辨别貔貅币的一种代码思路

辨别貔貅币的一种代码思路,第1张

说在前头

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调用智能合约等教程

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/925001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存