TRANSFER_FORM_FAILED - Как одобрить роутер
Итак, я пытался запустить код из EatTheBlocks. Спустя (к сожалению) несколько часов мне удалось заставить его работать. Я получаю список новых пар, я решил проблему с газом, и транзакция прошла. Но каждый раз я получаю следующую ошибку:
Когда я открываю transactionHash, я вижу статус:
Я поискал его, и, видимо, это потому, что мне сначала нужно использовать функцию утверждения. Но в коде есть функция init, которая вызывает уже реализованную команду «одобрить». Я попытался заменить его тем, что нашел в Интернете от людей с похожими проблемами, но, похоже, не могу решить эту проблему. Как я могу запустить функцию init, чтобы она действительно одобряла?
Код:
const ethers = require('ethers');
const addresses = {
WBNB: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
factory: '0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73', //PancakeSwap Factory
router: '0x10ed43c718714eb63d5aa57b78b54704e256024e', //PancakeSwapRouterV2
recipient: '0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' //my wallet address
}
const mnemonic = 'my seed phrase left out for obvious reasons';
const provider = new ethers.providers.WebSocketProvider('My ankr node api');
const wallet = ethers.Wallet.fromMnemonic(mnemonic);
const account = wallet.connect(provider);
const factory = new ethers.Contract(
addresses.factory,
['event PairCreated(address indexed token0, address indexed token1, address pair, uint)'],
account
);
const router = new ethers.Contract(
addresses.router,
[
'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
);
const wbnb = new ethers.Contract(
addresses.WBNB,
[
'function approve(address spender, uint amount) public view returns(bool)',
],
account
);
const init = async () => {
const tx = await wbnb.approve(
router.address,
'1000000000000000000000000'
);
const receipt = await tx.wait();
console.log('Transaction receipt');
console.log(receipt);
}
factory.on('PairCreated', async (token0, token1, pairAddress) => {
console.log(`
New pair detected
=================
token0: ${token0}
token1: ${token1}
pairAddress: ${pairAddress}
`);
//The quote currency needs to be WBNB (we will pay with WBNB)
let tokenIn, tokenOut;
if(token0 === addresses.WBNB) {
tokenIn = token0;
tokenOut = token1;
}
if(token1 == addresses.WBNB) {
tokenIn = token1;
tokenOut = token0;
}
if(typeof tokenIn === 'undefined') {
return;
}
//'ether' === 'bnb' on BSC
var options = { gasPrice: 5000000000, gasLimit: 85000};
const amountIn = ethers.utils.parseUnits('0.00001', 'ether');
const amounts = await router.getAmountsOut(amountIn, [tokenIn, tokenOut]);
//Our execution price will be a bit different, we need some flexbility
const amountOutMin = amounts[1].sub(amounts[1].div(10));
console.log(`
Buying new token
=================
tokenIn: ${amountIn.toString()} ${tokenIn} (WBNB)
tokenOut: ${amountOutMin.toString()} ${tokenOut}
`);
const tx = await router.swapExactTokensForTokens(
amountIn,
amountOutMin,
[addresses.WBNB, tokenOut],
addresses.recipient,
Date.now() + 1000 * 60 * 10, //10 minutes
options
);
const receipt = await tx.wait();
console.log('Transaction receipt');
console.log(receipt);
});
init();
После запуска кода я получаю следующие журналы:
UnhandledPromiseRejectionWarning: TypeError: tx.wait is not a function
at init (C:\Users\~\348-pancakeswap-trading-bot\bot.js:43:28)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:4060) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:4060) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
New pair detected
=================
token0: 0x3dEf482d202Bbe892c2124d47C5904AC52c76E87
token1: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
pairAddress: 0x75Cc3973a2A6987fDC6B19AA7156889012E62885
Buying new token
=================
tokenIn: 10000000000000 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c (WBNB)
tokenOut: 444385806725157791655102824 0x3dEf482d202Bbe892c2124d47C5904AC52c76E87
New pair detected
=================
token0: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
token1: 0xDC7e29bdd44f49D4F51aC29f7D464Be05ffcCf52
pairAddress: 0xfb2A4283f47c5331aB6260BDAad3108D1841F44d```