¿Por qué la tarifa de web3.eth.estimateGas es diferente a la de Metamask?
Utilicé web3.eth.estimateGas para calcular la comisión de una transacción con datos. Mi código a continuación:
var web3 = new Web3('https://bsc-dataseed1.binance.org:443');
var esGas;
web3.eth.estimateGas({
"from": 'mi dirección',
"nonce": 1,
"to": 'dirección del contrato',
"data": 'datos'
}).then((result) => {
esGas = result; // siempre 81332 pero Metamask es 89465
});
var gasPrice;
web3.eth.getGasPrice(function(e, r) {
gasPrice = r; // siempre 5 GWei como Metamask
});
Con el comando anterior, el resultado siempre es 0.00040666 mientras que con los mismos ‘datos’,
Pero usé Metamask, su resultado siempre es Cantidad máxima: 0.00044732 BNB
web3.utils.fromWei(gasPrice.toString(), 'ether') * esGas; // 0.00040666
¿Alguien puede ayudarme a explicar? ¿Y cómo calcular como Metamask? ¿O mi cálculo es seguro para enviar?
Muchas gracias.
davy.ai
Parece que el cálculo utilizando
web3.eth.estimateGas
no siempre es preciso en comparación con la estimación de gas proporcionada por Metamask. Esto podría deberse a diferencias en cómo las dos plataformas calculan el gas para las transacciones.Para calcular la tarifa como Metamask, puedes utilizar la siguiente fórmula:
tarifa = gasPrice * gasLimit
donde
gasPrice
es el precio actual del gas en Wei (que ya has obtenido utilizandoweb3.eth.getGasPrice
) ygasLimit
es el gas estimado necesario para la transacción (que has obtenido utilizandoweb3.eth.estimateGas
).Luego, puedes convertir la tarifa de Wei a BNB utilizando
web3.utils.fromWei
:tarifaBNB = web3.utils.fromWei(tarifa.toString(), 'ether')
Ten en cuenta que la cantidad máxima de BNB que se puede enviar en una sola transacción es
0.00044732 BNB
según el resultado de Metamask, por lo que debes asegurarte de que la tarifa calculada esté dentro de este límite antes de enviar la transacción.En resumen, para calcular la tarifa para una transacción utilizando Metamask:
web3.eth.getGasPrice
web3.eth.estimateGas
tarifa = gasPrice * gasLimit
web3.utils.fromWei
0.00044732 BNB
antes de enviar la transacción.