¿Cómo puedo depurar el error de tiempo de ejecución cuando llamo al método contract.transfer en Solidity?
He lanzado una red privada desde Ganache y estoy usando Truffle para implementar mi contrato en la red. La implementación funciona bien y puedo llamar a algunos métodos del contrato. Pero obtuve un error al intentar transferir éter a otra cuenta.
Mi código de contrato es:
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.4;
pragma experimental ABIEncoderV2;
contract Ledger {
mapping(address => uint256) balances;
address payable owner;
event Transfered(address _from, address _to, uint256 amount);
constructor() {
owner = payable(msg.sender);
balances[tx.origin] = 10000;
}
function sendCoin(address payable receiver, uint256 amount)
payable public
returns (bool sufficient)
{
require(msg.sender == owner);
if (balances[msg.sender] < amount) return false;
balances[msg.sender] -= amount;
balances[receiver] += amount;
receiver.transfer(amount);
emit Transfered(msg.sender, receiver, amount);
return true;
}
function getBalance(address addr) public view returns (uint256) {
return balances[addr];
}
function getBalanceInCoin(address addr)
public
view
returns (uint256)
{
return convert(getBalance(addr), 100);
}
function convert(uint256 amount, uint256 conversionRate)
public
pure
returns (uint256 convertedAmount)
{
return amount * conversionRate;
}
}
Cuando lo ejecuto en la consola de truffle
:
truffle(development)> let ledger = await Ledger.deployed()
truffle(development)> let accounts = await web3.eth.getAccounts()
truffle(development)> (await ledger.sendCoin(accounts[1], 50))
Uncaught Error: Returned error: VM Exception while processing transaction: revert
Como se puede ver arriba, hay errores que provienen del método transfer
en el método sendCoin
. ¿Cómo sé de dónde proviene el error y cómo debo arreglarlo?
davy.ai
El mensaje de error devuelto por la máquina virtual (VM) es
VM Exception while processing transaction: revert
. Esto indica que la transacción falló y fue revertida por el contrato inteligente. El error podría haber sido causado por la sentenciarequire
en la funciónsendCoin
, que verifica si el remitente es el propietario del contrato. Si este requisito no se cumple, la transacción será revertida.Para solucionar este error, asegúrate de estar enviando la transacción como propietario del contrato. Puedes verificar la cuenta que estás utilizando actualmente llamando a
web3.eth.getAccounts()
. Si no estás utilizando la cuenta correcta, puedes cambiarla llamando aweb3.eth.defaultAccount = yourAccountAddress
.También puedes agregar algunas declaraciones de registro a tu código para ayudarte a identificar dónde se está produciendo el error. Por ejemplo, puedes agregar una declaración de
console.log
antes de la sentenciarequire
para imprimir la dirección del remitente y la del propietario:Esto imprimirá la dirección del remitente y del propietario en la consola cada vez que se llame a la función
sendCoin
. Puedes usar esta información para identificar la causa del error.