No se puede depositar ether en un contrato

Traté de crear un contrato básico a partir de algunos recursos, pero no pude depositar el éter en este contrato. El siguiente es mi código, ¿es correcto que "msg.value" y "address(this).balance" sean 0 en cualquier momento? Si es así, ¿cómo puedo enviar ether a otra dirección? Si no es así, ¿cómo depositar dinero en un método correcto?

// can get balance
function getOnesBalance(address addr) public view returns (uint){
    return addr.balance;
}

// can get balance
function getMyBalance() public view returns (uint){
    return msg.sender.balance;
}

// 0
function getMyBalance2() public view returns (uint){
    return msg.value;
}
// 0
function getMyBalance3() public view returns (uint){
    return address(this).balance;
}

function deposit(uint _money) public payable {}

function getContractAddr() public view returns (address){
    return msg.sender;
}

function() payable {}
¿Cómo estás transfiriendo ether al contrato? Presumiblemente, está invocando deposito la función de respaldo. ¿Estás haciendo eso a través de un código? Si es así, ¿puedes compartir ese código? Si no, ¿puede decirnos cómo está transfiriendo el éter?
getContractAddr()es incorrecto, devolverá la dirección del que llamó a la función.

Respuestas (1)

¿Es correcto que "msg.value" y "address(this).balance" sean 0 en cualquier momento?

Sí, msg.valuedepende de cada transacción. Mientras que address(this).balance devolverá el saldo almacenado en la dirección del contrato.

msg.valuees el número de wei enviado con la transacción.

El contrato que se proporciona a continuación le permitirá depositar ether y luego obtener la información de quién depositó cuánto:

contract MyContract {
    mapping(address => uint256) balances;

    function getOnesBalance(address addr) public view returns (uint){
        return balances[addr];
    }
    function getMyBalance() public view returns (uint){
        return balances[msg.sender];
    }
    function getContractBalance() public view returns (uint){
        return address(this).balance;
    }
    function getContractAddress() public view returns (address){
        return address(this)
    }
    function deposit() public payable {balances[msg.sender]+=msg.value;}
    function() public payable {deposit();}
}

Las correcciones realizadas son las siguientes:

  • deposit: Esta función se usará para enviar ether al contrato
  • function() public payable {deposit();}: Esta es la función alternativa que se ejecuta cada vez que el contrato recibe ether.
  • balances[]: Debe almacenar el éter depositado por alguien en una variable diferente. Aquí estamos almacenando en el mapeo llamadobalances
  • getMyBalance: Esta función devolverá la cantidad de éter depositada por la persona que llama a esta función.
  • getContractAddress: la dirección del contrato se recupera utilizando address(this).