xx.method_name(arg1,arg2)

正常的调用函数方式,xx需要是一个已定义的interface/contract,返回值就是被调用函数返回数据,当被调用函数发生revert时,当前调用也会自动revert。

transfer(value)

相当于data被设为空的函数调用,当发送的Transaction被revert时,会自动revert。

send(value)

相当于data被设为空的call,当发送的Transaction被revert时,不会自动revert,而是返回true/false表示Transaction结果。


低级调用

所有的低级调用返回值都类似(bool success, bytes memory result) ,success表示Transaction是否发生回滚,result中保留着返回数据,可以通过abi.decode抽取返回数据,例如:

(uint a, uint b) = abi.decode(result, (uint, uint));

注意,如果目标地址extcodesize为0,低级调用会正常返回,不会revert,参考 ‣

call

低级形式的函数调用方法,需要提供Transaction的data:

(bool success, bytes memory result) = addr.call(data);

其中data可以通过abi.encodeWithSignature来编码:

abi.encodeWithSignature("myFunction(uint256,address)", 10, msg.sender)

staticcall

要求被调用函数是view的,不能修改evm状态。