I have code to call pancakeswap/uniswap router function to swap token. In my code, I have no problem calling swapExactETHforTokens when swapping WBNB to BUSD in BSC. my problem came when I tried calling swapExactTokensForETH function to swap BUSD to WBNB. It showed me this error
Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"reason":"cannot estimate gas; transaction may fail or may require manual gas limit","code":"UNPREDICTABLE_GAS_LIMIT","error":{"reason":"processing response error","code":"SERVER_ERROR","body":"{"jsonrpc":"2.0","id":817,"error":{"code":3,"message":"execution reverted: TransferHelper: TRANSFER_FROM_FAILED","data":"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000245472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454400000000000000000000000000000000000000000000000000000000"}}\n","error":{"code":3,"data":"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000245472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454400000000000000000000000000000000000000000000000000000000"},"requestBody":"{"method":"eth_estimateGas","params":[{"gasPrice":"0x2540be400","type":"0x0","from":"0xa715c85973f8e0282ee8c1fc36305be23928344f","to":"0xd99d1c33f9fc3444f8101754abc46c52416550d1","data":"0x18cbafe5000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000713d616652258ed00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a715c85973f8e0282ee8c1fc36305be23928344f0000000000000000000000000000000000000000000000000000000060e5bd9a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000078867bbeef44f2326bf8ddd1941a4439382ef2a7000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd"}],"id":817,"jsonrpc":"2.0"}","requestMethod":"POST","url":"https://data-seed-prebsc-1-s1.binance.org:8545"},"method":"estimateGas","transaction":{"from":"0xA715c85973f8E0282eE8c1FC36305bE23928344f","gasPrice":{"type":"BigNumber","hex":"0x02540be400"},"to":"0xD99D1c33F9fC3444f8101754aBC46c52416550D1","data":"0x18cbafe5000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000713d616652258ed00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a715c85973f8e0282ee8c1fc36305be23928344f0000000000000000000000000000000000000000000000000000000060e5bd9a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000078867bbeef44f2326bf8ddd1941a4439382ef2a7000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd","type":0,"accessList":null}}, tx={"data":"0x18cbafe5000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000713d616652258ed00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a715c85973f8e0282ee8c1fc36305be23928344f0000000000000000000000000000000000000000000000000000000060e5bd9a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000078867bbeef44f2326bf8ddd1941a4439382ef2a7000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd","to":{},"from":"0xA715c85973f8E0282eE8c1FC36305bE23928344f","gasPrice":{"type":"BigNumber","hex":"0x02540be400"},"type":0,"nonce":{},"gasLimit":{},"chainId":{}}, code=UNPREDICTABLE_GAS_LIMIT, version=abstract-signer/5.4.0)
from the error i believe it is because it is unable to estimate gas. but I was wondering why would it not be a problem in swapExactETHforTokens function?
If the problem is estimating gas, what should I add in the code? I used PancakeSwap/sdk in the code as well.
down here is the piece of code that execute the swap. hope it makes the context a little bit clearer
const swap = async () => {
try {
error = '';
console.log(`Swap process`);
console.log({ tokenFrom, tokenTo });
const wallet = new ethers.Wallet($settings.privateKey, binance().bsc);
const account = wallet.connect(binance().bsc);
var amountOutMin = trade.minimumAmountOut(slippageTolerance).raw;
amountOutMin = BigNumber.from(amountOutMin.toString());
const path = [token0.address, token1.address];
const to = account.address;
const deadline = Math.floor(Date.now() / 1000) + 60 * 20;
var amountIn = trade.inputAmount.raw;
console.log(amountIn);
//var amount1 = amountIn*100000000000000000;
amountIn = BigNumber.from(amountIn.toString());
console.log({ amountIn, amountOutMin });
const uniswap = new ethers.Contract(
'0xD99D1c33F9fC3444f8101754aBC46c52416550D1',
[
'function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)',
'function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)',
'function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)',
],
account
);
var tx;
if (token0.address === WETH[chainId].address) {
console.log(`Swap exact ETH for tokens`)
tx = await uniswap.swapExactETHForTokens(
amountOutMin,
path,
to,
deadline,
{ value: amountIn }
);
} else if (token1.address === WETH[chainId].address) {
console.log(`Swap exact tokens for ETH`)
tx = await uniswap.swapExactTokensForETH(
amountIn, //maybe in 18 decimal
amountOutMin, //need to get getamountout by calling getamountout
path,
to,
deadline,
);
} else {
console.log(`Swap exact tokens for tokens`)
tx = await uniswap.swapExactTokensForTokens(
amountIn,
amountOutMin,
path,
to,
deadline
);
}
console.log(`Transaction hash: ${tx.hash}`);
const receipt = await tx.wait();
console.log(`Transaction was mined in block ${receipt.blockNumber}`);
} catch (error) {
console.error(error);
error = error.message;
}
};
token0
?approve
on the token that you're trying to swap first. Check this out for some context on how to do it: ethereum.stackexchange.com/questions/79242/…