Solidity

如何呼叫應付函式並從合約餘額中支付?

  • March 14, 2022

首先,這不是這些問題的重複問題:

我想知道是否可以從契約 A 中的非應付函式呼叫契約 B 中的應付函式,並從契約 A 的餘額而不是從呼叫者那裡支付。

這樣,呼叫對呼叫者來說是“免費的”,並且合約將承擔支付第二個應付函式的成本。

我試過{value: amount}在呼叫請求中使用,但這似乎是從呼叫者那裡獲得資金,而不是從契約餘額中。

謝謝!!

這只是純粹的猜想,但我知道可以呼叫值為 0 的應付函式。因此,應該可以執行您所描述的操作。你應該在 remix.ethereum.org 上嘗試一下

是的,有可能,這裡有一個例子:我已經部署了我的第一個合約TestPayable,其中包含一個payableFunction需要 1 個乙太幣的合約。

contract TestPayable {

   uint public count;

   function payableFunction() payable external {
       require(msg.value == 1 ether);
       count++;
   }

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

然後我有我的第二份契約CallPayable,我有一個接收功能,我在呼叫之前發送了一些乙太幣callPayableFunction

  interface ITestPayable {
       function payableFunction() payable external;
   }
   
   contract CallPayable {

   receive() payable external {
       
   }

   function callPayableFunction(address contractAddress) external {
       IPayable(contractAddress).payableFunction{value: 1 ether}();
   }

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

通過呼叫callPayableFunction,它payableFunction()從呼叫TestPayable,增加 的餘額TestPayable並減少CallPayable餘額。

希望能幫助到你

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