首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用应付款函数并从合同余额中支付?

如何调用应付款函数并从合同余额中支付?
EN

Ethereum用户
提问于 2022-03-12 19:00:45
回答 3查看 2.9K关注 0票数 0

第一,这不是与这些问题重复的问题:

我想知道是否可以从合同A中的非付款功能调用合同B中的应付款函数,从合同A的余额中支付,而不是从调用方调用。

这样,呼叫方将是“免费”的,合同将承担支付第二个应付款功能的费用。

我尝试在调用请求中使用{value: amount},但这似乎是从调用方获得资金,而不是从合同余额中获取资金。

谢谢你!!

EN

回答 3

Ethereum用户

发布于 2022-03-12 22:10:46

这只是一个纯粹的猜想,但我知道可以调用一个值为0的应付款函数。因此,应该有可能做你所描述的事情。你应该在remix.ethereum.org上试一试

票数 0
EN

Ethereum用户

发布于 2022-03-12 23:46:51

是的,这是可能的,这里有一个例子:我已经部署了我的第一个合同TestPayable,它包含一个需要一个乙醚的payableFunction

代码语言:javascript
复制
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之前发送了几个以太。

代码语言:javascript
复制
   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,它从TestPayable调用payableFunction(),增加TestPayable的余额,减少CallPayable余额。

希望它能帮上忙

票数 0
EN

Ethereum用户

发布于 2022-03-14 12:46:23

哇,非常感谢你的回答,它成功了。我不知道我以前在做什么,因为我想我也在做同样的事情:S

我扩大了你的例子,这是对的吗?

代码语言:javascript
复制
interface ITestPayable {
    function payableFunction() payable external;
}

contract CallPayable {

receive() payable external {
    
}

// This function pays from the caller: msg.value
function callPayableFunction(address contractAddress) external payable {
    require(msg.value >= 1 ether);
    
    ITestPayable (contractAddress).payableFunction{value: 1 ether}();
}

// This function pays from this contract balance
function callPayableFunction(address contractAddress) external {
    ITestPayable (contractAddress).payableFunction{value: 1 ether}();
}

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

}

在上面的代码中,有两个函数调用第二个合同应付函数:

  • 其中之一也是可支付的,因此它将从msg.value支付。
  • 另一笔不支付,因此它将从合同余额中支付。

这种理解是正确的吗?

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/123676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档