ETH Price: $2,027.89 (+4.72%)

Contract

0x169F28bfbfFCddFdc772A94Cf020bbB4CAdc8E01
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Receive_messages...170929782023-04-21 6:26:231053 days ago1682058383IN
0x169F28bf...4CAdc8E01
0 ETH0.002881335
Receive_messages...170658362023-04-17 10:14:111057 days ago1681726451IN
0x169F28bf...4CAdc8E01
0 ETH0.0024264529
Receive_messages...170084232023-04-09 4:35:111065 days ago1681014911IN
0x169F28bf...4CAdc8E01
0 ETH0.0015641319
Receive_messages...170059622023-04-08 20:14:351065 days ago1680984875IN
0x169F28bf...4CAdc8E01
0 ETH0.0018934223
Receive_messages...170052592023-04-08 17:51:351065 days ago1680976295IN
0x169F28bf...4CAdc8E01
0 ETH0.0019512820
Receive_messages...170044922023-04-08 15:14:111066 days ago1680966851IN
0x169F28bf...4CAdc8E01
0 ETH0.0024696930
Receive_messages...169930682023-04-07 0:24:111067 days ago1680827051IN
0x169F28bf...4CAdc8E01
0 ETH0.0016462220
Receive_messages...168943582023-03-24 2:21:471081 days ago1679624507IN
0x169F28bf...4CAdc8E01
0 ETH0.0010877213
Receive_messages...168746172023-03-21 7:45:231084 days ago1679384723IN
0x169F28bf...4CAdc8E01
0 ETH0.0005767512
Receive_messages...168746162023-03-21 7:45:111084 days ago1679384711IN
0x169F28bf...4CAdc8E01
0 ETH0.0010044212
Receive_messages...168174432023-03-13 7:00:111092 days ago1678690811IN
0x169F28bf...4CAdc8E01
0 ETH0.0017287821
Receive_messages...168110532023-03-12 9:28:111093 days ago1678613291IN
0x169F28bf...4CAdc8E01
0 ETH0.001811122
Receive_messages...167492912023-03-03 16:53:111101 days ago1677862391IN
0x169F28bf...4CAdc8E01
0 ETH0.0025520131
Receive_messages...167458702023-03-03 5:21:231102 days ago1677820883IN
0x169F28bf...4CAdc8E01
0 ETH0.0016464620
Receive_messages...166662902023-02-20 0:47:111113 days ago1676854031IN
0x169F28bf...4CAdc8E01
0 ETH0.0015641319
Receive_messages...166656652023-02-19 22:41:231113 days ago1676846483IN
0x169F28bf...4CAdc8E01
0 ETH0.0019757524
Receive_messages...166184792023-02-13 7:55:231120 days ago1676274923IN
0x169F28bf...4CAdc8E01
0 ETH0.0013171616
Receive_messages...166124822023-02-12 11:48:231121 days ago1676202503IN
0x169F28bf...4CAdc8E01
0 ETH0.0012348415
Receive_messages...166043472023-02-11 8:32:471122 days ago1676104367IN
0x169F28bf...4CAdc8E01
0 ETH0.0013171616
Receive_messages...165977652023-02-10 10:29:231123 days ago1676024963IN
0x169F28bf...4CAdc8E01
0 ETH0.0016464620
Receive_messages...165835022023-02-08 10:35:471125 days ago1675852547IN
0x169F28bf...4CAdc8E01
0 ETH0.0016734220
Receive_messages...165662722023-02-06 0:50:111127 days ago1675644611IN
0x169F28bf...4CAdc8E01
0 ETH0.0013171616
Receive_messages...165589112023-02-05 0:10:591128 days ago1675555859IN
0x169F28bf...4CAdc8E01
0 ETH0.0014818118
Receive_messages...165549522023-02-04 10:54:471129 days ago1675508087IN
0x169F28bf...4CAdc8E01
0 ETH0.0014818118
Receive_messages...165547242023-02-04 10:08:351129 days ago1675505315IN
0x169F28bf...4CAdc8E01
0 ETH0.001563919
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Assign170927432023-04-21 5:38:111053 days ago1682055491
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170927432023-04-21 5:38:111053 days ago1682055491
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170561972023-04-16 1:22:591058 days ago1681608179
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170561972023-04-16 1:22:591058 days ago1681608179
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170083132023-04-09 4:12:471065 days ago1681013567
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170083132023-04-09 4:12:471065 days ago1681013567
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170058532023-04-08 19:52:111065 days ago1680983531
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170058532023-04-08 19:52:111065 days ago1680983531
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170051622023-04-08 17:31:351065 days ago1680975095
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170051622023-04-08 17:31:351065 days ago1680975095
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170051612023-04-08 17:30:591065 days ago1680975059
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170051612023-04-08 17:30:591065 days ago1680975059
0x169F28bf...4CAdc8E01
0.009 ETH
Assign170043362023-04-08 14:41:471066 days ago1680964907
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message170043362023-04-08 14:41:471066 days ago1680964907
0x169F28bf...4CAdc8E01
0.009 ETH
Assign169929242023-04-06 23:54:231067 days ago1680825263
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message169929242023-04-06 23:54:231067 days ago1680825263
0x169F28bf...4CAdc8E01
0.009 ETH
Assign168915392023-03-23 16:52:111081 days ago1679590331
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message168915392023-03-23 16:52:111081 days ago1679590331
0x169F28bf...4CAdc8E01
0.009 ETH
Assign168729262023-03-21 2:03:471084 days ago1679364227
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message168729262023-03-21 2:03:471084 days ago1679364227
0x169F28bf...4CAdc8E01
0.009 ETH
Assign168166452023-03-13 4:19:231092 days ago1678681163
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message168166452023-03-13 4:19:231092 days ago1678681163
0x169F28bf...4CAdc8E01
0.009 ETH
Assign168104312023-03-12 7:22:471093 days ago1678605767
0x169F28bf...4CAdc8E01
0.009 ETH
Send_message168104312023-03-12 7:22:471093 days ago1678605767
0x169F28bf...4CAdc8E01
0.009 ETH
Assign167491672023-03-03 16:28:111102 days ago1677860891
0x169F28bf...4CAdc8E01
0.009 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OutboundLane

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU GPLv3 license
/**
 *Submitted for verification at Etherscan.io on 2022-09-27
*/

// hevm: flattened sources of src/message/OutboundLane.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.7.6;
pragma abicoder v2;

////// src/interfaces/IFeeMarket.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */
/* pragma abicoder v2; */

/// @title A interface for user to enroll to be a relayer.
/// @author echo
/// @notice After enroll to be a relyer , you have the duty to relay
/// the meesage which is assigned to you, or you will be slashed
interface IFeeMarket {
    //  Relayer which delivery the messages
    struct DeliveredRelayer {
        // relayer account
        address relayer;
        // encoded message key begin
        uint256 begin;
        // encoded message key end
        uint256 end;
    }
    /// @dev return the real time market maker fee
    /// @notice Revert `!top` when there is not enroll relayer in the fee-market
    function market_fee() external view returns (uint256 fee);
    // Assign new message encoded key to top N relayers in fee-market
    function assign(uint256 nonce) external payable returns(bool);
    // Settle delivered messages and reward/slash relayers
    function settle(DeliveredRelayer[] calldata delivery_relayers, address confirm_relayer) external returns(bool);
}

////// src/interfaces/IOutboundLane.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */

/// @title A interface for app layer to send cross chain message
/// @author echo
/// @notice The app layer could implement the interface `IOnMessageDelivered` to receive message dispatch result (optionally)
interface IOutboundLane {
    /// @notice Send message over lane.
    /// Submitter could be a contract or just an EOA address.
    /// At the beginning of the launch, submmiter is permission, after the system is stable it will be permissionless.
    /// @param target The target contract address which you would send cross chain message to
    /// @param encoded The calldata which encoded by ABI Encoding `abi.encodePacked(SELECTOR, PARAMS)`
    /// @return nonce Latest generated nonce
    function send_message(address target, bytes calldata encoded) external payable returns (uint64 nonce);
}

////// src/interfaces/IVerifier.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */

interface IVerifier {
    function verify_messages_proof(
        bytes32 outlane_data_hash,
        uint32 chain_pos,
        uint32 lane_pos,
        bytes calldata encoded_proof
    ) external view returns (bool);

    function verify_messages_delivery_proof(
        bytes32 inlane_data_hash,
        uint32 chain_pos,
        uint32 lane_pos,
        bytes calldata encoded_proof
    ) external view returns (bool);
}

////// src/message/OutboundLaneVerifier.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */
/* pragma abicoder v2; */

/* import "../interfaces/IVerifier.sol"; */

contract OutboundLaneVerifier {
    /// @dev Indentify slot
    Slot0 internal slot0;

    /// @dev The contract address of on-chain verifier
    IVerifier public immutable VERIFIER;

    struct Slot0 {
        // Bridged lane position of the leaf in the `lane_message_merkle_tree`, index starting with 0
        uint32 bridged_lane_pos;
        // Bridged chain position of the leaf in the `chain_message_merkle_tree`, index starting with 0
        uint32 bridged_chain_pos;
        // This lane position of the leaf in the `lane_message_merkle_tree`, index starting with 0
        uint32 this_lane_pos;
        // This chain position of the leaf in the `chain_message_merkle_tree`, index starting with 0
        uint32 this_chain_pos;
    }

    constructor(
        address _verifier,
        uint32 _thisChainPosition,
        uint32 _thisLanePosition,
        uint32 _bridgedChainPosition,
        uint32 _bridgedLanePosition
    ) {
        VERIFIER = IVerifier(_verifier);
        slot0.this_chain_pos = _thisChainPosition;
        slot0.this_lane_pos = _thisLanePosition;
        slot0.bridged_chain_pos = _bridgedChainPosition;
        slot0.bridged_lane_pos = _bridgedLanePosition;
    }

    function _verify_messages_delivery_proof(
        bytes32 inlane_data_hash,
        bytes memory encoded_proof
    ) internal view {
        Slot0 memory _slot0 = slot0;
        require(
            VERIFIER.verify_messages_delivery_proof(
                inlane_data_hash,
                _slot0.this_chain_pos,
                _slot0.bridged_lane_pos,
                encoded_proof
            ), "!proof"
        );
    }

    function getLaneInfo() external view returns (uint32,uint32,uint32,uint32) {
        Slot0 memory _slot0 = slot0;
        return (
            _slot0.this_chain_pos,
            _slot0.this_lane_pos,
            _slot0.bridged_chain_pos,
            _slot0.bridged_lane_pos
        );
    }

    // 32 bytes to identify an unique message from source chain
    // MessageKey encoding:
    // ThisChainPosition | ThisLanePosition | BridgedChainPosition | BridgedLanePosition | Nonce
    // [0..8)   bytes ---- Reserved
    // [8..12)  bytes ---- ThisChainPosition
    // [16..20) bytes ---- ThisLanePosition
    // [12..16) bytes ---- BridgedChainPosition
    // [20..24) bytes ---- BridgedLanePosition
    // [24..32) bytes ---- Nonce, max of nonce is `uint64(-1)`
    function encodeMessageKey(uint64 nonce) public view returns (uint256) {
        Slot0 memory _slot0 = slot0;
        return (uint256(_slot0.this_chain_pos) << 160) +
                (uint256(_slot0.this_lane_pos) << 128) +
                (uint256(_slot0.bridged_chain_pos) << 96) +
                (uint256(_slot0.bridged_lane_pos) << 64) +
                uint256(nonce);
    }
}

////// src/spec/SourceChain.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */
/* pragma abicoder v2; */

contract SourceChain {
    /// The MessagePayload is the structure of RPC which should be delivery to target chain
    /// @param source The source contract address which send the message
    /// @param target The targe contract address which receive the message
    /// @param encoded The calldata which encoded by ABI Encoding
    struct MessagePayload {
        address source;
        address target;
        bytes encoded; /*(abi.encodePacked(SELECTOR, PARAMS))*/
    }

    /// Message key (unique message identifier) as it is stored in the storage.
    struct MessageKey {
        // This chain position
        uint32 this_chain_pos;
        // Position of the message this lane.
        uint32 this_lane_pos;
        // Bridged chain position
        uint32 bridged_chain_pos;
        // Position of the message bridged lane.
        uint32 bridged_lane_pos;
        // Nonce of the message.
        uint64 nonce;
    }

    struct MessageStorage {
        uint256 encoded_key;
        bytes32 payload_hash;
    }

    /// Message as it is stored in the storage.
    struct Message {
        // Encoded message key.
        uint256 encoded_key;
        // Message payload.
        MessagePayload payload;
    }

    /// Outbound lane data.
    struct OutboundLaneData {
        // Nonce of the latest message, received by bridged chain.
        uint64 latest_received_nonce;
        // Messages sent through this lane.
        Message[] messages;
    }

    struct OutboundLaneDataStorage {
        uint64 latest_received_nonce;
        MessageStorage[] messages;
    }

    /// @dev Hash of the OutboundLaneData Schema
    /// keccak256(abi.encodePacked(
    ///     "OutboundLaneData(uint256 latest_received_nonce,Message[] messages)",
    ///     "Message(uint256 encoded_key,MessagePayload payload)",
    ///     "MessagePayload(address source,address target,bytes32 encoded_hash)"
    ///     )
    /// )
    bytes32 internal constant OUTBOUNDLANEDATA_TYPEHASH = 0x823237038687bee0f021baf36aa1a00c49bd4d430512b28fed96643d7f4404c6;


    /// @dev Hash of the Message Schema
    /// keccak256(abi.encodePacked(
    ///     "Message(uint256 encoded_key,MessagePayload payload)",
    ///     "MessagePayload(address source,address target,bytes32 encoded_hash)"
    ///     )
    /// )
    bytes32 internal constant MESSAGE_TYPEHASH = 0xfc686c8227203ee2031e2c031380f840b8cea19f967c05fc398fdeb004e7bf8b;

    /// @dev Hash of the MessagePayload Schema
    /// keccak256(abi.encodePacked(
    ///     "MessagePayload(address source,address target,bytes32 encoded_hash)"
    ///     )
    /// )
    bytes32 internal constant MESSAGEPAYLOAD_TYPEHASH = 0x582ffe1da2ae6da425fa2c8a2c423012be36b65787f7994d78362f66e4f84101;

    function hash(OutboundLaneData memory data)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encode(
                OUTBOUNDLANEDATA_TYPEHASH,
                data.latest_received_nonce,
                hash(data.messages)
            )
        );
    }

    function hash(OutboundLaneDataStorage memory data)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encode(
                OUTBOUNDLANEDATA_TYPEHASH,
                data.latest_received_nonce,
                hash(data.messages)
            )
        );
    }

    function hash(MessageStorage[] memory msgs)
        internal
        pure
        returns (bytes32)
    {
        uint msgsLength = msgs.length;
        bytes memory encoded = abi.encode(msgsLength);
        for (uint256 i = 0; i < msgsLength; i ++) {
            MessageStorage memory message = msgs[i];
            encoded = abi.encodePacked(
                encoded,
                abi.encode(
                    MESSAGE_TYPEHASH,
                    message.encoded_key,
                    message.payload_hash
                )
            );
        }
        return keccak256(encoded);
    }

    function hash(Message[] memory msgs)
        internal
        pure
        returns (bytes32)
    {
        uint msgsLength = msgs.length;
        bytes memory encoded = abi.encode(msgsLength);
        for (uint256 i = 0; i < msgsLength; i ++) {
            Message memory message = msgs[i];
            encoded = abi.encodePacked(
                encoded,
                abi.encode(
                    MESSAGE_TYPEHASH,
                    message.encoded_key,
                    hash(message.payload)
                )
            );
        }
        return keccak256(encoded);
    }

    function hash(MessagePayload memory payload)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encode(
                MESSAGEPAYLOAD_TYPEHASH,
                payload.source,
                payload.target,
                keccak256(payload.encoded)
            )
        );
    }

    function decodeMessageKey(uint256 encoded) internal pure returns (MessageKey memory key) {
        key.this_chain_pos = uint32(encoded >> 160);
        key.this_lane_pos = uint32(encoded >> 128);
        key.bridged_chain_pos = uint32(encoded >> 96);
        key.bridged_lane_pos = uint32(encoded >> 64);
        key.nonce = uint64(encoded);
    }
}

////// src/spec/TargetChain.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.

/* pragma solidity 0.7.6; */
/* pragma abicoder v2; */

contract TargetChain {
    /// Delivered messages with their dispatch result.
    struct DeliveredMessages {
        // Nonce of the first message that has been delivered (inclusive).
        uint64 begin;
        // Nonce of the last message that has been delivered (inclusive).
        uint64 end;
    }

    /// Unrewarded relayer entry stored in the inbound lane data.
    ///
    /// This struct represents a continuous range of messages that have been delivered by the same
    /// relayer and whose confirmations are still pending.
    struct UnrewardedRelayer {
        // Address of the relayer.
        address relayer;
        // Messages range, delivered by this relayer.
        DeliveredMessages messages;
    }

    /// Inbound lane data
    struct InboundLaneData {
        // Identifiers of relayers and messages that they have delivered to this lane (ordered by
        // message nonce).
        //
        // This serves as a helper storage item, to allow the source chain to easily pay rewards
        // to the relayers who successfully delivered messages to the target chain (inbound lane).
        //
        // All nonces in this queue are in
        // range: `(self.last_confirmed_nonce; self.last_delivered_nonce()]`.
        //
        // When a relayer sends a single message, both of begin and end nonce are the same.
        // When relayer sends messages in a batch, the first arg is the lowest nonce, second arg the
        // highest nonce. Multiple dispatches from the same relayer are allowed.
        UnrewardedRelayer[] relayers;
        // Nonce of the last message that
        // a) has been delivered to the target (this) chain and
        // b) the delivery has been confirmed on the source chain
        //
        // that the target chain knows of.
        //
        // This value is updated indirectly when an `OutboundLane` state of the source
        // chain is received alongside with new messages delivery.
        uint64 last_confirmed_nonce;
        // Nonce of the latest received or has been delivered message to this inbound lane.
        uint64 last_delivered_nonce;
    }

    /// @dev Hash of the InboundLaneData Schema
    /// keccak256(abi.encodePacked(
    ///     "InboundLaneData(UnrewardedRelayer[] relayers,uint64 last_confirmed_nonce,uint64 last_delivered_nonce)",
    ///     "UnrewardedRelayer(address relayer,DeliveredMessages messages)",
    ///     "DeliveredMessages(uint64 begin,uint64 end)"
    ///     )
    /// )
    bytes32 internal constant INBOUNDLANEDATA_TYPEHASH = 0xcf4a39e72acc9d64da0fc507104c55de6ee7e6e1a477d8700014bcb981f85106;

    /// @dev Hash of the UnrewardedRelayer Schema
    /// keccak256(abi.encodePacked(
    ///     "UnrewardedRelayer(address relayer,DeliveredMessages messages)",
    ///     "DeliveredMessages(uint64 begin,uint64 end)"
    ///     )
    /// )
    bytes32 internal constant UNREWARDEDRELAYER_TYPETASH = 0x6d8ba9a028be62615788b0b9200c2e575678c124d2db04ca91582405eba190a1;

    /// @dev Hash of the DeliveredMessages Schema
    /// keccak256(abi.encodePacked(
    ///     "DeliveredMessages(uint64 begin,uint64 end)"
    ///     )
    /// )
    bytes32 internal constant DELIVEREDMESSAGES_TYPETASH = 0x1984c1907b379883ef1736e0351d28f5b4b82026a854e28971d89eb48f32fbe2;

    function hash(InboundLaneData memory inboundLaneData)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encode(
                INBOUNDLANEDATA_TYPEHASH,
                hash(inboundLaneData.relayers),
                inboundLaneData.last_confirmed_nonce,
                inboundLaneData.last_delivered_nonce
            )
        );
    }

    function hash(UnrewardedRelayer[] memory relayers)
        internal
        pure
        returns (bytes32)
    {
        uint relayersLength = relayers.length;
        bytes memory encoded = abi.encode(relayersLength);
        for (uint256 i = 0; i < relayersLength; i++) {
            UnrewardedRelayer memory r = relayers[i];
            encoded = abi.encodePacked(
                encoded,
                abi.encode(
                    UNREWARDEDRELAYER_TYPETASH,
                    r.relayer,
                    hash(r.messages)
                )
            );
        }
        return keccak256(encoded);
    }

    function hash(DeliveredMessages memory messages)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encode(
                DELIVEREDMESSAGES_TYPETASH,
                messages.begin,
                messages.end
            )
        );
    }
}

////// src/message/OutboundLane.sol
// This file is part of Darwinia.
// Copyright (C) 2018-2022 Darwinia Network
//
// Darwinia is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Darwinia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Darwinia. If not, see <https://www.gnu.org/licenses/>.
//
// Message module that allows sending and receiving messages using lane concept:
//
// 1) the message is sent using `send_message()` call;
// 2) every outbound message is assigned nonce;
// 3) the messages hash are stored in the storage;
// 4) external component (relay) delivers messages to bridged chain;
// 5) messages are processed in order (ordered by assigned nonce);
// 6) relay may send proof-of-delivery back to this chain.
//
// Once message is sent, its progress can be tracked by looking at lane contract events.
// The assigned nonce is reported using `MessageAccepted` event. When message is
// delivered to the the bridged chain, it is reported using `MessagesDelivered` event.

/* pragma solidity 0.7.6; */
/* pragma abicoder v2; */

/* import "../interfaces/IOutboundLane.sol"; */
/* import "../interfaces/IFeeMarket.sol"; */
/* import "./OutboundLaneVerifier.sol"; */
/* import "../spec/SourceChain.sol"; */
/* import "../spec/TargetChain.sol"; */

// Everything about outgoing messages sending.
contract OutboundLane is IOutboundLane, OutboundLaneVerifier, TargetChain, SourceChain {
    /// slot 1
    OutboundLaneNonce public outboundLaneNonce;
    /// slot 2
    /// nonce => hash(MessagePayload)
    mapping(uint64 => bytes32) public messages;

    address public immutable FEE_MARKET;

    uint256 private constant MAX_CALLDATA_LENGTH       = 2048;
    uint64  private constant MAX_PENDING_MESSAGES      = 20;
    uint64  private constant MAX_PRUNE_MESSAGES_ATONCE = 5;

    event MessageAccepted(uint64 indexed nonce, address source, address target, bytes encoded);
    event MessagesDelivered(uint64 indexed begin, uint64 indexed end);
    event MessagePruned(uint64 indexed oldest_unpruned_nonce);

    /// Outbound lane nonce.
    struct OutboundLaneNonce {
        // Nonce of the latest message, received by bridged chain.
        uint64 latest_received_nonce;
        // Nonce of the latest message, generated by this lane.
        uint64 latest_generated_nonce;
        // Nonce of the oldest message that we haven't yet pruned. May point to not-yet-generated
        // message if all sent messages are already pruned.
        uint64 oldest_unpruned_nonce;
    }

    /// @dev Deploys the OutboundLane contract
    /// @param _lightClientBridge The contract address of on-chain light client
    /// @param _thisChainPosition The thisChainPosition of outbound lane
    /// @param _thisLanePosition The lanePosition of this outbound lane
    /// @param _bridgedChainPosition The bridgedChainPosition of outbound lane
    /// @param _bridgedLanePosition The lanePosition of target inbound lane
    /// @param _oldest_unpruned_nonce The oldest_unpruned_nonce of outbound lane
    /// @param _latest_received_nonce The latest_received_nonce of outbound lane
    /// @param _latest_generated_nonce The latest_generated_nonce of outbound lane
    constructor(
        address _lightClientBridge,
        address _feeMarket,
        uint32 _thisChainPosition,
        uint32 _thisLanePosition,
        uint32 _bridgedChainPosition,
        uint32 _bridgedLanePosition,
        uint64 _oldest_unpruned_nonce,
        uint64 _latest_received_nonce,
        uint64 _latest_generated_nonce
    ) OutboundLaneVerifier(
        _lightClientBridge,
        _thisChainPosition,
        _thisLanePosition,
        _bridgedChainPosition,
        _bridgedLanePosition
    ) {
        outboundLaneNonce = OutboundLaneNonce(
            _latest_received_nonce,
            _latest_generated_nonce,
            _oldest_unpruned_nonce
        );
        FEE_MARKET = _feeMarket;
    }

    /// @dev Send message over lane.
    /// Submitter could be a contract or just an EOA address.
    /// At the beginning of the launch, submmiter is permission, after the system is stable it will be permissionless.
    /// @param target The target contract address which you would send cross chain message to
    /// @param encoded The calldata which encoded by ABI Encoding
    /// @return nonce Latest generated nonce
    function send_message(address target, bytes calldata encoded) external payable override returns (uint64) {
        require(outboundLaneNonce.latest_generated_nonce - outboundLaneNonce.latest_received_nonce < MAX_PENDING_MESSAGES, "TooManyPendingMessages");
        require(outboundLaneNonce.latest_generated_nonce < type(uint64).max, "Overflow");
        require(encoded.length <= MAX_CALLDATA_LENGTH, "TooLargeCalldata");

        uint64 nonce = outboundLaneNonce.latest_generated_nonce + 1;

        // assign the message to top relayers
        uint encoded_key = encodeMessageKey(nonce);
        require(IFeeMarket(FEE_MARKET).assign{value: msg.value}(encoded_key), "AssignRelayersFailed");

        outboundLaneNonce.latest_generated_nonce = nonce;
        MessagePayload memory payload = MessagePayload({
            source: msg.sender,
            target: target,
            encoded: encoded
        });
        messages[nonce] = hash(payload);
        // message sender prune at most `MAX_PRUNE_MESSAGES_ATONCE` messages
        _prune_messages(MAX_PRUNE_MESSAGES_ATONCE);
        emit MessageAccepted(
            nonce,
            msg.sender,
            target,
            encoded);
        return nonce;
    }

    /// Receive messages delivery proof from bridged chain.
    function receive_messages_delivery_proof(
        InboundLaneData calldata inboundLaneData,
        bytes memory messagesProof
    ) external {
        _verify_messages_delivery_proof(hash(inboundLaneData), messagesProof);
        DeliveredMessages memory confirmed_messages = _confirm_delivery(inboundLaneData);
        // settle the confirmed_messages at fee market
        settle_messages(inboundLaneData.relayers, confirmed_messages.begin, confirmed_messages.end);
    }

    /// Return the commitment of lane data.
    function commitment() external view returns (bytes32) {
        return hash(data());
    }

    function message_size() public view returns (uint64 size) {
        size = outboundLaneNonce.latest_generated_nonce - outboundLaneNonce.latest_received_nonce;
    }

    /// Get lane data from the storage.
    function data() public view returns (OutboundLaneDataStorage memory lane_data) {
        uint64 size = message_size();
        if (size > 0) {
            lane_data.messages = new MessageStorage[](size);
            uint64 begin = outboundLaneNonce.latest_received_nonce + 1;
            for (uint64 index = 0; index < size; index++) {
                uint64 nonce = index + begin;
                lane_data.messages[index] = MessageStorage(encodeMessageKey(nonce), messages[nonce]);
            }
        }
        lane_data.latest_received_nonce = outboundLaneNonce.latest_received_nonce;
    }

    function _extract_inbound_lane_info(
        InboundLaneData memory lane_data
    ) private pure returns (
        uint64 total_unrewarded_messages,
        uint64 last_delivered_nonce
    ) {
        total_unrewarded_messages = lane_data.last_delivered_nonce - lane_data.last_confirmed_nonce;
        last_delivered_nonce = lane_data.last_delivered_nonce;
    }

    /// Confirm messages delivery.
    function _confirm_delivery(
        InboundLaneData memory inboundLaneData
    ) private returns (
        DeliveredMessages memory confirmed_messages
    ) {
        (uint64 total_messages, uint64 latest_delivered_nonce) = _extract_inbound_lane_info(inboundLaneData);

        OutboundLaneNonce memory nonce = outboundLaneNonce;
        require(latest_delivered_nonce > nonce.latest_received_nonce, "NoNewConfirmations");
        require(latest_delivered_nonce <= nonce.latest_generated_nonce, "FailedToConfirmFutureMessages");
        // that the relayer has declared correct number of messages that the proof contains (it
        // is checked outside of the function). But it may happen (but only if this/bridged
        // chain storage is corrupted, though) that the actual number of confirmed messages if
        // larger than declared.
        require(latest_delivered_nonce - nonce.latest_received_nonce <= total_messages, "TryingToConfirmMoreMessagesThanExpected");
        _check_relayers(latest_delivered_nonce, inboundLaneData.relayers);
        uint64 prev_latest_received_nonce = nonce.latest_received_nonce;
        outboundLaneNonce.latest_received_nonce = latest_delivered_nonce;
        confirmed_messages = DeliveredMessages({
            begin: prev_latest_received_nonce + 1,
            end: latest_delivered_nonce
        });
        // emit 'MessagesDelivered' event
        emit MessagesDelivered(confirmed_messages.begin, confirmed_messages.end);
    }

    /// Extract new dispatch results from the unrewarded relayers vec.
    ///
    /// Revert if unrewarded relayers vec contains invalid data, meaning that the bridged
    /// chain has invalid runtime storage.
    function _check_relayers(uint64 latest_received_nonce, UnrewardedRelayer[] memory relayers) private pure {
        // the only caller of this functions checks that the
        // prev_latest_received_nonce..=latest_received_nonce is valid, so we're ready to accept
        // messages in this range => with_capacity call must succeed here or we'll be unable to receive
        // confirmations at all
        uint64 last_entry_end = 0;
        for (uint64 i = 0; i < relayers.length; i++) {
            UnrewardedRelayer memory entry = relayers[i];
            // unrewarded relayer entry must have at least 1 unconfirmed message
            // (guaranteed by the `InboundLane::receive_message()`)
            require(entry.messages.end >= entry.messages.begin, "EmptyUnrewardedRelayerEntry");
            if (last_entry_end > 0) {
                uint64 expected_entry_begin = last_entry_end + 1;
                // every entry must confirm range of messages that follows previous entry range
                // (guaranteed by the `InboundLane::receive_message()`)
                require(entry.messages.begin == expected_entry_begin, "NonConsecutiveUnrewardedRelayerEntries");
            }
            last_entry_end = entry.messages.end;
            // entry can't confirm messages larger than `inbound_lane_data.latest_received_nonce()`
            // (guaranteed by the `InboundLane::receive_message()`)
			// technically this will be detected in the next loop iteration as
			// `InvalidNumberOfDispatchResults` but to guarantee safety of loop operations below
			// this is detected now
            require(entry.messages.end <= latest_received_nonce, "FailedToConfirmFutureMessages");
        }
    }

    /// Prune at most `max_messages_to_prune` already received messages.
    ///
    /// Returns number of pruned messages.
    function _prune_messages(uint64 max_messages_to_prune) private returns (uint64 pruned_messages) {
        OutboundLaneNonce memory nonce = outboundLaneNonce;
        while (pruned_messages < max_messages_to_prune &&
            nonce.oldest_unpruned_nonce <= nonce.latest_received_nonce)
        {
            delete messages[nonce.oldest_unpruned_nonce];
            pruned_messages += 1;
            nonce.oldest_unpruned_nonce += 1;
        }
        if (pruned_messages > 0) {
            outboundLaneNonce.oldest_unpruned_nonce = nonce.oldest_unpruned_nonce;
            emit MessagePruned(outboundLaneNonce.oldest_unpruned_nonce);
        }
        return pruned_messages;
    }

    function settle_messages(
        UnrewardedRelayer[] memory relayers,
        uint64 received_start,
        uint64 received_end
    ) private {
        IFeeMarket.DeliveredRelayer[] memory delivery_relayers = new IFeeMarket.DeliveredRelayer[](relayers.length);
        for (uint256 i = 0; i < relayers.length; i++) {
            UnrewardedRelayer memory r = relayers[i];
            uint64 nonce_begin = _max(r.messages.begin, received_start);
            uint64 nonce_end = _min(r.messages.end, received_end);
            delivery_relayers[i] = IFeeMarket.DeliveredRelayer(r.relayer, encodeMessageKey(nonce_begin), encodeMessageKey(nonce_end));
        }
        require(IFeeMarket(FEE_MARKET).settle(delivery_relayers, msg.sender), "SettleFailed");
    }

    // --- Math ---
    function _min(uint64 x, uint64 y) private pure returns (uint64 z) {
        return x <= y ? x : y;
    }

    function _max(uint64 x, uint64 y) private pure returns (uint64 z) {
        return x >= y ? x : y;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_lightClientBridge","type":"address"},{"internalType":"address","name":"_feeMarket","type":"address"},{"internalType":"uint32","name":"_thisChainPosition","type":"uint32"},{"internalType":"uint32","name":"_thisLanePosition","type":"uint32"},{"internalType":"uint32","name":"_bridgedChainPosition","type":"uint32"},{"internalType":"uint32","name":"_bridgedLanePosition","type":"uint32"},{"internalType":"uint64","name":"_oldest_unpruned_nonce","type":"uint64"},{"internalType":"uint64","name":"_latest_received_nonce","type":"uint64"},{"internalType":"uint64","name":"_latest_generated_nonce","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"address","name":"source","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"MessageAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"oldest_unpruned_nonce","type":"uint64"}],"name":"MessagePruned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"begin","type":"uint64"},{"indexed":true,"internalType":"uint64","name":"end","type":"uint64"}],"name":"MessagesDelivered","type":"event"},{"inputs":[],"name":"FEE_MARKET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERIFIER","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitment","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"components":[{"internalType":"uint64","name":"latest_received_nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"encoded_key","type":"uint256"},{"internalType":"bytes32","name":"payload_hash","type":"bytes32"}],"internalType":"struct SourceChain.MessageStorage[]","name":"messages","type":"tuple[]"}],"internalType":"struct SourceChain.OutboundLaneDataStorage","name":"lane_data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"encodeMessageKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLaneInfo","outputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"message_size","outputs":[{"internalType":"uint64","name":"size","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"messages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"outboundLaneNonce","outputs":[{"internalType":"uint64","name":"latest_received_nonce","type":"uint64"},{"internalType":"uint64","name":"latest_generated_nonce","type":"uint64"},{"internalType":"uint64","name":"oldest_unpruned_nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"relayer","type":"address"},{"components":[{"internalType":"uint64","name":"begin","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"}],"internalType":"struct TargetChain.DeliveredMessages","name":"messages","type":"tuple"}],"internalType":"struct TargetChain.UnrewardedRelayer[]","name":"relayers","type":"tuple[]"},{"internalType":"uint64","name":"last_confirmed_nonce","type":"uint64"},{"internalType":"uint64","name":"last_delivered_nonce","type":"uint64"}],"internalType":"struct TargetChain.InboundLaneData","name":"inboundLaneData","type":"tuple"},{"internalType":"bytes","name":"messagesProof","type":"bytes"}],"name":"receive_messages_delivery_proof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"encoded","type":"bytes"}],"name":"send_message","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"payable","type":"function"}]

60c06040523480156200001157600080fd5b506040516200222038038062002220833981016040819052620000349162000171565b606098891b6001600160601b03199081166080526000805463ffffffff60601b19166c0100000000000000000000000063ffffffff9a8b16021763ffffffff60401b191668010000000000000000988a1689021763ffffffff60201b1916640100000000978a16979097029690961763ffffffff191694909716939093179093556040805180890182526001600160401b0394851680825293851660208201819052929094169301839052600180546001600160401b031916909217600160401b600160801b031916930292909217600160801b600160c01b031916600160801b909102179055911b1660a0526200022b565b80516001600160a01b03811681146200013f57600080fd5b919050565b805163ffffffff811681146200013f57600080fd5b80516001600160401b03811681146200013f57600080fd5b60008060008060008060008060006101208a8c03121562000190578485fd5b6200019b8a62000127565b9850620001ab60208b0162000127565b9750620001bb60408b0162000144565b9650620001cb60608b0162000144565b9550620001db60808b0162000144565b9450620001eb60a08b0162000144565b9350620001fb60c08b0162000159565b92506200020b60e08b0162000159565b91506200021c6101008b0162000159565b90509295985092959850929598565b60805160601c60a05160601c611fbc620002646000398061027452806103b85280610ff55250806102395280610c145250611fbc6000f3fe6080604052600436106100bc5760003560e01c80636135ca651161007457806373d4a13a1161004e57806373d4a13a146101ce5780639b01a773146101f0578063a3ccae5a14610210576100bc565b80636135ca65146101635780636257278d1461018857806372602226146101aa576100bc565b80631303a484116100a55780631303a484146101195780632156ff261461012e578063303d8a1214610143576100bc565b8063029d6713146100c157806308c84e70146100f7575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046117ab565b610225565b6040516100ee9190611918565b60405180910390f35b34801561010357600080fd5b5061010c610237565b6040516100ee91906117f4565b34801561012557600080fd5b506100e161025b565b34801561013a57600080fd5b5061010c610272565b610156610151366004611624565b610296565b6040516100ee9190611dac565b34801561016f57600080fd5b506101786105bd565b6040516100ee9493929190611d84565b34801561019457600080fd5b506101a86101a33660046116c2565b61061d565b005b3480156101b657600080fd5b506101bf6106be565b6040516100ee93929190611dc1565b3480156101da57600080fd5b506101e36106f6565b6040516100ee9190611d16565b3480156101fc57600080fd5b506100e161020b3660046117ab565b610838565b34801561021c57600080fd5b50610156610907565b60026020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061026d6102686106f6565b610928565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600090601467ffffffffffffffff8281166801000000000000000090930481169290920390911610610300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611b6f565b60405180910390fd5b60015467ffffffffffffffff68010000000000000000909104811610610352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611aa4565b61080082111561038e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611b38565b6001805468010000000000000000900467ffffffffffffffff160160006103b482610838565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634c08113834836040518363ffffffff1660e01b81526004016104109190611918565b6020604051808303818588803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061046291906116a2565b610498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611ca8565b600180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8516021790556040805160608101825233815273ffffffffffffffffffffffffffffffffffffffff88166020808301919091528251601f880182900482028101820184528781526000938301918990899081908401838280828437600092019190915250505091525090506105458161098c565b67ffffffffffffffff841660009081526002602052604090205561056960056109d5565b508267ffffffffffffffff167f98c95af5732ea9f6898d677074a303d37cbf80a533c81aafef61e3414624624e338989896040516105aa9493929190611815565b60405180910390a2509095945050505050565b6040805160808101825260005463ffffffff808216808452640100000000830482166020850181905268010000000000000000840483169585018690526c0100000000000000000000000090930490911660609093018390529193909190565b61063761063161062c84611e75565b610b3a565b82610b84565b600061064a61064584611e75565b610cd4565b90506106b96106598480611de5565b808060200260200160405190810160405280939291908181526020016000905b828210156106a55761069660608302860136819003810190611790565b81526020019060010190610679565b505050505082600001518360200151610ea9565b505050565b60015467ffffffffffffffff808216916801000000000000000081048216917001000000000000000000000000000000009091041683565b6106fe6114cb565b6000610708610907565b905067ffffffffffffffff811615610825578067ffffffffffffffff1667ffffffffffffffff8111801561073b57600080fd5b5060405190808252806020026020018201604052801561077557816020015b6107626114e3565b81526020019060019003908161075a5790505b5060208301526001805467ffffffffffffffff160160005b8267ffffffffffffffff168167ffffffffffffffff161015610822576000828201905060405180604001604052806107c483610838565b8152602001600260008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205481525085602001518367ffffffffffffffff168151811061080e57fe5b60209081029190910101525060010161078d565b50505b5060015467ffffffffffffffff16815290565b604080516080808201835260005463ffffffff808216845264010000000082048082166020860152680100000000000000008304808316868801526c01000000000000000000000000840492831660609687015267ffffffffffffffff88169390961b6bffffffff000000000000000016941b6fffffffff000000000000000000000000169490921b73ffffffff000000000000000000000000000000001660a09290921b77ffffffff000000000000000000000000000000000000000016919091019290920101015b919050565b60015467ffffffffffffffff80821668010000000000000000909204160390565b805160208201516000917f823237038687bee0f021baf36aa1a00c49bd4d430512b28fed96643d7f4404c69161095d906110ba565b60405160200161096f93929190611a2d565b604051602081830303815290604052805190602001209050919050565b8051602080830151604080850151805190840120905160009461096f947f582ffe1da2ae6da425fa2c8a2c423012be36b65787f7994d78362f66e4f84101949193919201611921565b6040805160608101825260015467ffffffffffffffff80821683526801000000000000000082048116602084015270010000000000000000000000000000000090910416918101919091526000905b8267ffffffffffffffff168267ffffffffffffffff16108015610a635750806000015167ffffffffffffffff16816040015167ffffffffffffffff1611155b15610aa2576040808201805167ffffffffffffffff90811660009081526002602052928320929092558051600190810190921690529190910190610a24565b67ffffffffffffffff821615610b3457604081810151600180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff93841681029190911791829055925192900416907f0ff432861ad053b4d1074d84bf72d0892e4e57e697ea40a9087d1d231dd5859590600090a25b50919050565b80516000907fcf4a39e72acc9d64da0fc507104c55de6ee7e6e1a477d8700014bcb981f8510690610b6a906111ce565b602080850151604080870151905161096f9594930161197f565b6040805160808101825260005463ffffffff8082168084526401000000008304821660208501526801000000000000000083048216848601526c01000000000000000000000000909204166060830181905292517f3f8c931d000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692633f8c931d92610c4e92889290919088906004016119bd565b60206040518083038186803b158015610c6657600080fd5b505afa158015610c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9e91906116a2565b6106b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611bdd565b610cdc6114e3565b600080610ce8846112da565b6040805160608101825260015467ffffffffffffffff80821680845268010000000000000000830482166020850152700100000000000000000000000000000000909204811693830193909352939550919350909190831611610d77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611a6d565b806020015167ffffffffffffffff168267ffffffffffffffff161115610dc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611cdf565b805167ffffffffffffffff808516918403161115610e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611adb565b610e218286600001516112eb565b8051600180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116918217835560408051808201825293850190911680845260208401839052905192975090917fb11cf15eb96c6c0e544143cec0aa5944efc0e5d311263e73ccfe0f80231e0ac890600090a350505050919050565b6000835167ffffffffffffffff81118015610ec357600080fd5b50604051908082528060200260200182016040528015610efd57816020015b610eea6114fa565b815260200190600190039081610ee25790505b50905060005b8451811015610fb7576000858281518110610f1a57fe5b602002602001015190506000610f388260200151600001518761143e565b90506000610f4e8360200151602001518761146b565b90506040518060600160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001610f8484610838565b8152602001610f9283610838565b815250858581518110610fa157fe5b6020908102919091010152505050600101610f03565b506040517fcf65f7cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cf65f7cc9061102c908490339060040161188a565b602060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e91906116a2565b6110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611ba6565b50505050565b600080825190506000816040516020016110d49190611918565b604051602081830303815290604052905060005b828110156111be5760008582815181106110fe57fe5b60200260200101519050827ffc686c8227203ee2031e2c031380f840b8cea19f967c05fc398fdeb004e7bf8b60001b82600001518360200151604051602001611149939291906119a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261118592916020016117c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016110e8565b5080516020909101209392505050565b600080825190506000816040516020016111e89190611918565b604051602081830303815290604052905060005b828110156111be57600085828151811061121257fe5b60200260200101519050827f6d8ba9a028be62615788b0b9200c2e575678c124d2db04ca91582405eba190a160001b8260000151611253846020015161148f565b60405160200161126593929190611953565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526112a192916020016117c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016111fc565b602081015160409091015190810391565b6000805b82518167ffffffffffffffff1610156110b4576000838267ffffffffffffffff168151811061131a57fe5b6020026020010151905080602001516000015167ffffffffffffffff1681602001516020015167ffffffffffffffff161015611382576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611c14565b67ffffffffffffffff8316156113e457602081015151600184019067ffffffffffffffff8083169116146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611c4b565b505b6020808201510151925067ffffffffffffffff8086169084161115611435576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611cdf565b506001016112ef565b60008167ffffffffffffffff168367ffffffffffffffff1610156114625781611464565b825b9392505050565b60008167ffffffffffffffff168367ffffffffffffffff1611156114625781611464565b805160208083015160405160009361096f937f1984c1907b379883ef1736e0351d28f5b4b82026a854e28971d89eb48f32fbe293919201611a4d565b60408051808201909152600081526060602082015290565b604080518082019091526000808252602082015290565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090257600080fd5b60008183036060811215611567578182fd5b6040805181810167ffffffffffffffff828210818311171561158557fe5b81845282955061159487611531565b8352837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0860112156115c557600080fd5b83519450838501915084821081831117156115dc57fe5b5082526115eb6020860161160c565b83526115f882860161160c565b602084015282602082015250505092915050565b803567ffffffffffffffff8116811461090257600080fd5b600080600060408486031215611638578283fd5b61164184611531565b9250602084013567ffffffffffffffff8082111561165d578384fd5b818601915086601f830112611670578384fd5b81358181111561167e578485fd5b87602082850101111561168f578485fd5b6020830194508093505050509250925092565b6000602082840312156116b3578081fd5b81518015158114611464578182fd5b600080604083850312156116d4578182fd5b823567ffffffffffffffff808211156116eb578384fd5b90840190606082870312156116fe578384fd5b9092506020908482013581811115611714578384fd5b8501601f81018713611724578384fd5b80358281111561173057fe5b611760847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611e51565b92508083528784828401011115611775578485fd5b80848301858501378201909201929092525090939092509050565b6000606082840312156117a1578081fd5b6114648383611555565b6000602082840312156117bc578081fd5b6114648261160c565b600083516117d7818460208801611f5a565b8351908301906117eb818360208801611f5a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506060604083015282606083015282846080840137818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6040808252835182820181905260009190606090818501906020808901865b838110156118ec578151805173ffffffffffffffffffffffffffffffffffffffff16865283810151848701528701518786015293850193908201906001016118a9565b505082955073ffffffffffffffffffffffffffffffffffffffff88168188015250505050509392505050565b90815260200190565b93845273ffffffffffffffffffffffffffffffffffffffff928316602085015291166040830152606082015260800190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b938452602084019290925267ffffffffffffffff908116604084015216606082015260800190565b9283526020830191909152604082015260600190565b600085825263ffffffff80861660208401528085166040840152506080606083015282518060808401526119f88160a0850160208701611f5a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b92835267ffffffffffffffff919091166020830152604082015260600190565b92835267ffffffffffffffff918216602084015216604082015260600190565b60208082526012908201527f4e6f4e6577436f6e6669726d6174696f6e730000000000000000000000000000604082015260600190565b60208082526008908201527f4f766572666c6f77000000000000000000000000000000000000000000000000604082015260600190565b60208082526027908201527f547279696e67546f436f6e6669726d4d6f72654d657373616765735468616e4560408201527f7870656374656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f546f6f4c6172676543616c6c6461746100000000000000000000000000000000604082015260600190565b60208082526016908201527f546f6f4d616e7950656e64696e674d6573736167657300000000000000000000604082015260600190565b6020808252600c908201527f536574746c654661696c65640000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f2170726f6f660000000000000000000000000000000000000000000000000000604082015260600190565b6020808252601b908201527f456d707479556e726577617264656452656c61796572456e7472790000000000604082015260600190565b60208082526026908201527f4e6f6e436f6e7365637574697665556e726577617264656452656c617965724560408201527f6e74726965730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f41737369676e52656c61796572734661696c6564000000000000000000000000604082015260600190565b6020808252601d908201527f4661696c6564546f436f6e6669726d4675747572654d65737361676573000000604082015260600190565b6020808252825167ffffffffffffffff168282015282810151604080840181905281516060850181905260009392830191849160808701905b80841015611d785784518051835286015186830152938501936001939093019290820190611d4f565b50979650505050505050565b63ffffffff948516815292841660208401529083166040830152909116606082015260800190565b67ffffffffffffffff91909116815260200190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e19578283fd5b83018035915067ffffffffffffffff821115611e33578283fd5b6020019150606081023603821315611e4a57600080fd5b9250929050565b60405181810167ffffffffffffffff81118282101715611e6d57fe5b604052919050565b60006060808336031215611e87578182fd5b60405181810167ffffffffffffffff8282108183111715611ea457fe5b816040528535915080821115611eb8578485fd5b9085019036601f830112611eca578485fd5b8135602082821115611ed857fe5b611ee58182840201611e51565b828152818101935084820136888502870184011115611f02578889fd5b8895505b83861015611f2c57611f183682611555565b855260019590950194938201938701611f06565b508552611f3a88820161160c565b8186015250505050611f4e6040850161160c565b60408201529392505050565b60005b83811015611f75578181015183820152602001611f5d565b838111156110b4575050600091015256fea2646970667358221220dfc7a7a05ecfae90cff88b9bd91d20260773295958a9eab9ade56c5065ace86f64736f6c634300070600330000000000000000000000001632822223f75599daed9045fead2e93c6b41cb7000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106100bc5760003560e01c80636135ca651161007457806373d4a13a1161004e57806373d4a13a146101ce5780639b01a773146101f0578063a3ccae5a14610210576100bc565b80636135ca65146101635780636257278d1461018857806372602226146101aa576100bc565b80631303a484116100a55780631303a484146101195780632156ff261461012e578063303d8a1214610143576100bc565b8063029d6713146100c157806308c84e70146100f7575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046117ab565b610225565b6040516100ee9190611918565b60405180910390f35b34801561010357600080fd5b5061010c610237565b6040516100ee91906117f4565b34801561012557600080fd5b506100e161025b565b34801561013a57600080fd5b5061010c610272565b610156610151366004611624565b610296565b6040516100ee9190611dac565b34801561016f57600080fd5b506101786105bd565b6040516100ee9493929190611d84565b34801561019457600080fd5b506101a86101a33660046116c2565b61061d565b005b3480156101b657600080fd5b506101bf6106be565b6040516100ee93929190611dc1565b3480156101da57600080fd5b506101e36106f6565b6040516100ee9190611d16565b3480156101fc57600080fd5b506100e161020b3660046117ab565b610838565b34801561021c57600080fd5b50610156610907565b60026020526000908152604090205481565b7f0000000000000000000000001632822223f75599daed9045fead2e93c6b41cb781565b600061026d6102686106f6565b610928565b905090565b7f000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a81565b600154600090601467ffffffffffffffff8281166801000000000000000090930481169290920390911610610300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611b6f565b60405180910390fd5b60015467ffffffffffffffff68010000000000000000909104811610610352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611aa4565b61080082111561038e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611b38565b6001805468010000000000000000900467ffffffffffffffff160160006103b482610838565b90507f000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a73ffffffffffffffffffffffffffffffffffffffff16634c08113834836040518363ffffffff1660e01b81526004016104109190611918565b6020604051808303818588803b15801561042957600080fd5b505af115801561043d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061046291906116a2565b610498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611ca8565b600180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8516021790556040805160608101825233815273ffffffffffffffffffffffffffffffffffffffff88166020808301919091528251601f880182900482028101820184528781526000938301918990899081908401838280828437600092019190915250505091525090506105458161098c565b67ffffffffffffffff841660009081526002602052604090205561056960056109d5565b508267ffffffffffffffff167f98c95af5732ea9f6898d677074a303d37cbf80a533c81aafef61e3414624624e338989896040516105aa9493929190611815565b60405180910390a2509095945050505050565b6040805160808101825260005463ffffffff808216808452640100000000830482166020850181905268010000000000000000840483169585018690526c0100000000000000000000000090930490911660609093018390529193909190565b61063761063161062c84611e75565b610b3a565b82610b84565b600061064a61064584611e75565b610cd4565b90506106b96106598480611de5565b808060200260200160405190810160405280939291908181526020016000905b828210156106a55761069660608302860136819003810190611790565b81526020019060010190610679565b505050505082600001518360200151610ea9565b505050565b60015467ffffffffffffffff808216916801000000000000000081048216917001000000000000000000000000000000009091041683565b6106fe6114cb565b6000610708610907565b905067ffffffffffffffff811615610825578067ffffffffffffffff1667ffffffffffffffff8111801561073b57600080fd5b5060405190808252806020026020018201604052801561077557816020015b6107626114e3565b81526020019060019003908161075a5790505b5060208301526001805467ffffffffffffffff160160005b8267ffffffffffffffff168167ffffffffffffffff161015610822576000828201905060405180604001604052806107c483610838565b8152602001600260008467ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205481525085602001518367ffffffffffffffff168151811061080e57fe5b60209081029190910101525060010161078d565b50505b5060015467ffffffffffffffff16815290565b604080516080808201835260005463ffffffff808216845264010000000082048082166020860152680100000000000000008304808316868801526c01000000000000000000000000840492831660609687015267ffffffffffffffff88169390961b6bffffffff000000000000000016941b6fffffffff000000000000000000000000169490921b73ffffffff000000000000000000000000000000001660a09290921b77ffffffff000000000000000000000000000000000000000016919091019290920101015b919050565b60015467ffffffffffffffff80821668010000000000000000909204160390565b805160208201516000917f823237038687bee0f021baf36aa1a00c49bd4d430512b28fed96643d7f4404c69161095d906110ba565b60405160200161096f93929190611a2d565b604051602081830303815290604052805190602001209050919050565b8051602080830151604080850151805190840120905160009461096f947f582ffe1da2ae6da425fa2c8a2c423012be36b65787f7994d78362f66e4f84101949193919201611921565b6040805160608101825260015467ffffffffffffffff80821683526801000000000000000082048116602084015270010000000000000000000000000000000090910416918101919091526000905b8267ffffffffffffffff168267ffffffffffffffff16108015610a635750806000015167ffffffffffffffff16816040015167ffffffffffffffff1611155b15610aa2576040808201805167ffffffffffffffff90811660009081526002602052928320929092558051600190810190921690529190910190610a24565b67ffffffffffffffff821615610b3457604081810151600180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff93841681029190911791829055925192900416907f0ff432861ad053b4d1074d84bf72d0892e4e57e697ea40a9087d1d231dd5859590600090a25b50919050565b80516000907fcf4a39e72acc9d64da0fc507104c55de6ee7e6e1a477d8700014bcb981f8510690610b6a906111ce565b602080850151604080870151905161096f9594930161197f565b6040805160808101825260005463ffffffff8082168084526401000000008304821660208501526801000000000000000083048216848601526c01000000000000000000000000909204166060830181905292517f3f8c931d000000000000000000000000000000000000000000000000000000008152919273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001632822223f75599daed9045fead2e93c6b41cb71692633f8c931d92610c4e92889290919088906004016119bd565b60206040518083038186803b158015610c6657600080fd5b505afa158015610c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9e91906116a2565b6106b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611bdd565b610cdc6114e3565b600080610ce8846112da565b6040805160608101825260015467ffffffffffffffff80821680845268010000000000000000830482166020850152700100000000000000000000000000000000909204811693830193909352939550919350909190831611610d77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611a6d565b806020015167ffffffffffffffff168267ffffffffffffffff161115610dc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611cdf565b805167ffffffffffffffff808516918403161115610e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611adb565b610e218286600001516112eb565b8051600180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff858116918217835560408051808201825293850190911680845260208401839052905192975090917fb11cf15eb96c6c0e544143cec0aa5944efc0e5d311263e73ccfe0f80231e0ac890600090a350505050919050565b6000835167ffffffffffffffff81118015610ec357600080fd5b50604051908082528060200260200182016040528015610efd57816020015b610eea6114fa565b815260200190600190039081610ee25790505b50905060005b8451811015610fb7576000858281518110610f1a57fe5b602002602001015190506000610f388260200151600001518761143e565b90506000610f4e8360200151602001518761146b565b90506040518060600160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001610f8484610838565b8152602001610f9283610838565b815250858581518110610fa157fe5b6020908102919091010152505050600101610f03565b506040517fcf65f7cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a169063cf65f7cc9061102c908490339060040161188a565b602060405180830381600087803b15801561104657600080fd5b505af115801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e91906116a2565b6110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611ba6565b50505050565b600080825190506000816040516020016110d49190611918565b604051602081830303815290604052905060005b828110156111be5760008582815181106110fe57fe5b60200260200101519050827ffc686c8227203ee2031e2c031380f840b8cea19f967c05fc398fdeb004e7bf8b60001b82600001518360200151604051602001611149939291906119a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261118592916020016117c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016110e8565b5080516020909101209392505050565b600080825190506000816040516020016111e89190611918565b604051602081830303815290604052905060005b828110156111be57600085828151811061121257fe5b60200260200101519050827f6d8ba9a028be62615788b0b9200c2e575678c124d2db04ca91582405eba190a160001b8260000151611253846020015161148f565b60405160200161126593929190611953565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526112a192916020016117c5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529250506001016111fc565b602081015160409091015190810391565b6000805b82518167ffffffffffffffff1610156110b4576000838267ffffffffffffffff168151811061131a57fe5b6020026020010151905080602001516000015167ffffffffffffffff1681602001516020015167ffffffffffffffff161015611382576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611c14565b67ffffffffffffffff8316156113e457602081015151600184019067ffffffffffffffff8083169116146113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611c4b565b505b6020808201510151925067ffffffffffffffff8086169084161115611435576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f790611cdf565b506001016112ef565b60008167ffffffffffffffff168367ffffffffffffffff1610156114625781611464565b825b9392505050565b60008167ffffffffffffffff168367ffffffffffffffff1611156114625781611464565b805160208083015160405160009361096f937f1984c1907b379883ef1736e0351d28f5b4b82026a854e28971d89eb48f32fbe293919201611a4d565b60408051808201909152600081526060602082015290565b604080518082019091526000808252602082015290565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b803573ffffffffffffffffffffffffffffffffffffffff8116811461090257600080fd5b60008183036060811215611567578182fd5b6040805181810167ffffffffffffffff828210818311171561158557fe5b81845282955061159487611531565b8352837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0860112156115c557600080fd5b83519450838501915084821081831117156115dc57fe5b5082526115eb6020860161160c565b83526115f882860161160c565b602084015282602082015250505092915050565b803567ffffffffffffffff8116811461090257600080fd5b600080600060408486031215611638578283fd5b61164184611531565b9250602084013567ffffffffffffffff8082111561165d578384fd5b818601915086601f830112611670578384fd5b81358181111561167e578485fd5b87602082850101111561168f578485fd5b6020830194508093505050509250925092565b6000602082840312156116b3578081fd5b81518015158114611464578182fd5b600080604083850312156116d4578182fd5b823567ffffffffffffffff808211156116eb578384fd5b90840190606082870312156116fe578384fd5b9092506020908482013581811115611714578384fd5b8501601f81018713611724578384fd5b80358281111561173057fe5b611760847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611e51565b92508083528784828401011115611775578485fd5b80848301858501378201909201929092525090939092509050565b6000606082840312156117a1578081fd5b6114648383611555565b6000602082840312156117bc578081fd5b6114648261160c565b600083516117d7818460208801611f5a565b8351908301906117eb818360208801611f5a565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506060604083015282606083015282846080840137818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b6040808252835182820181905260009190606090818501906020808901865b838110156118ec578151805173ffffffffffffffffffffffffffffffffffffffff16865283810151848701528701518786015293850193908201906001016118a9565b505082955073ffffffffffffffffffffffffffffffffffffffff88168188015250505050509392505050565b90815260200190565b93845273ffffffffffffffffffffffffffffffffffffffff928316602085015291166040830152606082015260800190565b92835273ffffffffffffffffffffffffffffffffffffffff919091166020830152604082015260600190565b938452602084019290925267ffffffffffffffff908116604084015216606082015260800190565b9283526020830191909152604082015260600190565b600085825263ffffffff80861660208401528085166040840152506080606083015282518060808401526119f88160a0850160208701611f5a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b92835267ffffffffffffffff919091166020830152604082015260600190565b92835267ffffffffffffffff918216602084015216604082015260600190565b60208082526012908201527f4e6f4e6577436f6e6669726d6174696f6e730000000000000000000000000000604082015260600190565b60208082526008908201527f4f766572666c6f77000000000000000000000000000000000000000000000000604082015260600190565b60208082526027908201527f547279696e67546f436f6e6669726d4d6f72654d657373616765735468616e4560408201527f7870656374656400000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f546f6f4c6172676543616c6c6461746100000000000000000000000000000000604082015260600190565b60208082526016908201527f546f6f4d616e7950656e64696e674d6573736167657300000000000000000000604082015260600190565b6020808252600c908201527f536574746c654661696c65640000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f2170726f6f660000000000000000000000000000000000000000000000000000604082015260600190565b6020808252601b908201527f456d707479556e726577617264656452656c61796572456e7472790000000000604082015260600190565b60208082526026908201527f4e6f6e436f6e7365637574697665556e726577617264656452656c617965724560408201527f6e74726965730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f41737369676e52656c61796572734661696c6564000000000000000000000000604082015260600190565b6020808252601d908201527f4661696c6564546f436f6e6669726d4675747572654d65737361676573000000604082015260600190565b6020808252825167ffffffffffffffff168282015282810151604080840181905281516060850181905260009392830191849160808701905b80841015611d785784518051835286015186830152938501936001939093019290820190611d4f565b50979650505050505050565b63ffffffff948516815292841660208401529083166040830152909116606082015260800190565b67ffffffffffffffff91909116815260200190565b67ffffffffffffffff93841681529183166020830152909116604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e19578283fd5b83018035915067ffffffffffffffff821115611e33578283fd5b6020019150606081023603821315611e4a57600080fd5b9250929050565b60405181810167ffffffffffffffff81118282101715611e6d57fe5b604052919050565b60006060808336031215611e87578182fd5b60405181810167ffffffffffffffff8282108183111715611ea457fe5b816040528535915080821115611eb8578485fd5b9085019036601f830112611eca578485fd5b8135602082821115611ed857fe5b611ee58182840201611e51565b828152818101935084820136888502870184011115611f02578889fd5b8895505b83861015611f2c57611f183682611555565b855260019590950194938201938701611f06565b508552611f3a88820161160c565b8186015250505050611f4e6040850161160c565b60408201529392505050565b60005b83811015611f75578181015183820152602001611f5d565b838111156110b4575050600091015256fea2646970667358221220dfc7a7a05ecfae90cff88b9bd91d20260773295958a9eab9ade56c5065ace86f64736f6c63430007060033

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

0000000000000000000000001632822223f75599daed9045fead2e93c6b41cb7000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _lightClientBridge (address): 0x1632822223F75599daED9045FeaD2e93C6B41Cb7
Arg [1] : _feeMarket (address): 0xCD97185B7d05f8ea91d241C8dfD51a2Cc9c0547a
Arg [2] : _thisChainPosition (uint32): 1
Arg [3] : _thisLanePosition (uint32): 0
Arg [4] : _bridgedChainPosition (uint32): 0
Arg [5] : _bridgedLanePosition (uint32): 1
Arg [6] : _oldest_unpruned_nonce (uint64): 1
Arg [7] : _latest_received_nonce (uint64): 0
Arg [8] : _latest_generated_nonce (uint64): 0

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000001632822223f75599daed9045fead2e93c6b41cb7
Arg [1] : 000000000000000000000000cd97185b7d05f8ea91d241c8dfd51a2cc9c0547a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

22213:11601:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22427:42;;;;;;;;;;-1:-1:-1;22427:42:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5884:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27144:92::-;;;;;;;;;;;;;:::i;22478:35::-;;;;;;;;;;;;;:::i;25290:1250::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7413:298::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;26609:482::-;;;;;;;;;;-1:-1:-1;26609:482:0;;;;;:::i;:::-;;:::i;:::-;;22323:42;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;27459:607::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8200:386::-;;;;;;;;;;-1:-1:-1;8200:386:0;;;;;:::i;:::-;;:::i;27244:166::-;;;;;;;;;;;;;:::i;22427:42::-;;;;;;;;;;;;;:::o;5884:35::-;;;:::o;27144:92::-;27189:7;27216:12;27221:6;:4;:6::i;:::-;27216:4;:12::i;:::-;27209:19;;27144:92;:::o;22478:35::-;;;:::o;25290:1250::-;25457:17;:39;25387:6;;22639:2;25414:105;25457:39;;;25414:40;;;;;;:82;;;;:105;;;;25406:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25565:17;:40;25608:16;25565:40;;;;;;:59;25557:80;;;;;;;;;;;;:::i;:::-;22575:4;25656:37;;;25648:66;;;;;;;;;;;;:::i;:::-;25742:17;:40;;;;;;;:44;25727:12;25865:23;25742:44;25865:16;:23::i;:::-;25846:42;;25918:10;25907:29;;;25944:9;25955:11;25907:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25899:93;;;;;;;;;;;;:::i;:::-;26005:17;:48;;;;;;;;;;;;26096:120;;;;;;;;26134:10;26096:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26096:120:0;;;26197:7;;26096:120;;;;;;26197:7;26096:120;;26197:7;26096:120;;;;;;;;;-1:-1:-1;;;26096:120:0;;-1:-1:-1;26064:152:0;-1:-1:-1;26245:13:0;26064:152;26245:4;:13::i;:::-;26227:15;;;;;;;:8;:15;;;;;:31;26347:42;22701:1;26347:15;:42::i;:::-;;26435:5;26405:104;;;26455:10;26480:6;26501:7;;26405:104;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;26527:5:0;;25290:1250;-1:-1:-1;;;;;25290:1250:0:o;7413:298::-;7499:27;;;;;;;;-1:-1:-1;7499:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7413:298::o;26609:482::-;26765:69;26797:21;;26802:15;26797:21;:::i;:::-;:4;:21::i;:::-;26820:13;26765:31;:69::i;:::-;26845:43;26891:34;;26909:15;26891:34;:::i;:::-;:17;:34::i;:::-;26845:80;-1:-1:-1;26992:91:0;27008:24;:15;;:24;:::i;:::-;26992:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;27034:18;:24;;;27060:18;:22;;;26992:15;:91::i;:::-;26609:482;;;:::o;22323:42::-;;;;;;;;;;;;;;;;;;;;:::o;27459:607::-;27496:40;;:::i;:::-;27549:11;27563:14;:12;:14::i;:::-;27549:28;-1:-1:-1;27592:8:0;;;;27588:387;;27659:4;27638:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;27617:18:0;;;:47;27694:17;:39;;;;:43;27679:12;27752:212;27783:4;27775:12;;:5;:12;;;27752:212;;;27817:12;27840:5;27832;:13;27817:28;;27892:56;;;;;;;;27907:23;27924:5;27907:16;:23::i;:::-;27892:56;;;;27932:8;:15;27941:5;27932:15;;;;;;;;;;;;;;;;27892:56;;;27864:9;:18;;;27883:5;27864:25;;;;;;;;;;;;;;;;;;;:84;-1:-1:-1;27789:7:0;;27752:212;;;;27588:387;;-1:-1:-1;28019:17:0;:39;;;27985:73;;:9;27459:607::o;8200:386::-;8281:27;;;;;;;;;-1:-1:-1;8281:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8564:14;;;8505:38;;;;;;8444:39;;;;8386:36;;;;;;8361:3;8327:37;;;;;;8326:97;;;;:158;;;;:218;:252;8200:386;;;;:::o;27244:166::-;27363:17;:39;;;;;27320:40;;;;;:82;;27244:166::o;12551:328::-;12781:26;;12831:13;;;;12652:7;;11451:66;;12826:19;;:4;:19::i;:::-;12708:152;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12684:187;;;;;;12677:194;;12551:328;;;:::o;14130:348::-;14352:14;;14385;;;;;14428:15;;;;;14418:26;;;;;;14281:178;;14225:7;;14281:178;;12147:66;;14352:14;;14385;;14281:178;;:::i;32085:698::-;32192:50;;;;;;;;32225:17;32192:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;32157:22;;32253:285;32278:21;32260:39;;:15;:39;;;:114;;;;;32347:5;:27;;;32316:58;;:5;:27;;;:58;;;;32260:114;32253:285;;;32416:27;;;;;;32407:37;;;;;;;;:8;:37;;;;;32400:44;;;;32494:32;;32478:1;32494:32;;;;;;;;32459:20;;;;;32253:285;;;32552:19;;;;32548:195;;32630:27;;;;;32588:17;:69;;;;;;;;;;;;;;;;;;;32677:54;;32691:39;;;;;32677:54;;-1:-1:-1;;32677:54:0;32548:195;32753:22;32085:698;;;:::o;19030:406::-;19267:24;;19134:7;;18273:66;;19262:30;;:4;:30::i;:::-;19311:36;;;;;19366;;;;;19190:227;;;;;;;;:::i;6968:437::-;7113:27;;;;;;;;:19;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7173:203;;;;;7113:27;;7173:39;:8;:39;;;;:203;;7231:16;;7113:27;;;7348:13;;7113:27;7173:203;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7151:246;;;;;;;;;;;;:::i;28488:1504::-;28598:43;;:::i;:::-;28661:21;28684:29;28717:43;28744:15;28717:26;:43::i;:::-;28773:50;;;;;;;;28806:17;28773:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28660:100;;-1:-1:-1;28660:100:0;;-1:-1:-1;28773:50:0;;28842:52;;;;28834:83;;;;;;;;;;;;:::i;:::-;28962:5;:28;;;28936:54;;:22;:54;;;;28928:96;;;;;;;;;;;;:::i;:::-;29388:27;;29363:70;;;;:52;;;:70;;;29355:122;;;;;;;;;;;;:::i;:::-;29488:65;29504:22;29528:15;:24;;;29488:15;:65::i;:::-;29600:27;;29638:17;:64;;;;;;;;;;;;;29734:124;;;;;;;;29774:30;;;29734:124;;;;;;;;;;;;29917:67;;29734:124;;-1:-1:-1;29638:64:0;;29917:67;;-1:-1:-1;;29917:67:0;28488:1504;;;;;;;:::o;32791:771::-;32950:54;33041:8;:15;33007:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;32950:107;;33073:9;33068:391;33092:8;:15;33088:1;:19;33068:391;;;33129:26;33158:8;33167:1;33158:11;;;;;;;;;;;;;;33129:40;;33184:18;33205:38;33210:1;:10;;;:16;;;33228:14;33205:4;:38::i;:::-;33184:59;;33258:16;33277:34;33282:1;:10;;;:14;;;33298:12;33277:4;:34::i;:::-;33258:53;;33349:98;;;;;;;;33377:1;:9;;;33349:98;;;;;;33388:29;33405:11;33388:16;:29::i;:::-;33349:98;;;;33419:27;33436:9;33419:16;:27::i;:::-;33349:98;;;33326:17;33344:1;33326:20;;;;;;;;;;;;;;;;;:121;-1:-1:-1;;;33109:3:0;;33068:391;;;-1:-1:-1;33477:60:0;;;;;:29;33488:10;33477:29;;;;:60;;33507:17;;33526:10;;33477:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33469:85;;;;;;;;;;;;:::i;:::-;32791:771;;;;:::o;12887:620::-;12981:7;13006:15;13024:4;:11;13006:29;;13046:20;13080:10;13069:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;13046:45;;13107:9;13102:362;13126:10;13122:1;:14;13102:362;;;13159:29;13191:4;13196:1;13191:7;;;;;;;;;;;;;;13159:39;;13258:7;11827:66;13317:16;;13356:7;:19;;;13398:7;:20;;;13284:153;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;13223:229;;;13284:153;13223:229;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;13138:4:0;;13102:362;;;-1:-1:-1;13481:18:0;;;;;;;;12887:620;-1:-1:-1;;;12887:620:0:o;19444:639::-;19545:7;19570:19;19592:8;:15;19570:37;;19618:20;19652:14;19641:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;19618:49;;19683:9;19678:362;19702:14;19698:1;:18;19678:362;;;19738:26;19767:8;19776:1;19767:11;;;;;;;;;;;;;;19738:40;;19838:7;18653:66;19897:26;;19946:1;:9;;;19978:16;19983:1;:10;;;19978:4;:16::i;:::-;19864:149;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;19803:225;;;19864:149;19803:225;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;19718:3:0;;19678:362;;28074:370;28342:30;;;;28309;;;;;:63;;;;28074:370::o;30216:1734::-;30630:21;30671:8;30666:1277;30689:8;:15;30685:1;:19;;;30666:1277;;;30726:30;30759:8;30768:1;30759:11;;;;;;;;;;;;;;;;30726:44;;30966:5;:14;;;:20;;;30944:42;;:5;:14;;;:18;;;:42;;;;30936:82;;;;;;;;;;;;:::i;:::-;31037:18;;;;31033:391;;31321:14;;;;:20;31123:1;31106:18;;;31321:44;;;;;;;31313:95;;;;;;;;;;;;:::i;:::-;31033:391;;31455:14;;;;;:18;;;-1:-1:-1;31854:43:0;;;;;;;;;31846:85;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30706:3:0;;30666:1277;;33705:106;33761:8;33794:1;33789:6;;:1;:6;;;;:14;;33802:1;33789:14;;;33798:1;33789:14;33782:21;33705:106;-1:-1:-1;;;33705:106:0:o;33591:::-;33647:8;33680:1;33675:6;;:1;:6;;;;:14;;33688:1;33675:14;;20091:308;20320:14;;20353:12;;;;;20246:134;;20190:7;;20246:134;;18955:66;;20320:14;;20246:134;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:198:1:-;84:20;;144:42;133:54;;123:65;;113:2;;202:1;199;192:12;217:976;;323:9;318:3;314:19;353:4;349:2;345:13;342:2;;;375:5;368;361:20;342:2;402:4;435:2;429:9;477:2;469:6;465:15;499:18;567:6;555:10;552:22;547:2;535:10;532:18;529:46;526:2;;;578:9;526:2;609:10;605:2;598:22;638:6;629:15;;668:31;689:9;668:31;:::i;:::-;660:6;653:47;793:2;724:66;720:2;716:75;712:84;709:2;;;809:1;806;799:12;709:2;844;838:9;822:25;;890:2;880:8;876:17;856:37;;947:8;933:12;930:26;925:2;911:12;908:20;905:52;902:2;;;960:9;902:2;-1:-1:-1;980:24:1;;1030:39;1065:2;1050:18;;1030:39;:::i;:::-;1020:8;1013:57;1105:39;1140:2;1129:9;1125:18;1105:39;:::i;:::-;1100:2;1090:8;1086:17;1079:66;1178:8;1173:2;1165:6;1161:15;1154:33;;;;294:899;;;;:::o;1198:173::-;1267:20;;1327:18;1316:30;;1306:41;;1296:2;;1361:1;1358;1351:12;1376:717;;;;1524:2;1512:9;1503:7;1499:23;1495:32;1492:2;;;1545:6;1537;1530:22;1492:2;1573:31;1594:9;1573:31;:::i;:::-;1563:41;;1655:2;1644:9;1640:18;1627:32;1678:18;1719:2;1711:6;1708:14;1705:2;;;1740:6;1732;1725:22;1705:2;1783:6;1772:9;1768:22;1758:32;;1828:7;1821:4;1817:2;1813:13;1809:27;1799:2;;1855:6;1847;1840:22;1799:2;1900;1887:16;1926:2;1918:6;1915:14;1912:2;;;1947:6;1939;1932:22;1912:2;1997:7;1992:2;1983:6;1979:2;1975:15;1971:24;1968:37;1965:2;;;2023:6;2015;2008:22;1965:2;2059;2055;2051:11;2041:21;;2081:6;2071:16;;;;;1482:611;;;;;:::o;2098:297::-;;2218:2;2206:9;2197:7;2193:23;2189:32;2186:2;;;2239:6;2231;2224:22;2186:2;2276:9;2270:16;2329:5;2322:13;2315:21;2308:5;2305:32;2295:2;;2356:6;2348;2341:22;2400:1148;;;2572:2;2560:9;2551:7;2547:23;2543:32;2540:2;;;2593:6;2585;2578:22;2540:2;2638:9;2625:23;2667:18;2708:2;2700:6;2697:14;2694:2;;;2729:6;2721;2714:22;2694:2;2757:22;;;;2813:2;2795:16;;;2791:25;2788:2;;;2834:6;2826;2819:22;2788:2;2862;;-1:-1:-1;2883:2:1;;2923:18;;;2910:32;2954:16;;;2951:2;;;2988:6;2980;2973:22;2951:2;3016:24;;3071:4;3063:13;;3059:27;-1:-1:-1;3049:2:1;;3105:6;3097;3090:22;3049:2;3146;3133:16;3168:2;3164;3161:10;3158:2;;;3174:9;3158:2;3207:111;3314:2;3245:66;3238:4;3234:2;3230:13;3226:86;3222:95;3207:111;:::i;:::-;3194:124;;3341:2;3334:5;3327:17;3381:7;3376:2;3371;3367;3363:11;3359:20;3356:33;3353:2;;;3407:6;3399;3392:22;3353:2;3467;3462;3458;3454:11;3449:2;3442:5;3438:14;3425:45;3490:14;;3486:23;;;3479:39;;;;-1:-1:-1;2530:1018:1;;3494:5;;-1:-1:-1;2530:1018:1;-1:-1:-1;2530:1018:1:o;3553:259::-;;3699:2;3687:9;3678:7;3674:23;3670:32;3667:2;;;3720:6;3712;3705:22;3667:2;3748:58;3798:7;3787:9;3748:58;:::i;3817:196::-;;3928:2;3916:9;3907:7;3903:23;3899:32;3896:2;;;3949:6;3941;3934:22;3896:2;3977:30;3997:9;3977:30;:::i;4018:466::-;;4231:6;4225:13;4247:53;4293:6;4288:3;4281:4;4273:6;4269:17;4247:53;:::i;:::-;4363:13;;4322:16;;;;4385:57;4363:13;4322:16;4419:4;4407:17;;4385:57;:::i;:::-;4458:20;;4201:283;-1:-1:-1;;;;4201:283:1:o;4489:226::-;4665:42;4653:55;;;;4635:74;;4623:2;4608:18;;4590:125::o;4720:682::-;;4933:42;5014:2;5006:6;5002:15;4991:9;4984:34;5066:2;5058:6;5054:15;5049:2;5038:9;5034:18;5027:43;;5106:2;5101;5090:9;5086:18;5079:30;5145:6;5140:2;5129:9;5125:18;5118:34;5203:6;5195;5189:3;5178:9;5174:19;5161:49;5230:22;;;5254:3;5226:32;;;5219:46;;;;5317:2;5305:15;;;5322:66;5301:88;5286:104;5282:114;;4913:489;-1:-1:-1;;;4913:489:1:o;5407:1058::-;5678:2;5730:21;;;5800:13;;5703:18;;;5822:22;;;5407:1058;;5678:2;5863;;5881:18;;;;5918:4;5945:15;;;5407:1058;5991:356;6005:6;6002:1;5999:13;5991:356;;;6064:13;;6106:9;;6117:42;6102:58;6090:71;;6201:11;;;6195:18;6181:12;;;6174:40;6254:11;;6248:18;6234:12;;;6227:40;6287:12;;;;6322:15;;;;6027:1;6020:9;5991:356;;;5995:3;;6364;6356:11;;6415:42;6407:6;6403:55;6398:2;6387:9;6383:18;6376:83;;;;;;5658:807;;;;;:::o;6470:177::-;6616:25;;;6604:2;6589:18;;6571:76::o;6652:470::-;6883:25;;;6927:42;7005:15;;;7000:2;6985:18;;6978:43;7057:15;;7052:2;7037:18;;7030:43;7104:2;7089:18;;7082:34;6870:3;6855:19;;6837:285::o;7127:368::-;7329:25;;;7402:42;7390:55;;;;7385:2;7370:18;;7363:83;7477:2;7462:18;;7455:34;7317:2;7302:18;;7284:211::o;7500:442::-;7727:25;;;7783:2;7768:18;;7761:34;;;;7814:18;7868:15;;;7863:2;7848:18;;7841:43;7920:15;7915:2;7900:18;;7893:43;7714:3;7699:19;;7681:261::o;7947:319::-;8149:25;;;8205:2;8190:18;;8183:34;;;;8248:2;8233:18;;8226:34;8137:2;8122:18;;8104:162::o;8271:700::-;;8498:6;8487:9;8480:25;8524:10;8582:2;8574:6;8570:15;8565:2;8554:9;8550:18;8543:43;8634:2;8626:6;8622:15;8617:2;8606:9;8602:18;8595:43;;8674:3;8669:2;8658:9;8654:18;8647:31;8707:6;8701:13;8751:6;8745:3;8734:9;8730:19;8723:35;8767:67;8827:6;8821:3;8810:9;8806:19;8801:2;8793:6;8789:15;8767:67;:::i;:::-;8886:2;8874:15;8891:66;8870:88;8855:104;;;;8961:3;8851:114;;8470:501;-1:-1:-1;;;;;8470:501:1:o;8976:342::-;9176:25;;;9249:18;9237:31;;;;9232:2;9217:18;;9210:59;9300:2;9285:18;;9278:34;9164:2;9149:18;;9131:187::o;9323:370::-;9521:25;;;9565:18;9619:15;;;9614:2;9599:18;;9592:43;9671:15;9666:2;9651:18;;9644:43;9509:2;9494:18;;9476:217::o;9945:342::-;10147:2;10129:21;;;10186:2;10166:18;;;10159:30;10225:20;10220:2;10205:18;;10198:48;10278:2;10263:18;;10119:168::o;10292:331::-;10494:2;10476:21;;;10533:1;10513:18;;;10506:29;10571:10;10566:2;10551:18;;10544:38;10614:2;10599:18;;10466:157::o;10628:403::-;10830:2;10812:21;;;10869:2;10849:18;;;10842:30;10908:34;10903:2;10888:18;;10881:62;10979:9;10974:2;10959:18;;10952:37;11021:3;11006:19;;10802:229::o;11036:340::-;11238:2;11220:21;;;11277:2;11257:18;;;11250:30;11316:18;11311:2;11296:18;;11289:46;11367:2;11352:18;;11210:166::o;11381:346::-;11583:2;11565:21;;;11622:2;11602:18;;;11595:30;11661:24;11656:2;11641:18;;11634:52;11718:2;11703:18;;11555:172::o;11732:336::-;11934:2;11916:21;;;11973:2;11953:18;;;11946:30;12012:14;12007:2;11992:18;;11985:42;12059:2;12044:18;;11906:162::o;12073:329::-;12275:2;12257:21;;;12314:1;12294:18;;;12287:29;12352:8;12347:2;12332:18;;12325:36;12393:2;12378:18;;12247:155::o;12407:351::-;12609:2;12591:21;;;12648:2;12628:18;;;12621:30;12687:29;12682:2;12667:18;;12660:57;12749:2;12734:18;;12581:177::o;12763:402::-;12965:2;12947:21;;;13004:2;12984:18;;;12977:30;13043:34;13038:2;13023:18;;13016:62;13114:8;13109:2;13094:18;;13087:36;13155:3;13140:19;;12937:228::o;13170:344::-;13372:2;13354:21;;;13411:2;13391:18;;;13384:30;13450:22;13445:2;13430:18;;13423:50;13505:2;13490:18;;13344:170::o;13519:353::-;13721:2;13703:21;;;13760:2;13740:18;;;13733:30;13799:31;13794:2;13779:18;;13772:59;13863:2;13848:18;;13693:179::o;13877:951::-;14078:2;14089:21;;;14191:13;;14206:18;14187:38;14167:18;;;14160:66;14261:15;;;14255:22;14296:4;14316:18;;;14309:30;;;14388:19;;14148:2;14133:18;;14416:22;;;13877:951;;14078:2;14496:21;;;13877:951;;14469:3;14454:19;;;14548:254;14562:6;14559:1;14556:13;14548:254;;;14621:13;;14659:9;;14647:22;;14709:11;;14703:18;14689:12;;;14682:40;14777:15;;;;14584:1;14577:9;;;;;14742:12;;;;14548:254;;;-1:-1:-1;14819:3:1;14058:770;-1:-1:-1;;;;;;;14058:770:1:o;15015:448::-;15248:10;15285:15;;;15267:34;;15337:15;;;15332:2;15317:18;;15310:43;15389:15;;;15384:2;15369:18;;15362:43;15441:15;;;15436:2;15421:18;;15414:43;15225:3;15210:19;;15192:271::o;15468:200::-;15642:18;15630:31;;;;15612:50;;15600:2;15585:18;;15567:101::o;15673:377::-;15879:18;15924:15;;;15906:34;;15976:15;;;15971:2;15956:18;;15949:43;16028:15;;;16023:2;16008:18;;16001:43;15857:2;15842:18;;15824:226::o;16055:655::-;;;16250:11;16237:25;16340:66;16329:8;16313:14;16309:29;16305:102;16285:18;16281:127;16271:2;;16425:4;16419;16412:18;16271:2;16455:33;;16507:20;;;-1:-1:-1;16550:18:1;16539:30;;16536:2;;;16585:4;16579;16572:18;16536:2;16621:4;16609:17;;-1:-1:-1;16680:4:1;16668:17;;16652:14;16648:38;16638:49;;16635:2;;;16700:1;16697;16690:12;16635:2;16201:509;;;;;:::o;16715:242::-;16785:2;16779:9;16815:17;;;16862:18;16847:34;;16883:22;;;16844:62;16841:2;;;16909:9;16841:2;16936;16929:22;16759:198;;-1:-1:-1;16759:198:1:o;16962:1468::-;;17112:4;17160:2;17152:5;17136:14;17132:26;17128:35;17125:2;;;17184:9;17173;17166:28;17125:2;17225;17219:9;17267:2;17259:6;17255:15;17289:18;17357:6;17345:10;17342:22;17337:2;17325:10;17322:18;17319:46;17316:2;;;17368:9;17316:2;17399:10;17395:2;17388:22;17446:5;17433:19;17419:33;;17475:2;17467:6;17464:14;17461:2;;;17499:9;17488;17481:28;17461:2;17530:18;;;;17586:14;17579:4;17571:13;;17567:34;17557:2;;17623:9;17612;17605:28;17557:2;17667;17654:16;17689:4;17712:2;17708;17705:10;17702:2;;;17718:9;17702:2;17749:36;17781:2;17776;17772;17768:11;17764:20;17749:36;:::i;:::-;17819:15;;;17850:12;;;;-1:-1:-1;17882:11:1;;;17939:14;17920:11;;;17912:20;;17908:29;;17905:49;17902:2;;;17975:9;17964;17957:28;17902:2;18005:9;17996:18;;18023:205;18037:2;18034:1;18031:9;18023:205;;;18094:59;18138:14;18133:3;18094:59;:::i;:::-;18082:72;;18055:1;18048:9;;;;;18174:12;;;;18206;;18023:205;;;-1:-1:-1;18237:21:1;;18291:35;18311:14;;;18291:35;:::i;:::-;18286:2;18278:6;18274:15;18267:60;;;;;18360:35;18391:2;18384:5;18380:14;18360:35;:::i;:::-;18355:2;18343:15;;18336:60;18347:6;17092:1338;-1:-1:-1;;;17092:1338:1:o;18435:258::-;18507:1;18517:113;18531:6;18528:1;18525:13;18517:113;;;18607:11;;;18601:18;18588:11;;;18581:39;18553:2;18546:10;18517:113;;;18648:6;18645:1;18642:13;18639:2;;;-1:-1:-1;;18683:1:1;18665:16;;18658:27;18488:205::o

Swarm Source

ipfs://dfc7a7a05ecfae90cff88b9bd91d20260773295958a9eab9ade56c5065ace86f

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.