#web3js #ethers.js
#web3js #ethers.js
Вопрос:
Я пытаюсь построить Node.js приложение, которое будет обмениваться токенами через контракт маршрутизатора Uniswap-подобного dex (он называется Ubeswap, вилка Uniswapv2 на Celo).
Я перепробовал несколько подходов, и до сих пор у меня ничего не получалось.
Вот код функции, которую я построил:
const { ChainId, Fetcher, CELO, Route, TradeType, Trade, TokenAmount, Token, Percent } = require ('@ubeswap/sdk') const ethers = require('ethers') const fs = require('fs') const Web3 = require('web3') // chaing config const chainId = ChainId.ALFAJORES.toString() const fornoUrl = 'https://alfajores-forno.celo-testnet.org' const customHttpProvider = new ethers.providers.JsonRpcProvider(fornoUrl) const web3 = new Web3(fornoUrl); //wallet config const targetAccount = JSON.parse(fs.readFileSync('path to the file with private key', 'utf-8')) const privateKey = Buffer.from(targetAccount.privateKey, 'hex') const signer = new ethers.Wallet(privateKey) const account = signer.connect(customHttpProvider) customHttpProvider.getBlockNumber().then((result) =gt; { console.log("Current block number: " result); }); // token for tokens we are interested in const celoAddressAlfa = '0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9' const cusdAddressAlfa = '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1' const UniswapV2RouterAddress = '0xE3D8bd6Aed4F159bc8000a9cD47CffDb95F96121' const UniswapV2RouterABI = [abi removed to save space] const UniswapV2RouterContract = new ethers.Contract(UniswapV2RouterAddress, UniswapV2RouterABI, account) const init = async () =gt; { //get data about tokens and pairs const token1 = await Fetcher.fetchTokenData(chainId, cusdAddressAlfa, customHttpProvider) const token2 = await Fetcher.fetchTokenData(chainId, celoAddressAlfa, customHttpProvider) const pair = await Fetcher.fetchPairData(token1, token2, customHttpProvider) const route = new Route([pair], token1) const amountInWei = '100000000000000000' // 1 const amountInHex = web3.utils.toHex('amountInWei') const path = [token1.address, token2.address] const amountOut = await UniswapV2RouterContract.getAmountsOut(amountInWei, path) const amountOutMinHex = amountOut[1]._hex const to = UniswapV2RouterAddress const deadline = Date.now() 1000 * 60 * 10 const tx = await UniswapV2RouterContract.swapExactTokensForTokens( amountInHex, amountOutMinHex, path, to, deadline ) const receipt = await tx.await() console.log(`Transaction hash: ${tx.hash}`) console.log(`Transaction was mined in block ${receipt.blockNumber}`) } init()
Когда я пытаюсь запустить его, он выдает ошибку:
UnhandledPromiseRejectionWarning: Error: invalid BigNumber value (argument="value", value=undefined, code=INVALID_ARGUMENT, version=bignumber/5.5.0)
при попытке выполнить
UniswapV2RouterContract.swapExactTokensForTokens
Я не могу понять, почему. Насколько я понимаю, мне нужно указать значения в шестнадцатеричном формате, поэтому я их преобразовал. Я также попытался указать значения для amountIn
и «amountOut` в wei и в десятичных дробях и попытался обернуть их строкой(). Ничто не помогает. Я всегда получаю одну и ту же ошибку. Что я упускаю?
Комментарии:
1. Моим первым предположением было бы переполнение типа одной из ваших переменных.