说在前头
辨别貔貅币的一种代码思路Web3是一种新兴的网络概念,由于某些原因导致我们能够接触到的相关技术知识实在有限,每当我遇见技术瓶颈总是不能找到充足的资料,这也让我萌生了填补这片空白知识的冲动。“Hello Web3” 这个专栏会尽力将我掌握的web3 知识分享给大家。如果分享的知识能帮助到大家,希望能够 关注、点赞 支持作者!
知识前置
貔貅币指的是一类只能买入不能卖出的币,对喜欢冲土狗的老兄伤害极大
solidity中的函数具有事务性,函数中任何代码执行失败,所有步骤都会回滚
执行智能合约前估算gasLimit的函数实际上是执行了相关函数,但是没有提交
思路剖析
貔貅币无法卖出,我们只需要将买入、授权、卖出三个流程全部走一遍就可知道这个币是否是貔貅币。
但是将三个流程逐个走一遍需要花费一定的成本和手续费(gas),等待链上反馈执行信息的流程也比较缓慢。
将这三个步骤放入到一个solidity函数中,配合估算gasLimit的函数即可模拟对一个币的买入卖出全过程且无需任何成本。
代码展示
为了避免代码长度影响文章篇幅,所以去掉了IERC20、IPancakeRouter01、IPancakeRouter02等引用文件,只展示最精华的部分
pragma solidity =0.8.4;
contract PiXiuCheck{
IPancakeRouter02 public uniswapV2Router;
constructor(
address pancakeRuouter
){
uniswapV2Router = IPancakeRouter02(pancakeRuouter);
}
function checkToken(address tokenAddress,address[] memory pathBuy,address pair)
external
payable{
// buy
uniswapV2Router.swapExactETHForTokens{value:msg.value}(
0,
pathBuy,
address(this),
block.timestamp
);
uint256 tokenBalance = IERC20(tokenAddress).balanceOf(address(this));
// approve
IERC20(tokenAddress).approve(address(uniswapV2Router),tokenBalance);
// sell
IERC20(tokenAddress).transfer(pair,tokenBalance);
}
function setRoutor(address routor)
external{
uniswapV2Router = IPancakeRouter02(routor);
}
}
代码分析
uniswapV2Router.swapExactETHForTokens{value:msg.value}(
0,
pathBuy,
address(this),
block.timestamp
);
这是买入代币的代码,考虑到一般的土狗都是和wbnb(weth之类的)组的流动性,所以这里的pathBuy你可以固定的传[wbnbAddress,tokenAddress]数组
{value:msg.value}表示用于买入代币的wbnb数量由checkToken函数调用方传入的bnb数量决定
买入的代币填写的收币地址是本合约的地址,方便下面的授权和卖出
IERC20(tokenAddress).approve(address(uniswapV2Router),tokenBalance);
这是授权的代码,在卖出任何ERC20代币前,需要将该Token无限授权给负责卖出的Router合约
IERC20(tokenAddress).transfer(pair,tokenBalance);
这是模拟卖出的代码,实际上卖出代币一般调用swapExactTokensForETH方法,但是卖出代币最核心的一步就是将Token转移到对应的LP流动性对的合约,很多貔貅代币都是在这一步上面动手脚,导致代币无法卖出
这里直接将买入的Token给LP流动性对的合约,功能相当于卖出
该函数配合调用方估测gasLimit的函数即可完成貔貅币的检查
功能不足
有些貔貅币自带交易开关,可以随时关闭交易,本文代码无法检测出这种潜在的貔貅
有些代币合约会限制用户只能卖出一部分代币,本文代码会将此种代币识别为貔貅币
BSC上已经创建了一个检查貔貅的智能合约,如果大家有需要可以调用这个智能合约的方法进行调用。BSC智能合约地址:0xd269d17D1b1C61E03d795e856545858E4fbc5de1
以下是我将检测貔貅币功能填充到discord机器人的截图:
保持对作者的关注,后续会分享各种合约的源码解析,java调用智能合约等教程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)