Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,248 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Update Recent | 17034390 | 648 days ago | IN | 0 ETH | 0.00992814 | ||||
Update Recent | 17034264 | 648 days ago | IN | 0 ETH | 0.00954855 | ||||
Update Recent | 17034136 | 648 days ago | IN | 0 ETH | 0.01052371 | ||||
Update Recent | 17034007 | 648 days ago | IN | 0 ETH | 0.01580368 | ||||
Update Recent | 17033878 | 648 days ago | IN | 0 ETH | 0.01436093 | ||||
Update Recent | 17033751 | 648 days ago | IN | 0 ETH | 0.01199544 | ||||
Update Recent | 17033623 | 648 days ago | IN | 0 ETH | 0.01136159 | ||||
Update Recent | 17033495 | 648 days ago | IN | 0 ETH | 0.01228581 | ||||
Update Recent | 17033368 | 648 days ago | IN | 0 ETH | 0.00955123 | ||||
Update Recent | 17033239 | 649 days ago | IN | 0 ETH | 0.01307575 | ||||
Update Recent | 17033111 | 649 days ago | IN | 0 ETH | 0.00980466 | ||||
Update Recent | 17033000 | 649 days ago | IN | 0 ETH | 0.01483949 | ||||
Update Recent | 17032855 | 649 days ago | IN | 0 ETH | 0.01178891 | ||||
Update Recent | 17032728 | 649 days ago | IN | 0 ETH | 0.01338271 | ||||
Update Recent | 17032600 | 649 days ago | IN | 0 ETH | 0.01071331 | ||||
Update Recent | 17032472 | 649 days ago | IN | 0 ETH | 0.01153693 | ||||
Update Recent | 17032343 | 649 days ago | IN | 0 ETH | 0.01080875 | ||||
Update Recent | 17032216 | 649 days ago | IN | 0 ETH | 0.00900985 | ||||
Update Recent | 17032087 | 649 days ago | IN | 0 ETH | 0.0106091 | ||||
Update Recent | 17031959 | 649 days ago | IN | 0 ETH | 0.01179275 | ||||
Update Recent | 17031831 | 649 days ago | IN | 0 ETH | 0.00864787 | ||||
Update Recent | 17031704 | 649 days ago | IN | 0 ETH | 0.00919588 | ||||
Update Recent | 17031575 | 649 days ago | IN | 0 ETH | 0.00784192 | ||||
Update Recent | 17031447 | 649 days ago | IN | 0 ETH | 0.00888599 | ||||
Update Recent | 17031319 | 649 days ago | IN | 0 ETH | 0.01057957 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AxiomV0
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 16000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // WARNING! This smart contract and the associated zk-SNARK verifiers have not been audited. // DO NOT USE THIS CONTRACT FOR PRODUCTION pragma solidity ^0.8.12; uint8 constant TREE_DEPTH = 10; uint32 constant NUM_LEAVES = 2 ** 10; // array indices for reading from the ZKP calldata uint32 constant PUBLIC_BYTES_START_IDX = 4 * 3 * 32; uint32 constant ROOT_BYTES_START_IDX = PUBLIC_BYTES_START_IDX + 5 * 32; // constants for batch import of historical block hashes uint8 constant HISTORICAL_TREE_DEPTH = 17; uint32 constant HISTORICAL_NUM_LEAVES = 2 ** 17; uint32 constant HISTORICAL_NUM_ROOTS = 2 ** 7; // HISTORICAL_NUM_LEAVES / NUM_LEAVES function calcMerkleRoot(bytes32[HISTORICAL_NUM_ROOTS] calldata leaves) pure returns (bytes32) { uint256 len = HISTORICAL_NUM_ROOTS >> 1; bytes32[] memory roots = new bytes32[](len); for (uint256 i = 0; i < len; i++) { roots[i] = keccak256(abi.encodePacked(leaves[i << 1], leaves[(i << 1) | 1])); } while (len > 1) { len >>= 1; for (uint256 i = 0; i < len; i++) { roots[i] = keccak256(abi.encodePacked(roots[i << 1], roots[(i << 1) | 1])); } } return roots[0]; } contract AxiomV0 { address private verifierAddress; address private historicalVerifierAddress; // historicalRoots[startBlockNumber] is 0 unless (startBlockNumber % NUM_LEAVES == 0) // historicalRoots[startBlockNumber] holds the hash of // prevHash || root || numFinal // where // - prevHash is the parent hash of block startBlockNumber // - root is the partial Merkle root of blockhashes of block numbers // [startBlockNumber, startBlockNumber + NUM_LEAVES) // where unconfirmed block hashes are 0's // - numFinal is the number of confirmed consecutive roots in [startBlockNumber, startBlockNumber + NUM_LEAVES) mapping(uint32 => bytes32) public historicalRoots; event UpdateEvent(uint32 startBlockNumber, bytes32 prevHash, bytes32 root, uint32 numFinal); struct BlockHashWitness { uint32 blockNumber; bytes32 claimedBlockHash; bytes32 prevHash; uint32 numFinal; bytes32[TREE_DEPTH] merkleProof; } constructor(address _verifierAddress, address _historicalVerifierAddress) { verifierAddress = _verifierAddress; historicalVerifierAddress = _historicalVerifierAddress; } function verifyRaw(bytes calldata input) private returns (bool) { (bool success,) = verifierAddress.call(input); return success; } function verifyHistoricalRaw(bytes calldata input) private returns (bool) { (bool success,) = historicalVerifierAddress.call(input); return success; } function getEmptyHash(uint256 depth) public pure returns (bytes32) { // emptyHashes[idx] is the Merkle root of a tree of depth idx with 0's as leaves bytes32[TREE_DEPTH] memory emptyHashes = [ bytes32(0x0000000000000000000000000000000000000000000000000000000000000000), bytes32(0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5), bytes32(0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30), bytes32(0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85), bytes32(0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344), bytes32(0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d), bytes32(0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968), bytes32(0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83), bytes32(0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af), bytes32(0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0) ]; return emptyHashes[depth]; } // The ZKP has block headers for [startBlockNumber, endBlockNumber] blocks. We extract some common information from the calldata. function getBoundaryBlockData(bytes calldata proofData) internal pure returns (bytes32 prevHash, bytes32 endHash, uint32 startBlockNumber, uint32 endBlockNumber, bytes32 root) { prevHash = bytes32( uint256(bytes32(proofData[PUBLIC_BYTES_START_IDX:PUBLIC_BYTES_START_IDX + 32])) << 128 | uint128(bytes16(proofData[PUBLIC_BYTES_START_IDX + 32 + 16:PUBLIC_BYTES_START_IDX + 2 * 32])) ); endHash = bytes32( uint256(bytes32(proofData[PUBLIC_BYTES_START_IDX + 2 * 32:PUBLIC_BYTES_START_IDX + 3 * 32])) << 128 | uint128(bytes16(proofData[PUBLIC_BYTES_START_IDX + 3 * 32 + 16:PUBLIC_BYTES_START_IDX + 4 * 32])) ); startBlockNumber = uint32(bytes4(proofData[PUBLIC_BYTES_START_IDX + 5 * 32 - 8:PUBLIC_BYTES_START_IDX + 5 * 32 - 4])); endBlockNumber = uint32(bytes4(proofData[PUBLIC_BYTES_START_IDX + 5 * 32 - 4:PUBLIC_BYTES_START_IDX + 5 * 32])); root = bytes32( uint256(bytes32(proofData[ROOT_BYTES_START_IDX:ROOT_BYTES_START_IDX + 32])) << 128 | uint128(bytes16(proofData[ROOT_BYTES_START_IDX + 48:ROOT_BYTES_START_IDX + 64])) ); } // update blocks in the "backward" direction, anchoring on a "recent" end blockhash that is within last 256 blocks // * startBlockNumber must be a multiple of NUM_LEAVES // * roots[idx] is the root of a Merkle tree of height 2**(TREE_DEPTH - idx) in a Merkle mountain // range which stores block hashes in the interval [startBlockNumber, endBlockNumber] function updateRecent(bytes calldata proofData) external { (bytes32 prevHash, bytes32 endHash, uint32 startBlockNumber, uint32 endBlockNumber, bytes32 root) = getBoundaryBlockData(proofData); bytes32[TREE_DEPTH] memory roots; for (uint256 idx = 1; idx <= TREE_DEPTH; idx++) { roots[idx - 1] = bytes32( uint256(bytes32(proofData[ROOT_BYTES_START_IDX + idx * 64:ROOT_BYTES_START_IDX + idx * 64 + 32])) << 128 | uint128( bytes16(proofData[ROOT_BYTES_START_IDX + idx * 64 + 16 + 32:ROOT_BYTES_START_IDX + idx * 64 + 64]) ) ); } uint32 numFinal = endBlockNumber - startBlockNumber + 1; require(numFinal <= NUM_LEAVES, "Updating too many blocks at once"); require(startBlockNumber % NUM_LEAVES == 0, "startBlockNumber not a multiple of NUM_LEAVES"); require(block.number - endBlockNumber <= 256, "Not a recent endBlock"); require(endBlockNumber < block.number, "Not a recent endBlock"); require(blockhash(endBlockNumber) == endHash, "endHash does not match"); require(verifyRaw(proofData), "ZKP does not verify"); if (root == bytes32(0)) { // compute Merkle root of completed Merkle mountain range with 0s for unconfirmed blockhashes for (uint256 round = 1; round <= TREE_DEPTH; round++) { if (roots[TREE_DEPTH - round] != 0) { root = keccak256(abi.encodePacked(roots[TREE_DEPTH - round], root)); } else { root = keccak256(abi.encodePacked(root, getEmptyHash(round - 1))); } } } historicalRoots[startBlockNumber] = keccak256(abi.encodePacked(prevHash, root, numFinal)); emit UpdateEvent(startBlockNumber, prevHash, root, numFinal); } // update older blocks in "backwards" direction, anchoring on more recent trusted blockhash // must be batch of NUM_LEAVES blocks function updateOld(bytes32 nextRoot, uint32 nextNumFinal, bytes calldata proofData) external { (bytes32 prevHash, bytes32 endHash, uint32 startBlockNumber, uint32 endBlockNumber, bytes32 root) = getBoundaryBlockData(proofData); require(startBlockNumber % NUM_LEAVES == 0, "startBlockNumber not a multiple of NUM_LEAVES"); require(endBlockNumber - startBlockNumber == NUM_LEAVES - 1, "Updating with incorrect number of blocks"); require( historicalRoots[endBlockNumber + 1] == keccak256(abi.encodePacked(endHash, nextRoot, nextNumFinal)), "endHash does not match" ); require(verifyRaw(proofData), "ZKP does not verify"); historicalRoots[startBlockNumber] = keccak256(abi.encodePacked(prevHash, root, NUM_LEAVES)); emit UpdateEvent(startBlockNumber, prevHash, root, NUM_LEAVES); } /// Update older blocks in "backwards" direction, anchoring on more recent trusted blockhash /// Must be batch of HISTORICAL_NUM_LEAVES blocks /// `roots` should contain HISTORICAL_NUM_ROOTS merkle roots, one per batch of NUM_LEAVES blocks /// For all except the last batch of NUM_LEAVES blocks, a merkle inclusion proof of the `endHash` of the batch must be provided, with respect to the corresponding merkle root in `roots` function updateHistorical( bytes32 nextRoot, uint32 nextNumFinal, bytes32[HISTORICAL_NUM_ROOTS] calldata roots, bytes32[TREE_DEPTH + 1][HISTORICAL_NUM_ROOTS - 1] calldata endHashProofs, bytes calldata proofData ) external { (bytes32 _prevHash, bytes32 _endHash, uint32 startBlockNumber, uint32 endBlockNumber, bytes32 aggregateRoot) = getBoundaryBlockData(proofData); require(startBlockNumber % NUM_LEAVES == 0, "startBlockNumber not a multiple of NUM_LEAVES"); require( endBlockNumber - startBlockNumber == HISTORICAL_NUM_LEAVES - 1, "Updating with incorrect number of historical blocks" ); require( historicalRoots[endBlockNumber + 1] == keccak256(abi.encodePacked(_endHash, nextRoot, nextNumFinal)), "endHash does not match" ); require( calcMerkleRoot(roots) == aggregateRoot, "Aggregate merkle root of supplied historical roots does not match the ZKP root" ); require(verifyHistoricalRaw(proofData), "ZKP does not verify"); for (uint256 i = 0; i < HISTORICAL_NUM_ROOTS; i++) { if (i != HISTORICAL_NUM_ROOTS - 1) { bytes32 proofCheck = endHashProofs[i][TREE_DEPTH]; for (uint256 j = 0; j < TREE_DEPTH; j++) { proofCheck = keccak256(abi.encodePacked(endHashProofs[i][TREE_DEPTH - 1 - j], proofCheck)); } require(proofCheck == roots[i], "Merkle inclusion proof failed"); } bytes32 prevHash = i == 0 ? _prevHash : endHashProofs[i - 1][TREE_DEPTH]; uint32 start = uint32(startBlockNumber + i * NUM_LEAVES); historicalRoots[start] = keccak256(abi.encodePacked(prevHash, roots[i], NUM_LEAVES)); emit UpdateEvent(start, prevHash, roots[i], NUM_LEAVES); } } function isRecentBlockHashValid(uint32 blockNumber, bytes32 claimedBlockHash) public view returns (bool) { bytes32 blockHash = blockhash(blockNumber); require(blockHash != 0x0, "Must supply block hash of one of 256 most recent blocks"); return (blockHash == claimedBlockHash); } function isBlockHashValid(BlockHashWitness calldata witness) public view returns (bool) { require(witness.claimedBlockHash != 0x0, "Claimed block hash cannot be 0"); uint32 side = witness.blockNumber % NUM_LEAVES; uint32 startBlockNumber = witness.blockNumber - side; bytes32 merkleRoot = historicalRoots[startBlockNumber]; require(merkleRoot != 0, "Merkle root must be stored already"); // compute Merkle root of blockhash bytes32 root = witness.claimedBlockHash; for (uint8 depth = 0; depth < TREE_DEPTH; depth++) { // 0 for left, 1 for right if ((side >> depth) & 1 == 0) { root = keccak256(abi.encodePacked(root, witness.merkleProof[depth])); } else { root = keccak256(abi.encodePacked(witness.merkleProof[depth], root)); } } return (merkleRoot == keccak256(abi.encodePacked(witness.prevHash, root, witness.numFinal))); } }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/" ], "optimizer": { "enabled": true, "runs": 16000, "details": { "constantOptimizer": true, "yul": true } }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_verifierAddress","type":"address"},{"internalType":"address","name":"_historicalVerifierAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"startBlockNumber","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"prevHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"numFinal","type":"uint32"}],"name":"UpdateEvent","type":"event"},{"inputs":[{"internalType":"uint256","name":"depth","type":"uint256"}],"name":"getEmptyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"historicalRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"claimedBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"prevHash","type":"bytes32"},{"internalType":"uint32","name":"numFinal","type":"uint32"},{"internalType":"bytes32[10]","name":"merkleProof","type":"bytes32[10]"}],"internalType":"struct AxiomV0.BlockHashWitness","name":"witness","type":"tuple"}],"name":"isBlockHashValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"claimedBlockHash","type":"bytes32"}],"name":"isRecentBlockHashValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nextRoot","type":"bytes32"},{"internalType":"uint32","name":"nextNumFinal","type":"uint32"},{"internalType":"bytes32[128]","name":"roots","type":"bytes32[128]"},{"internalType":"bytes32[11][127]","name":"endHashProofs","type":"bytes32[11][127]"},{"internalType":"bytes","name":"proofData","type":"bytes"}],"name":"updateHistorical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"nextRoot","type":"bytes32"},{"internalType":"uint32","name":"nextNumFinal","type":"uint32"},{"internalType":"bytes","name":"proofData","type":"bytes"}],"name":"updateOld","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proofData","type":"bytes"}],"name":"updateRecent","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001edf38038062001edf833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b611e1480620000cb6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80637225fb211161005b5780637225fb21146100d2578063b737127e146100e5578063c1f7cae214610106578063c6ca47531461011957600080fd5b806301ef3afa1461008257806311b63d01146100975780636f193b83146100aa575b600080fd5b610095610090366004611984565b610139565b005b6100956100a53660046119df565b6106ba565b6100bd6100b8366004611a39565b6109db565b60405190151581526020015b60405180910390f35b6100956100e0366004611a52565b610c5a565b6100f86100f3366004611adf565b611232565b6040519081526020016100c9565b6100bd610114366004611af8565b6113ba565b6100f8610127366004611b22565b60026020526000908152604090205481565b600080600080600061014b8787611444565b9450945094509450945061015d61191c565b60015b600a81116102a2578888610175836040611b73565b61018261018060a0611b8a565b63ffffffff166101929190611bae565b61019d906010611bae565b6101a8906020611bae565b906101b4846040611b73565b6101c161018060a0611b8a565b63ffffffff166101d19190611bae565b6101dc906040611bae565b926101e993929190611bc1565b6101f291611beb565b608090811c908a8a610205856040611b73565b61021261018060a0611b8a565b63ffffffff166102229190611bae565b9061022e866040611b73565b61023b61018060a0611b8a565b63ffffffff1661024b9190611bae565b610256906020611bae565b9261026393929190611bc1565b61026c91611c33565b901b178261027b600184611c6f565b600a811061028b5761028b611c82565b60200201528061029a81611cb1565b915050610160565b5060006102af8585611ce9565b6102ba906001611b8a565b905061040063ffffffff821611156103195760405162461bcd60e51b815260206004820181905260248201527f5570646174696e6720746f6f206d616e7920626c6f636b73206174206f6e636560448201526064015b60405180910390fd5b61032561040086611d06565b63ffffffff161561039e5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b6101006103b163ffffffff861643611c6f565b11156103ff5760405162461bcd60e51b815260206004820152601560248201527f4e6f74206120726563656e7420656e64426c6f636b00000000000000000000006044820152606401610310565b438463ffffffff16106104545760405162461bcd60e51b815260206004820152601560248201527f4e6f74206120726563656e7420656e64426c6f636b00000000000000000000006044820152606401610310565b858463ffffffff1640146104aa5760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b6104b489896116c5565b6105005760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b826105dd5760015b600a81116105db578261051c82600a611c6f565b600a811061052c5761052c611c82565b60200201511561058f578261054282600a611c6f565b600a811061055257610552611c82565b602002015184604051602001610572929190918252602082015260400190565b6040516020818303038152906040528051906020012093506105c9565b8361059e6100f3600184611c6f565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093505b806105d381611cb1565b915050610508565b505b60408051602081018990529081018490527fffffffff0000000000000000000000000000000000000000000000000000000060e083901b166060820152606401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012063ffffffff898116600081815260028552859020929092559084529083018a9052908201859052821660608201527f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb906080015b60405180910390a1505050505050505050565b60008060008060006106cc8787611444565b94509450945094509450610400836106e49190611d06565b63ffffffff161561075d5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b61076a6001610400611ce9565b63ffffffff1661077a8484611ce9565b63ffffffff16146107f35760405162461bcd60e51b815260206004820152602860248201527f5570646174696e67207769746820696e636f7272656374206e756d626572206f60448201527f6620626c6f636b730000000000000000000000000000000000000000000000006064820152608401610310565b60408051602081018690529081018a90527fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b166060820152606401604051602081830303815290604052805190602001206002600084600161085a9190611b8a565b63ffffffff1663ffffffff16815260200190815260200160002054146108c25760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b6108cc87876116c5565b6109185760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b60408051602081018790529081018290527d0400000000000000000000000000000000000000000000000000000000006060820152606401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012063ffffffff87166000818152600284528490209190915583528201879052810182905261040060608201527f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb906080016106a7565b600060208201358103610a305760405162461bcd60e51b815260206004820152601e60248201527f436c61696d656420626c6f636b20686173682063616e6e6f74206265203000006044820152606401610310565b6000610400610a426020850185611b22565b610a4c9190611d06565b9050600081610a5e6020860186611b22565b610a689190611ce9565b63ffffffff8116600090815260026020526040812054919250819003610af65760405162461bcd60e51b815260206004820152602260248201527f4d65726b6c6520726f6f74206d7573742062652073746f72656420616c72656160448201527f64790000000000000000000000000000000000000000000000000000000000006064820152608401610310565b602085013560005b600a60ff82161015610bd857600163ffffffff861660ff83161c16600003610b755781876080018260ff16600a8110610b3957610b39611c82565b6020020135604051602001610b58929190918252602082015260400190565b604051602081830303815290604052805190602001209150610bc6565b866080018160ff16600a8110610b8d57610b8d611c82565b602002013582604051602001610bad929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610bd081611d50565b915050610afe565b50604086013581610bef6080890160608a01611b22565b604051602001610c3793929190928352602083019190915260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016604082015260440190565b604051602081830303815290604052805190602001208214945050505050919050565b6000806000806000610c6c8787611444565b9450945094509450945061040083610c849190611d06565b63ffffffff1615610cfd5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b610d0b600162020000611ce9565b63ffffffff16610d1b8484611ce9565b63ffffffff1614610d945760405162461bcd60e51b815260206004820152603360248201527f5570646174696e67207769746820696e636f7272656374206e756d626572206f60448201527f6620686973746f726963616c20626c6f636b73000000000000000000000000006064820152608401610310565b60408051602081018690529081018c90527fffffffff0000000000000000000000000000000000000000000000000000000060e08c901b1660608201526064016040516020818303038152906040528051906020012060026000846001610dfb9190611b8a565b63ffffffff1663ffffffff1681526020019081526020016000205414610e635760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b80610e6d8a61173f565b14610f065760405162461bcd60e51b815260206004820152604e60248201527f416767726567617465206d65726b6c6520726f6f74206f6620737570706c696560448201527f6420686973746f726963616c20726f6f747320646f6573206e6f74206d61746360648201527f6820746865205a4b5020726f6f74000000000000000000000000000000000000608482015260a401610310565b610f1087876118eb565b610f5c5760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b60005b608081101561122457610f7460016080611ce9565b63ffffffff1681146110a25760008982607f8110610f9457610f94611c82565b6101600201600a6020020135905060005b600a81101561103a578a83607f8110610fc057610fc0611c82565b610160020181610fd26001600a611d6f565b60ff16610fdf9190611c6f565b600b8110610fef57610fef611c82565b60200201358260405160200161100f929190918252602082015260400190565b604051602081830303815290604052805190602001209150808061103290611cb1565b915050610fa5565b508a826080811061104d5761104d611c82565b602002013581146110a05760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c6520696e636c7573696f6e2070726f6f66206661696c65640000006044820152606401610310565b505b600081156110d757896110b6600184611c6f565b607f81106110c6576110c6611c82565b6101600201600a60200201356110d9565b865b905060006110e961040084611b73565b6110f99063ffffffff8816611bae565b9050818c846080811061110e5761110e611c82565b602002013561040060405160200161115e93929190928352602083019190915260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016604082015260440190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012063ffffffff8416600090815260029093529120557f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb81838e86608081106111dd576111dd611c82565b6040805163ffffffff90951685526020858101949094529202013590820152610400606082015260800160405180910390a15050808061121c90611cb1565b915050610f5f565b505050505050505050505050565b604080516101408101825260008082527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208301527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30928201929092527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201528083600a81106113ae576113ae611c82565b60200201519392505050565b600063ffffffff8316408082036114395760405162461bcd60e51b815260206004820152603760248201527f4d75737420737570706c7920626c6f636b2068617368206f66206f6e65206f6660448201527f20323536206d6f737420726563656e7420626c6f636b730000000000000000006064820152608401610310565b821490505b92915050565b60008080808086866114596101806020611b8a565b611464906010611b8a565b63ffffffff16906114786101806040611b8a565b63ffffffff169261148b93929190611bc1565b61149491611beb565b608090811c9088610180896114aa826020611b8a565b63ffffffff16926114bd93929190611bc1565b6114c691611c33565b901b17945086866114da6101806060611b8a565b6114e5906010611b8a565b63ffffffff16906114f96101806080611b8a565b63ffffffff169261150c93929190611bc1565b61151591611beb565b608090811c90888861152a6101806040611b8a565b63ffffffff169061153e6101806060611b8a565b63ffffffff169261155193929190611bc1565b61155a91611c33565b901b1793508686600861157061018060a0611b8a565b61157a9190611ce9565b63ffffffff1690600461159061018060a0611b8a565b61159a9190611ce9565b63ffffffff16926115ad93929190611bc1565b6115b691611d88565b60e01c9250868660046115cc61018060a0611b8a565b6115d69190611ce9565b63ffffffff16906115ea61018060a0611b8a565b63ffffffff16926115fd93929190611bc1565b61160691611d88565b60e01c9150868661161a61018060a0611b8a565b611625906030611b8a565b63ffffffff169061163961018060a0611b8a565b611644906040611b8a565b63ffffffff169261165793929190611bc1565b61166091611beb565b608090811c90888861167561018060a0611b8a565b63ffffffff169061168961018060a0611b8a565b611694906020611b8a565b63ffffffff16926116a793929190611bc1565b6116b091611c33565b60001c901b1760001b90509295509295909350565b60008054604051829173ffffffffffffffffffffffffffffffffffffffff16906116f29086908690611dce565b6000604051808303816000865af19150503d806000811461172f576040519150601f19603f3d011682016040523d82523d6000602084013e611734565b606091505b509095945050505050565b604080518181526108208101825260009190829082602082016108008036833701905050905060005b828110156118065784600182901b6080811061178657611786611c82565b602002013585600183811b17608081106117a2576117a2611c82565b60200201356040516020016117c1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106117e9576117e9611c82565b6020908102919091010152806117fe81611cb1565b915050611768565b505b60018211156118c757600182901c915060005b828110156118c15781600182901b8151811061183957611839611c82565b602002602001015182600183901b6001178151811061185a5761185a611c82565b602002602001015160405160200161187c929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106118a4576118a4611c82565b6020908102919091010152806118b981611cb1565b91505061181b565b50611808565b806000815181106118da576118da611c82565b602002602001015192505050919050565b600154604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906116f29086908690611dce565b604051806101400160405280600a906020820280368337509192915050565b60008083601f84011261194d57600080fd5b50813567ffffffffffffffff81111561196557600080fd5b60208301915083602082850101111561197d57600080fd5b9250929050565b6000806020838503121561199757600080fd5b823567ffffffffffffffff8111156119ae57600080fd5b6119ba8582860161193b565b90969095509350505050565b803563ffffffff811681146119da57600080fd5b919050565b600080600080606085870312156119f557600080fd5b84359350611a05602086016119c6565b9250604085013567ffffffffffffffff811115611a2157600080fd5b611a2d8782880161193b565b95989497509550505050565b60006101c08284031215611a4c57600080fd5b50919050565b60008060008060008061bf008789031215611a6c57600080fd5b86359550611a7c602088016119c6565b9450611040870188811115611a9057600080fd5b60408801945061bee0880189811115611aa857600080fd5b9093503567ffffffffffffffff811115611ac157600080fd5b611acd89828a0161193b565b979a9699509497509295939492505050565b600060208284031215611af157600080fd5b5035919050565b60008060408385031215611b0b57600080fd5b611b14836119c6565b946020939093013593505050565b600060208284031215611b3457600080fd5b611b3d826119c6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761143e5761143e611b44565b63ffffffff818116838216019080821115611ba757611ba7611b44565b5092915050565b8082018082111561143e5761143e611b44565b60008085851115611bd157600080fd5b83861115611bde57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008135818116916010851015611c2b5780818660100360031b1b83161692505b505092915050565b8035602083101561143e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b8181038181111561143e5761143e611b44565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ce257611ce2611b44565b5060010190565b63ffffffff828116828216039080821115611ba757611ba7611b44565b600063ffffffff80841680611d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b600060ff821660ff8103611d6657611d66611b44565b60010192915050565b60ff828116828216039081111561143e5761143e611b44565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611c2b5760049490940360031b84901b1690921692915050565b818382376000910190815291905056fea2646970667358221220ebb3649264d1972de47445824beb46e801d3b148a6911b33a6013c84e4b23d3b64736f6c63430008110033000000000000000000000000f0e3b9aada6d89ddeb34aab7e9cd1744cf90d82f000000000000000000000000bf2c05d0362a640629b9b98be4c4e4f9a8e22841
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80637225fb211161005b5780637225fb21146100d2578063b737127e146100e5578063c1f7cae214610106578063c6ca47531461011957600080fd5b806301ef3afa1461008257806311b63d01146100975780636f193b83146100aa575b600080fd5b610095610090366004611984565b610139565b005b6100956100a53660046119df565b6106ba565b6100bd6100b8366004611a39565b6109db565b60405190151581526020015b60405180910390f35b6100956100e0366004611a52565b610c5a565b6100f86100f3366004611adf565b611232565b6040519081526020016100c9565b6100bd610114366004611af8565b6113ba565b6100f8610127366004611b22565b60026020526000908152604090205481565b600080600080600061014b8787611444565b9450945094509450945061015d61191c565b60015b600a81116102a2578888610175836040611b73565b61018261018060a0611b8a565b63ffffffff166101929190611bae565b61019d906010611bae565b6101a8906020611bae565b906101b4846040611b73565b6101c161018060a0611b8a565b63ffffffff166101d19190611bae565b6101dc906040611bae565b926101e993929190611bc1565b6101f291611beb565b608090811c908a8a610205856040611b73565b61021261018060a0611b8a565b63ffffffff166102229190611bae565b9061022e866040611b73565b61023b61018060a0611b8a565b63ffffffff1661024b9190611bae565b610256906020611bae565b9261026393929190611bc1565b61026c91611c33565b901b178261027b600184611c6f565b600a811061028b5761028b611c82565b60200201528061029a81611cb1565b915050610160565b5060006102af8585611ce9565b6102ba906001611b8a565b905061040063ffffffff821611156103195760405162461bcd60e51b815260206004820181905260248201527f5570646174696e6720746f6f206d616e7920626c6f636b73206174206f6e636560448201526064015b60405180910390fd5b61032561040086611d06565b63ffffffff161561039e5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b6101006103b163ffffffff861643611c6f565b11156103ff5760405162461bcd60e51b815260206004820152601560248201527f4e6f74206120726563656e7420656e64426c6f636b00000000000000000000006044820152606401610310565b438463ffffffff16106104545760405162461bcd60e51b815260206004820152601560248201527f4e6f74206120726563656e7420656e64426c6f636b00000000000000000000006044820152606401610310565b858463ffffffff1640146104aa5760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b6104b489896116c5565b6105005760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b826105dd5760015b600a81116105db578261051c82600a611c6f565b600a811061052c5761052c611c82565b60200201511561058f578261054282600a611c6f565b600a811061055257610552611c82565b602002015184604051602001610572929190918252602082015260400190565b6040516020818303038152906040528051906020012093506105c9565b8361059e6100f3600184611c6f565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093505b806105d381611cb1565b915050610508565b505b60408051602081018990529081018490527fffffffff0000000000000000000000000000000000000000000000000000000060e083901b166060820152606401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012063ffffffff898116600081815260028552859020929092559084529083018a9052908201859052821660608201527f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb906080015b60405180910390a1505050505050505050565b60008060008060006106cc8787611444565b94509450945094509450610400836106e49190611d06565b63ffffffff161561075d5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b61076a6001610400611ce9565b63ffffffff1661077a8484611ce9565b63ffffffff16146107f35760405162461bcd60e51b815260206004820152602860248201527f5570646174696e67207769746820696e636f7272656374206e756d626572206f60448201527f6620626c6f636b730000000000000000000000000000000000000000000000006064820152608401610310565b60408051602081018690529081018a90527fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b166060820152606401604051602081830303815290604052805190602001206002600084600161085a9190611b8a565b63ffffffff1663ffffffff16815260200190815260200160002054146108c25760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b6108cc87876116c5565b6109185760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b60408051602081018790529081018290527d0400000000000000000000000000000000000000000000000000000000006060820152606401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012063ffffffff87166000818152600284528490209190915583528201879052810182905261040060608201527f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb906080016106a7565b600060208201358103610a305760405162461bcd60e51b815260206004820152601e60248201527f436c61696d656420626c6f636b20686173682063616e6e6f74206265203000006044820152606401610310565b6000610400610a426020850185611b22565b610a4c9190611d06565b9050600081610a5e6020860186611b22565b610a689190611ce9565b63ffffffff8116600090815260026020526040812054919250819003610af65760405162461bcd60e51b815260206004820152602260248201527f4d65726b6c6520726f6f74206d7573742062652073746f72656420616c72656160448201527f64790000000000000000000000000000000000000000000000000000000000006064820152608401610310565b602085013560005b600a60ff82161015610bd857600163ffffffff861660ff83161c16600003610b755781876080018260ff16600a8110610b3957610b39611c82565b6020020135604051602001610b58929190918252602082015260400190565b604051602081830303815290604052805190602001209150610bc6565b866080018160ff16600a8110610b8d57610b8d611c82565b602002013582604051602001610bad929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610bd081611d50565b915050610afe565b50604086013581610bef6080890160608a01611b22565b604051602001610c3793929190928352602083019190915260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016604082015260440190565b604051602081830303815290604052805190602001208214945050505050919050565b6000806000806000610c6c8787611444565b9450945094509450945061040083610c849190611d06565b63ffffffff1615610cfd5760405162461bcd60e51b815260206004820152602d60248201527f7374617274426c6f636b4e756d626572206e6f742061206d756c7469706c652060448201527f6f66204e554d5f4c4541564553000000000000000000000000000000000000006064820152608401610310565b610d0b600162020000611ce9565b63ffffffff16610d1b8484611ce9565b63ffffffff1614610d945760405162461bcd60e51b815260206004820152603360248201527f5570646174696e67207769746820696e636f7272656374206e756d626572206f60448201527f6620686973746f726963616c20626c6f636b73000000000000000000000000006064820152608401610310565b60408051602081018690529081018c90527fffffffff0000000000000000000000000000000000000000000000000000000060e08c901b1660608201526064016040516020818303038152906040528051906020012060026000846001610dfb9190611b8a565b63ffffffff1663ffffffff1681526020019081526020016000205414610e635760405162461bcd60e51b815260206004820152601660248201527f656e644861736820646f6573206e6f74206d61746368000000000000000000006044820152606401610310565b80610e6d8a61173f565b14610f065760405162461bcd60e51b815260206004820152604e60248201527f416767726567617465206d65726b6c6520726f6f74206f6620737570706c696560448201527f6420686973746f726963616c20726f6f747320646f6573206e6f74206d61746360648201527f6820746865205a4b5020726f6f74000000000000000000000000000000000000608482015260a401610310565b610f1087876118eb565b610f5c5760405162461bcd60e51b815260206004820152601360248201527f5a4b5020646f6573206e6f7420766572696679000000000000000000000000006044820152606401610310565b60005b608081101561122457610f7460016080611ce9565b63ffffffff1681146110a25760008982607f8110610f9457610f94611c82565b6101600201600a6020020135905060005b600a81101561103a578a83607f8110610fc057610fc0611c82565b610160020181610fd26001600a611d6f565b60ff16610fdf9190611c6f565b600b8110610fef57610fef611c82565b60200201358260405160200161100f929190918252602082015260400190565b604051602081830303815290604052805190602001209150808061103290611cb1565b915050610fa5565b508a826080811061104d5761104d611c82565b602002013581146110a05760405162461bcd60e51b815260206004820152601d60248201527f4d65726b6c6520696e636c7573696f6e2070726f6f66206661696c65640000006044820152606401610310565b505b600081156110d757896110b6600184611c6f565b607f81106110c6576110c6611c82565b6101600201600a60200201356110d9565b865b905060006110e961040084611b73565b6110f99063ffffffff8816611bae565b9050818c846080811061110e5761110e611c82565b602002013561040060405160200161115e93929190928352602083019190915260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016604082015260440190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012063ffffffff8416600090815260029093529120557f8b1606624b2f737eaf245dca9fba97deb930da8f4c71fb05a3f1b77d6bb8dfeb81838e86608081106111dd576111dd611c82565b6040805163ffffffff90951685526020858101949094529202013590820152610400606082015260800160405180910390a15050808061121c90611cb1565b915050610f5f565b505050505050505050505050565b604080516101408101825260008082527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560208301527fb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30928201929092527f21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba8560608201527fe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a1934460808201527f0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d60a08201527f887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a196860c08201527fffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f8360e08201527f9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af6101008201527fcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e06101208201528083600a81106113ae576113ae611c82565b60200201519392505050565b600063ffffffff8316408082036114395760405162461bcd60e51b815260206004820152603760248201527f4d75737420737570706c7920626c6f636b2068617368206f66206f6e65206f6660448201527f20323536206d6f737420726563656e7420626c6f636b730000000000000000006064820152608401610310565b821490505b92915050565b60008080808086866114596101806020611b8a565b611464906010611b8a565b63ffffffff16906114786101806040611b8a565b63ffffffff169261148b93929190611bc1565b61149491611beb565b608090811c9088610180896114aa826020611b8a565b63ffffffff16926114bd93929190611bc1565b6114c691611c33565b901b17945086866114da6101806060611b8a565b6114e5906010611b8a565b63ffffffff16906114f96101806080611b8a565b63ffffffff169261150c93929190611bc1565b61151591611beb565b608090811c90888861152a6101806040611b8a565b63ffffffff169061153e6101806060611b8a565b63ffffffff169261155193929190611bc1565b61155a91611c33565b901b1793508686600861157061018060a0611b8a565b61157a9190611ce9565b63ffffffff1690600461159061018060a0611b8a565b61159a9190611ce9565b63ffffffff16926115ad93929190611bc1565b6115b691611d88565b60e01c9250868660046115cc61018060a0611b8a565b6115d69190611ce9565b63ffffffff16906115ea61018060a0611b8a565b63ffffffff16926115fd93929190611bc1565b61160691611d88565b60e01c9150868661161a61018060a0611b8a565b611625906030611b8a565b63ffffffff169061163961018060a0611b8a565b611644906040611b8a565b63ffffffff169261165793929190611bc1565b61166091611beb565b608090811c90888861167561018060a0611b8a565b63ffffffff169061168961018060a0611b8a565b611694906020611b8a565b63ffffffff16926116a793929190611bc1565b6116b091611c33565b60001c901b1760001b90509295509295909350565b60008054604051829173ffffffffffffffffffffffffffffffffffffffff16906116f29086908690611dce565b6000604051808303816000865af19150503d806000811461172f576040519150601f19603f3d011682016040523d82523d6000602084013e611734565b606091505b509095945050505050565b604080518181526108208101825260009190829082602082016108008036833701905050905060005b828110156118065784600182901b6080811061178657611786611c82565b602002013585600183811b17608081106117a2576117a2611c82565b60200201356040516020016117c1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106117e9576117e9611c82565b6020908102919091010152806117fe81611cb1565b915050611768565b505b60018211156118c757600182901c915060005b828110156118c15781600182901b8151811061183957611839611c82565b602002602001015182600183901b6001178151811061185a5761185a611c82565b602002602001015160405160200161187c929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106118a4576118a4611c82565b6020908102919091010152806118b981611cb1565b91505061181b565b50611808565b806000815181106118da576118da611c82565b602002602001015192505050919050565b600154604051600091829173ffffffffffffffffffffffffffffffffffffffff909116906116f29086908690611dce565b604051806101400160405280600a906020820280368337509192915050565b60008083601f84011261194d57600080fd5b50813567ffffffffffffffff81111561196557600080fd5b60208301915083602082850101111561197d57600080fd5b9250929050565b6000806020838503121561199757600080fd5b823567ffffffffffffffff8111156119ae57600080fd5b6119ba8582860161193b565b90969095509350505050565b803563ffffffff811681146119da57600080fd5b919050565b600080600080606085870312156119f557600080fd5b84359350611a05602086016119c6565b9250604085013567ffffffffffffffff811115611a2157600080fd5b611a2d8782880161193b565b95989497509550505050565b60006101c08284031215611a4c57600080fd5b50919050565b60008060008060008061bf008789031215611a6c57600080fd5b86359550611a7c602088016119c6565b9450611040870188811115611a9057600080fd5b60408801945061bee0880189811115611aa857600080fd5b9093503567ffffffffffffffff811115611ac157600080fd5b611acd89828a0161193b565b979a9699509497509295939492505050565b600060208284031215611af157600080fd5b5035919050565b60008060408385031215611b0b57600080fd5b611b14836119c6565b946020939093013593505050565b600060208284031215611b3457600080fd5b611b3d826119c6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761143e5761143e611b44565b63ffffffff818116838216019080821115611ba757611ba7611b44565b5092915050565b8082018082111561143e5761143e611b44565b60008085851115611bd157600080fd5b83861115611bde57600080fd5b5050820193919092039150565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000008135818116916010851015611c2b5780818660100360031b1b83161692505b505092915050565b8035602083101561143e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b8181038181111561143e5761143e611b44565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ce257611ce2611b44565b5060010190565b63ffffffff828116828216039080821115611ba757611ba7611b44565b600063ffffffff80841680611d44577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910692915050565b600060ff821660ff8103611d6657611d66611b44565b60010192915050565b60ff828116828216039081111561143e5761143e611b44565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015611c2b5760049490940360031b84901b1690921692915050565b818382376000910190815291905056fea2646970667358221220ebb3649264d1972de47445824beb46e801d3b148a6911b33a6013c84e4b23d3b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f0e3b9aada6d89ddeb34aab7e9cd1744cf90d82f000000000000000000000000bf2c05d0362a640629b9b98be4c4e4f9a8e22841
-----Decoded View---------------
Arg [0] : _verifierAddress (address): 0xf0E3B9aAdA6D89DdEb34aaB7E9cd1744CF90D82f
Arg [1] : _historicalVerifierAddress (address): 0xBF2c05D0362a640629b9b98Be4c4E4f9a8E22841
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0e3b9aada6d89ddeb34aab7e9cd1744cf90d82f
Arg [1] : 000000000000000000000000bf2c05d0362a640629b9b98be4c4e4f9a8e22841
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.