Как подтвердить только один раз на Metamask, после чего бот разместит заказ на обмен?

#javascript #metamask #ethers.js

Вопрос:

У меня есть этот код на HTML/JavaScript; Он заказывает Metamask для обмена блинами, он запускается, но требует 2-кратного одобрения пользователя: первый раз для утверждения токена и 2-й раз для действия подкачки. Я чувствую, что во 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],
                      [BASE, TOKEN],
                      signerAddress,
                      Date.now()   1000 * 60 * 10, //10 minutes
                      {
                        'gasLimit': gasLimit,
                        'gasPrice': gasPrice_weiBN
            })
        
        console.log(tx,"<<< tx")
        
      }