惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
L
LINUX DO - 最新话题
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
V
Visual Studio Blog
博客园 - 【当耐特】
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
IT之家
IT之家
H
Hacker News: Front Page
O
OpenAI News
V2EX - 技术
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
K
Kaspersky official blog
罗磊的独立博客
博客园 - 聂微东
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
P
Privacy International News Feed
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Help Net Security
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
H
Help Net Security
S
Secure Thoughts
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Latest news
Latest news
T
Troy Hunt's Blog

博客园 - Lion

如何使用Solidity和Hardhat构建你自己的NFT以及NFT交易市场 ROS+LEDE最强上网软路由 Flume1.9.0的安装、部署、简单应用(含分布式、与Hadoop3.1.2、Hbase1.4.9的案例) 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出 Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建 Centos7 二进制安装 Kubernetes 1.13 - Lion Centos7 使用 kubeadm 安装Kubernetes 1.13.3 - Lion go get获取gitlab私有仓库的代码 Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务 - Lion Docker 创建 Bamboo6.7.1 以及与 Crowd3.3.2 实现 SSO 单点登录 GitLab11.3.9 使用 Crowd3.3.2 的帐号实现 SSO 单点登录,以及GitLab配置腾讯企业邮箱 - Lion Docker 创建 Crucible4.6.1 以及与 Crowd3.3.2 实现 SSO 单点登录 Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约 Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现众筹合约的实例 Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例 以太坊智能合约 Solidity 的常用数据类型介绍 - Lion 使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署 - Lion 使用 Go-Ethereum 1.7.2搭建以太坊私有链 cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台
如何将 ERC20 代币在一次交易中发送到多个地址?
Lion · 2022-07-13 · via 博客园 - Lion

目录

每一次链上交易都需要支持一笔交易费用,也就是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 代币在一次交易中发送到多个地址?
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!