import(引用)的引用方法
1.通过源文件相对位置导入,在solidity中,当你有多个文件并且想把一个文件导入文件时可以用import。
import'./someothercontract.sol';
// ./表示同一目录
contract newContract is SomeOtherContract{
}
这样当我们合约contract目录下有一名为.someothercontract.sol的文件它会被编译器导入
2.通过源文件网址导入网上的合约。
// 通过网址引用
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol';
3.通过npm的目录导入
import '@openzeppelin/contracts/access/Ownable.sol';
4.通过全局符号导入特定合约
import {NewContract} from './SomeOtherContract.sol';
5.引用(import
)在代码中的位置为:在声明版本号之后,在其余代码之前。
以简单合约OtherContract来调用
contract OtherContract {
uint256 private _x = 0; // 状态变量_x
// 收到eth的事件,记录amount和gas
event Log(uint amount, uint gas);
// 返回合约ETH余额
function getBalance() view public returns(uint) {
return address(this).balance;
}
// 可以调整状态变量_x的函数,并且可以往合约转ETH (payable)
function setX(uint256 x) external payable{
_x = x;
// 如果转入ETH,则释放Log事件
if(msg.value > 0){
emit Log(msg.value, gasleft());
}
}
// 读取_x
function getX() external view returns(uint x){
x = _x;
}
}
调用OtherContract合约
我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:_Name(_Address)
,其中_Name
是合约名,_Address
是合约地址。然后用合约的引用来调用它的函数:_Name(_Address).f()
,其中f()
是要调用的函数。
1.传入合约地址
我们可以在函数里传入目标合约地址,生成目标合约的引用,然后调用目标函数。以调用OtherContract
合约的setX
函数为例,我们在新合约中写一个callSetX
函数,传入已部署好的OtherContract
合约地址_Address
和setX
的参数x
:
function callSetX(address _Address, uint256 x) external{
OtherContract(_Address).setX(x);
}
2.传入合约变量
我们可以直接在函数里传入合约的引用,只需要把上面参数的address
类型改为目标合约名,比如OtherContract
。下面例子实现了调用目标合约的getX()
函数。注意该函数参数OtherContract _Address
底层类型仍然是address
,生成的ABI
中、调用callGetX
时传入的参数都是address
类型
function callGetX(OtherContract _Address) external view returns(uint x){
x = _Address.getX();
}
复制OtherContract
合约的地址,填入callGetX
函数的参数中,调用后成功获取x
的值
3.创建合约变量
我们可以创建合约变量,然后通过它来调用目标函数。下面例子,我们给变量oc
存储了OtherContract
合约的引用:
function callGetX2(address _Address) external view returns(uint x){
OtherContract oc = OtherContract(_Address);
x = oc.getX();
}
复制OtherContract
合约的地址,填入callGetX2
函数的参数中,调用后成功获取x
的值
4.调用合约并发送ETH
如果目标合约的函数是payable
的,那么我们可以通过调用它来给合约转账:_Name(_Address).f{value: _Value}()
,其中_Name
是合约名,_Address
是合约地址,f
是目标函数名,_Value
是要转的ETH
数额(以wei
为单位)。OtherContract
合约的setX
函数是payable
的,在下面这个例子中我们通过调用setX
来往目标合约转账。
function setXTransferETH(address otherContract, uint256 x) payable external{
OtherContract(otherContract).setX{value: msg.value}(x);
}
复制OtherContract
合约的地址,填入setXTransferETH
函数的参数中,并转入10ETH