51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Solidity - 空投

今天给大家讲一下空投。所谓空投,就是作为项目方,在项目的首发阶段为了做一些运营活动活跃用户,开发新用户,在初期给用户空投项目方的代币,或者ETH的行为。接下来这一节,我将带领大家如何编写一份示例的空投合约代码。

第一份Airdrop合约需求:我们实现将ETH进行分发以及将代币进行分发。逻辑代码如下。

分发ETH逻辑

function batchTtransferEther(address payable[] memory accounts, uint256 etherValue) public payable onlyOwner {
        uint256 _etherBalance = address(this).balance;
        require(_etherBalance >= etherValue * (accounts.length));
        for (uint256 i = 0; i < accounts.length; i++) {
            accounts[i].transfer(etherValue);
        }
    }

分发token逻辑

function batchTransferVoken(address[] memory accounts, uint256 vokenValue) public onlyOwner {
        uint256 _vokenAllowance = VOKEN.allowance(msg.sender, address(this));
        require(_vokenAllowance >= vokenValue * (accounts.length));
        for (uint256 i = 0; i < accounts.length; i++) {
            // assert(VOKEN.transferFrom(msg.sender, accounts[i], vokenValue*10**21));
            assert(VOKEN.transferFrom(msg.sender, accounts[i], vokenValue));
        }
    }

同时分发ETH和token的逻辑

function batchTransfer(address payable[] memory accounts, uint256 etherValue, uint256 vokenValue) public payable onlyOwner {
        uint256 _etherBalance = address(this).balance;
        uint256 _vokenAllowance = VOKEN.allowance(msg.sender, address(this));
        require(_etherBalance >= etherValue * (accounts.length));
        require(_vokenAllowance >= vokenValue * (accounts.length));
        // 转账
        for (uint256 i = 0; i < accounts.length; i++) {
            accounts[i].transfer(etherValue);
            assert(VOKEN.transferFrom(msg.sender, accounts[i], vokenValue));
        }
    }

在Airdrop这份代码中,我们实现了三个方法,分别是空投ETH,空投Token,以及同时空投ETH和Token。下面,我们看下如何部署调用这份合约的三个方法。

首先,我们部署一个代币合约,充当我们要空投的代币。

接着,我们部署Airdrop合约,并触发enter方法给合约转ETH用于空投,我在这里enter了三次,并在代币合约给Airdrop合约授权允许Airdrop合约从代币合约转账

最后,我们先空投ETH给以下三个账户地址。最终每个账户都各自收到了1ETH。

调用完空投ETH后,我们接下来调用空投Token,前面我们已经调用代币合约的approve方法给空投合约授权了。现在,我们来调用空投的方法。同样的,我们还是给上述的账户地址转Token。 我们从代币合约中可以看到每个账户地址的代币余额都为0。现在我们开始为这三个账户地址空投代币。

空投完,我们发现三个账户地址都有了代币了。

最后一个方法中,我们还实现了同时将ETH和代币转入到用户账户。通过执行以下这个方法,我们就能达到这种效果。

第二份drop合约需求是实现可添加不同的代币合约地址,之后调用方法可以一次性给用户分发不同的代币,这就避免了我们在分发代币的时候要一个个的去部署代币合约然后去进行分发。主要逻辑代码如下。

    function addTokenAddr(IERC20[] memory tokenAddrs_) public returns(bool) {
        for(uint256 i = 0; i < tokenAddrs_.length; i++) {
            tokenAddrs.push(tokenAddrs_[i]);
        }
        return true;
    }

    // 给多个用户空投固定value数量的erc20代币
    function batchAirDropTokens(address[] memory users, uint256 value) public returns(bool) {
        for(uint256 i = 0; i < tokenAddrs.length; i++) {
            for(uint256 k = 0; k < users.length; k++) {
                IERC20(tokenAddrs[i]).transferFrom(msg.sender,users[k], value);
            }
        }

        emit BatchAirDropTokens(tokenAddrs,users,value);

        return true;
    }

通过这两个方法,我么就可以实现给多个用户空投不同的代币。可以自己试试哦。要记住的是,在调用空投方法的前提要调用代币合约给空投合约授权。

合约源码地址:https://github.com/zhihaozhong123/Solidity_Contracts_Learning/tree/master/airdrop

赞(4)
未经允许不得转载:工具盒子 » Solidity - 空投