Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 11919796 | 1487 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
SequenceUtils
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "./MultiCallUtils.sol"; import "./RequireUtils.sol"; contract SequenceUtils is MultiCallUtils, RequireUtils { constructor( address _factory, address _mainModule ) RequireUtils( _factory, _mainModule ) {} }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "../commons/interfaces/IModuleCalls.sol"; contract MultiCallUtils { 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]; require(!transaction.delegateCall, 'MultiCallUtils#multiCall: delegateCall not allowed'); require(gasleft() >= transaction.gasLimit, "MultiCallUtils#multiCall: NOT_ENOUGH_GAS"); // solhint-disable (_successes[i], _results[i]) = transaction.target.call{ value: transaction.value, gas: transaction.gasLimit == 0 ? gasleft() : transaction.gasLimit }(transaction.data); // solhint-enable require(_successes[i] || !_txs[i].revertOnError, 'MultiCallUtils#multiCall: CALL_REVERTED'); } } // /// // Globals // /// 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.difficulty; } function callGasLimit() external view returns (uint256) { return block.gaslimit; } function callBlockNumber() external view returns (uint256) { return block.gaslimit; } 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 pure returns (uint256 id) { assembly { id := chainid() } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "../commons/interfaces/IModuleCalls.sol"; import "../commons/interfaces/IModuleAuthUpgradable.sol"; import "../../interfaces/IERC1271Wallet.sol"; import "../../utils/SignatureValidator.sol"; import "../../utils/LibBytes.sol"; import "../../Wallet.sol"; contract RequireUtils is SignatureValidator { using LibBytes for bytes; uint256 private constant NONCE_BITS = 96; bytes32 private constant NONCE_MASK = bytes32((1 << NONCE_BITS) - 1); uint256 private constant FLAG_SIGNATURE = 0; uint256 private constant FLAG_ADDRESS = 1; bytes32 private immutable INIT_CODE_HASH; address private immutable FACTORY; struct Member { uint256 weight; address signer; } event RequiredConfig( address indexed _wallet, bytes32 indexed _imageHash, uint256 _threshold, bytes _signers ); event RequiredSigner( address indexed _wallet, address indexed _signer ); mapping(address => uint256) public lastSignerUpdate; mapping(address => uint256) public lastWalletUpdate; constructor(address _factory, address _mainModule) public { FACTORY = _factory; INIT_CODE_HASH = keccak256(abi.encodePacked(Wallet.creationCode, uint256(_mainModule))); } /** * @notice Publishes the current configuration of a Sequence wallets using logs * @dev Used for fast lookup of a wallet configuration based on its image-hash, compatible with updated and counter-factual wallets. * * @param _wallet Sequence wallet * @param _threshold Thershold of the current configuration * @param _members Members of the current configuration * @param _index True if an index in contract-storage is desired */ function publishConfig( address _wallet, uint256 _threshold, Member[] calldata _members, bool _index ) external { // Compute expected imageHash bytes32 imageHash = bytes32(uint256(_threshold)); for (uint256 i = 0; i < _members.length; i++) { imageHash = keccak256(abi.encode(imageHash, _members[i].weight, _members[i].signer)); } // Check against wallet imageHash (bool succeed, bytes memory data) = _wallet.call(abi.encodePacked(IModuleAuthUpgradable(_wallet).imageHash.selector)); if (succeed && data.length == 32) { // Check contract defined bytes32 currentImageHash = abi.decode(data, (bytes32)); require(currentImageHash == imageHash, "RequireUtils#publishConfig: UNEXPECTED_IMAGE_HASH"); } else { // Check counter-factual require(address( uint256( keccak256( abi.encodePacked( byte(0xff), FACTORY, imageHash, INIT_CODE_HASH ) ) ) ) == _wallet, "RequireUtils#publishConfig: UNEXPECTED_COUNTERFACTUAL_IMAGE_HASH"); } // Emit event for easy config retrieval emit RequiredConfig(_wallet, imageHash, _threshold, abi.encode(_members)); if (_index) { // Register last event for given wallet lastWalletUpdate[_wallet] = block.number; } } /** * @notice Publishes the configuration and set of signers for a counter-factual Sequence wallets using logs * @dev Used for fast lookup of a wallet based on its signer members, only signing members are included in the logs * as a mechanism to avoid poisoning of the directory of wallets. * * Only the initial counter-factual configuration can be published, to publish updated configurations see `publishConfig`. * * @param _wallet Sequence wallet * @param _hash Any hash signed by the wallet * @param _sizeMembers Number of members on the counter-factual configuration * @param _signature Signature for the given hash * @param _index True if an index in contract-storage is desired */ function publishInitialSigners( address _wallet, bytes32 _hash, uint256 _sizeMembers, bytes memory _signature, bool _index ) external { // Decode and index signature ( uint16 threshold, // required threshold signature uint256 rindex // read index ) = _signature.readFirstUint16(); // Generate sub-digest bytes32 subDigest; { uint256 chainId; assembly { chainId := chainid() } subDigest = keccak256( abi.encodePacked( "\x19\x01", chainId, _wallet, _hash ) ); } // Recover signature bytes32 imageHash = bytes32(uint256(threshold)); Member[] memory members = new Member[](_sizeMembers); uint256 membersIndex = 0; while (rindex < _signature.length) { // Read next item type and addrWeight uint256 flag; uint256 addrWeight; address addr; (flag, addrWeight, rindex) = _signature.readUint8Uint8(rindex); if (flag == FLAG_ADDRESS) { // Read plain address (addr, rindex) = _signature.readAddress(rindex); } else if (flag == FLAG_SIGNATURE) { // Read single signature and recover signer bytes memory signature; (signature, rindex) = _signature.readBytes66(rindex); addr = recoverSigner(subDigest, signature); // Required signer event emit RequiredSigner(_wallet, addr); if (_index) { // Register last event for given signer lastSignerUpdate[addr] = block.number; } } else { revert("RequireUtils#publishInitialSigners: INVALID_SIGNATURE_FLAG"); } // Store member on array members[membersIndex] = Member(addrWeight, addr); membersIndex++; // Write weight and address to image imageHash = keccak256(abi.encode(imageHash, addrWeight, addr)); } require(membersIndex == _sizeMembers, "RequireUtils#publishInitialSigners: INVALID_MEMBERS_COUNT"); // Check against counter-factual imageHash require(address( uint256( keccak256( abi.encodePacked( byte(0xff), FACTORY, imageHash, INIT_CODE_HASH ) ) ) ) == _wallet, "RequireUtils#publishInitialSigners: UNEXPECTED_COUNTERFACTUAL_IMAGE_HASH"); // Emit event for easy config retrieval emit RequiredConfig(_wallet, imageHash, threshold, abi.encode(members)); if (_index) { // Register last event for given wallet lastWalletUpdate[_wallet] = block.number; } } /** * @notice Validates that a given expiration hasn't expired * @dev Used as an optional transaction on a Sequence batch, to create expirable transactions. * * @param _expiration Expiration to check */ function requireNonExpired(uint256 _expiration) external view { require(block.timestamp < _expiration, "RequireUtils#requireNonExpired: EXPIRED"); } /** * @notice Validates that a given wallet has reached a given nonce * @dev Used as an optional transaction on a Sequence batch, to define transaction execution order * * @param _wallet Sequence wallet * @param _nonce Required nonce */ function requireMinNonce(address _wallet, uint256 _nonce) external view { (uint256 space, uint256 nonce) = _decodeNonce(_nonce); uint256 currentNonce = IModuleCalls(_wallet).readNonce(space); require(currentNonce >= nonce, "RequireUtils#requireMinNonce: NONCE_BELOW_REQUIRED"); } /** * @notice Decodes a raw nonce * @dev A raw nonce is encoded using the first 160 bits for the space * and the last 96 bits for the nonce * @param _rawNonce Nonce to be decoded * @return _space The nonce space of the raw nonce * @return _nonce The nonce of the raw nonce */ function _decodeNonce(uint256 _rawNonce) private pure returns (uint256 _space, uint256 _nonce) { _nonce = uint256(bytes32(_rawNonce) & NONCE_MASK); _space = _rawNonce >> NONCE_BITS; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface IModuleCalls { // Events event NonceChange(uint256 _space, uint256 _newNonce); event TxFailed(bytes32 _tx, bytes _reason); event TxExecuted(bytes32 _tx) anonymous; // Transaction structure struct Transaction { bool delegateCall; // Performs delegatecall bool revertOnError; // Reverts transaction bundle if tx fails uint256 gasLimit; // Maximum gas to be forwarded address target; // Address of the contract to call uint256 value; // Amount of ETH to pass with the call bytes data; // calldata to pass } /** * @notice Returns the next nonce of the default nonce space * @dev The default nonce space is 0x00 * @return The next nonce */ function nonce() external view returns (uint256); /** * @notice Returns the next nonce of the given nonce space * @param _space Nonce space, each space keeps an independent nonce count * @return The next nonce */ function readNonce(uint256 _space) external view returns (uint256); /** * @notice Allow wallet owner to execute an action * @param _txs Transactions to process * @param _nonce Signature nonce (may contain an encoded space) * @param _signature Encoded signature */ function execute( Transaction[] calldata _txs, uint256 _nonce, bytes calldata _signature ) external; /** * @notice Allow wallet to execute an action * without signing the message * @param _txs Transactions to execute */ function selfExecute( Transaction[] calldata _txs ) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; interface IModuleAuthUpgradable { /** * @notice Updates the signers configuration of the wallet * @param _imageHash New required image hash of the signature */ function updateImageHash(bytes32 _imageHash) external; /** * @notice Returns the current image hash of the wallet */ function imageHash() external view returns (bytes32); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; interface IERC1271Wallet { /** * @notice Verifies whether the provided signature is valid with respect to the provided data * @dev MUST return the correct magic value if the signature provided is valid for the provided data * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") * > This function MAY modify Ethereum's state * @param _data Arbitrary length data signed on the behalf of address(this) * @param _signature Signature byte array associated with _data * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise */ function isValidSignature( bytes calldata _data, bytes calldata _signature) external view returns (bytes4 magicValue); /** * @notice Verifies whether the provided signature is valid with respect to the provided hash * @dev MUST return the correct magic value if the signature provided is valid for the provided hash * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") * > This function MAY modify Ethereum's state * @param _hash keccak256 hash that was signed * @param _signature Signature byte array associated with _data * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise */ function isValidSignature( bytes32 _hash, bytes calldata _signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; import "../interfaces/IERC1271Wallet.sol"; import "./LibBytes.sol"; /** * @dev Contains logic for signature validation. * Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) * Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/ */ contract SignatureValidator { using LibBytes for bytes; /***********************************| | Variables | |__________________________________*/ // bytes4(keccak256("isValidSignature(bytes,bytes)")) bytes4 constant internal ERC1271_MAGICVALUE = 0x20c13b0b; // bytes4(keccak256("isValidSignature(bytes32,bytes)")) bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e; // Allowed signature types. uint256 private constant SIG_TYPE_EIP712 = 1; uint256 private constant SIG_TYPE_ETH_SIGN = 2; uint256 private constant SIG_TYPE_WALLET_BYTES32 = 3; /***********************************| | Signature Functions | |__________________________________*/ /** * @notice Recover the signer of hash, assuming it's an EOA account * @dev Only for SignatureType.EIP712 and SignatureType.EthSign signatures * @param _hash Hash that was signed * encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType) */ function recoverSigner( bytes32 _hash, bytes memory _signature ) internal pure returns (address signer) { uint256 signatureType = uint8(_signature[_signature.length - 1]); // Variables are not scoped in Solidity. uint8 v = uint8(_signature[64]); bytes32 r = _signature.readBytes32(0); bytes32 s = _signature.readBytes32(32); // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. // // Source OpenZeppelin // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("SignatureValidator#recoverSigner: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("SignatureValidator#recoverSigner: invalid signature 'v' value"); } // Signature using EIP712 if (signatureType == SIG_TYPE_EIP712) { signer = ecrecover(_hash, v, r, s); // Signed using web3.eth_sign() or Ethers wallet.signMessage() } else if (signatureType == SIG_TYPE_ETH_SIGN) { signer = ecrecover( keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)), v, r, s ); } else { // Anything other signature types are illegal (We do not return false because // the signature may actually be valid, just not in a format // that we currently support. In this case returning false // may lead the caller to incorrectly believe that the // signature was invalid.) revert("SignatureValidator#recoverSigner: UNSUPPORTED_SIGNATURE_TYPE"); } // Prevent signer from being 0x0 require( signer != address(0x0), "SignatureValidator#recoverSigner: INVALID_SIGNER" ); return signer; } /** * @notice Returns true if the provided signature is valid for the given signer. * @dev Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures * @param _hash Hash that was signed * @param _signer Address of the signer candidate * @param _signature Signature byte array */ function isValidSignature( bytes32 _hash, address _signer, bytes memory _signature ) internal view returns (bool valid) { uint256 signatureType = uint8(_signature[_signature.length - 1]); if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) { // Recover signer and compare with provided valid = recoverSigner(_hash, _signature) == _signer; } else if (signatureType == SIG_TYPE_WALLET_BYTES32) { // Remove signature type before calling ERC1271, restore after call uint256 prevSize; assembly { prevSize := mload(_signature) mstore(_signature, sub(prevSize, 1)) } valid = ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signer).isValidSignature(_hash, _signature); assembly { mstore(_signature, prevSize) } } else { // Anything other signature types are illegal (We do not return false because // the signature may actually be valid, just not in a format // that we currently support. In this case returning false // may lead the caller to incorrectly believe that the // signature was invalid.) revert("SignatureValidator#isValidSignature: UNSUPPORTED_SIGNATURE_TYPE"); } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; library LibBytes { using LibBytes for bytes; /***********************************| | Read Bytes Functions | |__________________________________*/ /** * @dev Read firsts uint16 value. * @param data Byte array to be read. * @return a uint16 value of data at index zero. * @return newIndex Updated index after reading the values. */ function readFirstUint16( bytes memory data ) internal pure returns ( uint16 a, uint256 newIndex ) { assembly { let word := mload(add(32, data)) a := shr(240, word) newIndex := 2 } require(2 <= data.length, "LibBytes#readFirstUint16: OUT_OF_BOUNDS"); } /** * @dev Reads consecutive bool (8 bits) and uint8 values. * @param data Byte array to be read. * @param index Index in byte array of uint8 and uint8 values. * @return a uint8 value of data at given index. * @return b uint8 value of data at given index + 8. * @return newIndex Updated index after reading the values. */ function readUint8Uint8( bytes memory data, uint256 index ) internal pure returns ( uint8 a, uint8 b, uint256 newIndex ) { assembly { let word := mload(add(index, add(32, data))) a := shr(248, word) b := and(shr(240, word), 0xff) newIndex := add(index, 2) } require(newIndex <= data.length, "LibBytes#readUint8Uint8: OUT_OF_BOUNDS"); } /** * @dev Reads an address value from a position in a byte array. * @param data Byte array to be read. * @param index Index in byte array of address value. * @return a address value of data at given index. * @return newIndex Updated index after reading the value. */ function readAddress( bytes memory data, uint256 index ) internal pure returns ( address a, uint256 newIndex ) { assembly { let word := mload(add(index, add(32, data))) a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff) newIndex := add(index, 20) } require(newIndex <= data.length, "LibBytes#readAddress: OUT_OF_BOUNDS"); } /** * @dev Reads 66 bytes from a position in a byte array. * @param data Byte array to be read. * @param index Index in byte array of 66 bytes value. * @return a 66 bytes bytes array value of data at given index. * @return newIndex Updated index after reading the value. */ function readBytes66( bytes memory data, uint256 index ) internal pure returns ( bytes memory a, uint256 newIndex ) { a = new bytes(66); assembly { let offset := add(32, add(data, index)) mstore(add(a, 32), mload(offset)) mstore(add(a, 64), mload(add(offset, 32))) mstore(add(a, 66), mload(add(offset, 34))) newIndex := add(index, 66) } require(newIndex <= data.length, "LibBytes#readBytes66: OUT_OF_BOUNDS"); } /** * @dev Reads a bytes32 value from a position in a byte array. * @param b Byte array containing a bytes32 value. * @param index Index in byte array of bytes32 value. * @return result bytes32 value from byte array. */ function readBytes32( bytes memory b, uint256 index ) internal pure returns (bytes32 result) { require( b.length >= index + 32, "LibBytes#readBytes32: GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED" ); // Arrays are prefixed by a 256 bit length parameter uint256 pos = index + 32; // Read the bytes32 from array memory assembly { result := mload(add(b, pos)) } return result; } /** * @dev Reads an uint16 value from a position in a byte array. * @param data Byte array to be read. * @param index Index in byte array of uint16 value. * @return a uint16 value of data at given index. * @return newIndex Updated index after reading the value. */ function readUint16( bytes memory data, uint256 index ) internal pure returns (uint16 a, uint256 newIndex) { assembly { let word := mload(add(index, add(32, data))) a := and(shr(240, word), 0xffff) newIndex := add(index, 2) } require(newIndex <= data.length, "LibBytes#readUint16: OUT_OF_BOUNDS"); } /** * @dev Reads bytes from a position in a byte array. * @param data Byte array to be read. * @param index Index in byte array of bytes value. * @param size Number of bytes to read. * @return a bytes bytes array value of data at given index. * @return newIndex Updated index after reading the value. */ function readBytes( bytes memory data, uint256 index, uint256 size ) internal pure returns (bytes memory a, uint256 newIndex) { a = new bytes(size); assembly { let offset := add(32, add(data, index)) let i := 0 let n := 32 // Copy each word, except last one for { } lt(n, size) { i := n n := add(n, 32) } { mstore(add(a, n), mload(add(offset, i))) } // Load word after new array let suffix := add(a, add(32, size)) let suffixWord := mload(suffix) // Copy last word, overwrites after array mstore(add(a, n), mload(add(offset, i))) // Restore after array mstore(suffix, suffixWord) newIndex := add(index, size) } require(newIndex <= data.length, "LibBytes#readBytes: OUT_OF_BOUNDS"); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; /** Minimal upgradeable proxy implementation, delegates all calls to the address defined by the storage slot matching the wallet address. Inspired by EIP-1167 Implementation (https://eips.ethereum.org/EIPS/eip-1167) deployed code: 0x00 0x36 0x36 CALLDATASIZE cds 0x01 0x3d 0x3d RETURNDATASIZE 0 cds 0x02 0x3d 0x3d RETURNDATASIZE 0 0 cds 0x03 0x37 0x37 CALLDATACOPY 0x04 0x3d 0x3d RETURNDATASIZE 0 0x05 0x3d 0x3d RETURNDATASIZE 0 0 0x06 0x3d 0x3d RETURNDATASIZE 0 0 0 0x07 0x36 0x36 CALLDATASIZE cds 0 0 0 0x08 0x3d 0x3d RETURNDATASIZE 0 cds 0 0 0 0x09 0x30 0x30 ADDRESS addr 0 cds 0 0 0 0x0A 0x54 0x54 SLOAD imp 0 cds 0 0 0 0x0B 0x5a 0x5a GAS gas imp 0 cds 0 0 0 0x0C 0xf4 0xf4 DELEGATECALL suc 0 0x0D 0x3d 0x3d RETURNDATASIZE rds suc 0 0x0E 0x82 0x82 DUP3 0 rds suc 0 0x0F 0x80 0x80 DUP1 0 0 rds suc 0 0x10 0x3e 0x3e RETURNDATACOPY suc 0 0x11 0x90 0x90 SWAP1 0 suc 0x12 0x3d 0x3d RETURNDATASIZE rds 0 suc 0x13 0x91 0x91 SWAP2 suc 0 rds 0x14 0x60 0x18 0x6018 PUSH1 0x18 suc 0 rds /-- 0x16 0x57 0x57 JUMPI 0 rds | 0x17 0xfd 0xfd REVERT \-> 0x18 0x5b 0x5b JUMPDEST 0 rds 0x19 0xf3 0xf3 RETURN flat deployed code: 0x363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 deploy function: 0x00 0x60 0x3a 0x603a PUSH1 0x3a 0x02 0x60 0x0e 0x600e PUSH1 0x0e 0x3a 0x04 0x3d 0x3d RETURNDATASIZE 0 0x0e 0x3a 0x05 0x39 0x39 CODECOPY 0x06 0x60 0x1a 0x601a PUSH1 0x1a 0x08 0x80 0x80 DUP1 0x1a 0x1a 0x09 0x51 0x51 MLOAD imp 0x1a 0x0A 0x30 0x30 ADDRESS addr imp 0x1a 0x0B 0x55 0x55 SSTORE 0x1a 0x0C 0x3d 0x3d RETURNDATASIZE 0 0x1a 0x0D 0xf3 0xf3 RETURN [...deployed code] flat deploy function: 0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 */ library Wallet { bytes internal constant creationCode = hex"603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3"; }
{ "optimizer": { "enabled": true, "runs": 999999, "details": { "yul": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_mainModule","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_wallet","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_imageHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_threshold","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_signers","type":"bytes"}],"name":"RequiredConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_wallet","type":"address"},{"indexed":true,"internalType":"address","name":"_signer","type":"address"}],"name":"RequiredSigner","type":"event"},{"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":"pure","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":"callTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastSignerUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastWalletUpdate","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":"_threshold","type":"uint256"},{"components":[{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"internalType":"struct RequireUtils.Member[]","name":"_members","type":"tuple[]"},{"internalType":"bool","name":"_index","type":"bool"}],"name":"publishConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_sizeMembers","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bool","name":"_index","type":"bool"}],"name":"publishInitialSigners","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002432380380620024328339810160408190526200003491620000cd565b8181816001600160a01b031660a0816001600160a01b031660601b815250506040518060600160405280602881526020016200240a60289139816001600160a01b03166040516020016200008a92919062000104565b60408051601f198184030181529190528051602090910120608052506200014692505050565b80516001600160a01b0381168114620000c857600080fd5b919050565b60008060408385031215620000e0578182fd5b620000eb83620000b0565b9150620000fb60208401620000b0565b90509250929050565b60008351815b818110156200012657602081870181015185830152016200010a565b81811115620001355782828501525b509190910191825250602001919050565b60805160a05160601c61229362000177600039806105e95280610a6252508061060d5280610a8652506122936000f3fe60806040526004361061016a5760003560e01c8063aeea5fb5116100cb578063d1db39071161007f578063e90f13e711610059578063e90f13e71461033f578063f209883a14610394578063ffd7d741146103a95761016a565b8063d1db39071461033f578063d5b5337f14610354578063e717aba9146103745761016a565b8063c272d5c3116100b0578063c272d5c3146102dd578063c39f2d5c146102f2578063c66764e1146103125761016a565b8063aeea5fb5146102a8578063b472f0a2146102bd5761016a565b8063543196eb116101225780637f29d538116101075780637f29d53814610251578063984395bc1461027157806398f9fbc4146102935761016a565b8063543196eb146102115780637082503b146102315761016a565b806343d9c9351161015357806343d9c935146101ba57806344d466c2146101cf57806348acd29f146101f15761016a565b80630fdecfac1461016f5780631cd05dc41461019a575b600080fd5b34801561017b57600080fd5b506101846103ca565b6040516101919190611c05565b60405180910390f35b3480156101a657600080fd5b506101846101b536600461165f565b6103ce565b3480156101c657600080fd5b506101846103e0565b3480156101db57600080fd5b506101ef6101ea366004611719565b6103e8565b005b3480156101fd57600080fd5b5061018461020c36600461165f565b610762565b34801561021d57600080fd5b5061018461022c36600461165f565b610780565b34801561023d57600080fd5b506101ef61024c366004611680565b610784565b34801561025d57600080fd5b506101ef61026c366004611903565b610bdc565b34801561027d57600080fd5b50610286610c18565b6040516101919190611a75565b34801561029f57600080fd5b50610286610c1c565b3480156102b457600080fd5b50610184610c20565b3480156102c957600080fd5b506101ef6102d83660046116f0565b610c24565b3480156102e957600080fd5b50610184610d02565b3480156102fe57600080fd5b5061018461030d36600461165f565b610d06565b34801561031e57600080fd5b5061033261032d36600461165f565b610d0a565b6040516101919190611c3a565b34801561034b57600080fd5b50610184610d4f565b34801561036057600080fd5b5061018461036f366004611903565b610d53565b34801561038057600080fd5b5061018461038f36600461165f565b610d57565b3480156103a057600080fd5b50610184610d69565b6103bc6103b73660046117a9565b610d6d565b604051610191929190611a96565b4690565b60006020819052908152604090205481565b60005a905090565b8360005b83811015610481578185858381811061040157fe5b9050604002016000013586868481811061041757fe5b905060400201602001602081019061042f919061165f565b60405160200161044193929190611c0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091506001016103ec565b506000808773ffffffffffffffffffffffffffffffffffffffff166351605d8060e01b6040516020016104b491906119c9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526104ec916119f6565b6000604051808303816000865af19150503d8060008114610529576040519150601f19603f3d011682016040523d82523d6000602084013e61052e565b606091505b5091509150818015610541575080516020145b156105a65760008180602001905181019061055c91906118eb565b90508381146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611f5b565b60405180910390fd5b5061069b565b60405173ffffffffffffffffffffffffffffffffffffffff891690610635907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611965565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff161461069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611fb8565b828873ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8989896040516020016106e8929190611b3c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610721929161203b565b60405180910390a383156107585773ffffffffffffffffffffffffffffffffffffffff881660009081526001602052604090204390555b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b60008061079084610fdd565b915091506000804690508089896040516020016107af93929190611a12565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091505061ffff831660008767ffffffffffffffff8111801561080657600080fd5b5060405190808252806020026020018201604052801561084057816020015b61082d611591565b8152602001906001900390816108255790505b50905060005b87518510156109e6576000808061085d8b8961104b565b995060ff918216945016915060018314156108855761087c8b896110c5565b98509050610967565b826109355760606108968c8a611139565b995090506108a488826111e1565b91508173ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff167f600ba597427f042bcd559a0d06fa1732cc104d6dd43cbe8845b5a0e804b2b39f60405160405180910390a38a1561092f5773ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090204390555b50610967565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611c4d565b60405180604001604052808381526020018273ffffffffffffffffffffffffffffffffffffffff1681525085858151811061099e57fe5b602002602001018190525083806001019450508582826040516020016109c693929190611c0e565b604051602081830303815290604052805190602001209550505050610846565b888114610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611efe565b60405173ffffffffffffffffffffffffffffffffffffffff8c1690610aae907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611965565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611e1e565b828b73ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8885604051602001610b5f9190611ba0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610b989291612016565b60405180910390a38615610bcf5773ffffffffffffffffffffffffffffffffffffffff8b1660009081526001602052604090204390555b5050505050505050505050565b804210610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611dc1565b50565b3290565b4190565b4490565b600080610c3083611510565b9150915060008473ffffffffffffffffffffffffffffffffffffffff16638c3f5563846040518263ffffffff1660e01b8152600401610c6f9190611c05565b60206040518083038186803b158015610c8757600080fd5b505afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf91906118eb565b905081811015610cfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611d64565b5050505050565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b60016020526000908152604090205481565b4290565b606080825167ffffffffffffffff81118015610d8857600080fd5b50604051908082528060200260200182016040528015610db2578160200160208202803683370190505b509150825167ffffffffffffffff81118015610dcd57600080fd5b50604051908082528060200260200182016040528015610e0157816020015b6060815260200190600190039081610dec5790505b50905060005b8351811015610fd7576000848281518110610e1e57fe5b60200260200101519050806000015115610e64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611ea1565b80604001515a1015610ea2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611d07565b806060015173ffffffffffffffffffffffffffffffffffffffff1681608001518260400151600014610ed8578260400151610eda565b5a5b908360a00151604051610eed91906119f6565b600060405180830381858888f193505050503d8060008114610f2b576040519150601f19603f3d011682016040523d82523d6000602084013e610f30565b606091505b50858481518110610f3d57fe5b60200260200101858581518110610f5057fe5b6020026020010182905282151515158152505050838281518110610f7057fe5b602002602001015180610f985750848281518110610f8a57fe5b602002602001015160200151155b610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611caa565b50600101610e07565b50915091565b6020810151815160f09190911c90600290811115611046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806121096027913960400191505060405180910390fd5b915091565b80820160200151825160f882901c9160f01c60ff169060028401908111156110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806121fc6026913960400191505060405180910390fd5b9250925092565b80820160200151825160609190911c906014830190811115611132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806120e66023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508351811115611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061219d6023913960400191505060405180910390fd5b600080826001845103815181106111f457fe5b602001015160f81c60f81b60f81c60ff16905060008360408151811061121657fe5b016020015160f81c9050600061122c8582611529565b9050600061123b866020611529565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806120a9603d913960400191505060405180910390fd5b8260ff16601b141580156112ce57508260ff16601c14155b15611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612130603d913960400191505060405180910390fd5b60018414156113985760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611387573d6000803e3d6000fd5b50505060206040510351945061149a565b60028414156114495760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611387573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806121c0603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061216d6030913960400191505060405180910390fd5b5050505092915050565b606081901c916bffffffffffffffffffffffff90911690565b60008160200183511015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612222603c913960400191505060405180910390fd5b50016020015190565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461077b57600080fd5b8035801515811461077b57600080fd5b600082601f8301126115ec578081fd5b813567ffffffffffffffff81111561160057fe5b61163160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612054565b818152846020838601011115611645578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611670578081fd5b611679826115a8565b9392505050565b600080600080600060a08688031215611697578081fd5b6116a0866115a8565b94506020860135935060408601359250606086013567ffffffffffffffff8111156116c9578182fd5b6116d5888289016115dc565b9250506116e4608087016115cc565b90509295509295909350565b60008060408385031215611702578182fd5b61170b836115a8565b946020939093013593505050565b600080600080600060808688031215611730578081fd5b611739866115a8565b945060208601359350604086013567ffffffffffffffff8082111561175c578283fd5b818801915088601f83011261176f578283fd5b81358181111561177d578384fd5b896020604083028501011115611791578384fd5b6020830195508094505050506116e4606087016115cc565b600060208083850312156117bb578182fd5b823567ffffffffffffffff808211156117d2578384fd5b818501915085601f8301126117e5578384fd5b8135818111156117f157fe5b6117fe8485830201612054565b81815284810190848601875b848110156118dc578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215611848578a8bfd5b604080518281018181108b8211171561185d57fe5b825261186a848d016115cc565b81526118778285016115cc565b8c82015260608085013583830152611891608086016115a8565b9082015260a084810135608083015292840135929150898311156118b3578c8dfd5b6118c18f8d858701016115dc565b9181019190915286525050928701929087019060010161180a565b50909998505050505050505050565b6000602082840312156118fc578081fd5b5051919050565b600060208284031215611914578081fd5b5035919050565b60008151808452611933816020860160208601612078565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260040190565b60008251611a08818460208701612078565b9190910192915050565b7f19010000000000000000000000000000000000000000000000000000000000008152600281019390935260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166022830152603682015260560190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015611ad1578151151584529284019290840190600101611ab3565b5050508381038285015284518082528282019080840283018401878501865b838110156118dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552611b2a83835161191b565b94870194925090860190600101611af0565b6020808252818101839052600090604080840186845b87811015611b93578135835273ffffffffffffffffffffffffffffffffffffffff611b7e8684016115a8565b16838601529183019190830190600101611b52565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015611bf85781518051855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101611bbd565b5091979650505050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b600060208252611679602083018461191b565b6020808252603a908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f5349474e41545552455f464c4147000000000000606082015260800190565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f526571756972655574696c7323726571756972654d696e4e6f6e63653a204e4f60408201527f4e43455f42454c4f575f52455155495245440000000000000000000000000000606082015260800190565b60208082526027908201527f526571756972655574696c7323726571756972654e6f6e457870697265643a2060408201527f4558504952454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526048908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20554e45585045435445445f434f554e5445524641435455414c5f494d60608201527f4147455f48415348000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60208082526039908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f4d454d424552535f434f554e5400000000000000606082015260800190565b60208082526031908201527f526571756972655574696c73237075626c697368436f6e6669673a20554e455860408201527f5045435445445f494d4147455f48415348000000000000000000000000000000606082015260800190565b602080825260409082018190527f526571756972655574696c73237075626c697368436f6e6669673a20554e4558908201527f5045435445445f434f554e5445524641435455414c5f494d4147455f48415348606082015260800190565b600061ffff8416825260406020830152612033604083018461191b565b949350505050565b600083825260406020830152612033604083018461191b565b60405181810167ffffffffffffffff8111828210171561207057fe5b604052919050565b60005b8381101561209357818101518382015260200161207b565b838111156120a2576000848401525b5050505056fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75654c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544a264697066735822122049d1e82e9b8d2e638d5955baa9e29b90455cd4cbc9d66547ee8741bb595aff6d64736f6c63430007060033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf300000000000000000000000073025f64a80f5df7f86b80c597bc96ddfadae07200000000000000000000000052080556206ecc3953ba6e280eb1a26b63692829
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063aeea5fb5116100cb578063d1db39071161007f578063e90f13e711610059578063e90f13e71461033f578063f209883a14610394578063ffd7d741146103a95761016a565b8063d1db39071461033f578063d5b5337f14610354578063e717aba9146103745761016a565b8063c272d5c3116100b0578063c272d5c3146102dd578063c39f2d5c146102f2578063c66764e1146103125761016a565b8063aeea5fb5146102a8578063b472f0a2146102bd5761016a565b8063543196eb116101225780637f29d538116101075780637f29d53814610251578063984395bc1461027157806398f9fbc4146102935761016a565b8063543196eb146102115780637082503b146102315761016a565b806343d9c9351161015357806343d9c935146101ba57806344d466c2146101cf57806348acd29f146101f15761016a565b80630fdecfac1461016f5780631cd05dc41461019a575b600080fd5b34801561017b57600080fd5b506101846103ca565b6040516101919190611c05565b60405180910390f35b3480156101a657600080fd5b506101846101b536600461165f565b6103ce565b3480156101c657600080fd5b506101846103e0565b3480156101db57600080fd5b506101ef6101ea366004611719565b6103e8565b005b3480156101fd57600080fd5b5061018461020c36600461165f565b610762565b34801561021d57600080fd5b5061018461022c36600461165f565b610780565b34801561023d57600080fd5b506101ef61024c366004611680565b610784565b34801561025d57600080fd5b506101ef61026c366004611903565b610bdc565b34801561027d57600080fd5b50610286610c18565b6040516101919190611a75565b34801561029f57600080fd5b50610286610c1c565b3480156102b457600080fd5b50610184610c20565b3480156102c957600080fd5b506101ef6102d83660046116f0565b610c24565b3480156102e957600080fd5b50610184610d02565b3480156102fe57600080fd5b5061018461030d36600461165f565b610d06565b34801561031e57600080fd5b5061033261032d36600461165f565b610d0a565b6040516101919190611c3a565b34801561034b57600080fd5b50610184610d4f565b34801561036057600080fd5b5061018461036f366004611903565b610d53565b34801561038057600080fd5b5061018461038f36600461165f565b610d57565b3480156103a057600080fd5b50610184610d69565b6103bc6103b73660046117a9565b610d6d565b604051610191929190611a96565b4690565b60006020819052908152604090205481565b60005a905090565b8360005b83811015610481578185858381811061040157fe5b9050604002016000013586868481811061041757fe5b905060400201602001602081019061042f919061165f565b60405160200161044193929190611c0e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091506001016103ec565b506000808773ffffffffffffffffffffffffffffffffffffffff166351605d8060e01b6040516020016104b491906119c9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526104ec916119f6565b6000604051808303816000865af19150503d8060008114610529576040519150601f19603f3d011682016040523d82523d6000602084013e61052e565b606091505b5091509150818015610541575080516020145b156105a65760008180602001905181019061055c91906118eb565b90508381146105a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611f5b565b60405180910390fd5b5061069b565b60405173ffffffffffffffffffffffffffffffffffffffff891690610635907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000073025f64a80f5df7f86b80c597bc96ddfadae0729087907f015981d91fe7ee50efe66b053efceeb454d0363c64ea53afb4e624751a9b2aa690602001611965565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff161461069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611fb8565b828873ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8989896040516020016106e8929190611b3c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610721929161203b565b60405180910390a383156107585773ffffffffffffffffffffffffffffffffffffffff881660009081526001602052604090204390555b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b60008061079084610fdd565b915091506000804690508089896040516020016107af93929190611a12565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091505061ffff831660008767ffffffffffffffff8111801561080657600080fd5b5060405190808252806020026020018201604052801561084057816020015b61082d611591565b8152602001906001900390816108255790505b50905060005b87518510156109e6576000808061085d8b8961104b565b995060ff918216945016915060018314156108855761087c8b896110c5565b98509050610967565b826109355760606108968c8a611139565b995090506108a488826111e1565b91508173ffffffffffffffffffffffffffffffffffffffff168f73ffffffffffffffffffffffffffffffffffffffff167f600ba597427f042bcd559a0d06fa1732cc104d6dd43cbe8845b5a0e804b2b39f60405160405180910390a38a1561092f5773ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090204390555b50610967565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611c4d565b60405180604001604052808381526020018273ffffffffffffffffffffffffffffffffffffffff1681525085858151811061099e57fe5b602002602001018190525083806001019450508582826040516020016109c693929190611c0e565b604051602081830303815290604052805190602001209550505050610846565b888114610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611efe565b60405173ffffffffffffffffffffffffffffffffffffffff8c1690610aae907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000073025f64a80f5df7f86b80c597bc96ddfadae0729087907f015981d91fe7ee50efe66b053efceeb454d0363c64ea53afb4e624751a9b2aa690602001611965565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611e1e565b828b73ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8885604051602001610b5f9190611ba0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610b989291612016565b60405180910390a38615610bcf5773ffffffffffffffffffffffffffffffffffffffff8b1660009081526001602052604090204390555b5050505050505050505050565b804210610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611dc1565b50565b3290565b4190565b4490565b600080610c3083611510565b9150915060008473ffffffffffffffffffffffffffffffffffffffff16638c3f5563846040518263ffffffff1660e01b8152600401610c6f9190611c05565b60206040518083038186803b158015610c8757600080fd5b505afa158015610c9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbf91906118eb565b905081811015610cfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611d64565b5050505050565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b60016020526000908152604090205481565b4290565b606080825167ffffffffffffffff81118015610d8857600080fd5b50604051908082528060200260200182016040528015610db2578160200160208202803683370190505b509150825167ffffffffffffffff81118015610dcd57600080fd5b50604051908082528060200260200182016040528015610e0157816020015b6060815260200190600190039081610dec5790505b50905060005b8351811015610fd7576000848281518110610e1e57fe5b60200260200101519050806000015115610e64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611ea1565b80604001515a1015610ea2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611d07565b806060015173ffffffffffffffffffffffffffffffffffffffff1681608001518260400151600014610ed8578260400151610eda565b5a5b908360a00151604051610eed91906119f6565b600060405180830381858888f193505050503d8060008114610f2b576040519150601f19603f3d011682016040523d82523d6000602084013e610f30565b606091505b50858481518110610f3d57fe5b60200260200101858581518110610f5057fe5b6020026020010182905282151515158152505050838281518110610f7057fe5b602002602001015180610f985750848281518110610f8a57fe5b602002602001015160200151155b610fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059790611caa565b50600101610e07565b50915091565b6020810151815160f09190911c90600290811115611046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806121096027913960400191505060405180910390fd5b915091565b80820160200151825160f882901c9160f01c60ff169060028401908111156110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806121fc6026913960400191505060405180910390fd5b9250925092565b80820160200151825160609190911c906014830190811115611132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806120e66023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508351811115611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061219d6023913960400191505060405180910390fd5b600080826001845103815181106111f457fe5b602001015160f81c60f81b60f81c60ff16905060008360408151811061121657fe5b016020015160f81c9050600061122c8582611529565b9050600061123b866020611529565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806120a9603d913960400191505060405180910390fd5b8260ff16601b141580156112ce57508260ff16601c14155b15611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612130603d913960400191505060405180910390fd5b60018414156113985760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611387573d6000803e3d6000fd5b50505060206040510351945061149a565b60028414156114495760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611387573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806121c0603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516611506576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061216d6030913960400191505060405180910390fd5b5050505092915050565b606081901c916bffffffffffffffffffffffff90911690565b60008160200183511015611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612222603c913960400191505060405180910390fd5b50016020015190565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461077b57600080fd5b8035801515811461077b57600080fd5b600082601f8301126115ec578081fd5b813567ffffffffffffffff81111561160057fe5b61163160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612054565b818152846020838601011115611645578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611670578081fd5b611679826115a8565b9392505050565b600080600080600060a08688031215611697578081fd5b6116a0866115a8565b94506020860135935060408601359250606086013567ffffffffffffffff8111156116c9578182fd5b6116d5888289016115dc565b9250506116e4608087016115cc565b90509295509295909350565b60008060408385031215611702578182fd5b61170b836115a8565b946020939093013593505050565b600080600080600060808688031215611730578081fd5b611739866115a8565b945060208601359350604086013567ffffffffffffffff8082111561175c578283fd5b818801915088601f83011261176f578283fd5b81358181111561177d578384fd5b896020604083028501011115611791578384fd5b6020830195508094505050506116e4606087016115cc565b600060208083850312156117bb578182fd5b823567ffffffffffffffff808211156117d2578384fd5b818501915085601f8301126117e5578384fd5b8135818111156117f157fe5b6117fe8485830201612054565b81815284810190848601875b848110156118dc578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215611848578a8bfd5b604080518281018181108b8211171561185d57fe5b825261186a848d016115cc565b81526118778285016115cc565b8c82015260608085013583830152611891608086016115a8565b9082015260a084810135608083015292840135929150898311156118b3578c8dfd5b6118c18f8d858701016115dc565b9181019190915286525050928701929087019060010161180a565b50909998505050505050505050565b6000602082840312156118fc578081fd5b5051919050565b600060208284031215611914578081fd5b5035919050565b60008151808452611933816020860160208601612078565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260040190565b60008251611a08818460208701612078565b9190910192915050565b7f19010000000000000000000000000000000000000000000000000000000000008152600281019390935260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166022830152603682015260560190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015611ad1578151151584529284019290840190600101611ab3565b5050508381038285015284518082528282019080840283018401878501865b838110156118dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552611b2a83835161191b565b94870194925090860190600101611af0565b6020808252818101839052600090604080840186845b87811015611b93578135835273ffffffffffffffffffffffffffffffffffffffff611b7e8684016115a8565b16838601529183019190830190600101611b52565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015611bf85781518051855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101611bbd565b5091979650505050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b600060208252611679602083018461191b565b6020808252603a908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f5349474e41545552455f464c4147000000000000606082015260800190565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f526571756972655574696c7323726571756972654d696e4e6f6e63653a204e4f60408201527f4e43455f42454c4f575f52455155495245440000000000000000000000000000606082015260800190565b60208082526027908201527f526571756972655574696c7323726571756972654e6f6e457870697265643a2060408201527f4558504952454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526048908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20554e45585045435445445f434f554e5445524641435455414c5f494d60608201527f4147455f48415348000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60208082526039908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f4d454d424552535f434f554e5400000000000000606082015260800190565b60208082526031908201527f526571756972655574696c73237075626c697368436f6e6669673a20554e455860408201527f5045435445445f494d4147455f48415348000000000000000000000000000000606082015260800190565b602080825260409082018190527f526571756972655574696c73237075626c697368436f6e6669673a20554e4558908201527f5045435445445f434f554e5445524641435455414c5f494d4147455f48415348606082015260800190565b600061ffff8416825260406020830152612033604083018461191b565b949350505050565b600083825260406020830152612033604083018461191b565b60405181810167ffffffffffffffff8111828210171561207057fe5b604052919050565b60005b8381101561209357818101518382015260200161207b565b838111156120a2576000848401525b5050505056fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75654c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544a264697066735822122049d1e82e9b8d2e638d5955baa9e29b90455cd4cbc9d66547ee8741bb595aff6d64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000073025f64a80f5df7f86b80c597bc96ddfadae07200000000000000000000000052080556206ecc3953ba6e280eb1a26b63692829
-----Decoded View---------------
Arg [0] : _factory (address): 0x73025F64A80f5DF7f86b80c597Bc96DdfAdae072
Arg [1] : _mainModule (address): 0x52080556206Ecc3953BA6e280eb1a26b63692829
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000073025f64a80f5df7f86b80c597bc96ddfadae072
Arg [1] : 00000000000000000000000052080556206ecc3953ba6e280eb1a26b63692829
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.