這裡列舉是比較常用的其他歸類Utils
Counters
提供只能遞增、遞減或重置的計數器。可以用在元素數量、發布 ERC721 ID 或計算請求 ID。
current
計算到哪increment
遞增decrement
遞減reset
重新設定// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/utils/Counters.sol>";
contract CountersImpl {
using Counters for Counters.Counter;
Counters.Counter private _counter;
function current() public view returns (uint256) {
return _counter.current();
}
function increment() public {
_counter.increment();
}
function decrement() public {
_counter.decrement();
}
function reset() public {
_counter.reset();
}
}
Address
isContract(account)
是不是合約地址
sendValue(recipient, amount)
發送金額,錯誤時gas回收(小心使用)
functionCall(target, data)
呼叫目標合約的function
functionCall(target, data, errorMessage)
呼叫目標合約的function帶錯誤訊息
functionCallWithValue(target, data, value)
呼叫目標合約的function,設定eth 至少多少
functionCallWithValue(target, data, value, errorMessage)
呼叫目標合約的function,設定eth 至少多少,帶錯誤訊息
verifyCallResult(success, returndata, errorMessage)
驗證呼叫結果
還有兩個比較原理的呼叫
Static、Delegate
Static: 只能呼叫 view, prue 修飾詞的function
Delegate: msg.sender 一直沿用
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "<https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/utils/Address.sol>";
contract AddressImpl {
string public sharedAnswer;
event CallReturnValue(string data);
function isContract(address account) external view returns (bool) {
return Address.isContract(account);
}
function sendValue(address payable receiver, uint256 amount) external {
Address.sendValue(receiver, amount);
}
function functionCall(address target, bytes calldata data) external {
bytes memory returnData = Address.functionCall(target, data);
emit CallReturnValue(abi.decode(returnData, (string)));
}
function functionCallWithValue(
address target,
bytes calldata data,
uint256 value
) external payable {
bytes memory returnData = Address.functionCallWithValue(target, data, value);
emit CallReturnValue(abi.decode(returnData, (string)));
}
function functionStaticCall(address target, bytes calldata data) external {
bytes memory returnData = Address.functionStaticCall(target, data);
emit CallReturnValue(abi.decode(returnData, (string)));
}
function functionDelegateCall(address target, bytes calldata data) external {
bytes memory returnData = Address.functionDelegateCall(target, data);
emit CallReturnValue(abi.decode(returnData, (string)));
}
// sendValue's tests require the contract to hold Ether
receive() external payable {}
}
有任何問題可反饋: [email protected]