Skip to content

Fail with error 'TransferHelper: TRANSFER_FROM_FAILED' #10

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))

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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