ETH Price: $2,834.01 (+2.23%)

Contract

0xe7C1D08aC706444F356af2D37541d8d57e8C57B6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Receive Message140848882022-01-27 2:02:031123 days ago1643248923IN
0xe7C1D08a...57e8C57B6
0 ETH0.04418976149.95644238
Receive Message140799562022-01-26 7:39:151124 days ago1643182755IN
0xe7C1D08a...57e8C57B6
0 ETH0.03258781113.09910432
Receive Message140789082022-01-26 3:38:491124 days ago1643168329IN
0xe7C1D08a...57e8C57B6
0 ETH0.0344049116.86211938
Send Cross Domai...140749712022-01-25 13:18:141125 days ago1643116694IN
0xe7C1D08a...57e8C57B6
0 ETH0.00547890.96201173
Receive Message140246982022-01-17 18:33:081133 days ago1642444388IN
0xe7C1D08a...57e8C57B6
0 ETH0.0342243115.7313381
Receive Message140060232022-01-14 21:22:321136 days ago1642195352IN
0xe7C1D08a...57e8C57B6
0 ETH0.06596708225.05300801
Receive Message140047222022-01-14 16:32:241136 days ago1642177944IN
0xe7C1D08a...57e8C57B6
0 ETH0.04873769165.24556429
Receive Message140017022022-01-14 5:12:211136 days ago1642137141IN
0xe7C1D08a...57e8C57B6
0 ETH0.03840158129.27695273
Receive Message139866572022-01-11 21:24:261139 days ago1641936266IN
0xe7C1D08a...57e8C57B6
0 ETH0.04608581155.72582506
Receive Message139789562022-01-10 16:54:051140 days ago1641833645IN
0xe7C1D08a...57e8C57B6
0 ETH0.09253684313.49613374
Receive Message139775712022-01-10 11:44:041140 days ago1641815044IN
0xe7C1D08a...57e8C57B6
0 ETH0.07585694210.99036372
Receive Message139703302022-01-09 8:43:461141 days ago1641717826IN
0xe7C1D08a...57e8C57B6
0 ETH0.0246406483.58429015
Receive Message139692802022-01-09 4:53:331141 days ago1641704013IN
0xe7C1D08a...57e8C57B6
0 ETH0.04965375145.15966967
Receive Message139579932022-01-07 11:12:461143 days ago1641553966IN
0xe7C1D08a...57e8C57B6
0 ETH0.0242238981.20185372
Receive Message139546212022-01-06 22:42:191144 days ago1641508939IN
0xe7C1D08a...57e8C57B6
0 ETH0.038014118.86099097
Receive Message139443212022-01-05 8:20:041145 days ago1641370804IN
0xe7C1D08a...57e8C57B6
0 ETH0.03488109117.25485298
Receive Message139321852022-01-03 11:26:171147 days ago1641209177IN
0xe7C1D08a...57e8C57B6
0 ETH0.019894267.4171949
Receive Message139309512022-01-03 6:35:581147 days ago1641191758IN
0xe7C1D08a...57e8C57B6
0 ETH0.03446156115.50486127
Receive Message139264252022-01-02 14:05:251148 days ago1641132325IN
0xe7C1D08a...57e8C57B6
0 ETH0.0199826667.35381606
Receive Message139136312021-12-31 14:21:491150 days ago1640960509IN
0xe7C1D08a...57e8C57B6
0 ETH0.0250258283.85462183
Receive Message139126482021-12-31 10:37:421150 days ago1640947062IN
0xe7C1D08a...57e8C57B6
0 ETH0.0262310376.72763564
Receive Message139124212021-12-31 9:46:061150 days ago1640943966IN
0xe7C1D08a...57e8C57B6
0 ETH0.0263675173.91366206
Receive Message139120872021-12-31 8:29:391150 days ago1640939379IN
0xe7C1D08a...57e8C57B6
0 ETH0.0281807596.71048613
Receive Message139092322021-12-30 21:52:111151 days ago1640901131IN
0xe7C1D08a...57e8C57B6
0 ETH0.02916421101.88976026
Receive Message139041902021-12-30 3:02:481151 days ago1640833368IN
0xe7C1D08a...57e8C57B6
0 ETH0.03515356118.6610084
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
140852192022-01-27 3:19:571123 days ago1643253597
0xe7C1D08a...57e8C57B6
0 ETH
140852192022-01-27 3:19:571123 days ago1643253597
0xe7C1D08a...57e8C57B6
0 ETH
140848882022-01-27 2:02:031123 days ago1643248923
0xe7C1D08a...57e8C57B6
0 ETH
140848882022-01-27 2:02:031123 days ago1643248923
0xe7C1D08a...57e8C57B6
0 ETH
140848882022-01-27 2:02:031123 days ago1643248923
0xe7C1D08a...57e8C57B6
0 ETH
140835212022-01-26 20:53:571124 days ago1643230437
0xe7C1D08a...57e8C57B6
0 ETH
140835212022-01-26 20:53:571124 days ago1643230437
0xe7C1D08a...57e8C57B6
0 ETH
140829972022-01-26 18:53:531124 days ago1643223233
0xe7C1D08a...57e8C57B6
0 ETH
140829972022-01-26 18:53:531124 days ago1643223233
0xe7C1D08a...57e8C57B6
0 ETH
140823662022-01-26 16:31:521124 days ago1643214712
0xe7C1D08a...57e8C57B6
0 ETH
140823662022-01-26 16:31:521124 days ago1643214712
0xe7C1D08a...57e8C57B6
0 ETH
140813712022-01-26 12:56:131124 days ago1643201773
0xe7C1D08a...57e8C57B6
0 ETH
140813712022-01-26 12:56:131124 days ago1643201773
0xe7C1D08a...57e8C57B6
0 ETH
140807432022-01-26 10:38:561124 days ago1643193536
0xe7C1D08a...57e8C57B6
0 ETH
140807432022-01-26 10:38:561124 days ago1643193536
0xe7C1D08a...57e8C57B6
0 ETH
140801992022-01-26 8:37:381124 days ago1643186258
0xe7C1D08a...57e8C57B6
0 ETH
140801992022-01-26 8:37:381124 days ago1643186258
0xe7C1D08a...57e8C57B6
0 ETH
140799562022-01-26 7:39:151124 days ago1643182755
0xe7C1D08a...57e8C57B6
0 ETH
140799562022-01-26 7:39:151124 days ago1643182755
0xe7C1D08a...57e8C57B6
0 ETH
140799562022-01-26 7:39:151124 days ago1643182755
0xe7C1D08a...57e8C57B6
0 ETH
140789082022-01-26 3:38:491124 days ago1643168329
0xe7C1D08a...57e8C57B6
0 ETH
140789082022-01-26 3:38:491124 days ago1643168329
0xe7C1D08a...57e8C57B6
0 ETH
140789082022-01-26 3:38:491124 days ago1643168329
0xe7C1D08a...57e8C57B6
0 ETH
140778832022-01-25 23:55:521125 days ago1643154952
0xe7C1D08a...57e8C57B6
0 ETH
140778832022-01-25 23:55:521125 days ago1643154952
0xe7C1D08a...57e8C57B6
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PolygonMessengerWrapper

Compiler Version
v0.7.3+commit.9bfce1f6

Optimization Enabled:
Yes with 50000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-21
*/

/**
 *Submitted for verification at Etherscan.io on 2021-07-21
*/

// SPDX-License-Identifier: MIT
// @unsupported: ovm
pragma solidity 0.7.3;
pragma experimental ABIEncoderV2;

library RLPReader {
    uint8 constant STRING_SHORT_START = 0x80;
    uint8 constant STRING_LONG_START = 0xb8;
    uint8 constant LIST_SHORT_START = 0xc0;
    uint8 constant LIST_LONG_START = 0xf8;
    uint8 constant WORD_SIZE = 32;

    struct RLPItem {
        uint256 len;
        uint256 memPtr;
    }

    /*
     * @param item RLP encoded bytes
     */
    function toRlpItem(bytes memory item)
        internal
        pure
        returns (RLPItem memory)
    {
        require(item.length > 0, "RLPReader: INVALID_BYTES_LENGTH");
        uint256 memPtr;
        assembly {
            memPtr := add(item, 0x20)
        }

        return RLPItem(item.length, memPtr);
    }

    /*
     * @param item RLP encoded list in bytes
     */
    function toList(RLPItem memory item)
        internal
        pure
        returns (RLPItem[] memory)
    {
        require(isList(item), "RLPReader: ITEM_NOT_LIST");

        uint256 items = numItems(item);
        RLPItem[] memory result = new RLPItem[](items);
        uint256 listLength = _itemLength(item.memPtr);
        require(listLength == item.len, "RLPReader: LIST_DECODED_LENGTH_MISMATCH");

        uint256 memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint256 dataLen;
        for (uint256 i = 0; i < items; i++) {
            dataLen = _itemLength(memPtr);
            result[i] = RLPItem(dataLen, memPtr);
            memPtr = memPtr + dataLen;
        }

        return result;
    }

    // @return indicator whether encoded payload is a list. negate this function call for isData.
    function isList(RLPItem memory item) internal pure returns (bool) {
        uint8 byte0;
        uint256 memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < LIST_SHORT_START) return false;
        return true;
    }

    /** RLPItem conversions into data types **/

    // @returns raw rlp encoding in bytes
    function toRlpBytes(RLPItem memory item)
        internal
        pure
        returns (bytes memory)
    {
        bytes memory result = new bytes(item.len);

        uint256 ptr;
        assembly {
            ptr := add(0x20, result)
        }

        copy(item.memPtr, ptr, item.len);
        return result;
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        require(!isList(item), "RLPReader: DECODING_LIST_AS_ADDRESS");
        // 1 byte for the length prefix
        require(item.len == 21, "RLPReader: INVALID_ADDRESS_LENGTH");

        return address(toUint(item));
    }

    function toUint(RLPItem memory item) internal pure returns (uint256) {
        require(!isList(item), "RLPReader: DECODING_LIST_AS_UINT");
        require(item.len <= 33, "RLPReader: INVALID_UINT_LENGTH");

        uint256 itemLength = _itemLength(item.memPtr);
        require(itemLength == item.len, "RLPReader: UINT_DECODED_LENGTH_MISMATCH");

        uint256 offset = _payloadOffset(item.memPtr);
        uint256 len = item.len - offset;
        uint256 result;
        uint256 memPtr = item.memPtr + offset;
        assembly {
            result := mload(memPtr)

            // shfit to the correct location if neccesary
            if lt(len, 32) {
                result := div(result, exp(256, sub(32, len)))
            }
        }

        return result;
    }

    // enforces 32 byte length
    function toUintStrict(RLPItem memory item) internal pure returns (uint256) {
        uint256 itemLength = _itemLength(item.memPtr);
        require(itemLength == item.len, "RLPReader: UINT_STRICT_DECODED_LENGTH_MISMATCH");
        // one byte prefix
        require(item.len == 33, "RLPReader: INVALID_UINT_STRICT_LENGTH");

        uint256 result;
        uint256 memPtr = item.memPtr + 1;
        assembly {
            result := mload(memPtr)
        }

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
        uint256 listLength = _itemLength(item.memPtr);
        require(listLength == item.len, "RLPReader: BYTES_DECODED_LENGTH_MISMATCH");
        uint256 offset = _payloadOffset(item.memPtr);

        uint256 len = item.len - offset; // data length
        bytes memory result = new bytes(len);

        uint256 destPtr;
        assembly {
            destPtr := add(0x20, result)
        }

        copy(item.memPtr + offset, destPtr, len);
        return result;
    }

    /*
     * Private Helpers
     */

    // @return number of payload items inside an encoded list.
    function numItems(RLPItem memory item) private pure returns (uint256) {
        // add `isList` check if `item` is expected to be passsed without a check from calling function
        // require(isList(item), "RLPReader: NUM_ITEMS_NOT_LIST");

        uint256 count = 0;
        uint256 currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint256 endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
            currPtr = currPtr + _itemLength(currPtr); // skip over an item
            require(currPtr <= endPtr, "RLPReader: NUM_ITEMS_DECODED_LENGTH_MISMATCH");
            count++;
        }

        return count;
    }

    // @return entire rlp item byte length
    function _itemLength(uint256 memPtr) private pure returns (uint256) {
        uint256 itemLen;
        uint256 byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START) itemLen = 1;
        else if (byte0 < STRING_LONG_START)
            itemLen = byte0 - STRING_SHORT_START + 1;
        else if (byte0 < LIST_SHORT_START) {
            assembly {
                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
                memPtr := add(memPtr, 1) // skip over the first byte

                /* 32 byte word size */
                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
                itemLen := add(dataLen, add(byteLen, 1))
            }
        } else if (byte0 < LIST_LONG_START) {
            itemLen = byte0 - LIST_SHORT_START + 1;
        } else {
            assembly {
                let byteLen := sub(byte0, 0xf7)
                memPtr := add(memPtr, 1)

                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
                itemLen := add(dataLen, add(byteLen, 1))
            }
        }

        return itemLen;
    }

    // @return number of bytes until the data
    function _payloadOffset(uint256 memPtr) private pure returns (uint256) {
        uint256 byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START) return 0;
        else if (
            byte0 < STRING_LONG_START ||
            (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START)
        ) return 1;
        else if (byte0 < LIST_SHORT_START)
            // being explicit
            return byte0 - (STRING_LONG_START - 1) + 1;
        else return byte0 - (LIST_LONG_START - 1) + 1;
    }

    /*
     * @param src Pointer to source
     * @param dest Pointer to destination
     * @param len Amount of memory to copy from the source
     */
    function copy(
        uint256 src,
        uint256 dest,
        uint256 len
    ) private pure {
        if (len == 0) return;

        // copy as many word sizes as possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

        // left over bytes. Mask is used to remove unwanted bytes from the word
        uint256 mask = 256**(WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}

library MerklePatriciaProof {
    /*
     * @dev Verifies a merkle patricia proof.
     * @param value The terminating value in the trie.
     * @param encodedPath The path in the trie leading to value.
     * @param rlpParentNodes The rlp encoded stack of nodes.
     * @param root The root hash of the trie.
     * @return The boolean validity of the proof.
     */
    function verify(
        bytes memory value,
        bytes memory encodedPath,
        bytes memory rlpParentNodes,
        bytes32 root
    ) internal pure returns (bool) {
        RLPReader.RLPItem memory item = RLPReader.toRlpItem(rlpParentNodes);
        RLPReader.RLPItem[] memory parentNodes = RLPReader.toList(item);

        bytes memory currentNode;
        RLPReader.RLPItem[] memory currentNodeList;

        bytes32 nodeKey = root;
        uint256 pathPtr = 0;

        bytes memory path = _getNibbleArray(encodedPath);
        if (path.length == 0) {
            return false;
        }

        for (uint256 i = 0; i < parentNodes.length; i++) {
            if (pathPtr > path.length) {
                return false;
            }

            currentNode = RLPReader.toRlpBytes(parentNodes[i]);
            if (nodeKey != keccak256(currentNode)) {
                return false;
            }
            currentNodeList = RLPReader.toList(parentNodes[i]);

            if (currentNodeList.length == 17) {
                if (pathPtr == path.length) {
                    if (
                        keccak256(RLPReader.toBytes(currentNodeList[16])) ==
                        keccak256(value)
                    ) {
                        return true;
                    } else {
                        return false;
                    }
                }

                uint8 nextPathNibble = uint8(path[pathPtr]);
                if (nextPathNibble > 16) {
                    return false;
                }
                nodeKey = bytes32(
                    RLPReader.toUintStrict(currentNodeList[nextPathNibble])
                );
                pathPtr += 1;
            } else if (currentNodeList.length == 2) {
                uint256 traversed = _nibblesToTraverse(
                    RLPReader.toBytes(currentNodeList[0]),
                    path,
                    pathPtr
                );
                if (pathPtr + traversed == path.length) {
                    //leaf node
                    if (
                        keccak256(RLPReader.toBytes(currentNodeList[1])) ==
                        keccak256(value)
                    ) {
                        return true;
                    } else {
                        return false;
                    }
                }

                //extension node
                if (traversed == 0) {
                    return false;
                }

                pathPtr += traversed;
                nodeKey = bytes32(RLPReader.toUintStrict(currentNodeList[1]));
            } else {
                return false;
            }
        }
    }

    function _nibblesToTraverse(
        bytes memory encodedPartialPath,
        bytes memory path,
        uint256 pathPtr
    ) private pure returns (uint256) {
        uint256 len = 0;
        // encodedPartialPath has elements that are each two hex characters (1 byte), but partialPath
        // and slicedPath have elements that are each one hex character (1 nibble)
        bytes memory partialPath = _getNibbleArray(encodedPartialPath);
        bytes memory slicedPath = new bytes(partialPath.length);

        // pathPtr counts nibbles in path
        // partialPath.length is a number of nibbles
        for (uint256 i = pathPtr; i < pathPtr + partialPath.length; i++) {
            bytes1 pathNibble = path[i];
            slicedPath[i - pathPtr] = pathNibble;
        }

        if (keccak256(partialPath) == keccak256(slicedPath)) {
            len = partialPath.length;
        } else {
            len = 0;
        }
        return len;
    }

    // bytes b must be hp encoded
    function _getNibbleArray(bytes memory b)
        internal
        pure
        returns (bytes memory)
    {
        bytes memory nibbles = "";
        if (b.length > 0) {
            uint8 offset;
            uint8 hpNibble = uint8(_getNthNibbleOfBytes(0, b));
            if (hpNibble == 1 || hpNibble == 3) {
                nibbles = new bytes(b.length * 2 - 1);
                bytes1 oddNibble = _getNthNibbleOfBytes(1, b);
                nibbles[0] = oddNibble;
                offset = 1;
            } else {
                nibbles = new bytes(b.length * 2 - 2);
                offset = 0;
            }

            for (uint256 i = offset; i < nibbles.length; i++) {
                nibbles[i] = _getNthNibbleOfBytes(i - offset + 2, b);
            }
        }
        return nibbles;
    }

    function _getNthNibbleOfBytes(uint256 n, bytes memory str)
        private
        pure
        returns (bytes1)
    {
        return
            bytes1(
                n % 2 == 0 ? uint8(str[n / 2]) / 0x10 : uint8(str[n / 2]) % 0x10
            );
    }
}

library Merkle {
    function checkMembership(
        bytes32 leaf,
        uint256 index,
        bytes32 rootHash,
        bytes memory proof
    ) internal pure returns (bool) {
        require(proof.length % 32 == 0, "Invalid proof length");
        uint256 proofHeight = proof.length / 32;
        // Proof of size n means, height of the tree is n+1.
        // In a tree of height n+1, max #leafs possible is 2 ^ n
        require(index < 2 ** proofHeight, "Leaf index is too big");

        bytes32 proofElement;
        bytes32 computedHash = leaf;
        for (uint256 i = 32; i <= proof.length; i += 32) {
            assembly {
                proofElement := mload(add(proof, i))
            }

            if (index % 2 == 0) {
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }

            index = index / 2;
        }
        return computedHash == rootHash;
    }
}

interface IFxStateSender {
    function sendMessageToChild(address _receiver, bytes calldata _data) external;
}

contract ICheckpointManager {
    struct HeaderBlock {
        bytes32 root;
        uint256 start;
        uint256 end;
        uint256 createdAt;
        address proposer;
    }

    /**
     * @notice mapping of checkpoint header numbers to block details
     * @dev These checkpoints are submited by plasma contracts
     */
    mapping(uint256 => HeaderBlock) public headerBlocks;
}

abstract contract FxBaseRootTunnel {
    using RLPReader for bytes;
    using RLPReader for RLPReader.RLPItem;
    using Merkle for bytes32;

    // keccak256(MessageSent(bytes))
    bytes32 public constant SEND_MESSAGE_EVENT_SIG = 0x8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036;

    // state sender contract
    IFxStateSender public fxRoot;
    // root chain manager
    ICheckpointManager public checkpointManager;
    // child tunnel contract which receives and sends messages 
    address public fxChildTunnel;

    // storage to avoid duplicate exits
    mapping(bytes32 => bool) public processedExits;

    constructor(address _checkpointManager, address _fxRoot) {
        checkpointManager = ICheckpointManager(_checkpointManager);
        fxRoot = IFxStateSender(_fxRoot);
    }

    // set fxChildTunnel if not set already
    function setFxChildTunnel(address _fxChildTunnel) public {
        require(fxChildTunnel == address(0x0), "FxBaseRootTunnel: CHILD_TUNNEL_ALREADY_SET");
        fxChildTunnel = _fxChildTunnel;
    }

    /**
     * @notice Send bytes message to Child Tunnel
     * @param message bytes message that will be sent to Child Tunnel
     * some message examples -
     *   abi.encode(tokenId);
     *   abi.encode(tokenId, tokenMetadata);
     *   abi.encode(messageType, messageData);
     */
    function _sendMessageToChild(bytes memory message) internal {
        fxRoot.sendMessageToChild(fxChildTunnel, message);
    }

    function _validateAndExtractMessage(bytes memory inputData) internal returns (bytes memory) {
        RLPReader.RLPItem[] memory inputDataRLPList = inputData
            .toRlpItem()
            .toList();

        // checking if exit has already been processed
        // unique exit is identified using hash of (blockNumber, branchMask, receiptLogIndex)
        bytes32 exitHash = keccak256(
            abi.encodePacked(
                inputDataRLPList[2].toUint(), // blockNumber
                // first 2 nibbles are dropped while generating nibble array
                // this allows branch masks that are valid but bypass exitHash check (changing first 2 nibbles only)
                // so converting to nibble array and then hashing it
                MerklePatriciaProof._getNibbleArray(inputDataRLPList[8].toBytes()), // branchMask
                inputDataRLPList[9].toUint() // receiptLogIndex
            )
        );
        require(
            processedExits[exitHash] == false,
            "FxRootTunnel: EXIT_ALREADY_PROCESSED"
        );
        processedExits[exitHash] = true;

        RLPReader.RLPItem[] memory receiptRLPList = inputDataRLPList[6]
            .toBytes()
            .toRlpItem()
            .toList();
        RLPReader.RLPItem memory logRLP = receiptRLPList[3]
            .toList()[
                inputDataRLPList[9].toUint() // receiptLogIndex
            ];

        RLPReader.RLPItem[] memory logRLPList = logRLP.toList();
        
        // check child tunnel
        require(fxChildTunnel == RLPReader.toAddress(logRLPList[0]), "FxRootTunnel: INVALID_FX_CHILD_TUNNEL");

        // verify receipt inclusion
        require(
            MerklePatriciaProof.verify(
                inputDataRLPList[6].toBytes(), // receipt
                inputDataRLPList[8].toBytes(), // branchMask
                inputDataRLPList[7].toBytes(), // receiptProof
                bytes32(inputDataRLPList[5].toUint()) // receiptRoot
            ),
            "FxRootTunnel: INVALID_RECEIPT_PROOF"
        );

        // verify checkpoint inclusion
        _checkBlockMembershipInCheckpoint(
            inputDataRLPList[2].toUint(), // blockNumber
            inputDataRLPList[3].toUint(), // blockTime
            bytes32(inputDataRLPList[4].toUint()), // txRoot
            bytes32(inputDataRLPList[5].toUint()), // receiptRoot
            inputDataRLPList[0].toUint(), // headerNumber
            inputDataRLPList[1].toBytes() // blockProof
        );

        RLPReader.RLPItem[] memory logTopicRLPList = logRLPList[1].toList(); // topics

        require(
            bytes32(logTopicRLPList[0].toUint()) == SEND_MESSAGE_EVENT_SIG, // topic0 is event sig
            "FxRootTunnel: INVALID_SIGNATURE"
        );

        // received message data
        bytes memory receivedData = logRLPList[2].toBytes();
        (bytes memory message) = abi.decode(receivedData, (bytes)); // event decodes params again, so decoding bytes to get message
        return message;
    }

    function _checkBlockMembershipInCheckpoint(
        uint256 blockNumber,
        uint256 blockTime,
        bytes32 txRoot,
        bytes32 receiptRoot,
        uint256 headerNumber,
        bytes memory blockProof
    ) private view returns (uint256) {
        (
            bytes32 headerRoot,
            uint256 startBlock,
            ,
            uint256 createdAt,

        ) = checkpointManager.headerBlocks(headerNumber);

        require(
            keccak256(
                abi.encodePacked(blockNumber, blockTime, txRoot, receiptRoot)
            )
                .checkMembership(
                blockNumber-startBlock,
                headerRoot,
                blockProof
            ),
            "FxRootTunnel: INVALID_HEADER"
        );
        return createdAt;
    }

    /**
     * @notice receive message from  L2 to L1, validated by proof
     * @dev This function verifies if the transaction actually happened on child chain
     *
     * @param inputData RLP encoded data of the reference tx containing following list of fields
     *  0 - headerNumber - Checkpoint header block number containing the reference tx
     *  1 - blockProof - Proof that the block header (in the child chain) is a leaf in the submitted merkle root
     *  2 - blockNumber - Block number containing the reference tx on child chain
     *  3 - blockTime - Reference tx block time
     *  4 - txRoot - Transactions root of block
     *  5 - receiptRoot - Receipts root of block
     *  6 - receipt - Receipt of the reference transaction
     *  7 - receiptProof - Merkle proof of the reference receipt
     *  8 - branchMask - 32 bits denoting the path of receipt in merkle tree
     *  9 - receiptLogIndex - Log Index to read from the receipt
     */
    function receiveMessage(bytes memory inputData) public virtual {
        bytes memory message = _validateAndExtractMessage(inputData);
        _processMessageFromChild(message);
    }

    /**
     * @notice Process message received from Child Tunnel
     * @dev function needs to be implemented to handle message as per requirement
     * This is called by onStateReceive function.
     * Since it is called via a system call, any event will not be emitted during its execution.
     * @param message bytes message that was sent from Child Tunnel
     */
    function _processMessageFromChild(bytes memory message) virtual internal;
}

interface IMessengerWrapper {
    function sendCrossDomainMessage(bytes memory _calldata) external;
    function verifySender(address l1BridgeCaller, bytes memory _data) external;
}

abstract contract MessengerWrapper is IMessengerWrapper {
    address public immutable l1BridgeAddress;

    constructor(address _l1BridgeAddress) internal {
        l1BridgeAddress = _l1BridgeAddress;
    }

    modifier onlyL1Bridge {
        require(msg.sender == l1BridgeAddress, "MW: Sender must be the L1 Bridge");
        _;
    }
}

/**
 * @dev A MessengerWrapper for Polygon - https://docs.matic.network/docs
 * @notice Deployed on layer-1
 */

contract PolygonMessengerWrapper is FxBaseRootTunnel, MessengerWrapper {

    constructor(
        address _l1BridgeAddress,
        address _checkpointManager,
        address _fxRoot,
        address _fxChildTunnel
    )
        public
        MessengerWrapper(_l1BridgeAddress)
        FxBaseRootTunnel(_checkpointManager, _fxRoot)
    {
        setFxChildTunnel(_fxChildTunnel);
    }

    /** 
     * @dev Sends a message to the l2MessengerProxy from layer-1
     * @param _calldata The data that l2MessengerProxy will be called with
     * @notice The msg.sender is sent to the L2_PolygonMessengerProxy and checked there.
     */
    function sendCrossDomainMessage(bytes memory _calldata) public override {
        _sendMessageToChild(
            abi.encode(msg.sender, _calldata)
        );
    }

    function verifySender(address l1BridgeCaller, bytes memory /*_data*/) public view override {
        require(l1BridgeCaller == address(this), "L1_PLGN_WPR: Caller must be this contract");
    }

    function _processMessageFromChild(bytes memory message) internal override {
        (bool success,) = l1BridgeAddress.call(message);
        require(success, "L1_PLGN_WPR: Call to L1 Bridge failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_l1BridgeAddress","type":"address"},{"internalType":"address","name":"_checkpointManager","type":"address"},{"internalType":"address","name":"_fxRoot","type":"address"},{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"SEND_MESSAGE_EVENT_SIG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpointManager","outputs":[{"internalType":"contract ICheckpointManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxChildTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRoot","outputs":[{"internalType":"contract IFxStateSender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1BridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedExits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"inputData","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"sendCrossDomainMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fxChildTunnel","type":"address"}],"name":"setFxChildTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l1BridgeCaller","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"verifySender","outputs":[],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b506040516200246c3803806200246c8339810160408190526200003491620000ff565b600180546001600160a01b038086166001600160a01b03199283161790925560008054928516929091169190911790556001600160601b0319606085901b1660805262000081816200008b565b50505050620001a5565b6002546001600160a01b031615620000c05760405162461bcd60e51b8152600401620000b7906200015b565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b80516001600160a01b0381168114620000fa57600080fd5b919050565b6000806000806080858703121562000115578384fd5b6200012085620000e2565b93506200013060208601620000e2565b92506200014060408601620000e2565b91506200015060608601620000e2565b905092959194509250565b6020808252602a908201527f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160408201526913149150511657d4d15560b21b606082015260800190565b60805160601c6122a4620001c8600039806101cf52806107bd52506122a46000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c806399178dd811610076578063c0857ba01161005b578063c0857ba014610159578063de9b771f14610161578063f953cec714610169576100be565b806399178dd814610133578063aea4e49e14610146576100be565b80635ab2a558116100a75780635ab2a558146100f6578063607f2d421461010b578063972c49281461012b576100be565b80630e387de6146100c3578063419cb550146100e1575b600080fd5b6100cb61017c565b6040516100d89190611ae3565b60405180910390f35b6100f46100ef366004611926565b6101a0565b005b6100fe6101cd565b6040516100d89190611a88565b61011e6101193660046118c2565b6101f1565b6040516100d89190611ad8565b6100fe610206565b6100f4610141366004611874565b610222565b6100f4610154366004611851565b61027e565b6100fe610315565b6100fe610331565b6100f4610177366004611926565b61034d565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b6101ca33826040516020016101b6929190611aa9565b604051602081830303815290604052610363565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020526000908152604090205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8216301461027a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611c38565b60405180910390fd5b5050565b60025473ffffffffffffffffffffffffffffffffffffffff16156102ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611b7e565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610358826103f4565b905061027a816107b9565b6000546002546040517fb472047700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263b4720477926103bf929116908590600401611aa9565b600060405180830381600087803b1580156103d957600080fd5b505af11580156103ed573d6000803e3d6000fd5b5050505050565b6060806104086104038461087d565b6108dd565b905060006104298260028151811061041c57fe5b6020026020010151610a3f565b61044e6104498460088151811061043c57fe5b6020026020010151610b4c565b610c11565b61045e8460098151811061041c57fe5b60405160200161047093929190611a40565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff16156104f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611c95565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815160609061054a9061040390610545908690600690811061043c57fe5b61087d565b90506105546117e4565b6105718260038151811061056457fe5b60200260200101516108dd565b6105818560098151811061041c57fe5b8151811061058b57fe5b6020026020010151905060606105a0826108dd565b90506105bf816000815181106105b257fe5b6020026020010151610db5565b60025473ffffffffffffffffffffffffffffffffffffffff908116911614610613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061200d565b61065b6106268660068151811061043c57fe5b6106368760088151811061043c57fe5b6106468860078151811061043c57fe5b6106568960058151811061041c57fe5b610e3b565b610691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611bdb565b6106ff6106a48660028151811061041c57fe5b6106b48760038151811061041c57fe5b6106c48860048151811061041c57fe5b60001b6106d78960058151811061041c57fe5b60001b6106ea8a60008151811061041c57fe5b6106fa8b60018151811061043c57fe5b611082565b5060606107128260018151811061056457fe5b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b6107488260008151811061041c57fe5b1461077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611f42565b60606107918360028151811061043c57fe5b90506060818060200190518101906107a99190611959565b985050505050505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826040516108009190611a24565b6000604051808303816000865af19150503d806000811461083d576040519150601f19603f3d011682016040523d82523d6000602084013e610842565b606091505b505090508061027a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611ee5565b6108856117e4565b60008251116108c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611cf2565b506040805180820190915281518152602082810190820152919050565b60606108e8826111c1565b61091e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610271906120c7565b6000610929836111ed565b905060608167ffffffffffffffff8111801561094457600080fd5b5060405190808252806020026020018201604052801561097e57816020015b61096b6117e4565b8152602001906001900390816109635790505b50905060006109908560200151611274565b855190915081146109cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611fb0565b60006109dc8660200151611349565b60208701510190506000805b85811015610a33576109f983611274565b9150604051806040016040528083815260200184815250858281518110610a1c57fe5b6020908102919091010152918101916001016109e8565b50929695505050505050565b6000610a4a826111c1565b15610a81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611b49565b815160211015610abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611f79565b6000610acc8360200151611274565b83519091508114610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610271906120fe565b6000610b188460200151611349565b84516020808701518301805193945091849003929190831015610b4257826020036101000a820491505b5095945050505050565b60606000610b5d8360200151611274565b83519091508114610b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611d29565b6000610ba98460200151611349565b845190915081900360608167ffffffffffffffff81118015610bca57600080fd5b506040519080825280601f01601f191660200182016040528015610bf5576020820181803683370190505b5090506000816020019050610b428488602001510182856113e8565b60408051602081019091526000815281516060919015610daf57600080610c3960008661146f565b60f81c90506001811480610c5057508060ff166003145b15610cf757600185516002020367ffffffffffffffff81118015610c7357600080fd5b506040519080825280601f01601f191660200182016040528015610c9e576020820181803683370190505b5092506000610cae60018761146f565b90508084600081518110610cbe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001925050610d48565b600285516002020367ffffffffffffffff81118015610d1557600080fd5b506040519080825280601f01601f191660200182016040528015610d40576020820181803683370190505b509250600091505b60ff82165b8351811015610dab57610d688360ff1682036002018761146f565b848281518110610d7457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101610d4d565b5050505b92915050565b6000610dc0826111c1565b15610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611de3565b8151601514610e32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061215b565b610daf82610a3f565b6000610e456117e4565b610e4e8461087d565b90506060610e5b826108dd565b905060608085600082610e6d8b610c11565b9050805160001415610e8957600097505050505050505061107a565b60005b8651811015611071578151831115610eaf5760009850505050505050505061107a565b610ecb878281518110610ebe57fe5b60200260200101516114cc565b955085805190602001208414610eec5760009850505050505050505061107a565b610efb87828151811061056457fe5b9450845160111415610fb8578151831415610f57578c80519060200120610f288660108151811061043c57fe5b805190602001201415610f465760019850505050505050505061107a565b60009850505050505050505061107a565b6000828481518110610f6557fe5b016020015160f81c90506010811115610f8a576000995050505050505050505061107a565b610fa9868260ff1681518110610f9c57fe5b6020026020010151611533565b94505060019290920191611069565b845160021415610f46576000610fde610fd78760008151811061043c57fe5b84866115c8565b905082518185011415611034578d805190602001206110038760018151811061043c57fe5b805190602001201415611022576001995050505050505050505061107a565b6000995050505050505050505061107a565b8061104b576000995050505050505050505061107a565b808401935061106086600181518110610f9c57fe5b94506110699050565b600101610e8c565b50505050505050505b949350505050565b6001546040517f41539d4a00000000000000000000000000000000000000000000000000000000815260009182918291829173ffffffffffffffffffffffffffffffffffffffff909116906341539d4a906110e1908990600401611ae3565b60a06040518083038186803b1580156110f957600080fd5b505afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113191906118da565b509350509250925061117e828b0384878d8d8d8d6040516020016111589493929190611a6d565b604051602081830303815290604052805190602001206116bf909392919063ffffffff16565b6111b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611eae565b9998505050505050505050565b6020810151805160009190821a9060c08210156111e3576000925050506107b4565b5060019392505050565b6000806000905060006112038460200151611349565b602085015185519181019250015b8082101561126b5761122282611274565b8201915080821115611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611d86565b600190920191611211565b50909392505050565b80516000908190811a608081101561128f5760019150611342565b60b88110156112c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181019150611342565b60c08110156112ef5760b78103600185019450806020036101000a85510460018201810193505050611342565b60f8811015611322577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181019150611342565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b8051600090811a60808110156113635760009150506107b4565b60b881108061137e575060c0811080159061137e575060f881105b1561138d5760019150506107b4565b60c08110156113bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190506107b4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190506107b4565b806113f25761146a565b5b602081106114305782518252602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016113f3565b8251825160208390036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161782525b505050565b600060028306156114a057601082600285048151811061148b57fe5b016020015160f81c8161149a57fe5b066114c2565b60108260028504815181106114b157fe5b016020015160f81c816114c057fe5b045b60f81b9392505050565b606080826000015167ffffffffffffffff811180156114ea57600080fd5b506040519080825280601f01601f191660200182016040528015611515576020820181803683370190505b509050600081602001905061134284602001518286600001516113e8565b6000806115438360200151611274565b83519091508114611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061206a565b82516021146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611aec565b5050602001516001015190565b60008060606115d686610c11565b90506060815167ffffffffffffffff811180156115f257600080fd5b506040519080825280601f01601f19166020018201604052801561161d576020820181803683370190505b509050845b8251860181101561168f57600087828151811061163b57fe5b602001015160f81c60f81b905080838884038151811061165757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600101611622565b508080519060200120828051906020012014156116af57815192506116b4565b600092505b509095945050505050565b600060208251816116cc57fe5b0615611704576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611e40565b6000602083518161171157fe5b0490508060020a8510611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611e77565b60008660205b855181116117d6578581015192506002880661179c57818360405160200161177f929190611a16565b6040516020818303038152906040528051906020012091506117c8565b82826040516020016117af929190611a16565b6040516020818303038152906040528051906020012091505b600288049750602001611756565b509094149695505050505050565b604051806040016040528060008152602001600081525090565b600082601f83011261180e578081fd5b813561182161181c826121dc565b6121b8565b915080825283602082850101111561183857600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611862578081fd5b813561186d8161224c565b9392505050565b60008060408385031215611886578081fd5b82356118918161224c565b9150602083013567ffffffffffffffff8111156118ac578182fd5b6118b8858286016117fe565b9150509250929050565b6000602082840312156118d3578081fd5b5035919050565b600080600080600060a086880312156118f1578081fd5b8551945060208601519350604086015192506060860151915060808601516119188161224c565b809150509295509295909350565b600060208284031215611937578081fd5b813567ffffffffffffffff81111561194d578182fd5b61107a848285016117fe565b60006020828403121561196a578081fd5b815167ffffffffffffffff811115611980578182fd5b8201601f81018413611990578182fd5b805161199e61181c826121dc565b8181528560208385010111156119b2578384fd5b6119c382602083016020860161221c565b95945050505050565b600081518084526119e481602086016020860161221c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b918252602082015260400190565b60008251611a3681846020870161221c565b9190910192915050565b60008482528351611a5881602085016020880161221c565b60209201918201929092526040019392505050565b93845260208401929092526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261107a60408301846119cc565b901515815260200190565b90815260200190565b60208082526025908201527f524c505265616465723a20494e56414c49445f55494e545f5354524943545f4c60408201527f454e475448000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f524c505265616465723a204445434f44494e475f4c4953545f41535f55494e54604082015260600190565b6020808252602a908201527f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160408201527f4c52454144595f53455400000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260408201527f4f4f460000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4c315f504c474e5f5750523a2043616c6c6572206d757374206265207468697360408201527f20636f6e74726163740000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560408201527f5353454400000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f524c505265616465723a20494e56414c49445f42595445535f4c454e47544800604082015260600190565b60208082526028908201527f524c505265616465723a2042595445535f4445434f4445445f4c454e4754485f60408201527f4d49534d41544348000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f524c505265616465723a204e554d5f4954454d535f4445434f4445445f4c454e60408201527f4754485f4d49534d415443480000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f524c505265616465723a204445434f44494e475f4c4953545f41535f4144445260408201527f4553530000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f496e76616c69642070726f6f66206c656e677468000000000000000000000000604082015260600190565b60208082526015908201527f4c65616620696e64657820697320746f6f206269670000000000000000000000604082015260600190565b6020808252601c908201527f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000604082015260600190565b60208082526025908201527f4c315f504c474e5f5750523a2043616c6c20746f204c3120427269646765206660408201527f61696c6564000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500604082015260600190565b6020808252601e908201527f524c505265616465723a20494e56414c49445f55494e545f4c454e4754480000604082015260600190565b60208082526027908201527f524c505265616465723a204c4953545f4445434f4445445f4c454e4754485f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460408201527f554e4e454c000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f524c505265616465723a2055494e545f5354524943545f4445434f4445445f4c60408201527f454e4754485f4d49534d41544348000000000000000000000000000000000000606082015260800190565b60208082526018908201527f524c505265616465723a204954454d5f4e4f545f4c4953540000000000000000604082015260600190565b60208082526027908201527f524c505265616465723a2055494e545f4445434f4445445f4c454e4754485f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f524c505265616465723a20494e56414c49445f414444524553535f4c454e475460408201527f4800000000000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff811182821017156121d457fe5b604052919050565b600067ffffffffffffffff8211156121f057fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561223757818101518382015260200161221f565b83811115612246576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146101ca57600080fdfea26469706673582212205fc96262fc200246e5dc4c3a460f43d25ccd32dfec87e97b169789221c2ed9eb64736f6c634300070300330000000000000000000000003e4a3a4796d16c0cd582c382691998f7c06420b600000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2000000000000000000000000f2a1c5571808efbf7b174bcfeace9f2cbcc51d7e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100be5760003560e01c806399178dd811610076578063c0857ba01161005b578063c0857ba014610159578063de9b771f14610161578063f953cec714610169576100be565b806399178dd814610133578063aea4e49e14610146576100be565b80635ab2a558116100a75780635ab2a558146100f6578063607f2d421461010b578063972c49281461012b576100be565b80630e387de6146100c3578063419cb550146100e1575b600080fd5b6100cb61017c565b6040516100d89190611ae3565b60405180910390f35b6100f46100ef366004611926565b6101a0565b005b6100fe6101cd565b6040516100d89190611a88565b61011e6101193660046118c2565b6101f1565b6040516100d89190611ad8565b6100fe610206565b6100f4610141366004611874565b610222565b6100f4610154366004611851565b61027e565b6100fe610315565b6100fe610331565b6100f4610177366004611926565b61034d565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681565b6101ca33826040516020016101b6929190611aa9565b604051602081830303815290604052610363565b50565b7f0000000000000000000000003e4a3a4796d16c0cd582c382691998f7c06420b681565b60036020526000908152604090205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff8216301461027a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611c38565b60405180910390fd5b5050565b60025473ffffffffffffffffffffffffffffffffffffffff16156102ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611b7e565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6060610358826103f4565b905061027a816107b9565b6000546002546040517fb472047700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263b4720477926103bf929116908590600401611aa9565b600060405180830381600087803b1580156103d957600080fd5b505af11580156103ed573d6000803e3d6000fd5b5050505050565b6060806104086104038461087d565b6108dd565b905060006104298260028151811061041c57fe5b6020026020010151610a3f565b61044e6104498460088151811061043c57fe5b6020026020010151610b4c565b610c11565b61045e8460098151811061041c57fe5b60405160200161047093929190611a40565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff16156104f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611c95565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815160609061054a9061040390610545908690600690811061043c57fe5b61087d565b90506105546117e4565b6105718260038151811061056457fe5b60200260200101516108dd565b6105818560098151811061041c57fe5b8151811061058b57fe5b6020026020010151905060606105a0826108dd565b90506105bf816000815181106105b257fe5b6020026020010151610db5565b60025473ffffffffffffffffffffffffffffffffffffffff908116911614610613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061200d565b61065b6106268660068151811061043c57fe5b6106368760088151811061043c57fe5b6106468860078151811061043c57fe5b6106568960058151811061041c57fe5b610e3b565b610691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611bdb565b6106ff6106a48660028151811061041c57fe5b6106b48760038151811061041c57fe5b6106c48860048151811061041c57fe5b60001b6106d78960058151811061041c57fe5b60001b6106ea8a60008151811061041c57fe5b6106fa8b60018151811061043c57fe5b611082565b5060606107128260018151811061056457fe5b90507f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03660001b6107488260008151811061041c57fe5b1461077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611f42565b60606107918360028151811061043c57fe5b90506060818060200190518101906107a99190611959565b985050505050505050505b919050565b60007f0000000000000000000000003e4a3a4796d16c0cd582c382691998f7c06420b673ffffffffffffffffffffffffffffffffffffffff16826040516108009190611a24565b6000604051808303816000865af19150503d806000811461083d576040519150601f19603f3d011682016040523d82523d6000602084013e610842565b606091505b505090508061027a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611ee5565b6108856117e4565b60008251116108c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611cf2565b506040805180820190915281518152602082810190820152919050565b60606108e8826111c1565b61091e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610271906120c7565b6000610929836111ed565b905060608167ffffffffffffffff8111801561094457600080fd5b5060405190808252806020026020018201604052801561097e57816020015b61096b6117e4565b8152602001906001900390816109635790505b50905060006109908560200151611274565b855190915081146109cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611fb0565b60006109dc8660200151611349565b60208701510190506000805b85811015610a33576109f983611274565b9150604051806040016040528083815260200184815250858281518110610a1c57fe5b6020908102919091010152918101916001016109e8565b50929695505050505050565b6000610a4a826111c1565b15610a81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611b49565b815160211015610abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611f79565b6000610acc8360200151611274565b83519091508114610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610271906120fe565b6000610b188460200151611349565b84516020808701518301805193945091849003929190831015610b4257826020036101000a820491505b5095945050505050565b60606000610b5d8360200151611274565b83519091508114610b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611d29565b6000610ba98460200151611349565b845190915081900360608167ffffffffffffffff81118015610bca57600080fd5b506040519080825280601f01601f191660200182016040528015610bf5576020820181803683370190505b5090506000816020019050610b428488602001510182856113e8565b60408051602081019091526000815281516060919015610daf57600080610c3960008661146f565b60f81c90506001811480610c5057508060ff166003145b15610cf757600185516002020367ffffffffffffffff81118015610c7357600080fd5b506040519080825280601f01601f191660200182016040528015610c9e576020820181803683370190505b5092506000610cae60018761146f565b90508084600081518110610cbe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001925050610d48565b600285516002020367ffffffffffffffff81118015610d1557600080fd5b506040519080825280601f01601f191660200182016040528015610d40576020820181803683370190505b509250600091505b60ff82165b8351811015610dab57610d688360ff1682036002018761146f565b848281518110610d7457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101610d4d565b5050505b92915050565b6000610dc0826111c1565b15610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611de3565b8151601514610e32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061215b565b610daf82610a3f565b6000610e456117e4565b610e4e8461087d565b90506060610e5b826108dd565b905060608085600082610e6d8b610c11565b9050805160001415610e8957600097505050505050505061107a565b60005b8651811015611071578151831115610eaf5760009850505050505050505061107a565b610ecb878281518110610ebe57fe5b60200260200101516114cc565b955085805190602001208414610eec5760009850505050505050505061107a565b610efb87828151811061056457fe5b9450845160111415610fb8578151831415610f57578c80519060200120610f288660108151811061043c57fe5b805190602001201415610f465760019850505050505050505061107a565b60009850505050505050505061107a565b6000828481518110610f6557fe5b016020015160f81c90506010811115610f8a576000995050505050505050505061107a565b610fa9868260ff1681518110610f9c57fe5b6020026020010151611533565b94505060019290920191611069565b845160021415610f46576000610fde610fd78760008151811061043c57fe5b84866115c8565b905082518185011415611034578d805190602001206110038760018151811061043c57fe5b805190602001201415611022576001995050505050505050505061107a565b6000995050505050505050505061107a565b8061104b576000995050505050505050505061107a565b808401935061106086600181518110610f9c57fe5b94506110699050565b600101610e8c565b50505050505050505b949350505050565b6001546040517f41539d4a00000000000000000000000000000000000000000000000000000000815260009182918291829173ffffffffffffffffffffffffffffffffffffffff909116906341539d4a906110e1908990600401611ae3565b60a06040518083038186803b1580156110f957600080fd5b505afa15801561110d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113191906118da565b509350509250925061117e828b0384878d8d8d8d6040516020016111589493929190611a6d565b604051602081830303815290604052805190602001206116bf909392919063ffffffff16565b6111b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611eae565b9998505050505050505050565b6020810151805160009190821a9060c08210156111e3576000925050506107b4565b5060019392505050565b6000806000905060006112038460200151611349565b602085015185519181019250015b8082101561126b5761122282611274565b8201915080821115611260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611d86565b600190920191611211565b50909392505050565b80516000908190811a608081101561128f5760019150611342565b60b88110156112c2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181019150611342565b60c08110156112ef5760b78103600185019450806020036101000a85510460018201810193505050611342565b60f8811015611322577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181019150611342565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b8051600090811a60808110156113635760009150506107b4565b60b881108061137e575060c0811080159061137e575060f881105b1561138d5760019150506107b4565b60c08110156113bf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a0190506107b4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a0190506107b4565b806113f25761146a565b5b602081106114305782518252602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016113f3565b8251825160208390036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161782525b505050565b600060028306156114a057601082600285048151811061148b57fe5b016020015160f81c8161149a57fe5b066114c2565b60108260028504815181106114b157fe5b016020015160f81c816114c057fe5b045b60f81b9392505050565b606080826000015167ffffffffffffffff811180156114ea57600080fd5b506040519080825280601f01601f191660200182016040528015611515576020820181803683370190505b509050600081602001905061134284602001518286600001516113e8565b6000806115438360200151611274565b83519091508114611580576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102719061206a565b82516021146115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611aec565b5050602001516001015190565b60008060606115d686610c11565b90506060815167ffffffffffffffff811180156115f257600080fd5b506040519080825280601f01601f19166020018201604052801561161d576020820181803683370190505b509050845b8251860181101561168f57600087828151811061163b57fe5b602001015160f81c60f81b905080838884038151811061165757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050600101611622565b508080519060200120828051906020012014156116af57815192506116b4565b600092505b509095945050505050565b600060208251816116cc57fe5b0615611704576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611e40565b6000602083518161171157fe5b0490508060020a8510611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027190611e77565b60008660205b855181116117d6578581015192506002880661179c57818360405160200161177f929190611a16565b6040516020818303038152906040528051906020012091506117c8565b82826040516020016117af929190611a16565b6040516020818303038152906040528051906020012091505b600288049750602001611756565b509094149695505050505050565b604051806040016040528060008152602001600081525090565b600082601f83011261180e578081fd5b813561182161181c826121dc565b6121b8565b915080825283602082850101111561183857600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611862578081fd5b813561186d8161224c565b9392505050565b60008060408385031215611886578081fd5b82356118918161224c565b9150602083013567ffffffffffffffff8111156118ac578182fd5b6118b8858286016117fe565b9150509250929050565b6000602082840312156118d3578081fd5b5035919050565b600080600080600060a086880312156118f1578081fd5b8551945060208601519350604086015192506060860151915060808601516119188161224c565b809150509295509295909350565b600060208284031215611937578081fd5b813567ffffffffffffffff81111561194d578182fd5b61107a848285016117fe565b60006020828403121561196a578081fd5b815167ffffffffffffffff811115611980578182fd5b8201601f81018413611990578182fd5b805161199e61181c826121dc565b8181528560208385010111156119b2578384fd5b6119c382602083016020860161221c565b95945050505050565b600081518084526119e481602086016020860161221c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b918252602082015260400190565b60008251611a3681846020870161221c565b9190910192915050565b60008482528351611a5881602085016020880161221c565b60209201918201929092526040019392505050565b93845260208401929092526040830152606082015260800190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff841682526040602083015261107a60408301846119cc565b901515815260200190565b90815260200190565b60208082526025908201527f524c505265616465723a20494e56414c49445f55494e545f5354524943545f4c60408201527f454e475448000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f524c505265616465723a204445434f44494e475f4c4953545f41535f55494e54604082015260600190565b6020808252602a908201527f467842617365526f6f7454756e6e656c3a204348494c445f54554e4e454c5f4160408201527f4c52454144595f53455400000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f4678526f6f7454756e6e656c3a20494e56414c49445f524543454950545f505260408201527f4f4f460000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4c315f504c474e5f5750523a2043616c6c6572206d757374206265207468697360408201527f20636f6e74726163740000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4678526f6f7454756e6e656c3a20455849545f414c52454144595f50524f434560408201527f5353454400000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f524c505265616465723a20494e56414c49445f42595445535f4c454e47544800604082015260600190565b60208082526028908201527f524c505265616465723a2042595445535f4445434f4445445f4c454e4754485f60408201527f4d49534d41544348000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f524c505265616465723a204e554d5f4954454d535f4445434f4445445f4c454e60408201527f4754485f4d49534d415443480000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f524c505265616465723a204445434f44494e475f4c4953545f41535f4144445260408201527f4553530000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f496e76616c69642070726f6f66206c656e677468000000000000000000000000604082015260600190565b60208082526015908201527f4c65616620696e64657820697320746f6f206269670000000000000000000000604082015260600190565b6020808252601c908201527f4678526f6f7454756e6e656c3a20494e56414c49445f48454144455200000000604082015260600190565b60208082526025908201527f4c315f504c474e5f5750523a2043616c6c20746f204c3120427269646765206660408201527f61696c6564000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f4678526f6f7454756e6e656c3a20494e56414c49445f5349474e415455524500604082015260600190565b6020808252601e908201527f524c505265616465723a20494e56414c49445f55494e545f4c454e4754480000604082015260600190565b60208082526027908201527f524c505265616465723a204c4953545f4445434f4445445f4c454e4754485f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f4678526f6f7454756e6e656c3a20494e56414c49445f46585f4348494c445f5460408201527f554e4e454c000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602e908201527f524c505265616465723a2055494e545f5354524943545f4445434f4445445f4c60408201527f454e4754485f4d49534d41544348000000000000000000000000000000000000606082015260800190565b60208082526018908201527f524c505265616465723a204954454d5f4e4f545f4c4953540000000000000000604082015260600190565b60208082526027908201527f524c505265616465723a2055494e545f4445434f4445445f4c454e4754485f4d60408201527f49534d4154434800000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f524c505265616465723a20494e56414c49445f414444524553535f4c454e475460408201527f4800000000000000000000000000000000000000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff811182821017156121d457fe5b604052919050565b600067ffffffffffffffff8211156121f057fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561223757818101518382015260200161221f565b83811115612246576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146101ca57600080fdfea26469706673582212205fc96262fc200246e5dc4c3a460f43d25ccd32dfec87e97b169789221c2ed9eb64736f6c63430007030033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000003e4a3a4796d16c0cd582c382691998f7c06420b600000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2000000000000000000000000f2a1c5571808efbf7b174bcfeace9f2cbcc51d7e

-----Decoded View---------------
Arg [0] : _l1BridgeAddress (address): 0x3E4a3a4796d16c0Cd582C382691998f7c06420B6
Arg [1] : _checkpointManager (address): 0x86E4Dc95c7FBdBf52e33D563BbDB00823894C287
Arg [2] : _fxRoot (address): 0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2
Arg [3] : _fxChildTunnel (address): 0xf2A1C5571808eFBf7b174BcfEAcE9f2CBcc51d7e

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000003e4a3a4796d16c0cd582c382691998f7c06420b6
Arg [1] : 00000000000000000000000086e4dc95c7fbdbf52e33d563bbdb00823894c287
Arg [2] : 000000000000000000000000fe5e5d361b2ad62c541bab87c45a0b9b018389a2
Arg [3] : 000000000000000000000000f2a1c5571808efbf7b174bcfeace9f2cbcc51d7e


Deployed Bytecode Sourcemap

23081:1251:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15535:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23741:169;;;;;;:::i;:::-;;:::i;:::-;;22672:40;;;:::i;:::-;;;;;;;:::i;15944:46::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15866:28::-;;;:::i;23918:195::-;;;;;;:::i;:::-;;:::i;16229:201::-;;;;;;:::i;:::-;;:::i;15751:43::-;;;:::i;15689:28::-;;;:::i;21769:186::-;;;;;;:::i;:::-;;:::i;15535:115::-;15584:66;15535:115;:::o;23741:169::-;23824:78;23869:10;23881:9;23858:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23824:19;:78::i;:::-;23741:169;:::o;22672:40::-;;;:::o;15944:46::-;;;;;;;;;;;;;;;:::o;15866:28::-;;;;;;:::o;23918:195::-;24028:31;;;24054:4;24028:31;24020:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23918:195;;:::o;16229:201::-;16305:13;;:29;:13;:29;16297:84;;;;;;;;;;;;:::i;:::-;16392:13;:30;;;;;;;;;;;;;;;16229:201::o;15751:43::-;;;;;;:::o;15689:28::-;;;;;;:::o;21769:186::-;21843:20;21866:37;21893:9;21866:26;:37::i;:::-;21843:60;;21914:33;21939:7;21914:24;:33::i;16735:128::-;16806:6;;16832:13;;16806:49;;;;;:6;;;;;:25;;:49;;16832:13;;;16847:7;;16806:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16735:128;:::o;16871:3079::-;16949:12;16974:43;17020:58;:35;:9;:33;:35::i;:::-;:56;:58::i;:::-;16974:104;;17242:16;17320:28;:16;17337:1;17320:19;;;;;;;;;;;;;;:26;:28::i;:::-;17648:66;17684:29;:16;17701:1;17684:19;;;;;;;;;;;;;;:27;:29::i;:::-;17648:35;:66::i;:::-;17747:28;:16;17764:1;17747:19;;;;;;;:28;17285:524;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;17261:559;;17285:524;17261:559;;;;17853:24;;;;:14;:24;;;;;;17261:559;;-1:-1:-1;17853:24:0;;:33;17831:119;;;;;;;;;;;;:::i;:::-;17961:24;;;;:14;:24;;;;;:31;;;;17988:4;17961:31;;;18049:19;;18005:41;;18049:92;;:69;;:43;;:16;;18066:1;;18049:19;;;;;:43;:67;:69::i;:92::-;18005:136;;18152:31;;:::i;:::-;18186:40;:14;18201:1;18186:17;;;;;;;;;;;;;;:38;:40::i;:::-;18245:28;:16;18262:1;18245:19;;;;;;;:28;18186:121;;;;;;;;;;;;;;18152:155;;18320:37;18360:15;:6;:13;:15::i;:::-;18320:55;;18452:34;18472:10;18483:1;18472:13;;;;;;;;;;;;;;18452:19;:34::i;:::-;18435:13;;:51;:13;;;:51;;;18427:101;;;;;;;;;;;;:::i;:::-;18600:297;18645:29;:16;18662:1;18645:19;;;;;;;:29;18704;:16;18721:1;18704:19;;;;;;;:29;18766;:16;18783:1;18766:19;;;;;;;:29;18838:28;:16;18855:1;18838:19;;;;;;;:28;18600:26;:297::i;:::-;18578:382;;;;;;;;;;;;:::i;:::-;19013:404;19061:28;:16;19078:1;19061:19;;;;;;;:28;19119;:16;19136:1;19119:19;;;;;;;:28;19183;:16;19200:1;19183:19;;;;;;;:28;19175:37;;19245:28;:16;19262:1;19245:19;;;;;;;:28;19237:37;;19304:28;:16;19321:1;19304:19;;;;;;;:28;19363:29;:16;19380:1;19363:19;;;;;;;:29;19013:33;:404::i;:::-;;19430:42;19475:22;:10;19486:1;19475:13;;;;;;;:22;19430:67;;15584:66;19582:22;;19550:27;:15;19566:1;19550:18;;;;;;;:27;19542:62;19520:166;;;;;;;;;;;;:::i;:::-;19733:25;19761:23;:10;19772:1;19761:13;;;;;;;:23;19733:51;;19796:20;19831:12;19820:33;;;;;;;;;;;;:::i;:::-;19795:58;-1:-1:-1;;;;;;;;;16871:3079:0;;;;:::o;24121:208::-;24207:12;24224:15;:20;;24245:7;24224:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24206:47;;;24272:7;24264:57;;;;;;;;;;;;:::i;565:330::-;653:14;;:::i;:::-;707:1;693:4;:11;:15;685:59;;;;;;;;;;;;:::i;:::-;-1:-1:-1;859:28:0;;;;;;;;;867:11;;859:28;;824:4;814:15;;;859:28;;;;565:330;;;:::o;966:735::-;1053:16;1095:12;1102:4;1095:6;:12::i;:::-;1087:49;;;;;;;;;;;;:::i;:::-;1149:13;1165:14;1174:4;1165:8;:14::i;:::-;1149:30;;1190:23;1230:5;1216:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1190:46;;1247:18;1268:24;1280:4;:11;;;1268;:24::i;:::-;1325:8;;1247:45;;-1:-1:-1;1311:22:0;;1303:74;;;;;;;;;;;;:::i;:::-;1390:14;1421:27;1436:4;:11;;;1421:14;:27::i;:::-;1407:11;;;;:41;;-1:-1:-1;1459:15:0;;1485:183;1509:5;1505:1;:9;1485:183;;;1546:19;1558:6;1546:11;:19::i;:::-;1536:29;;1592:24;;;;;;;;1600:7;1592:24;;;;1609:6;1592:24;;;1580:6;1587:1;1580:9;;;;;;;;;;;;;;;;;:36;1640:16;;;;1516:3;;1485:183;;;-1:-1:-1;1687:6:0;;966:735;-1:-1:-1;;;;;;966:735:0:o;2851:792::-;2911:7;2940:12;2947:4;2940:6;:12::i;:::-;2939:13;2931:58;;;;;;;;;;;;:::i;:::-;3008:8;;3020:2;-1:-1:-1;3008:14:0;3000:57;;;;;;;;;;;;:::i;:::-;3070:18;3091:24;3103:4;:11;;;3091;:24::i;:::-;3148:8;;3070:45;;-1:-1:-1;3134:22:0;;3126:74;;;;;;;;;;;;:::i;:::-;3213:14;3230:27;3245:4;:11;;;3230:14;:27::i;:::-;3282:8;;3352:11;;;;;:20;;3417:13;;3213:44;;-1:-1:-1;3282:17:0;;;;;3417:13;3352:20;3508:11;;3505:2;;;3578:3;3574:2;3570:12;3565:3;3561:22;3553:6;3549:35;3539:45;;3505:2;-1:-1:-1;3629:6:0;2851:792;-1:-1:-1;;;;;2851:792:0:o;4189:564::-;4250:12;4275:18;4296:24;4308:4;:11;;;4296;:24::i;:::-;4353:8;;4275:45;;-1:-1:-1;4339:22:0;;4331:75;;;;;;;;;;;;:::i;:::-;4417:14;4434:27;4449:4;:11;;;4434:14;:27::i;:::-;4488:8;;4417:44;;-1:-1:-1;4488:17:0;;;4531:19;4488:17;4553:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4553:14:0;;4531:36;;4580:15;4651:6;4645:4;4641:17;4630:28;;4681:40;4700:6;4686:4;:11;;;:20;4708:7;4717:3;4681:4;:40::i;12561:827::-;12682:25;;;;;;;;;-1:-1:-1;12682:25:0;;12722:8;;12652:12;;12682:25;12722:12;12718:638;;12751:12;12778:14;12801:26;12822:1;12825;12801:20;:26::i;:::-;12795:33;;;-1:-1:-1;12859:1:0;12847:13;;;:30;;;12864:8;:13;;12876:1;12864:13;12847:30;12843:349;;;12933:1;12918;:8;12929:1;12918:12;:16;12908:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12908:27:0;;12898:37;;12954:16;12973:26;12994:1;12997;12973:20;:26::i;:::-;12954:45;;13031:9;13018:7;13026:1;13018:10;;;;;;;;;;;:22;;;;;;;;;;;13068:1;13059:10;;12843:349;;;;13145:1;13130;:8;13141:1;13130:12;:16;13120:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13120:27:0;;13110:37;;13175:1;13166:10;;12843:349;13213:18;;;13208:137;13237:7;:14;13233:1;:18;13208:137;;;13290:39;13315:6;13311:10;;:1;:10;13324:1;13311:14;13327:1;13290:20;:39::i;:::-;13277:7;13285:1;13277:10;;;;;;;;;;;:52;;;;;;;;;;-1:-1:-1;13253:3:0;;13208:137;;;;12718:638;;;13373:7;12561:827;-1:-1:-1;;12561:827:0:o;2538:305::-;2601:7;2630:12;2637:4;2630:6;:12::i;:::-;2629:13;2621:61;;;;;;;;;;;;:::i;:::-;2742:8;;2754:2;2742:14;2734:60;;;;;;;;;;;;:::i;:::-;2822:12;2829:4;2822:6;:12::i;8794:2738::-;8965:4;8982:29;;:::i;:::-;9014:35;9034:14;9014:19;:35::i;:::-;8982:67;;9060:38;9101:22;9118:4;9101:16;:22::i;:::-;9060:63;-1:-1:-1;9136:24:0;;9244:4;9226:15;9136:24;9311:28;9327:11;9311:15;:28::i;:::-;9291:48;;9354:4;:11;9369:1;9354:16;9350:61;;;9394:5;9387:12;;;;;;;;;;;9350:61;9428:9;9423:2102;9447:11;:18;9443:1;:22;9423:2102;;;9501:4;:11;9491:7;:21;9487:74;;;9540:5;9533:12;;;;;;;;;;;;9487:74;9591:36;9612:11;9624:1;9612:14;;;;;;;;;;;;;;9591:20;:36::i;:::-;9577:50;;9667:11;9657:22;;;;;;9646:7;:33;9642:86;;9707:5;9700:12;;;;;;;;;;;;9642:86;9760:32;9777:11;9789:1;9777:14;;;;;;;9760:32;9742:50;;9813:15;:22;9839:2;9813:28;9809:1705;;;9877:4;:11;9866:7;:22;9862:349;;;10031:5;10021:16;;;;;;9953:38;9971:15;9987:2;9971:19;;;;;;;9953:38;9943:49;;;;;;:94;9913:279;;;10095:4;10088:11;;;;;;;;;;;;9913:279;10163:5;10156:12;;;;;;;;;;;;9913:279;10231:20;10260:4;10265:7;10260:13;;;;;;;;;;;;;;;-1:-1:-1;10314:2:0;10297:19;;10293:80;;;10348:5;10341:12;;;;;;;;;;;;;10293:80;10431:55;10454:15;10470:14;10454:31;;;;;;;;;;;;;;;;10431:22;:55::i;:::-;10401:104;-1:-1:-1;;10535:1:0;10524:12;;;;;9809:1705;;;10562:15;:22;10588:1;10562:27;10558:956;;;10610:17;10630:154;10671:37;10689:15;10705:1;10689:18;;;;;;;10671:37;10731:4;10758:7;10630:18;:154::i;:::-;10610:174;;10830:4;:11;10817:9;10807:7;:19;:34;10803:393;;;11016:5;11006:16;;;;;;10939:37;10957:15;10973:1;10957:18;;;;;;;10939:37;10929:48;;;;;;:93;10899:278;;;11080:4;11073:11;;;;;;;;;;;;;10899:278;11148:5;11141:12;;;;;;;;;;;;;10899:278;11254:14;11250:75;;11300:5;11293:12;;;;;;;;;;;;;11250:75;11356:9;11345:20;;;;11402:42;11425:15;11441:1;11425:18;;;;;;;11402:42;11394:51;-1:-1:-1;10558:956:0;;-1:-1:-1;10558:956:0;;9467:3;;9423:2102;;;;8794:2738;;;;;;;;;;;;;;:::o;19958:822::-;20358:17;;:44;;;;;20208:7;;;;;;;;20358:17;;;;;:30;;:44;;20389:12;;20358:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20228:174;;;;;;;;20437:252;20606:10;20594:11;:22;20635:10;20664;20482:11;20495:9;20506:6;20514:11;20465:61;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20437:104;;;;;;:138;;:252;;;;;;:::i;:::-;20415:330;;;;;;;;;;;;:::i;:::-;20763:9;19958:822;-1:-1:-1;;;;;;;;;19958:822:0:o;1808:288::-;1924:11;;;;1987:13;;1868:4;;1979:22;;;;339:4;2028:24;;2024:42;;;2061:5;2054:12;;;;;;2024:42;-1:-1:-1;2084:4:0;;1808:288;-1:-1:-1;;;1808:288:0:o;4868:660::-;4929:7;5124:13;5140:1;5124:17;;5152:15;5184:27;5199:4;:11;;;5184:14;:27::i;:::-;5170:11;;;;5253:8;;5170:41;;;;-1:-1:-1;5239:22:0;5272:224;5289:6;5279:7;:16;5272:224;;;5332:20;5344:7;5332:11;:20::i;:::-;5322:7;:30;5312:40;;5407:6;5396:7;:17;;5388:74;;;;;;;;;;;;:::i;:::-;5477:7;;;;;5272:224;;;-1:-1:-1;5515:5:0;;4868:660;-1:-1:-1;;;4868:660:0:o;5580:1275::-;5750:13;;5639:7;;;;5742:22;;248:4;5791:26;;5787:1034;;;5829:1;5819:11;;5787:1034;;;294:4;5850:25;;5846:975;;;5900:30;;;;-1:-1:-1;5846:975:0;;;339:4;5950:24;;5946:875;;;6045:4;6038:5;6034:16;6125:1;6117:6;6113:14;6103:24;;6267:7;6263:2;6259:16;6254:3;6250:26;6241:6;6235:13;6231:46;6365:1;6356:7;6352:15;6343:7;6339:29;6328:40;;;;6000:383;;;383:4;6404:23;;6400:421;;;6454:28;;;;-1:-1:-1;6400:421:0;;;6569:4;6562:5;6558:16;6614:1;6606:6;6602:14;6592:24;;6687:7;6683:2;6679:16;6674:3;6670:26;6661:6;6655:13;6651:46;6792:1;6783:7;6779:15;6770:7;6766:29;6755:40;;;;6524:286;-1:-1:-1;6840:7:0;5580:1275;-1:-1:-1;;5580:1275:0:o;6910:570::-;7057:13;;6972:7;;7049:22;;248:4;7098:26;;7094:378;;;7133:1;7126:8;;;;;7094:378;294:4;7168:25;;;:96;;-1:-1:-1;339:4:0;7211:25;;;;;:52;;-1:-1:-1;383:4:0;7240:23;;7211:52;7150:322;;;7283:1;7276:8;;;;;7150:322;339:4;7304:24;;7300:172;;;7381:35;;;-1:-1:-1;7374:42:0;;7300:172;7439:33;;;-1:-1:-1;7432:40:0;;7645:761;7761:8;7757:21;;7771:7;;7757:21;7838:201;421:2;7845:16;;7838:201;;7937:10;;7924:24;;421:2;7979:16;;;;8010:17;;;;7863:16;;7838:201;;;8227:10;;8299:11;;421:2;8153:15;;;8147:3;:22;:26;;8239:9;;8223:26;;;8295:22;;8366:21;8353:35;;8193:206;;;;:::o;13396:264::-;13504:6;13577:1;13573;:5;:10;:64;;13633:4;13619:3;13627:1;13623;:5;13619:10;;;;;;;;;;;;;;13613:24;;;;;;13573:64;;;13606:4;13592:3;13600:1;13596;:5;13592:10;;;;;;;;;;;;;;13586:24;;;;;;13573:64;13548:104;;;13396:264;-1:-1:-1;;;13396:264:0:o;2198:332::-;2289:12;2319:19;2351:4;:8;;;2341:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2341:19:0;;2319:41;;2373:11;2436:6;2430:4;2426:17;2419:24;;2466:32;2471:4;:11;;;2484:3;2489:4;:8;;;2466:4;:32::i;3683:498::-;3749:7;3769:18;3790:24;3802:4;:11;;;3790;:24::i;:::-;3847:8;;3769:45;;-1:-1:-1;3833:22:0;;3825:81;;;;;;;;;;;;:::i;:::-;3953:8;;3965:2;3953:14;3945:64;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;4064:11:0;;;4078:1;4064:15;4124:13;;3683:498::o;11540:978::-;11693:7;;11926:24;11953:35;11969:18;11953:15;:35::i;:::-;11926:62;;11999:23;12035:11;:18;12025:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12025:29:0;-1:-1:-1;11999:55:0;-1:-1:-1;12181:7:0;12164:170;12204:11;:18;12194:7;:28;12190:1;:32;12164:170;;;12244:17;12264:4;12269:1;12264:7;;;;;;;;;;;;;;;;12244:27;;12312:10;12286;12301:7;12297:1;:11;12286:23;;;;;;;;;;;:36;;;;;;;;;;-1:-1:-1;;12224:3:0;;12164:170;;;;12386:10;12376:21;;;;;;12360:11;12350:22;;;;;;:47;12346:144;;;12420:11;:18;12414:24;;12346:144;;;12477:1;12471:7;;12346:144;-1:-1:-1;12507:3:0;;11540:978;-1:-1:-1;;;;;11540:978:0:o;13689:1128::-;13847:4;13887:2;13872:5;:12;:17;;;;;;:22;13864:55;;;;;;;;;;;;:::i;:::-;13930:19;13967:2;13952:5;:12;:17;;;;;;13930:39;;14129:11;14124:1;:16;14116:5;:24;14108:58;;;;;;;;;;;;:::i;:::-;14179:20;14233:4;14265:2;14248:520;14274:5;:12;14269:1;:17;14248:520;;14362:13;;;14356:20;;-1:-1:-1;14419:1:0;14411:5;:9;14407:316;;14510:12;14524;14493:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14461:95;;;;;;14446:110;;14407:316;;;14661:12;14675;14644:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14612:95;;;;;;14597:110;;14407:316;14755:1;14747:5;:9;;-1:-1:-1;14293:2:0;14288:7;14248:520;;;-1:-1:-1;14785:24:0;;;;13689:1128;-1:-1:-1;;;;;;13689:1128:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;14:460:1:-;;111:3;104:4;96:6;92:17;88:27;78:2;;133:5;126;119:20;78:2;177:6;164:20;202:53;217:37;247:6;217:37;:::i;:::-;202:53;:::i;:::-;193:62;;278:6;271:5;264:21;332:3;325:4;316:6;308;304:19;300:30;297:39;294:2;;;349:1;346;339:12;294:2;412:6;405:4;397:6;393:17;386:4;379:5;375:16;362:57;466:1;439:18;;;459:4;435:29;428:40;443:5;68:406;-1:-1:-1;;68:406:1:o;479:259::-;;591:2;579:9;570:7;566:23;562:32;559:2;;;612:6;604;597:22;559:2;656:9;643:23;675:33;702:5;675:33;:::i;:::-;727:5;549:189;-1:-1:-1;;;549:189:1:o;743:479::-;;;881:2;869:9;860:7;856:23;852:32;849:2;;;902:6;894;887:22;849:2;946:9;933:23;965:33;992:5;965:33;:::i;:::-;1017:5;-1:-1:-1;1073:2:1;1058:18;;1045:32;1100:18;1089:30;;1086:2;;;1137:6;1129;1122:22;1086:2;1165:51;1208:7;1199:6;1188:9;1184:22;1165:51;:::i;:::-;1155:61;;;839:383;;;;;:::o;1227:190::-;;1339:2;1327:9;1318:7;1314:23;1310:32;1307:2;;;1360:6;1352;1345:22;1307:2;-1:-1:-1;1388:23:1;;1297:120;-1:-1:-1;1297:120:1:o;1422:509::-;;;;;;1613:3;1601:9;1592:7;1588:23;1584:33;1581:2;;;1635:6;1627;1620:22;1581:2;1669:9;1663:16;1653:26;;1719:2;1708:9;1704:18;1698:25;1688:35;;1763:2;1752:9;1748:18;1742:25;1732:35;;1807:2;1796:9;1792:18;1786:25;1776:35;;1854:3;1843:9;1839:19;1833:26;1868:33;1895:5;1868:33;:::i;:::-;1920:5;1910:15;;;1571:360;;;;;;;;:::o;1936:342::-;;2057:2;2045:9;2036:7;2032:23;2028:32;2025:2;;;2078:6;2070;2063:22;2025:2;2123:9;2110:23;2156:18;2148:6;2145:30;2142:2;;;2193:6;2185;2178:22;2142:2;2221:51;2264:7;2255:6;2244:9;2240:22;2221:51;:::i;2283:695::-;;2415:2;2403:9;2394:7;2390:23;2386:32;2383:2;;;2436:6;2428;2421:22;2383:2;2474:9;2468:16;2507:18;2499:6;2496:30;2493:2;;;2544:6;2536;2529:22;2493:2;2572:22;;2625:4;2617:13;;2613:27;-1:-1:-1;2603:2:1;;2659:6;2651;2644:22;2603:2;2697;2691:9;2722:53;2737:37;2767:6;2737:37;:::i;2722:53::-;2798:6;2791:5;2784:21;2846:7;2841:2;2832:6;2828:2;2824:15;2820:24;2817:37;2814:2;;;2872:6;2864;2857:22;2814:2;2890:58;2941:6;2936:2;2929:5;2925:14;2920:2;2916;2912:11;2890:58;:::i;:::-;2967:5;2373:605;-1:-1:-1;;;;;2373:605:1:o;2983:318::-;;3064:5;3058:12;3091:6;3086:3;3079:19;3107:63;3163:6;3156:4;3151:3;3147:14;3140:4;3133:5;3129:16;3107:63;:::i;:::-;3215:2;3203:15;3220:66;3199:88;3190:98;;;;3290:4;3186:109;;3034:267;-1:-1:-1;;3034:267:1:o;3306:247::-;3463:19;;;3507:2;3498:12;;3491:28;3544:2;3535:12;;3453:100::o;3558:274::-;;3725:6;3719:13;3741:53;3787:6;3782:3;3775:4;3767:6;3763:17;3741:53;:::i;:::-;3810:16;;;;;3695:137;-1:-1:-1;;3695:137:1:o;3837:431::-;;4052:6;4047:3;4040:19;4088:6;4082:13;4104:60;4157:6;4152:2;4147:3;4143:12;4138:2;4130:6;4126:15;4104:60;:::i;:::-;4223:2;4183:16;;4215:11;;;4208:27;;;;4259:2;4251:11;;4030:238;-1:-1:-1;;;4030:238:1:o;4273:378::-;4486:19;;;4530:2;4521:12;;4514:28;;;;4567:2;4558:12;;4551:28;4604:2;4595:12;;4588:28;4641:3;4632:13;;4476:175::o;4656:226::-;4832:42;4820:55;;;;4802:74;;4790:2;4775:18;;4757:125::o;4887:355::-;;5090:42;5082:6;5078:55;5067:9;5060:74;5170:2;5165;5154:9;5150:18;5143:30;5190:46;5232:2;5221:9;5217:18;5209:6;5190:46;:::i;5591:187::-;5756:14;;5749:22;5731:41;;5719:2;5704:18;;5686:92::o;5783:177::-;5929:25;;;5917:2;5902:18;;5884:76::o;6477:401::-;6679:2;6661:21;;;6718:2;6698:18;;;6691:30;6757:34;6752:2;6737:18;;6730:62;6828:7;6823:2;6808:18;;6801:35;6868:3;6853:19;;6651:227::o;6883:356::-;7085:2;7067:21;;;7104:18;;;7097:30;7163:34;7158:2;7143:18;;7136:62;7230:2;7215:18;;7057:182::o;7244:406::-;7446:2;7428:21;;;7485:2;7465:18;;;7458:30;7524:34;7519:2;7504:18;;7497:62;7595:12;7590:2;7575:18;;7568:40;7640:3;7625:19;;7418:232::o;7655:399::-;7857:2;7839:21;;;7896:2;7876:18;;;7869:30;7935:34;7930:2;7915:18;;7908:62;8006:5;8001:2;7986:18;;7979:33;8044:3;8029:19;;7829:225::o;8059:405::-;8261:2;8243:21;;;8300:2;8280:18;;;8273:30;8339:34;8334:2;8319:18;;8312:62;8410:11;8405:2;8390:18;;8383:39;8454:3;8439:19;;8233:231::o;8469:400::-;8671:2;8653:21;;;8710:2;8690:18;;;8683:30;8749:34;8744:2;8729:18;;8722:62;8820:6;8815:2;8800:18;;8793:34;8859:3;8844:19;;8643:226::o;8874:355::-;9076:2;9058:21;;;9115:2;9095:18;;;9088:30;9154:33;9149:2;9134:18;;9127:61;9220:2;9205:18;;9048:181::o;9234:404::-;9436:2;9418:21;;;9475:2;9455:18;;;9448:30;9514:34;9509:2;9494:18;;9487:62;9585:10;9580:2;9565:18;;9558:38;9628:3;9613:19;;9408:230::o;9643:408::-;9845:2;9827:21;;;9884:2;9864:18;;;9857:30;9923:34;9918:2;9903:18;;9896:62;9994:14;9989:2;9974:18;;9967:42;10041:3;10026:19;;9817:234::o;10056:399::-;10258:2;10240:21;;;10297:2;10277:18;;;10270:30;10336:34;10331:2;10316:18;;10309:62;10407:5;10402:2;10387:18;;10380:33;10445:3;10430:19;;10230:225::o;10460:344::-;10662:2;10644:21;;;10701:2;10681:18;;;10674:30;10740:22;10735:2;10720:18;;10713:50;10795:2;10780:18;;10634:170::o;10809:345::-;11011:2;10993:21;;;11050:2;11030:18;;;11023:30;11089:23;11084:2;11069:18;;11062:51;11145:2;11130:18;;10983:171::o;11159:352::-;11361:2;11343:21;;;11400:2;11380:18;;;11373:30;11439;11434:2;11419:18;;11412:58;11502:2;11487:18;;11333:178::o;11516:401::-;11718:2;11700:21;;;11757:2;11737:18;;;11730:30;11796:34;11791:2;11776:18;;11769:62;11867:7;11862:2;11847:18;;11840:35;11907:3;11892:19;;11690:227::o;11922:355::-;12124:2;12106:21;;;12163:2;12143:18;;;12136:30;12202:33;12197:2;12182:18;;12175:61;12268:2;12253:18;;12096:181::o;12282:354::-;12484:2;12466:21;;;12523:2;12503:18;;;12496:30;12562:32;12557:2;12542:18;;12535:60;12627:2;12612:18;;12456:180::o;12641:403::-;12843:2;12825:21;;;12882:2;12862:18;;;12855:30;12921:34;12916:2;12901:18;;12894:62;12992:9;12987:2;12972:18;;12965:37;13034:3;13019:19;;12815:229::o;13049:401::-;13251:2;13233:21;;;13290:2;13270:18;;;13263:30;13329:34;13324:2;13309:18;;13302:62;13400:7;13395:2;13380:18;;13373:35;13440:3;13425:19;;13223:227::o;13455:410::-;13657:2;13639:21;;;13696:2;13676:18;;;13669:30;13735:34;13730:2;13715:18;;13708:62;13806:16;13801:2;13786:18;;13779:44;13855:3;13840:19;;13629:236::o;13870:348::-;14072:2;14054:21;;;14111:2;14091:18;;;14084:30;14150:26;14145:2;14130:18;;14123:54;14209:2;14194:18;;14044:174::o;14223:403::-;14425:2;14407:21;;;14464:2;14444:18;;;14437:30;14503:34;14498:2;14483:18;;14476:62;14574:9;14569:2;14554:18;;14547:37;14616:3;14601:19;;14397:229::o;14631:397::-;14833:2;14815:21;;;14872:2;14852:18;;;14845:30;14911:34;14906:2;14891:18;;14884:62;14982:3;14977:2;14962:18;;14955:31;15018:3;15003:19;;14805:223::o;15215:242::-;15285:2;15279:9;15315:17;;;15362:18;15347:34;;15383:22;;;15344:62;15341:2;;;15409:9;15341:2;15436;15429:22;15259:198;;-1:-1:-1;15259:198:1:o;15462:240::-;;15545:18;15537:6;15534:30;15531:2;;;15567:9;15531:2;-1:-1:-1;15615:4:1;15603:17;15622:66;15599:90;15691:4;15595:101;;15521:181::o;15707:258::-;15779:1;15789:113;15803:6;15800:1;15797:13;15789:113;;;15879:11;;;15873:18;15860:11;;;15853:39;15825:2;15818:10;15789:113;;;15920:6;15917:1;15914:13;15911:2;;;15955:1;15946:6;15941:3;15937:16;15930:27;15911:2;;15760:205;;;:::o;15970:156::-;16058:42;16051:5;16047:54;16040:5;16037:65;16027:2;;16116:1;16113;16106:12

Swarm Source

ipfs://5fc96262fc200246e5dc4c3a460f43d25ccd32dfec87e97b169789221c2ed9eb

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.