Не могу внести эфир в контракт

Я пытался построить базовый контракт из некоторых ресурсов, но не смог внести эфир в этот контракт. Ниже приведен мой код, правильно ли, что «msg.value» и «address(this).balance» равны 0 в любое время? Если да, то как я могу отправить эфир на другой адрес? Если нет, то как правильно внести деньги?

// 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 {}
Как вы переводите эфир на контракт? Предположительно, вы вызываете либо depositрезервную функцию. Вы делаете это через код? Если да, можете ли вы поделиться этим кодом? Если нет, можете ли вы рассказать нам, как вы передаете эфир?
getContractAddr()неверно, он вернет адрес того, кто вызвал функцию.

Ответы (1)

правильно ли, что "msg.value" и "address(this).balance" равны 0 в любое время?

Да, msg.valueзависит от каждой транзакции. В то время как address(this).balance вернет баланс, хранящийся по адресу контракта.

msg.valueэто количество wei, отправленное с транзакцией.

Контракт, приведенный ниже, позволит вам внести на него эфир, а затем получить информацию, кто сколько внес:

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();}
}

Проделанные исправления заключаются в следующем:

  • deposit: Эта функция будет использоваться для отправки эфира на контракт
  • function() public payable {deposit();}: это резервная функция, которая выполняется всякий раз, когда контракт получает эфир.
  • balances[]: Вам нужно хранить эфир, депонированный кем-то, в другой переменной. Здесь мы храним в отображении с именемbalances
  • getMyBalance: эта функция вернет количество эфира, депонированного человеком, вызвавшим эту функцию.
  • getContractAddress: адрес контракта извлекается с помощью address(this).