第一,这不是与这些问题重复的问题:
我想知道是否可以从合同A中的非付款功能调用合同B中的应付款函数,从合同A的余额中支付,而不是从调用方调用。
这样,呼叫方将是“免费”的,合同将承担支付第二个应付款功能的费用。
我尝试在调用请求中使用{value: amount},但这似乎是从调用方获得资金,而不是从合同余额中获取资金。
谢谢你!!
发布于 2022-03-12 22:10:46
这只是一个纯粹的猜想,但我知道可以调用一个值为0的应付款函数。因此,应该有可能做你所描述的事情。你应该在remix.ethereum.org上试一试
发布于 2022-03-12 23:46:51
是的,这是可能的,这里有一个例子:我已经部署了我的第一个合同TestPayable,它包含一个需要一个乙醚的payableFunction。
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,它从TestPayable调用payableFunction(),增加TestPayable的余额,减少CallPayable余额。
希望它能帮上忙
发布于 2022-03-14 12:46:23
哇,非常感谢你的回答,它成功了。我不知道我以前在做什么,因为我想我也在做同样的事情:S
我扩大了你的例子,这是对的吗?
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;
}}
在上面的代码中,有两个函数调用第二个合同应付函数:
这种理解是正确的吗?
https://ethereum.stackexchange.com/questions/123676
复制相似问题