es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo el error “Valor de BigNumber no válido” al intentar realizar un intercambio con swapExactTokensForTokens.

Estoy intentando construir una aplicación Node.js que intercambiará tokens a través del contrato del enrutador de un dex similar a Uniswap (llamado Ubeswap, un fork de Uniswapv2 en Celo).

He intentado varios enfoques y ninguno funciona por ahora.

Aquí está el código de la función que he construido:

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



// Configuración de la cadena
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);

// Configuración de la billetera
const targetAccount = JSON.parse(fs.readFileSync('ruta al archivo con clave privada', 'utf-8'))
const privateKey = Buffer.from(targetAccount.privateKey, 'hex')
const signer = new ethers.Wallet(privateKey)
const account = signer.connect(customHttpProvider)


customHttpProvider.getBlockNumber().then((result) => {
    console.log("Número de bloque actual: " + result);
});

// Token para los tokens en los que estamos interesados
const celoAddressAlfa = '0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9'
const cusdAddressAlfa = '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1';


const UniswapV2RouterAddress = '0xE3D8bd6Aed4F159bc8000a9cD47CffDb95F96121'
const UniswapV2RouterABI = [abi eliminada para ahorrar espacio]
const UniswapV2RouterContract = new ethers.Contract(UniswapV2RouterAddress, UniswapV2RouterABI, account)


    const init = async () => {
    // Obtenemos información sobre tokens y pares
    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(`Hash de transacción: ${tx.hash}`)
    console.log(`La transacción se minó en el bloque ${receipt.blockNumber}`)
}

init()

Cuando intento ejecutarlo, arroja un error:

UnhandledPromiseRejectionWarning: Error: invalid BigNumber value (argument="value", value=undefined, code=INVALID_ARGUMENT, version=bignumber/5.5.0) 

cuando intenta ejecutar el UniswapV2RouterContract.swapExactTokensForTokens

No puedo entender por qué. Según entiendo, tengo que proporcionar los valores en hexadecimal, así que los he convertido. También he intentado proporcionar valores para amountIn y amountOut en wei y en decimales, y he intentado envolverlos con string(). Nada funciona. Siempre obtengo exactamente el mismo error. ¿Qué me falta?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Basándose en el mensaje de error, parece que el problema está relacionado con el valor de BigNumber que se está proporcionando a la función “swapExactTokensForTokens”. Específicamente, parece que los valores “amountInHex” y “amountOutMinHex” no están definidos cuando se pasan a la función.

    Un posible problema es la concatenación de cadenas que se usa para definir el valor “amountInHex”:

    const amountInHex = web3.utils.toHex('amountInWei')

    Dado que “amountInWei” ya es una cadena, no debe estar entre comillas. En su lugar, la línea debería leerse así:

    const amountInHex = web3.utils.toHex(amountInWei)

    De igual manera, asegúrese de que “amountOutMinHex” tenga el valor correcto antes de pasarlo a la función.

    Si estos cambios no resuelven el problema, asegúrese de que todos los demás valores que se pasan a la función (como “path”, “to” y “deadline”) sean correctos y estén formateados adecuadamente. Verifique el ABI del contrato UniswapV2Router para asegurarse de que los parámetros de la función coincidan con los tipos y el orden esperados.

    Si el problema persiste, puede resultar útil registrar los valores de “amountInHex”, “amountOutMinHex” y cualquier otra variable relevante justo antes de pasarlos a la función para depurar el problema.

Comments are closed.