Skip to content

Fail with error 'TransferHelper: TRANSFER_FROM_FAILED' #10

@illUkc

Description

@illUkc

Hello,

I have problem to swap token for wbnb back from your code. Meybe some tips how to fix this?

i am getting Status: Failed Error Reason: arithmetic underflow or overflow my log
https://dashboard.tenderly.co/tx/bnb/0x18368454753b2f1de9d0d5f1a581ad7c915a5decaaf800705fefaa526d035572
or
https://bscscan.com/tx/0x18368454753b2f1de9d0d5f1a581ad7c915a5decaaf800705fefaa526d035572

Python printed :
Connected to BSC: True
Balance: 20.91228548125376 WYRB
Allowance: 20.91228548125376 WYRB
Updated Allowance: 20.91228548125376 WYRB
Swapping 5 WYRB for BNB
Swapped WYRB: 0x18368454753b2f1de9d0d5f1a581ad7c915a5decaaf800705fefaa526d035572

My edited code from yours:

import json
from web3 import Web3
import time

Define the parameters

user_address = "0xB0e8698c5BdadBf8ADDf772407e5F16e42DBf631"
private_key = "*****************************************"
token_in = "0x683B9F1f6F1c40A10b0Bf992AdB73308d019Ea5F"
token_out = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"
slippage = 1.0 # Slippage percentage
gas_price = 5 # Gas price in Gwei

bsc = "https://bsc-dataseed.binance.org/"
web3 = Web3(Web3.HTTPProvider(bsc))

print("Connected to BSC:", web3.is_connected())

PancakeSwap router

panRouterContractAddress = '0x10ED43C718714eb63d5aA57B78B54704E256024E'

PancakeSwap router ABI

panabi = '[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]'

sender_address = '0xB0e8698c5BdadBf8ADDf772407e5F16e42DBf631'
spend = web3.to_checksum_address("0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c") # WBNB Address

Contract id is the new token we are swapping to

contract_id = web3.to_checksum_address(token_in)

Setup the PancakeSwap contract

contract = web3.eth.contract(address=panRouterContractAddress, abi=panabi)

Abi for Token to sell - all we need from here is the balanceOf & approve function can replace with shortABI

sellAbi = '[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]'

Create token Instance for Token

sellTokenContract = web3.eth.contract(contract_id, abi=sellAbi)

Get Token Balance

balance = sellTokenContract.functions.balanceOf(sender_address).call()
decimals = sellTokenContract.functions.decimals().call()
symbol = sellTokenContract.functions.symbol().call()
readable_balance = balance / (10 ** decimals)
print(f"Balance: {readable_balance} {symbol}")

Enter amount of token to sell

import numpy as np

tokenValue = np.uint16(5 * (10 ** decimals))

min_tokenValue = np.uint16(4.8 * (10 ** decimals))

Enter amount of token to sell

tokenValue = int(5 * (10 ** decimals))
min_tokenValue = int(4.5 * (10 ** decimals)) # Set lower to account for slippag

Check allowance

allowance = sellTokenContract.functions.allowance(sender_address, panRouterContractAddress).call()
print(f"Allowance: {allowance / (10 ** decimals)} {symbol}")
if allowance < tokenValue:
print("Approving token...")
approve_tx = sellTokenContract.functions.approve(panRouterContractAddress, tokenValue).build_transaction({
'from': sender_address,
'gasPrice': web3.to_wei(1, 'gwei'),
'nonce': web3.eth.get_transaction_count(sender_address),
})

signed_approve_tx = web3.eth.account.sign_transaction(approve_tx, private_key=private_key)
tx_approve = web3.eth.send_raw_transaction(signed_approve_tx.rawTransaction)
print("Approved: " + web3.to_hex(tx_approve))

# Wait for the approval transaction to be mined
web3.eth.wait_for_transaction_receipt(tx_approve, timeout=120)

Check updated allowance

allowance = sellTokenContract.functions.allowance(sender_address, panRouterContractAddress).call()
print(f"Updated Allowance: {allowance / (10 ** decimals)} {symbol}")

Swap Tokens

print(f"Swapping {5} {symbol} for BNB")
pancakeswap_txn = contract.functions.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenValue,
min_tokenValue,
[contract_id, spend],
sender_address,
(int(time.time()) + 10000)
).build_transaction({
'from': sender_address,
'gasPrice': web3.to_wei(1, 'gwei'),
'gas': 200000, # Adjust gas limit if needed
'nonce': web3.eth.get_transaction_count(sender_address),
})

signed_swap_txn = web3.eth.account.sign_transaction(pancakeswap_txn, private_key=private_key)
tx_swap = web3.eth.send_raw_transaction(signed_swap_txn.rawTransaction)
print(f"Swapped {symbol}: " + web3.to_hex(tx_swap))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions