Я написал смартконтракт, который должен при получении на свой адрес денег
автоматически переводить 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;
}
}
Спасибо, что прочитали.