#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")
}