Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 75 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Receive_messages... | 17092978 | 1053 days ago | IN | 0 ETH | 0.0028813 | ||||
| Receive_messages... | 17065836 | 1057 days ago | IN | 0 ETH | 0.00242645 | ||||
| Receive_messages... | 17008423 | 1065 days ago | IN | 0 ETH | 0.00156413 | ||||
| Receive_messages... | 17005962 | 1065 days ago | IN | 0 ETH | 0.00189342 | ||||
| Receive_messages... | 17005259 | 1065 days ago | IN | 0 ETH | 0.00195128 | ||||
| Receive_messages... | 17004492 | 1066 days ago | IN | 0 ETH | 0.00246969 | ||||
| Receive_messages... | 16993068 | 1067 days ago | IN | 0 ETH | 0.00164622 | ||||
| Receive_messages... | 16894358 | 1081 days ago | IN | 0 ETH | 0.00108772 | ||||
| Receive_messages... | 16874617 | 1084 days ago | IN | 0 ETH | 0.00057675 | ||||
| Receive_messages... | 16874616 | 1084 days ago | IN | 0 ETH | 0.00100442 | ||||
| Receive_messages... | 16817443 | 1092 days ago | IN | 0 ETH | 0.00172878 | ||||
| Receive_messages... | 16811053 | 1093 days ago | IN | 0 ETH | 0.0018111 | ||||
| Receive_messages... | 16749291 | 1101 days ago | IN | 0 ETH | 0.00255201 | ||||
| Receive_messages... | 16745870 | 1102 days ago | IN | 0 ETH | 0.00164646 | ||||
| Receive_messages... | 16666290 | 1113 days ago | IN | 0 ETH | 0.00156413 | ||||
| Receive_messages... | 16665665 | 1113 days ago | IN | 0 ETH | 0.00197575 | ||||
| Receive_messages... | 16618479 | 1120 days ago | IN | 0 ETH | 0.00131716 | ||||
| Receive_messages... | 16612482 | 1121 days ago | IN | 0 ETH | 0.00123484 | ||||
| Receive_messages... | 16604347 | 1122 days ago | IN | 0 ETH | 0.00131716 | ||||
| Receive_messages... | 16597765 | 1123 days ago | IN | 0 ETH | 0.00164646 | ||||
| Receive_messages... | 16583502 | 1125 days ago | IN | 0 ETH | 0.00167342 | ||||
| Receive_messages... | 16566272 | 1127 days ago | IN | 0 ETH | 0.00131716 | ||||
| Receive_messages... | 16558911 | 1128 days ago | IN | 0 ETH | 0.00148181 | ||||
| Receive_messages... | 16554952 | 1129 days ago | IN | 0 ETH | 0.00148181 | ||||
| Receive_messages... | 16554724 | 1129 days ago | IN | 0 ETH | 0.0015639 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Assign | 17092743 | 1053 days ago | 0.009 ETH | ||||
| Send_message | 17092743 | 1053 days ago | 0.009 ETH | ||||
| Assign | 17056197 | 1058 days ago | 0.009 ETH | ||||
| Send_message | 17056197 | 1058 days ago | 0.009 ETH | ||||
| Assign | 17008313 | 1065 days ago | 0.009 ETH | ||||
| Send_message | 17008313 | 1065 days ago | 0.009 ETH | ||||
| Assign | 17005853 | 1065 days ago | 0.009 ETH | ||||
| Send_message | 17005853 | 1065 days ago | 0.009 ETH | ||||
| Assign | 17005162 | 1065 days ago | 0.009 ETH | ||||
| Send_message | 17005162 | 1065 days ago | 0.009 ETH | ||||
| Assign | 17005161 | 1065 days ago | 0.009 ETH | ||||
| Send_message | 17005161 | 1065 days ago | 0.009 ETH | ||||
| Assign | 17004336 | 1066 days ago | 0.009 ETH | ||||
| Send_message | 17004336 | 1066 days ago | 0.009 ETH | ||||
| Assign | 16992924 | 1067 days ago | 0.009 ETH | ||||
| Send_message | 16992924 | 1067 days ago | 0.009 ETH | ||||
| Assign | 16891539 | 1081 days ago | 0.009 ETH | ||||
| Send_message | 16891539 | 1081 days ago | 0.009 ETH | ||||
| Assign | 16872926 | 1084 days ago | 0.009 ETH | ||||
| Send_message | 16872926 | 1084 days ago | 0.009 ETH | ||||
| Assign | 16816645 | 1092 days ago | 0.009 ETH | ||||
| Send_message | 16816645 | 1092 days ago | 0.009 ETH | ||||
| Assign | 16810431 | 1093 days ago | 0.009 ETH | ||||
| Send_message | 16810431 | 1093 days ago | 0.009 ETH | ||||
| Assign | 16749167 | 1102 days ago | 0.009 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OutboundLane
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/**
*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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.