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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solidity中,可以通过使用智能合约来实现ERC20代币的锁仓与释放。以下是一个简单的锁仓合约示例: ``` pragma solidity ^0.8.0; import "./IERC20.sol"; import "./SafeMath.sol"; contract TokenVesting { using SafeMath for uint256; address public beneficiary; uint256 public cliff; uint256 public start; uint256 public duration; uint256 public released; IERC20 public token; constructor( address _beneficiary, uint256 _cliff, uint256 _duration, address _token ) public { require(_beneficiary != address(0)); require(_cliff <= _duration); beneficiary = _beneficiary; cliff = _cliff; duration = _duration; start = block.timestamp; token = IERC20(_token); } function release() public { uint256 unreleased = releasableAmount(); require(unreleased > 0); released = released.add(unreleased); token.transfer(beneficiary, unreleased); } function releasableAmount() public view returns (uint256) { return vestedAmount().sub(released); } function vestedAmount() public view returns (uint256) { uint256 currentBalance = token.balanceOf(address(this)); uint256 totalBalance = currentBalance.add(released); if (block.timestamp < start.add(cliff)) { return 0; } else if (block.timestamp >= start.add(duration)) { return totalBalance; } else { return totalBalance.mul(block.timestamp.sub(start)).div(duration); } } } ``` 在这个合约中,当创建合约时,需要传入受益人地址、锁仓期、释放期、代币地址等信息。锁仓期结束后,受益人可以通过调用 `release()` 函数来释放锁仓代币。如果释放函数被调用,但是当前时间还没有到达释放期,则会抛出异常。 为了保证代币不能被提前释放,合约还实现了 cliff 的概念,即在锁仓期结束之前,代币不能被释放。当 cliff 结束之后,代币将按照线性方式释放,直到释放期结束。 需要注意的是,以上示例只是一个简单的锁仓合约示例,实际生产环境中需要更加严格地考虑各种情况和安全性问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值