@konstantinst13

Почему в Solidity метод в receive() external payable{this.withdrawFunds();} не вызывается?

Я написал смартконтракт, который должен при получении на свой адрес денег автоматически переводить 50% на 1ый адрес кошелька, 25% - на второй, 25% - на третий. Почему-то он автоматически этого не делает.

Я использую Remix IDE. Я нажал Compile в левой вкладке Solidity Compiler, потом перешёл в Deploy & Run transactions, удалил задеплоенные контракты, написал наверху в value 1 (выбрал сбоку ether вместо wei) и по новой задеплоил этот контракт.
1 эфир списался с выбранного кошелька и перешёл на счёт контракта (я это узнал с помощью функции getBalance), но деньги не перевелись на нужные адреса кошельков. Чтобы деньги перевелись, приходится внизу нажимать на кнопку withdrawFunds (то есть нужно вызвать эту функцию).
Я написал receive() external payable{this.withdrawFunds();}, ожидая, что из-за этой строчки контракт при получении сам будет переводить деньги.
Но почему-то это не работает. Мне нужно чтобы контракт сам переводил деньги.

Контракт:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Demo {
        constructor() payable{}
        receive() external payable{this.withdrawFunds();} //почему-то не работает            

        function sendValue(address payable recipient, uint256 amount) internal {
                require(address(this).balance >= amount, "Address: insufficient balance");

                (bool success, ) = recipient.call{value: amount}("");
                require(success, "Address: unable to send value, recipient may have reverted");
            }

        function withdrawFunds() external payable{
            address addr1 = 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;
            address addr2 = 0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
            address addr3 = 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB;

            //address target = payable(_to);
            address payable wallet1 = payable(addr1); //первый адрес для Украины
            address payable wallet2 = payable(addr2); //второй адрес для Украины
            address payable wallet3 = payable(addr3); //мой другой адрес

            this.getBalance();

            uint _50 = address(this).balance*50/100; //50% of balance of contract
            uint _25 = address(this).balance*25/100; //25% of balance of contract
            uint s_25 = address(this).balance*25/100; //25% of balance of contract

            //wallet1.transfer(_50);
            //wallet2.transfer(_25);
            //wallet3.transfer(s_25);

	    sendValue(wallet1, _50);
	    sendValue(wallet2, _25);
	    sendValue(wallet3, s_25);	
        }

        function receiveFunds() external payable {}

        function getBalance() public view returns(uint){
            return address(this).balance;
        }

        function getMsgValue() public payable returns(uint){
            return msg.value;
        }
}


Спасибо, что прочитали.
  • Вопрос задан
  • 181 просмотр
Пригласить эксперта
Ответы на вопрос 1
@wonderingpeanut
Привет. Пожалуйста.

В солидити не нужен кийворд this для вызова функций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы