目录
uint256(numberType).toString()
一、通用需求
开源协议标识符:MIT
Solidity 编译器版本:不小于 0.8.16
二、自定义错误处理合约需求
Solidity文件名:CustomErrorDemo.sol
依赖的第三方solidity库:
import "@openzeppelin/contracts/utils/Strings.sol";
import "solidity-bytes-utils/contracts/BytesLib.sol";
合约名:CalleeContract、CallerContract
合约原型:
error NoPermission(address owner, address caller);
contract CalleeContract {
address owner;
uint8 calledTimes = 0;
constructor() {}
function callContract(address caller) public returns (uint8) {}
}
contract CallerContract {
CalleeContract calleeContract;
constructor(address calleeContractAddress) {}
function callContract() public returns (string memory returnString, bytes memory encodedErrorData) {}
}
-
NoPermission:自定义错误类型,参数为所有者地址,调用者地址。
-
CalleeContract.owner:被调用合约CalleeContract的成员变量,表示合约的拥有者,即谁部署的合约。
-
CalleeContract.calledTimes:被调用合约CalleeContract的成员变量,表示合约成员函数callContract被成功调用的次数。
-
CalleeContract.constructor:被调用合约CalleeContract的构造函数,记录部署合约的外部账户地址为。
-
CalleeContract.callContract:被调用合约CalleeContract的成员函数,如果函数的调用者不是合约所有者,则抛出自定义错误NoPermission,错误中包含合约的所有者、函数的调用者信息;如果函数的调用者是合约所有者,则将成员变量calledTimes的值加1。
-
CallerContract.calleeContract:调用合约CallerContract的成员变量,表示被调用合约。
-
CallerContract.constructor:调用合约CallerContract的构造函数,将参数calleeContractAddress转换为CalleeContract类
型并赋值给成员变量calleeContract,
-
CallerContract.callContract:调用合约CallerContract的成员函数。
此函数调用被调用合约的成员函数CalleeContract.callContract,参数为调用此函数的调用者地址。如果此函数的调用者是被调用合约CalleeContract的所有者,则根据CalleeContract.callContract函数的返回值得到5CalleeContract.callContract函数被成功调用的次数,并返回字符串” Success: calledTimes = X”,其中X为CalleeContract.callContract函数返回的被成功调用的次数;如果此函数的调用者不是被调用合约CalleeContract的所有者,则分析捕获到异常的底层数据,比较底层数据中的选择子是否等于NoPermission错误类型的选择子,相等则返回字符串” Failed: NoPermission owner = Y, caller = Z”,其中Y为所捕获异常底层数据中所携带的CalleeContract合约拥有者owner十六进制串表示的地址,Z为所捕获异常底层数据中所携带的此函数调用者caller十六进制串表示的地址,若不等于NoPermission错误类型的选择子则返回字符串”Failed: Other error.”
注:
1、合约代码中只能使用 penzeppelin 的 String 库提供的方法将整型值转换为字符串。
2、合约代码中只能使用 solidity-bytes-utils 的 BytesLib 提供的方法获取 bytes 类型的片段。


3731

被折叠的 条评论
为什么被折叠?



