目錄
每一次鏈上交易都需要支持一筆交易費用,也就是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 代幣在一次交易中發送到多個地址?
轉載聲明:可以轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明,謝謝合作!