如何將 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 < 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]);
        }
    }

}

上面的代碼爲了快速實現,直接調用 openzeppelinIERC20代碼,通過 IERC20 接口來調用 transferFrom 方法。

是不是很簡單?

Example:http://cointool.a246.vip/


博文作者:迦壹
博客地址:如何將 ERC20 代幣在一次交易中發送到多個地址?
轉載聲明:可以轉載, 但必須以超鏈接形式標明文章原始出處和作者信息及版權聲明,謝謝合作!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章