首页 > 其他分享 >使用合约管理钱包

使用合约管理钱包

时间:2022-12-15 15:22:25浏览次数:42  
标签:function 管理 uint256 salt contract token 钱包 address 合约

代码备份

// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

import "@openzeppelin/[email protected]/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/[email protected]/token/ERC20/IERC20.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";

interface IWallet{
	function tokenTransfer(address token,address reciever,uint256 amount) external;
}

contract Wallet is Ownable {
    constructor(address _owner)  {
    }

	function tokenTransfer(address token,address reciever,uint256 amount) external onlyOwner{
		SafeERC20.safeTransfer(IERC20(token),reciever,amount);
	}
}

contract WalletFactory is Ownable{
    mapping(uint256 => address)public wallets;

    function deploy(
        uint256 _salt
    ) external onlyOwner returns (address) {
        wallets[_salt] = address(new Wallet{salt: bytes32(_salt)}(address(this)));
        return wallets[_salt];
    }

    function getBytecode()
        internal
        view
        returns (bytes memory)
    {
        bytes memory bytecode = type(Wallet).creationCode;
        return abi.encodePacked(bytecode, abi.encode(address(this)));
    }

    function getAddress(uint256 _salt)
        public
        view
        returns (address)
    {
        bytes32 hash = keccak256(
            abi.encodePacked(
                bytes1(0xff), // 0
                address(this), // address of factory contract
                _salt, // a random salt
                keccak256(getBytecode()) // the wallet contract bytecode
            )
        );
        // Cast last 20 bytes of hash to address
        return address(uint160(uint256(hash)));
    }

	function tokenTransfer(address token,address sender,address receiver,uint256 amount) external onlyOwner{
		IWallet(sender).tokenTransfer(token,receiver,amount);
	}

    function flushs(address token,address[] memory _accounts,address receiver)public onlyOwner{
        for(uint256 i=0;i<_accounts.length;i++){
            uint256 balance = IERC20(token).balanceOf(_accounts[i]);
            if(balance>0){
                IWallet(_accounts[i]).tokenTransfer(token,receiver,balance);
            }
        }
    }
}

链下计算地址


// genAddress 使用salt生成地址,算法与合约保持一致
func (svc *Service) genAddress(_salt int64) (common.Address, error) {
	cfg := svc.cfg.Chain
	creationCode, err := hexutil.Decode(cfg.CreationCode)
	if err != nil {
		return common.Address{}, errors.Wrap(err, "Bad CreationCode")
	}
	contract := common.HexToAddress(cfg.WalletFactory).Bytes()

	byteCodeHash := crypto.Keccak256Hash(
		creationCode,
		common.LeftPadBytes(contract, 32),
	)
	salt := big.NewInt(_salt)
	hash := crypto.Keccak256Hash(
		[]byte{0xff},
		contract,
		common.LeftPadBytes(salt.Bytes(), 32),
		byteCodeHash.Bytes(),
	)

	var address common.Address
	copy(address[:], hash.Bytes()[12:])
	return address, err
}

标签:function,管理,uint256,salt,contract,token,钱包,address,合约
From: https://www.cnblogs.com/cqvoip/p/16985112.html

相关文章

  • RTL8380M/82M管理型交换机系统软件操作指南四:QoS/服务质量
    接下来对QoS进行详细的描述,主要包括以下七大内容:QoS概述、功能简介、拥塞管理、策略分类、调度方式、优先级映射配置、QoS端口配置.1.1QoS概述QoS(QualityofService,服务......
  • 智慧园区管理系统,请get这份成都住房租赁风险提示
    版权声明:本文章由“厦门多米克信息技术有限公司”编辑组汇编而成,未经授权和许可,任何个人或媒体不得对本网站的文章及其他信息资料予以复制、转载、抄袭、改编。厦门多米克......
  • 密钥管理与密钥分散
    密钥管理是数据加密技术中的重要一环,密钥管理的目的是确保密钥的安全性(真实性和有效性)。为了数据使用的方便,数据加密在许多场合集中表现为密钥的应用,以达到保密的要求,因此密......
  • 超市管理系统
    我开始写了个getTime()方法。一个员工类,继承出一个管理员,管理员可以创建新用户。  ......
  • golang的module管理与使用go mod
    #############################  更换或升级了golang后,需要删除go.mod、go.sum、vendor文件,然后重建,不然一直卡在那里      使用: Gomodules操作命令及相关文件解......
  • 【Linux】用户组管理命令:groupadd、groupdel、groupmod
    每个用户都有一个用户组,Linux用户属于与他同名的用户组,这个用户组在创建用户时同时创建,用户组的信息在文件/etc/group1.groupadd新增组groupaddone2.groupdel删除......
  • 精力管理 而非时间
    精力是最宝贵的资源。一、什么是精力管理 四个原则,(一)要同时调动:体能、情感、思维和意志,做到全情投入,精力和时间不同,是越用越多的资源。当对一件事情全身心投入时,精力不......
  • Nacos-配置管理,分布式,微服务,集群部署
    Nacos-配置管理目录Nacos-配置管理4Nacos配置管理基础应用4.1Nacos配置管理模型4.2命名空间管理4.2.1namespace隔离设计4.2.2命名空间管理4.3配置管理4.2.1配置......
  • 瓴羊Quick BI 权限管理:商业智能工具的领头羊
    当前,很多企业想通过引进商业智能工具让内部数据分析效率与智能化水平提高,建立起一套有效的数据分析与运行管理体系。在选择BI工具时,运算速度和功能多样性是考虑最多的,其他几......
  • 基于springboot疫情防控期间某村外出务工人员信息管理系统设计与实现的源码+文档
    摘 要网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合,利用java技术建设疫情防控期间某村外出务工人员信息管理系统......