// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract OtherContract {
uint256 private _x = 0;
event Log(uint amount, uint gas);
function getBalance() view public returns(uint){
return address(this).balance;
}
function setX(uint256 x) external payable {
_x = x;
if (msg.value > 0) {
emit Log(msg.value, gasleft());
}
}
function getX() external view returns(uint x){
x = _x;
}
}
contract CallContract {
// 1.传入目标合约地址,生成目标合约的引用,然后调用目标函数
function callSetX(address _Address, uint256 x) external {
OtherContract(_Address).setX(x);
}
// 2.传入合约变量,把address类型变为目标合约名,OtherContract _Address底层类型仍然是address
function callGetX(OtherContract _Address) external view returns(uint x){
x = _Address.getX();
}
// 2.创建合约变量,可以创建合约变量,然后通过它来调用目标函数
function callGetX2(address _Address) external view returns(uint x){
// 给变量oc存储了OtherContract合约的引用
OtherContract oc = OtherContract(_Address);
x = oc.getX();
}
// 调用合约并发送eth
function setXTransferETH(address otherContract, uint256 x) payable external{
OtherContract(otherContract).setX{value: msg.value}(x);
}
}