Solidity

為什麼在 Solidity 中沒有呼叫 receive() external paid{this.withdraw Funds();} 中的方法?

  • March 28, 2022

我寫了一個智能合約,當收到錢到我的地址時,應該自動將 50% 轉移到第一個錢包地址,25% 到第二個,25% 到第三個。由於某種原因,它不會自動執行。

我正在使用混音 IDE。我在 Solidity Compiler 的左側選項卡中點擊 Compile,然後轉到 Deploy & Run transactions,刪除已部署的合約,在頂部寫入 value 1(選擇 ether 而不是 wei)並將此合約部署到新合約上.

1 ether 從選定的錢包中扣除並轉移到合約賬戶(我發現使用 getBalance 功能),但錢沒有轉移到所需的錢包地址。為了轉賬,你必須點擊下面的withdrawFunds按鈕(即你需要呼叫這個函式)。

我寫了receive() external paid{this.withdrawFunds();},期望因為這條線,契約本身會在收到時轉賬。但由於某種原因,它不起作用。我需要契約來自己轉賬。

契約:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Demo {
       constructor() payable{}
       receive() external payable{this.withdrawFunds();}

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

           address payable wallet1 = payable(addr1);
           address payable wallet2 = payable(addr2);
           address payable wallet3 = payable(addr3);

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

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

       function receiveFunds() external payable {}
}

接收回退功能將在普通的乙太幣轉賬中執行

(例如通過 .send() 或 .transfer())。你receiveFunds()打電話不會觸發receive(),這就是為什麼轉移永遠不會發生。

引用自:https://ethereum.stackexchange.com/questions/124843