新年快乐!
最近也是从各个社区看到天才小黄同学.不讨论小黄同学这个发币行为,仁者见仁智者见智。
我们只需要来领取下代币。比正常用户领取节约太多gas了。
首先这是小黄同学的代币coin
0x1c7e83f8c581a967940dbfa7984744646ae46b29 找到cliam 函数function claim() external{ if( (uint32(block.timestamp)-release_time) <= 360 days && is_claim[msg.sender] == false ){ is_claim[msg.sender] = true; yet_claim_people.push(msg.sender); _mint(msg.sender,return_claim_number()); } }
我们发现这里主要校验了下,领取时间需要在合约发布后的360天内,是否领取过
因此我们需要使用各种新账户来cliam 领取。
大部分人会把eth 发给小号,让小号领取token,由于uniswap交易费很高,因此又要把token归并到一个账户来。这样不仅累,还浪费很多gas费用
因此我们这里直接部署合约来领取
pragma solidity ^0.8.0; //被领取token 所需要的3个函数,转账,查询余额,领取空投 //0x1c7e83f8c581a967940dbfa7984744646ae46b29 12岁小孩的token地址 interface airdrop { function transfer(address recipient, uint256 amount) external; function balanceOf(address account) external view returns (uint256); function claim() external; } contract ClaimToken { address constant rnd = address(0x1c7E83f8C581a967940DBfa7984744646AE46b29); //for循环创建新合约claimer,也就是领取多少次 function call(uint256 times) public { for(uint i=0;i<times;i++){ new claimer(rnd); } } //查询代币余额 function balance(address account) external view returns (uint256){ return airdrop(rnd).balanceOf(account); } } contract claimer{ constructor(address rnd){ //调用领取token函数 airdrop(rnd).claim(); //获取 新合约余额 uint256 balance = airdrop(rnd).balanceOf(address(this)); require(balance>0,'faled'); //从新合约里把token 转移到调用发起人 airdrop(rnd).transfer(address(tx.origin), balance); //自毁合约,使合约变为无效,有效地删除该地址地字节码。把合约的所有资金发送到目标地址 selfdestruct(payable(address(msg.sender))); } }
部署的时候只需要部署ClaimToken这个合约,并调用call 函数 参数是领取的次数。
大家可以使用ganache来fork主网,来用真实环境模拟调用。这是领取200次所用gas费用