ETH Price: $3,375.48 (-0.90%)

Contract

0x01d5b501C1fc0121e1411970fb79c322737025c2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Recent170343902023-04-12 20:50:35648 days ago1681332635IN
0x01d5b501...2737025c2
0 ETH0.0099281424.95707618
Update Recent170342642023-04-12 20:24:59648 days ago1681331099IN
0x01d5b501...2737025c2
0 ETH0.0095485525.56308094
Update Recent170341362023-04-12 19:58:23648 days ago1681329503IN
0x01d5b501...2737025c2
0 ETH0.0105237127.61949847
Update Recent170340072023-04-12 19:32:23648 days ago1681327943IN
0x01d5b501...2737025c2
0 ETH0.0158036841.49265985
Update Recent170338782023-04-12 19:06:11648 days ago1681326371IN
0x01d5b501...2737025c2
0 ETH0.0143609337.71065256
Update Recent170337512023-04-12 18:40:23648 days ago1681324823IN
0x01d5b501...2737025c2
0 ETH0.0119954431.50716947
Update Recent170336232023-04-12 18:13:59648 days ago1681323239IN
0x01d5b501...2737025c2
0 ETH0.0113615929.83086515
Update Recent170334952023-04-12 17:47:47648 days ago1681321667IN
0x01d5b501...2737025c2
0 ETH0.0122858132.27087578
Update Recent170333682023-04-12 17:22:11648 days ago1681320131IN
0x01d5b501...2737025c2
0 ETH0.0095512324.00888512
Update Recent170332392023-04-12 16:55:47649 days ago1681318547IN
0x01d5b501...2737025c2
0 ETH0.0130757535.00825442
Update Recent170331112023-04-12 16:29:23649 days ago1681316963IN
0x01d5b501...2737025c2
0 ETH0.0098046625.7307133
Update Recent170330002023-04-12 16:06:47649 days ago1681315607IN
0x01d5b501...2737025c2
0 ETH0.0148394938.9587296
Update Recent170328552023-04-12 15:37:23649 days ago1681313843IN
0x01d5b501...2737025c2
0 ETH0.0117889130.95185335
Update Recent170327282023-04-12 15:11:11649 days ago1681312271IN
0x01d5b501...2737025c2
0 ETH0.0133827135.15539987
Update Recent170326002023-04-12 14:45:23649 days ago1681310723IN
0x01d5b501...2737025c2
0 ETH0.0107133128.1243336
Update Recent170324722023-04-12 14:19:23649 days ago1681309163IN
0x01d5b501...2737025c2
0 ETH0.0115369330.3009443
Update Recent170323432023-04-12 13:52:59649 days ago1681307579IN
0x01d5b501...2737025c2
0 ETH0.0108087527.16826031
Update Recent170322162023-04-12 13:27:11649 days ago1681306031IN
0x01d5b501...2737025c2
0 ETH0.0090098524.12245094
Update Recent170320872023-04-12 13:01:11649 days ago1681304471IN
0x01d5b501...2737025c2
0 ETH0.010609127.84270302
Update Recent170319592023-04-12 12:34:47649 days ago1681302887IN
0x01d5b501...2737025c2
0 ETH0.0117927530.96096732
Update Recent170318312023-04-12 12:08:11649 days ago1681301291IN
0x01d5b501...2737025c2
0 ETH0.0086478722.70577297
Update Recent170317042023-04-12 11:42:11649 days ago1681299731IN
0x01d5b501...2737025c2
0 ETH0.0091958824.1530988
Update Recent170315752023-04-12 11:16:23649 days ago1681298183IN
0x01d5b501...2737025c2
0 ETH0.0078419220.5903043
Update Recent170314472023-04-12 10:50:35649 days ago1681296635IN
0x01d5b501...2737025c2
0 ETH0.0088859923.34063877
Update Recent170313192023-04-12 10:24:35649 days ago1681295075IN
0x01d5b501...2737025c2
0 ETH0.0105795726.59220132
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AxiomV0

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 16000 runs

Other Settings:
default evmVersion
File 1 of 1 : AxiomV0.sol
// 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)));
    }
}

Settings
{
  "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

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.