编译器
0.8.18+commit.87f61d96
文件 1 的 7:IModuleCalls.sol
pragma solidity 0.8.18;
interface IModuleCalls {
event TxFailed(bytes32 indexed _tx, uint256 _index, bytes _reason);
event TxExecuted(bytes32 indexed _tx, uint256 _index);
error NotEnoughGas(uint256 _index, uint256 _requested, uint256 _available);
error InvalidSignature(bytes32 _hash, bytes _signature);
struct Transaction {
bool delegateCall;
bool revertOnError;
uint256 gasLimit;
address target;
uint256 value;
bytes data;
}
function execute(
Transaction[] calldata _txs,
uint256 _nonce,
bytes calldata _signature
) external;
function selfExecute(
Transaction[] calldata _txs
) external;
}
文件 2 的 7:ModuleNonce.sol
pragma solidity 0.8.18;
import "./ModuleStorage.sol";
import "./submodules/nonce/SubModuleNonce.sol";
contract ModuleNonce {
event NonceChange(uint256 _space, uint256 _newNonce);
error BadNonce(uint256 _space, uint256 _provided, uint256 _current);
bytes32 private constant NONCE_KEY = bytes32(0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e);
function nonce() external virtual view returns (uint256) {
return readNonce(0);
}
function readNonce(uint256 _space) public virtual view returns (uint256) {
return uint256(ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)));
}
function _writeNonce(uint256 _space, uint256 _nonce) internal {
ModuleStorage.writeBytes32Map(NONCE_KEY, bytes32(_space), bytes32(_nonce));
}
function _validateNonce(uint256 _rawNonce) internal virtual {
(uint256 space, uint256 providedNonce) = SubModuleNonce.decodeNonce(_rawNonce);
uint256 currentNonce = readNonce(space);
if (currentNonce != providedNonce) {
revert BadNonce(space, providedNonce, currentNonce);
}
unchecked {
uint256 newNonce = providedNonce + 1;
_writeNonce(space, newNonce);
emit NonceChange(space, newNonce);
return;
}
}
}
文件 3 的 7:ModuleStorage.sol
pragma solidity 0.8.18;
library ModuleStorage {
function writeBytes32(bytes32 _key, bytes32 _val) internal {
assembly { sstore(_key, _val) }
}
function readBytes32(bytes32 _key) internal view returns (bytes32 val) {
assembly { val := sload(_key) }
}
function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) internal {
bytes32 key = keccak256(abi.encode(_key, _subKey));
assembly { sstore(key, _val) }
}
function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {
bytes32 key = keccak256(abi.encode(_key, _subKey));
assembly { val := sload(key) }
}
}
文件 4 的 7:MultiCallUtils.sol
pragma solidity 0.8.18;
import "../commons/interfaces/IModuleCalls.sol";
contract MultiCallUtils {
error DelegateCallNotAllowed(uint256 _index);
error CallReverted(uint256 _index, bytes _result);
function multiCall(
IModuleCalls.Transaction[] memory _txs
) public payable returns (
bool[] memory _successes,
bytes[] memory _results
) {
_successes = new bool[](_txs.length);
_results = new bytes[](_txs.length);
for (uint256 i = 0; i < _txs.length; i++) {
IModuleCalls.Transaction memory transaction = _txs[i];
if (transaction.delegateCall) revert DelegateCallNotAllowed(i);
if (gasleft() < transaction.gasLimit) revert IModuleCalls.NotEnoughGas(i, transaction.gasLimit, gasleft());
(_successes[i], _results[i]) = transaction.target.call{
value: transaction.value,
gas: transaction.gasLimit == 0 ? gasleft() : transaction.gasLimit
}(transaction.data);
if (!_successes[i] && _txs[i].revertOnError) revert CallReverted(i, _results[i]);
}
}
function callBlockhash(uint256 _i) external view returns (bytes32) {
return blockhash(_i);
}
function callCoinbase() external view returns (address) {
return block.coinbase;
}
function callDifficulty() external view returns (uint256) {
return block.prevrandao;
}
function callPrevrandao() external view returns (uint256) {
return block.prevrandao;
}
function callGasLimit() external view returns (uint256) {
return block.gaslimit;
}
function callBlockNumber() external view returns (uint256) {
return block.number;
}
function callTimestamp() external view returns (uint256) {
return block.timestamp;
}
function callGasLeft() external view returns (uint256) {
return gasleft();
}
function callGasPrice() external view returns (uint256) {
return tx.gasprice;
}
function callOrigin() external view returns (address) {
return tx.origin;
}
function callBalanceOf(address _addr) external view returns (uint256) {
return _addr.balance;
}
function callCodeSize(address _addr) external view returns (uint256 size) {
assembly { size := extcodesize(_addr) }
}
function callCode(address _addr) external view returns (bytes memory code) {
assembly {
let size := extcodesize(_addr)
code := mload(0x40)
mstore(0x40, add(code, and(add(add(size, 0x20), 0x1f), not(0x1f))))
mstore(code, size)
extcodecopy(_addr, add(code, 0x20), 0, size)
}
}
function callCodeHash(address _addr) external view returns (bytes32 codeHash) {
assembly { codeHash := extcodehash(_addr) }
}
function callChainId() external view returns (uint256 id) {
assembly { id := chainid() }
}
}
文件 5 的 7:RequireUtils.sol
pragma solidity 0.8.18;
import "../commons/ModuleNonce.sol";
import "../commons/submodules/nonce/SubModuleNonce.sol";
contract RequireUtils {
function requireNonExpired(uint256 _expiration) external view {
require(block.timestamp < _expiration, "RequireUtils#requireNonExpired: EXPIRED");
}
function requireMinNonce(address _wallet, uint256 _nonce) external view {
(uint256 space, uint256 nonce) = SubModuleNonce.decodeNonce(_nonce);
uint256 currentNonce = ModuleNonce(_wallet).readNonce(space);
require(currentNonce >= nonce, "RequireUtils#requireMinNonce: NONCE_BELOW_REQUIRED");
}
}
文件 6 的 7:SequenceUtils.sol
pragma solidity 0.8.18;
import "./MultiCallUtils.sol";
import "./RequireUtils.sol";
contract SequenceUtils is
MultiCallUtils,
RequireUtils
{ }
文件 7 的 7:SubModuleNonce.sol
pragma solidity 0.8.18;
library SubModuleNonce {
uint256 internal constant NONCE_BITS = 96;
bytes32 internal constant NONCE_MASK = bytes32(uint256(type(uint96).max));
function decodeNonce(uint256 _rawNonce) internal pure returns (
uint256 _space,
uint256 _nonce
) {
unchecked {
_space = _rawNonce >> NONCE_BITS;
_nonce = uint256(bytes32(_rawNonce) & NONCE_MASK);
}
}
}
{
"compilationTarget": {
"contracts/modules/utils/SequenceUtils.sol": "SequenceUtils"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 500000
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"_result","type":"bytes"}],"name":"CallReverted","type":"error"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"DelegateCallNotAllowed","type":"error"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_requested","type":"uint256"},{"internalType":"uint256","name":"_available","type":"uint256"}],"name":"NotEnoughGas","type":"error"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"callBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"}],"name":"callBlockhash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callChainId","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"callCode","outputs":[{"internalType":"bytes","name":"code","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"callCodeHash","outputs":[{"internalType":"bytes32","name":"codeHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"callCodeSize","outputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callCoinbase","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callDifficulty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callGasLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callGasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callOrigin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callPrevrandao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"delegateCall","type":"bool"},{"internalType":"bool","name":"revertOnError","type":"bool"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IModuleCalls.Transaction[]","name":"_txs","type":"tuple[]"}],"name":"multiCall","outputs":[{"internalType":"bool[]","name":"_successes","type":"bool[]"},{"internalType":"bytes[]","name":"_results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"requireMinNonce","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"requireNonExpired","outputs":[],"stateMutability":"view","type":"function"}]