Estoy intentando usar un método de contrato en la red de prueba (ropsten), pero falla debido a este error:
razón: 'no se puede estimar el gas; la transacción puede fallar o puede requerir un límite de gas manual', código: 'UNPREDICTABLE_GAS_LIMIT'
Creé una instancia del contrato inteligente y quería llamarlo método de registro:
const registrationContract = new ethers.Contract(ADDRESS, abi, signer); const hashedDomain = utils.keccak256(utils.toUtf8Bytes(domain)); const register = await registrationContract.register(hashedDomain, walletAddress);¿ Ethers.js proporciona una función para establecer el límite en el contrato? ¿O se puede hacer esto de otra manera? No encontré uno en la documentación .
Puede establecer el límite de gas con un objeto como último argumento, para una transacción de transferencia simple, podría hacer algo como esto:
const tx = { to: toAddress, value: ethers.utils.parseEther(value), gasLimit: 50000, nonce: nonce || undefined, }; await signer.sendTransaction(tx);Si está realizando una transacción a un contrato inteligente, la idea es la misma, pero asegúrese de configurar el último parámetro en uno de sus métodos abi, por ejemplo:
const tx = await contract.safeTransferFrom(from, to, tokenId, amount, [], { gasLimit: 100000, nonce: nonce || undefined, });Esto puede corregir el error UNPREDICTABLE_GAS_LIMIT, ya que al informarlo manualmente, los éteres saltan una llamada al método rpc al proveedor que solicita el gas_limit calculado.
Complementando la respuesta, cuando define gasLimit manualmente, es importante comprender:
el valor configurado se reserva y se envía en llamada de contrato, por lo que la cuenta del llamante debe tener al menos ese valor en su billetera;
por supuesto, después de que se completa la transacción, el gas restante se devuelve a la billetera de la persona que llama;
entonces hay un problema cuando para la misma llamada de transacción, dependiendo por ejemplo de la cantidad de argumentos, tiene una amplia gama de posibilidades de valores de gas y, a veces, el valor establecido es muy alto y desproporcionado para transacciones de gas pequeñas.
Entonces, para solucionar este problema y establecer dinámicamente gasLimit, usó la función para estimar el gas de transacción (estimateGas) de Ethers y luego proporcionó un porcentaje de error de margen adicional.
Podría ser algo como esto donde gasMargin() calcula el gas final para pasar en la llamada tx (en este caso solo agrega 10%).
const gasEstimated = await registrationContract.estimateGas.register(hashedDomain, walletAddress); const register = await registrationContract.register(hashedDomain, walletAddress), { gasLimit: Math.ceil(gasMargin(gasEstimated, 1.1)) });