// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
/*
Warning: This contract has a payable fallback function, but no receive ether function. Consider adding a receive ether function.
这里会有一个警告,意思是使用了支付,但是没有接受支付的功能,所以要添加一个
*/
//合约的abi调用方式
contract mast {
string xingxi;
uint zhi;
//接受支付
receive() external payable { }
//开启一个事件记录信息
event log(string xingxi);
//还需要考虑一个,如果调用不存在的函数,我们要使用fallback
fallback() external payable {
emit log("not the function");
}
//传入两个参数,一个信息,一个值,返回状态和值
function fun(string memory msgInfo, uint vue) external payable returns (bool,uint) {
xingxi \= msgInfo;
zhi \= vue;
return (true,zhi);
}
}
//创建一个调用mast合约的级
contract callMast {
uint public num;
//首先,要使用abi,我们要确认一个地址,然后带上gas,也可以带上币
function callFun(address weAdd) external{
//调用后,,会有两个返回,布尔值和data集
(bool isok, bytes memory data) \= weAdd.call(abi.encodeWithSignature("fun(string,uint256)", "send msg",123));
//(bool isok, bytes memory data) = weAdd.call{value:123,gas:20000}(abi.encodeWithSignature("fun(string,uint256)", "send msg",123));
//如果调用失败,会返回错误码和错误信息
require(isok);
//如果调用成功,返回值是data集
(bool isok2, uint vue) \= abi.decode(data, (bool,uint256));
//如果调用成功,返回的值是vue,如果调用失败,返回false
require(isok2);
num \= vue;
}
}