Tengo un nodo de testnet local usando Hardhat. Puedo implementar y probar con éxito mi contrato usando javascript simple, async await y const { ethers, upgrades } = require("hardhat"); .
Estoy devolviendo correctamente e imprimiendo en la consola una matriz BigNumber con 2 elementos de una función de contrato.
Pero la llamada a la función useDapp devuelve un valor diferente.
He intentado todo: JSON.stringify(array) devuelve [[]] , array[0] devuelve indefinido, BigNumber.from(array).toNumber arroja un error de BigNumber loco, etc. Pero sé que el contrato le está dando el correcto valores.
¿Por qué obtengo 2 valores diferentes en 2 archivos javascript diferentes? Supongo que es un problema con la forma en que el archivo de prueba del casco está recuperando los valores frente a useDapp.
Mi enlace frontal de useDapp se ve así y devuelve [Array(0)] con length: 1 :
export function useGetArray(): BigNumber[] | undefined { const {value,error}: any = useCall({ contract: new Contract(myContract, myInterface), method: "getArray", args: [], }) ?? []; if(error) { return error; } else { return value; }; } Mi prueba de javascript de hardhat se ve así y devuelve [ BigNumber { value: "50" }, BigNumber { value: "129" } ] :
CONTRACT = await ethers.getContractFactory("CONTRACT"); const contract = await CONTRACT.attach("0x109d198fca64d33Bd9F33E60333A544412cfAC7D"); array = await contract.getArray(); console.log(array);Tenga en cuenta que otras 2 llamadas de función casi idénticas que usan useDapp, y una incluso pasa datos al contrato, funcionan completamente bien. Entonces, el problema no radica en la dirección que se usa o en la ABI importada.
Para cualquiera que esté muy confundido con esto, que estoy seguro de que será común en el futuro con los desarrolladores de contratos inteligentes de EVM, la prueba de red predeterminada de hardhat frente a la prueba contra una bifurcación de red principal devolverá diferentes tipos de números del contrato.
Por ejemplo, si usa archivos de prueba .js normales con la red predeterminada, devolver un uint256[] del contrato será un número entero normal.
Pero para la bifurcación de la red principal, devolver un uint256[] devolverá una matriz BigNumber , que javascript tiene problemas para desglosar. Necesitará un paquete BigNumber para trabajar con él. Parece que las interacciones de la bifurcación .js de la red principal requieren obtener el primer elemento de la matriz Array[0] , y dentro de ese elemento estará cada objeto BigNumber , que además debe decodificarse con algo como BigNumber.from(yourNumber).toNumber() .
Nota: en cuanto al envío de números al contrato, debe asegurarse de prestar atención a los decimales de un token cuando se trata de cualquier valor de token. Por ejemplo, si un token tiene 6 decimales programados en el contrato y desea enviar un valor al contrato que represente 600 monedas, debe enviar 600000000 (600 con 6 0 agregados) o BigNumber.from(600000000) . No estoy seguro de si convertirlo a un tipo BigNumber antes de enviarlo al contrato ahorra gasolina o algo así, porque la conversión está fuera de cadena, pero parece que puede enviar cualquier número al contrato. Solo debe asegurarse de agregar los 0 al final del número de acuerdo con el token con el que está trabajando.