如何开发一个批量转账的合约?币安链和以太坊空投工具开发代码与教程

fffmCQ.jpg

撰写一个批量转账的空投合约,以帮助大家实现代币的空投

空投,一个在币圈很受欢迎的名词。如果你是项目方,需要用空投代币来提高持币人数。如果你是公司负责人,需要通过空投批量发放工资。简单来说,空投就是通过批量转账来降低自己的操作成本,相比较一笔笔进行转账,空投工具可以一次性实现上百笔转账交易,速度快、操作简单,是非常具有便利性的。作者就曾经领取过Uniswap的空投,赚了不少。

但是很多人使用批量转账的工具时,都会选择第三方平台。不仅要进行授权,还有些需要提交账户的私钥,这样就很难保证安全性了。与其搞这么复杂,不如自己开发一个脚本工具或者是智能合约,安全性大大提高。

空投工具

今天,就给大家演示一下,如何开发一个批量转账的合约工具,最后会附上相关的合约代码。

撰写空投代币合约

空投合约逻辑其实非常简单:利用循环,一笔交易将ERC20代币发送给多个地址。合约中包含两个函数

1、getSum()函数:返回uint数组的和。

// 数组求和函数
function getSum(uint256[] calldata _arr) public pure returns(uint sum)
{
    for(uint i = 0; i < _arr.length; i++)
        sum = sum + _arr[i];
}

2、multiTransferToken()函数:发送ERC20代币空投,包含3个参数:

  • _token:代币合约地址(address类型)
  • _addresses:接收空投的用户地址数组(address[]类型)
  • _amounts:空投数量数组,对应_addresses里每个地址的数量(uint[]类型)

该函数有两个检查:第一个require检查了_addresses和_amounts两个数组长度是否相等;第二个require检查了空投合约的授权额度大于要空投的代币数量总和。

/// @notice 向多个地址转账ERC20代币,使用前需要先授权
///
/// @param _token 转账的ERC20代币地址
/// @param _addresses 空投地址数组
/// @param _amounts 代币数量数组(每个地址的空投数量)
function multiTransferToken(
    address _token,
    address[] calldata _addresses,
    uint256[] calldata _amounts
    ) external {
    // 检查:_addresses和_amounts数组的长度相等
    require(_addresses.length == _amounts.length, "Lengths of Addresses and Amounts NOT EQUAL");
    IERC20 token = IERC20(_token); // 声明IERC合约变量
    uint _amountSum = getSum(_amounts); // 计算空投代币总量
    // 检查:授权代币数量 >= 空投代币总量
    require(token.allowance(msg.sender, address(this)) >= _amountSum, "Need Approve ERC20 token");
    
    // for循环,利用transferFrom函数发送空投
    for (uint8 i; i < _addresses.length; i++) {
        token.transferFrom(msg.sender, _addresses[i], _amounts[i]);
    }
}

3、multiTransferETH()函数:发送ETH空投,包含2个参数:

  • _addresses:接收空投的用户地址数组(address[]类型)
  • _amounts:空投数量数组,对应_addresses里每个地址的数量(uint[]类型)
/// 向多个地址转账ETH
function multiTransferETH(
    address payable[] calldata _addresses,
    uint256[] calldata _amounts
) public payable {
    // 检查:_addresses和_amounts数组的长度相等
    require(_addresses.length == _amounts.length, "Lengths of Addresses and Amounts NOT EQUAL");
    uint _amountSum = getSum(_amounts); // 计算空投ETH总量
    // 检查转入ETH等于空投总量
    require(msg.value == _amountSum, "Transfer amount error");
    // for循环,利用transfer函数发送ETH
    for (uint256 i = 0; i < _addresses.length; i++) {
        _addresses[i].transfer(_amounts[i]);
    }
}

空投实践部署

  1. 部署ERC20代币合约,并给自己mint10000 单位代币。

部署ERC20

mint

  1. 部署Airdrop空投合约。

部署Airdrop合约

  1. 利用ERC20代币合约中的approve()函数,给Airdrop空投合约授权10000 单位代币。

授权Airdrop合约

  1. 执行Airdrop合约的multiTransferToken()函数进行空投, _token填ERC20代币地址,_addresses和_amounts按照以下填写
// _addresses填写
["0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2", "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"]

// _amounts填写
[100, 200]

空投

  1. 利用ERC20合约的balanceOf()函数查询上面用户地址的代币余额,成功变为100和200,空投成功!

查询空投用户的代币余额

总结

以上就是一个简单的批量空投合约的代码实战,目前只是在以太坊链上试了一下,没问题。大家有兴趣,也可以部署到币安链上,轻轻松松就能完成。都是兼容链,问题不大。如果以上有不明白的,或者想要合作的,可以加wx:btc6540,或者电报:@btc6540,欢迎合作。专业dapp开发与合约撰写。

声明:该文观点仅代表作者本人,与炒币网无关。炒币网系信息发布平台,仅提供信息存储空间服务。对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,并不对文章观点负责。 提示:投资有风险,入市须谨慎。本资讯仅供参阅,不作为投资理财建议。

发表评论

登录后才能评论