微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Metamask 上只确认一次然后机器人会在之后下交换订单?

如何解决如何在 Metamask 上只确认一次然后机器人会在之后下交换订单?

我在 HTML/JavaScript 上有这段代码; 它命令 Metamask 交换 Pancakeswap,它运行,但它需要用户的 2 次批准:第一次令牌批准和第二次交换操作。我觉得第二次可能没有必要,特别是如果我们正在制作一个机器人。

如何避免第二个?

我只想批准订单一次,然后当机器人找到交换的好机会时自动进行这笔交易......

async function swapFunction() {
        const provider = new ethers.providers.Web3Provider(window.ethereum)

        const signer = provider.getSigner()

        var signerAddress = await signer.getAddress()

        const ACCOUNT = provider.getSigner(0);

        var ROUTER_ADDR = '0x05ff2b0db69458a0750badebc4f9e13add608c7f'; //pancakeswap router

        var ROUTER_CONTRACT = await new ethers.Contract(
            ROUTER_ADDR,[
            'function getAmountsOut(uint amountIn,address[] memory path) public view returns (uint[] memory amounts)','function swapExactTokensForTokens(uint amountIn,uint amountOutMin,address[] calldata path,address to,uint deadline) external returns (uint[] memory amounts)',],ACCOUNT
            );

        console.log(ROUTER_CONTRACT,"<< ROUTER_CONTRACT")

        var BASE = "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c";
        var TOKEN = "0xe9e7cea3dedca5984780bafc599bd69add087d56";

        var BASE_CONTRACT = new ethers.Contract(
            BASE,[
            'function approve(address spender,uint value) external returns (bool)','function decimals() public view returns (uint8)','function balanceOf(address account) external view returns (uint256)','function allowance(address _owner,address spender) external view returns (uint256)'
            ],ACCOUNT
            );

        console.log(BASE_CONTRACT,"<< BASE_CONTRACT")
        var amountIn_weiBN = ethers.utils.parseEther("0.001");
        var gasLimit = 300000;
        var gasPrice_weiBN = ethers.utils.parseUnits(`${5}`,'gwei');;
        var approved = false

        // ******************  Here Metamask ask to Click Confirmation 1st time. *******************
        var approved = await BASE_CONTRACT.approve( ROUTER_ADDR,amountIn_weiBN,{
                                                'gasLimit': gasLimit,'gasPrice': gasPrice_weiBN 
                                                });

        console.log(approved,"<< approved")
        
        var routeramountsOutBN = await ROUTER_CONTRACT.getAmountsOut( amountIn_weiBN,[BASE,TOKEN]);
        
        console.log(routeramountsOutBN,"<<< routeramountsOutBN")
       
       // .... Here will come some bot logics .... 
       // How to avoid this second time Confirmation ??
       // ******************  Here Metamask ask to Click Confirmation 2nd time. *******************
        var tx = await ROUTER_CONTRACT.swapExactTokensForTokens(
                      routeramountsOutBN[0],routeramountsOutBN[1],TOKEN],signerAddress,Date.Now() + 1000 * 60 * 10,//10 minutes
                      {
                        'gasLimit': gasLimit,'gasPrice': gasPrice_weiBN
            })
        
        console.log(tx,"<<< tx")
        
      }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?