如何将 ERC20 代币在一次交易中发送到多个地址?
目录
[TOC]
每一次链上交易都需要支持一笔交易费用,也就是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 < recipients.length; i++){
(bool sent, bytes memory da) = tokenAddress.call(abi.encodeWithSignature("transferFrom(address,address,uint256)",_msgSender(),recipients[i],values[i]));
// require(sent, "Failed to transfer token to user");
require(sent, string(da));
}
}
}
在上面的代码中,我们通过向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 < recipients.length; i++){
erc20.transferFrom(_msgSender(), recipients[i], values[i]);
}
}
}
上面的代码为了快速实现,直接调用 openzeppelin
的 IERC20
代码,通过 IERC20
接口来调用 transferFrom
方法。
是不是很简单?
Example:http://cointool.a246.vip/
博文作者:迦壹
博客地址:如何将 ERC20 代币在一次交易中发送到多个地址?
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!