批量转账 如何将ERC20代币在一次交易中发送到多个地址?

每一次链上交易都需要支持一笔交易费用,也就是gas费。很多时候向多个用户发送同样的Token,比如空投时,每次发送一笔会非常麻烦,也会损耗很多gas费用。
那么如何通过一笔交易实现向多个不同用户发送不同数量的 Erc20 Token 呢?

在 EIP20标准中,定义了transferFrom方法,将_value一定数量的代币从地址转移_from到地址_to.

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

那么我们只需要在自己的合约中实现接收多个地址、多个数量代币,然后调用transferFrom方法就可以。
第一种方法

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";

contract ERC20BatchTransfer is Context {
    function batchERC20(address tokenAddress, address[] calldata recipients, uint256[] calldata values) external {

        for (uint256 i = 0; i 

在上面的代码中,我们通过向tokenAddress合约通过call来呼叫合约的transferFrom方法。
abi.encodeWithSignature方法的第一个参数是要编码的方法,后面依次传入被编码方法的三个参数,调用者、接收人、数量。
第二种方法
这种代码编写可能看起来更容易理解。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";

contract ERC20BatchTransfer is Context {
    using SafeERC20 for IERC20;


    function batchERC20(address tokenAddress, address[] calldata recipients, uint256[] calldata values) external {
        IERC20 erc20 = IERC20(tokenAddress);
        for (uint256 i = 0; i 

上面的代码为了快速实现,直接调用openzeppelinIERC20代码,通过IERC20接口来调用transferFrom方法。
是不是很简单?

给TA打赏
共{{data.count}}人
人已打赏
区块链

Solidity 一个完整BSC币安智能链合约分红奖励项目

2022-3-23 1:24:17

区块链

如何使用ERC20代币实现买、卖功能并完成Dapp部署

2022-9-9 0:14:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
有新私信 私信列表
搜索