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.

¿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?

Tags:  , , , ,

Answer

  1. Avatar for 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 sentencia require en la función sendCoin, 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 a web3.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 sentencia require para imprimir la dirección del remitente y la del propietario:

    function sendCoin(address payable receiver, uint256 amount)
        payable public
        returns (bool sufficient)
    {
        // Agregar declaración de registro
        console.log("Remitente: ", msg.sender);
        console.log("Propietario: ", owner);
    
        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;
    }
    

    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.

Comments are closed.