通常批量转账可以作为独立的软件来使用,但是第三方的批量转账软件都不太完善,要么需要你把所有的代币全部转让对方指定的账户地址,要么在使用第三方批量转账软件时需要提供钱包私钥,这样就容易泄露钱包私钥,存在安全隐患。考虑到此类问题,建议在合约中增加批量转账功能,就可以避免使用第三方批量转账软件。
一、如果提供三种批量转账相关的合约实现功能代码:批量转账包含精度、批量转账不包含精度、批量转账固定数量
1、批量转账包含精度代码实现
function multiTransfer(address from, address[] calldata addresses, uint256[] calldata tokens) external onlyOwner { require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow require(addresses.length == tokens.length,"Mismatch between Address and token count"); uint256 SCCC = 0; for(uint i=0; i < addresses.length; i++){ SCCC = SCCC + tokens[i]; } require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _transfer(from,addresses[i],tokens[i]); } }
如果合约包含分红tricker,那么相关的代码就需要修改为如下形式:
function multiTransfer(address from, address[] calldata addresses, uint256[] calldata tokens) external onlyOwner { require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow require(addresses.length == tokens.length,"Mismatch between Address and token count"); uint256 SCCC = 0; for(uint i=0; i < addresses.length; i++){ SCCC = SCCC + tokens[i]; } require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _basicTransfer(from,addresses[i],tokens[i]); if(!isDividendExempt[addresses[i]]) { try distributor.setShare(addresses[i], balanceOf(addresses[i])) {} catch {} } } // Dividend tracker if(!isDividendExempt[from]) { try distributor.setShare(from, balanceOf(from)) {} catch {} } }
2、批量转账不包含精度
function multiTransfer_nodecimals(address from, address[] calldata addresses, uint256[] calldata tokens) external onlyOwner { require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow require(addresses.length == tokens.length,"Mismatch between Address and token count"); uint256 SCCC = 0; for(uint i=0; i < addresses.length; i++){ SCCC = SCCC + tokens[i]; } SCCC = SCCC * 10**_decimals; require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _transfer(from,addresses[i],(tokens[i] * 10**_decimals)); } }
如果合约包含分红tricker,那么相关的代码就需要修改为如下形式:
function multiTransfer_nodecimals(address from, address[] calldata addresses, uint256[] calldata tokens) external onlyOwner { require(addresses.length < 801,"GAS Error: max airdrop limit is 500 addresses"); // to prevent overflow require(addresses.length == tokens.length,"Mismatch between Address and token count"); uint256 SCCC = 0; for(uint i=0; i < addresses.length; i++){ SCCC = SCCC + tokens[i]; } SCCC = SCCC * 10**_decimals; require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _basicTransfer(from,addresses[i],(tokens[i] * 10**_decimals)); if(!isDividendExempt[addresses[i]]) { try distributor.setShare(addresses[i], balanceOf(addresses[i])) {} catch {} } } // Dividend tracker if(!isDividendExempt[from]) { try distributor.setShare(from, balanceOf(from)) {} catch {} } }
3、批量转账固定数量
function multiTransfer_fixed(address from, address[] calldata addresses, uint256 tokens) external onlyOwner { require(addresses.length < 2001,"GAS Error: max airdrop limit is 2000 addresses"); // to prevent overflow uint256 SCCC = tokens * addresses.length; require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _transfer(from,addresses[i],tokens); } }
如果合约包含分红tricker,那么相关的代码就需要修改为如下形式:
function multiTransfer_fixed(address from, address[] calldata addresses, uint256 tokens) external onlyOwner { require(addresses.length < 2001,"GAS Error: max airdrop limit is 2000 addresses"); // to prevent overflow uint256 SCCC = tokens * addresses.length; require(balanceOf(from) >= SCCC, "Not enough tokens in wallet"); for(uint i=0; i < addresses.length; i++){ _basicTransfer(from,addresses[i],tokens); if(!isDividendExempt[addresses[i]]) { try distributor.setShare(addresses[i], balanceOf(addresses[i])) {} catch {} } } // Dividend tracker if(!isDividendExempt[from]) { try distributor.setShare(from, balanceOf(from)) {} catch {} } }
以上为三种批量转账相关的合约实现功能代码。
二、直接在区块链浏览器上通过如下方式传递数组参数到合约,完成批量转账功能
注:以上是三种方式都可以实现批量转账功能,一定程度上都可以节约部分手续费,消耗的手续费大于一笔转账的手续费,小于每笔子交易单独转账时的累积和。
至此,完成合约中增加批量转账功能的所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册