USER
have this error PS C:\Users\lidor\Desktop\Trade Bot> node index.js
Estimated amount out: 171661.927822 Tether USD
TypeError: Cannot read properties of undefined (reading 'from')
at estimateGas (C:\Users\lidor\Desktop\Trade Bot\index.js:31:39)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async executeTrade (C:\Users\lidor\Desktop\Trade Bot\index.js:66:29)
PS C:\Users\lidor\Desktop\Trade Bot> with this code const { ethers, BigNumber } = require('ethers');
const { computePoolAddress } = require('@uniswap/v3-sdk');
const { Token } = require('@uniswap/sdk-core');
// Ethereum network configuration
const provider = new ethers.JsonRpcProvider('http://127.0.0.1:8545/');
const privateKey = 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80';
// Uniswap V3 contract configuration
const uniswapV3SwapRouterAddress = '0xE592427A0AEce92De3Edee1F18E0157C05861564';
const PoolFactoryContractAddress = '0x1F98431c8aD98523631AE4a59f267346ea31F984';
const quoterContractAddress = '0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6';
const uniswapV3SwapRouterABI = require('@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json').abi;
const uniswapV3PoolABI = require('@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json').abi;
const uniswapV3QuoterAbi = require('@uniswap/v3-periphery/artifacts/contracts/lens/Quoter.sol/Quoter.json').abi;
// Token configuration
const tokenToSwapAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2';
const tokenToReceiveAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
const wallet = new ethers.Wallet(privateKey, provider);
// Load the Uniswap V3 contract
const uniswapV3SwapRouterContract = new ethers.Contract(uniswapV3SwapRouterAddress, uniswapV3SwapRouterABI, wallet);
const customGasPrice = ethers.parseUnits('50', 'gwei');
async function estimateGas(txObj) {
const gasEstimate = await provider.estimateGas(txObj);
const { maxPriorityFeePerGas, maxFeePerGas } = await provider.getFeeData();
const estimatedGasPrice = BigNumber.from(maxPriorityFeePerGas).add(BigNumber.from(maxFeePerGas)).div(2);
const totalGas = gasEstimate.mul(estimatedGasPrice);
return ethers.utils.formatEther(totalGas);
}
async function executeTrade() {
try {
const tokenToSwapProperties = await getTokenProperties(tokenToSwapAddress);
const tokenToReceiveProperties = await getTokenProperties(tokenToReceiveAddress);
const tokenToSwap = new Token(1, tokenToSwapAddress, Number(tokenToSwapProperties.decimals), tokenToSwapProperties.symbol, tokenToSwapProperties.name);
const tokenToReceive = new Token(1, tokenToReceiveAddress, Number(tokenToReceiveProperties.decimals), tokenToReceiveProperties.symbol, tokenToReceiveProperties.name);
const tokenToSwapAmount = ethers.parseUnits('100', tokenToSwapProperties.decimals);
const currentPoolAddress = computePoolAddress({
factoryAddress: PoolFactoryContractAddress,
tokenA: tokenToSwap, // Use the Token instance
tokenB: tokenToReceive, // Use the Token instance
fee: 3000,
});
const poolContract = new ethers.Contract(currentPoolAddress, uniswapV3PoolABI, provider);
const [token0, token1, fee] = await Promise.all([poolContract.token0(), poolContract.token1(), poolContract.fee()]);
const quoterContract = new ethers.Contract(quoterContractAddress, uniswapV3QuoterAbi, provider);
const data = quoterContract.interface.encodeFunctionData('quoteExactInputSingle', [token0, token1, fee, tokenToSwapAmount.toString(), 0]);
const quotedAmountOut = await provider.call({ to: quoterContractAddress, data });
const humanReadableAmountOut = ethers.formatUnits(quotedAmountOut, Number(tokenToReceive.decimals));
console.log('Estimated amount out:', humanReadableAmountOut, tokenToReceive.name);
const txObj = {
to: quoterContractAddress,
data: data,
};
const estimatedGasFee = await estimateGas(txObj);
console.log('Estimated gas fee:', estimatedGasFee, 'ETH');
// Approve Uniswap V3 SwapRouter to spend tokenToSwap
console.log('Approving token spend by SwapRouter…');
const tokenToSwapContract = new ethers.Contract(tokenToSwapAddress, ['function approve(address spender, uint256 amount) external returns (bool)'], wallet);
const approvalTx = await tokenToSwapContract.approve(uniswapV3SwapRouterAddress, tokenToSwapAmount, { gasPrice: customGasPrice, gasLimit: 25000000 });
await approvalTx.wait();
console.log('Token spend approval transaction confirmed.');
const swapParams = {
tokenIn: tokenToSwapAddress,
tokenOut: tokenToReceiveAddress,
fee: 3000,
recipient: wallet.address,
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
amountIn: tokenToSwapAmount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0,
};
console.log('Sending swap transaction…');
const swapTx = await uniswapV3SwapRouterContract.exactInputSingle(swapParams, { gasPrice: customGasPrice, gasLimit: 25000000 });
console.log('Swap transaction hash:', swapTx.hash);
// Wait for transaction confirmation
console.log('Waiting for swap transaction confirmation…');
await swapTx.wait();
console.log('Swap transaction confirmed!');
} catch (e) {
console.log(e);
}
}
executeTrade();
async function getTokenProperties(tokenAddress) {
const erc20ABI = ['function name() view returns (string)', 'function symbol() view returns (string)', 'function decimals() view returns (uint8)'];
const tokenContract = new ethers.Contract(tokenAddress, erc20ABI, provider);
const [name, symbol, decimals] = await Promise.all([tokenContract.name(), tokenContract.symbol(), tokenContract.decimals()]);
return {
name,
symbol,
decimals,
};
}
using ethers 6.4.1