Contract 0xe01f3c1cd14f39303d175c31c16f58707b28976b 3

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x51ac34be7ec058ebd1fae5917479562a8368cfa23d27b199571913e48b46c3e10x61012060128219112022-05-24 1:32:00195 days 20 hrs ago0x9f403140bc0574d7d36ea472b82daa1bbd4ef327 IN  Create: MPTValidatorV50 ETH0.008268129041 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1e32062906b15096f8b37538382bfd91504207dcf090c4689b5b3c64a270ae5b233692452022-09-07 12:33:0089 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x1e32062906b15096f8b37538382bfd91504207dcf090c4689b5b3c64a270ae5b233692452022-09-07 12:33:0089 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x1e32062906b15096f8b37538382bfd91504207dcf090c4689b5b3c64a270ae5b233692452022-09-07 12:33:0089 days 9 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x9409c6dea4b58e12e4a6fbf14cea800561bd7760b9bb212bc5588eb67ae60d44233677142022-09-07 12:23:2989 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x9409c6dea4b58e12e4a6fbf14cea800561bd7760b9bb212bc5588eb67ae60d44233677142022-09-07 12:23:2989 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x9409c6dea4b58e12e4a6fbf14cea800561bd7760b9bb212bc5588eb67ae60d44233677142022-09-07 12:23:2989 days 9 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0xa21c6fd8ed94ffb91edfbfcc89b40924fc7df4a954de9db307f70c0fc3ac198f233668932022-09-07 12:18:4689 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0xa21c6fd8ed94ffb91edfbfcc89b40924fc7df4a954de9db307f70c0fc3ac198f233668932022-09-07 12:18:4689 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0xa21c6fd8ed94ffb91edfbfcc89b40924fc7df4a954de9db307f70c0fc3ac198f233668932022-09-07 12:18:4689 days 9 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x722685f7bbdd2804bfca2e772496cbe2f47c48284bad9034ec259d7a6f4c4d45233668072022-09-07 12:18:1789 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x722685f7bbdd2804bfca2e772496cbe2f47c48284bad9034ec259d7a6f4c4d45233668072022-09-07 12:18:1789 days 9 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x722685f7bbdd2804bfca2e772496cbe2f47c48284bad9034ec259d7a6f4c4d45233668072022-09-07 12:18:1789 days 9 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x16d4e4e896952a9e331831b6ffcf73f419440a010082a452bc15f85540c7fc95233653522022-09-07 12:08:2889 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x16d4e4e896952a9e331831b6ffcf73f419440a010082a452bc15f85540c7fc95233653522022-09-07 12:08:2889 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x16d4e4e896952a9e331831b6ffcf73f419440a010082a452bc15f85540c7fc95233653522022-09-07 12:08:2889 days 10 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x9b52e81c15750b594c8c51195e4337f8dca098aa252c1826131e69bc70bd02da233648292022-09-07 12:04:5189 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x9b52e81c15750b594c8c51195e4337f8dca098aa252c1826131e69bc70bd02da233648292022-09-07 12:04:5189 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x9b52e81c15750b594c8c51195e4337f8dca098aa252c1826131e69bc70bd02da233648292022-09-07 12:04:5189 days 10 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x2cea38d61a81bb7aa3cf13c6e1355dc5ea1d87520f89b124182ae5e3ae71eba3233647252022-09-07 12:04:1189 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x2cea38d61a81bb7aa3cf13c6e1355dc5ea1d87520f89b124182ae5e3ae71eba3233647252022-09-07 12:04:1189 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x2cea38d61a81bb7aa3cf13c6e1355dc5ea1d87520f89b124182ae5e3ae71eba3233647252022-09-07 12:04:1189 days 10 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x44721551f555a65bb6bca9d6e958eaac0a58adfa4ba19fc40e7c63216f8ac30a233647002022-09-07 12:03:5989 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x44721551f555a65bb6bca9d6e958eaac0a58adfa4ba19fc40e7c63216f8ac30a233647002022-09-07 12:03:5989 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
0x44721551f555a65bb6bca9d6e958eaac0a58adfa4ba19fc40e7c63216f8ac30a233647002022-09-07 12:03:5989 days 10 hrs ago 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675 0xe01f3c1cd14f39303d175c31c16f58707b28976b0 ETH
0x3261a3c9eff6b46f10043b6bb7bdc665d88b4363f24f77f6f78da8d6f0e653aa233632342022-09-07 11:55:3089 days 10 hrs ago 0xe01f3c1cd14f39303d175c31c16f58707b28976b0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MPTValidatorV5

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion, BSL 1.1 license

Contract Source Code (Solidity Multiple files format)

File 1 of 9: MPTValidatorV5.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.7.6;
pragma abicoder v2;

import "./IValidationLibraryHelper.sol";
import "./LayerZeroPacket.sol";
import "./PacketDecoder.sol";
import "./UltraLightNodeEVMDecoder.sol";

interface IUltraLightNode {
    struct BlockData {
        uint confirmations;
        bytes32 data;
    }

    struct ApplicationConfiguration {
        uint16 inboundProofLibraryVersion;
        uint64 inboundBlockConfirmations;
        address relayer;
        uint16 outboundProofType;
        uint64 outboundBlockConfirmations;
        address oracle;
    }

    function getAppConfig(uint16 _chainId, address userApplicationAddress) external view returns (ApplicationConfiguration memory);
    function getBlockHeaderData(address _oracle, uint16 _remoteChainId, bytes32 _lookupHash) external view returns (BlockData memory blockData);
}

interface IStargate {
    // Stargate objects for abi encoding / decoding
    struct SwapObj {
        uint256 amount;
        uint256 eqFee;
        uint256 eqReward;
        uint256 lpFee;
        uint256 protocolFee;
        uint256 lkbRemove;
    }

    struct CreditObj {
        uint256 credits;
        uint256 idealBalance;
    }
}

contract MPTValidatorV5 is ILayerZeroValidationLibrary, IValidationLibraryHelper {
    using RLPDecode for RLPDecode.RLPItem;
    using RLPDecode for RLPDecode.Iterator;
    using PacketDecoder for bytes;

    uint8 public utilsVersion = 3;
    bytes32 public constant PACKET_SIGNATURE = 0xe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f6;

    address immutable public stargateBridgeAddress;
    address immutable public stgTokenAddress;
    address immutable public relayerAddress;
    uint16 immutable public localChainId;
    IUltraLightNode immutable public uln;

    constructor (address _stargateBridgeAddress, address _stgTokenAddress, uint16 _localChainId, address _ulnAddress, address _relayerAddress) {
        stargateBridgeAddress = _stargateBridgeAddress;
        stgTokenAddress = _stgTokenAddress;
        localChainId = _localChainId;
        uln = IUltraLightNode(_ulnAddress);
        relayerAddress = _relayerAddress;
    }

    function validateProof(bytes32 _receiptsRoot, bytes calldata _transactionProof, uint _remoteAddressSize) external view override returns (LayerZeroPacket.Packet memory) {
        require(_remoteAddressSize > 0, "ProofLib: invalid address size");

        (uint16 remoteChainId, bytes32 blockHash, bytes[] memory proof, uint[] memory receiptSlotIndex, uint logIndex) = abi.decode(_transactionProof, (uint16, bytes32, bytes[], uint[], uint));

        ULNLog memory log = _getVerifiedLog(_receiptsRoot, receiptSlotIndex, logIndex, proof);
        require(log.topicZeroSig == PACKET_SIGNATURE, "ProofLib: packet not recognized"); //data

        LayerZeroPacket.Packet memory packet = log.data.getPacket(remoteChainId, _remoteAddressSize, log.contractAddress);

        _assertMessagePath(packet, blockHash, _receiptsRoot);

        if (packet.dstAddress == stargateBridgeAddress) packet.payload = _secureStgPayload(packet.payload);

        if (packet.dstAddress == stgTokenAddress) packet.payload = _secureStgTokenPayload(packet.payload);

        return packet;
    }

    function _assertMessagePath(LayerZeroPacket.Packet memory packet, bytes32 blockHash, bytes32 receiptsRoot) internal view {
        require(packet.dstChainId == localChainId, "ProofLib: invalid destination chain ID");

        IUltraLightNode.ApplicationConfiguration memory appConfig = uln.getAppConfig(packet.srcChainId, packet.dstAddress);
        IUltraLightNode.BlockData memory blockData = uln.getBlockHeaderData(appConfig.oracle, packet.srcChainId, blockHash);
        require(appConfig.relayer == relayerAddress, "ProofLib: invalid relayer");

        require(blockData.data == receiptsRoot, "ProofLib: invalid receipt root");

        require(blockData.confirmations >= appConfig.inboundBlockConfirmations, "ProofLib: not enough block confirmations");
    }

    function _secureStgTokenPayload(bytes memory _payload) internal pure returns (bytes memory) {
        (bytes memory toAddressBytes, uint256 qty) = abi.decode(_payload, (bytes, uint256));

        address toAddress = address(0);
        if (toAddressBytes.length > 0) {
            assembly { toAddress := mload(add(toAddressBytes, 20))}
        }

        if (toAddress == address(0)) {
            address deadAddress = address(0x000000000000000000000000000000000000dEaD);
            bytes memory newToAddressBytes = abi.encodePacked(deadAddress);
            return abi.encode(newToAddressBytes, qty);
        }

        // default to return the original payload
        return _payload;
    }

    function _secureStgPayload(bytes memory _payload) internal view returns (bytes memory) {
        // functionType is uint8 even though the encoding will take up the side of uint256
        uint8 functionType;
        assembly { functionType := mload(add(_payload, 32)) }

        // TYPE_SWAP_REMOTE == 1 && only if the payload has a payload
        // only swapRemote inside of stargate can call sgReceive on an user supplied to address
        // thus we do not care about the other type functions even if the toAddress is overly long.
        if (functionType == 1) {
            // decode the _payload with its types
            (
                ,
                uint256 srcPoolId,
                uint256 dstPoolId,
                uint256 dstGasForCall,
                IStargate.CreditObj memory c,
                IStargate.SwapObj memory s,
                bytes memory toAddressBytes,
                bytes memory contractCallPayload
            ) = abi.decode(_payload, (uint8, uint256, uint256, uint256, IStargate.CreditObj, IStargate.SwapObj, bytes, bytes));

            // if contractCallPayload.length > 0 need to check if the to address is a contract or not
            if (contractCallPayload.length > 0) {
                // otherwise, need to check if the payload can be delivered to the toAddress
                address toAddress = address(0);
                if (toAddressBytes.length > 0) {
                    assembly { toAddress := mload(add(toAddressBytes, 20)) }
                }

                // check if the toAddress is a contract. We are not concerned about addresses that pretend to be wallets. because worst case we just delete their payload if being malicious
                // we can guarantee that if a size > 0, then the contract is definitely a contract address in this context
                uint size;
                assembly { size := extcodesize(toAddress) }

                if (size == 0) {
                    // size == 0 indicates its not a contract, payload wont be delivered
                    // secure the _payload to make sure funds can be delivered to the toAddress
                    bytes memory newToAddressBytes = abi.encodePacked(toAddress);
                    bytes memory securePayload = abi.encode(functionType, srcPoolId, dstPoolId, dstGasForCall, c, s, newToAddressBytes, bytes(""));
                    return securePayload;
                }
            }
        }

        // default to return the original payload
        return _payload;
    }

    function secureStgTokenPayload(bytes memory _payload) external pure returns(bytes memory) {
        return _secureStgTokenPayload(_payload);
    }

    function secureStgPayload(bytes memory _payload) external view returns(bytes memory) {
        return _secureStgPayload(_payload);
    }

    function _getVerifiedLog(bytes32 hashRoot, uint[] memory paths, uint logIndex, bytes[] memory proof) internal pure returns(ULNLog memory) {
        require(paths.length == proof.length, "ProofLib: invalid proof size");
        require(proof.length >0, "ProofLib: proof size must > 0");
        RLPDecode.RLPItem memory item;
        bytes memory proofBytes;

        for (uint i = 0; i < proof.length; i++) {
            proofBytes = proof[i];
            require(hashRoot == keccak256(proofBytes), "ProofLib: invalid hashlink");
            item = RLPDecode.toRlpItem(proofBytes).safeGetItemByIndex(paths[i]);
            if (i < proof.length - 1) hashRoot = bytes32(item.toUint());
        }

        // burning status + gasUsed + logBloom
        RLPDecode.RLPItem memory logItem = item.typeOffset().safeGetItemByIndex(3);
        RLPDecode.Iterator memory it =  logItem.safeGetItemByIndex(logIndex).iterator();
        ULNLog memory log;
        log.contractAddress = bytes32(it.next().toUint());
        log.topicZeroSig = bytes32(it.next().safeGetItemByIndex(0).toUint());
        log.data = it.next().toBytes();

        return log;
    }

    function getUtilsVersion() external override view returns(uint8) {
        return utilsVersion;
    }

    function getVerifyLog(bytes32 hashRoot, uint[] memory receiptSlotIndex, uint logIndex, bytes[] memory proof) external override pure returns(ULNLog memory){
        return _getVerifiedLog(hashRoot, receiptSlotIndex, logIndex, proof);
    }

    function getPacket(bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress) external override pure returns(LayerZeroPacket.Packet memory){
        return data.getPacket(srcChain, sizeOfSrcAddress, ulnAddress);
    }

    // profiling and test
    function assertMessagePath(LayerZeroPacket.Packet memory packet, bytes32 blockHash, bytes32 receiptsRoot) external view {
        _assertMessagePath(packet, blockHash, receiptsRoot);
    }
}

File 2 of 9: Buffer.sol
// SPDX-License-Identifier: BSD-2-Clause
// https://github.com/ensdomains/buffer

pragma solidity ^0.7.0;

/**
 * @dev A library for working with mutable byte buffers in Solidity.
 *
 * Byte buffers are mutable and expandable, and provide a variety of primitives
 * for writing to them. At any time you can fetch a bytes object containing the
 * current contents of the buffer. The bytes object should not be stored between
 * operations, as it may change due to resizing of the buffer.
 */
library Buffer {
    /**
     * @dev Represents a mutable buffer. Buffers have a current value (buf) and
     *      a capacity. The capacity may be longer than the current value, in
     *      which case it can be extended without the need to allocate more memory.
     */
    struct buffer {
        bytes buf;
        uint capacity;
    }

    /**
     * @dev Initializes a buffer with an initial capacity.a co
     * @param buf The buffer to initialize.
     * @param capacity The number of bytes of space to allocate the buffer.
     * @return The buffer, for chaining.
     */
    function init(buffer memory buf, uint capacity) internal pure returns (buffer memory) {
        if (capacity % 32 != 0) {
            capacity += 32 - (capacity % 32);
        }
        // Allocate space for the buffer data
        buf.capacity = capacity;
        assembly {
            let ptr := mload(0x40)
            mstore(buf, ptr)
            mstore(ptr, 0)
            mstore(0x40, add(32, add(ptr, capacity)))
        }
        return buf;
    }


    /**
     * @dev Writes a byte string to a buffer. Resizes if doing so would exceed
     *      the capacity of the buffer.
     * @param buf The buffer to append to.
     * @param off The start offset to write to.
     * @param rawData The data to append.
     * @param len The number of bytes to copy.
     * @return The original buffer, for chaining.
     */
    function writeRawBytes(
        buffer memory buf,
        uint off,
        bytes memory rawData,
        uint offData,
        uint len
    ) internal pure returns (buffer memory) {
        if (off + len > buf.capacity) {
            resize(buf, max(buf.capacity, len + off) * 2);
        }

        uint dest;
        uint src;
        assembly {
            // Memory address of the buffer data
            let bufptr := mload(buf)
            // Length of existing buffer data
            let buflen := mload(bufptr)
            // Start address = buffer address + offset + sizeof(buffer length)
            dest := add(add(bufptr, 32), off)
            // Update buffer length if we're extending it
            if gt(add(len, off), buflen) {
                mstore(bufptr, add(len, off))
            }
            src := add(rawData, offData)
        }

        // Copy word-length chunks while possible
        for (; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256**(32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }

        return buf;
    }

    /**
     * @dev Writes a byte string to a buffer. Resizes if doing so would exceed
     *      the capacity of the buffer.
     * @param buf The buffer to append to.
     * @param off The start offset to write to.
     * @param data The data to append.
     * @param len The number of bytes to copy.
     * @return The original buffer, for chaining.
     */
    function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) {
        require(len <= data.length);

        if (off + len > buf.capacity) {
            resize(buf, max(buf.capacity, len + off) * 2);
        }

        uint dest;
        uint src;
        assembly {
        // Memory address of the buffer data
            let bufptr := mload(buf)
        // Length of existing buffer data
            let buflen := mload(bufptr)
        // Start address = buffer address + offset + sizeof(buffer length)
            dest := add(add(bufptr, 32), off)
        // Update buffer length if we're extending it
            if gt(add(len, off), buflen) {
                mstore(bufptr, add(len, off))
            }
            src := add(data, 32)
        }

        // Copy word-length chunks while possible
        for (; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256**(32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }

        return buf;
    }

    function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {
        return write(buf, buf.buf.length, data, data.length);
    }

    function resize(buffer memory buf, uint capacity) private pure {
        bytes memory oldbuf = buf.buf;
        init(buf, capacity);
        append(buf, oldbuf);
    }

    function max(uint a, uint b) private pure returns (uint) {
        if (a > b) {
            return a;
        }
        return b;
    }
}

File 3 of 9: ILayerZeroValidationLibrary.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.7.0;
pragma abicoder v2;

import "./LayerZeroPacket.sol";

interface ILayerZeroValidationLibrary {
    function validateProof(bytes32 blockData, bytes calldata _data, uint _remoteAddressSize) external returns (LayerZeroPacket.Packet memory packet);
}

File 4 of 9: IValidationLibraryHelper.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.7.0;
pragma abicoder v2;

import "./LayerZeroPacket.sol";
import "./ILayerZeroValidationLibrary.sol";

interface IValidationLibraryHelper {
    struct ULNLog{
        bytes32 contractAddress;
        bytes32 topicZeroSig;
        bytes data;
    }

    function getVerifyLog(bytes32 hashRoot, uint[] memory receiptSlotIndex, uint logIndex, bytes[] memory proof) external pure returns(ULNLog memory);
    function getPacket(bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress) external pure returns(LayerZeroPacket.Packet memory);
    function getUtilsVersion() external view returns(uint8);
}

File 5 of 9: LayerZeroPacket.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.7.6;

import "./Buffer.sol";
import "./SafeMath.sol";

library LayerZeroPacket {
    using Buffer for Buffer.buffer;
    using SafeMath for uint;

    struct Packet {
        uint16 srcChainId;
        uint16 dstChainId;
        uint64 nonce;
        address dstAddress;
        bytes srcAddress;
        bytes32 ulnAddress;
        bytes payload;
    }

    function getPacket(
        bytes memory data,
        uint16 srcChain,
        uint sizeOfSrcAddress,
        bytes32 ulnAddress
    ) internal pure returns (LayerZeroPacket.Packet memory) {
        uint16 dstChainId;
        address dstAddress;
        uint size;
        uint64 nonce;

        // The log consists of the destination chain id and then a bytes payload
        //      0--------------------------------------------31
        // 0   |  total bytes size
        // 32  |  destination chain id
        // 64  |  bytes offset
        // 96  |  bytes array size
        // 128 |  payload
        assembly {
            dstChainId := mload(add(data, 32))
            size := mload(add(data, 96)) /// size of the byte array
            nonce := mload(add(data, 104)) // offset to convert to uint64  128  is index -24
            dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8
        }

        Buffer.buffer memory srcAddressBuffer;
        srcAddressBuffer.init(sizeOfSrcAddress);
        srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8

        uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);
        Buffer.buffer memory payloadBuffer;
        payloadBuffer.init(payloadSize);
        payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8
        return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);
    }
}

File 6 of 9: PacketDecoder.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity 0.7.6;
pragma abicoder v2;

import "./LayerZeroPacket.sol";

library PacketDecoder {
    using Buffer for Buffer.buffer;
    using SafeMath for uint;

    function getPacket(
        bytes memory data,
        uint16 srcChain,
        uint sizeOfSrcAddress,
        bytes32 ulnAddress
    ) internal pure returns (LayerZeroPacket.Packet memory) {
        uint16 dstChainId;
        address dstAddress;
        uint size;
        uint64 nonce;

        // The log consists of the destination chain id and then a bytes payload
        //      0--------------------------------------------31
        // 0   |  total bytes size
        // 32  |  destination chain id
        // 64  |  bytes offset
        // 96  |  bytes array size
        // 128 |  payload
        assembly {
            dstChainId := mload(add(data, 32))
            size := mload(add(data, 96)) /// size of the byte array
            nonce := mload(add(data, 104)) // offset to convert to uint64  128  is index -24
            dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8
        }

        Buffer.buffer memory srcAddressBuffer;
        srcAddressBuffer.init(sizeOfSrcAddress);
        srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8

        uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);
        Buffer.buffer memory payloadBuffer;
        payloadBuffer.init(payloadSize);
        payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8
        return LayerZeroPacket.Packet(srcChain, dstChainId, nonce, dstAddress, srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf);
    }
}

File 7 of 9: RLPDecode.sol
// SPDX-License-Identifier: Apache-2.0
// https://github.com/hamdiallam/solidity-rlp

pragma solidity ^0.7.0;

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

    struct RLPItem {
        uint len;
        uint memPtr;
    }

    struct Iterator {
        RLPItem item; // Item that's being iterated over.
        uint nextPtr; // Position of the next item in the list.
    }

    /*
     * @dev Returns the next element in the iteration. Reverts if it has not next element.
     * @param self The iterator.
     * @return The next element in the iteration.
     */
    function next(Iterator memory self) internal pure returns (RLPItem memory) {
        require(hasNext(self), "RLPDecoder iterator has no next");

        uint ptr = self.nextPtr;
        uint itemLength = _itemLength(ptr);
        self.nextPtr = ptr + itemLength;

        return RLPItem(itemLength, ptr);
    }

    /*
     * @dev Returns true if the iteration has more elements.
     * @param self The iterator.
     * @return true if the iteration has more elements.
     */
    function hasNext(Iterator memory self) internal pure returns (bool) {
        RLPItem memory item = self.item;
        return self.nextPtr < item.memPtr + item.len;
    }

    /*
     * @param item RLP encoded bytes
     */

    function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) {
        uint memPtr;
        assembly {
            memPtr := add(item, 0x20)
        }
        // offset the pointer if the first byte

        uint8 byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }
        uint len = item.length;
        if (len > 0 && byte0 < LIST_SHORT_START) {
            assembly {
                memPtr := add(memPtr, 0x01)
            }
            len -= 1;
        }
        return RLPItem(len, memPtr);
    }

    /*
     * @dev Create an iterator. Reverts if item is not a list.
     * @param self The RLP item.
     * @return An 'Iterator' over the item.
     */
    function iterator(RLPItem memory self) internal pure returns (Iterator memory) {
        require(isList(self), "RLPDecoder iterator is not list");

        uint ptr = self.memPtr + _payloadOffset(self.memPtr);
        return Iterator(self, ptr);
    }

    /*
     * @param item RLP encoded bytes
     */
    function rlpLen(RLPItem memory item) internal pure returns (uint) {
        return item.len;
    }

    /*
     * @param item RLP encoded bytes
     */
    function payloadLen(RLPItem memory item) internal pure returns (uint) {
        uint offset = _payloadOffset(item.memPtr);
        require(item.len >= offset, "RLPDecoder: invalid uint RLP item offset size");
        return item.len - offset;
    }

    /*
     * @param item RLP encoded list in bytes
     */
    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory) {
        require(isList(item), "RLPDecoder iterator is not a list");

        uint items = numItems(item);
        RLPItem[] memory result = new RLPItem[](items);

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

        return result;
    }

    /*
     * @param get the RLP item by index. save gas.
     */
    function getItemByIndex(RLPItem memory item, uint idx) internal pure returns (RLPItem memory) {
        require(isList(item), "RLPDecoder iterator is not a list");

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < idx; i++) {
            dataLen = _itemLength(memPtr);
            memPtr = memPtr + dataLen;
        }
        dataLen = _itemLength(memPtr);
        return RLPItem(dataLen, memPtr);
    }


    /*
     * @param get the RLP item by index. save gas.
     */
    function safeGetItemByIndex(RLPItem memory item, uint idx) internal pure returns (RLPItem memory) {
        require(isList(item), "RLPDecoder iterator is not a list");
        require(idx < numItems(item), "RLP item out of bounds");
        uint endPtr = item.memPtr + item.len;

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < idx; i++) {
            dataLen = _itemLength(memPtr);
            memPtr = memPtr + dataLen;
        }
        dataLen = _itemLength(memPtr);

        require(memPtr + dataLen <= endPtr, "RLP item overflow");
        return RLPItem(dataLen, memPtr);
    }

    /*
     * @param offset the receipt bytes item
     */
    function typeOffset(RLPItem memory item) internal pure returns (RLPItem memory) {
        uint offset = _payloadOffset(item.memPtr);
        uint8 byte0;
        uint memPtr = item.memPtr;
        uint len = item.len;
        assembly {
            memPtr := add(memPtr, offset)
            byte0 := byte(0, mload(memPtr))
        }
        if (len >0 && byte0 < LIST_SHORT_START) {
            assembly {
                memPtr := add(memPtr, 0x01)
            }
            len -= 1;
        }
        return RLPItem(len, memPtr);
    }

    // @return indicator whether encoded payload is a list. negate this function call for isData.
    function isList(RLPItem memory item) internal pure returns (bool) {
        if (item.len == 0) return false;

        uint8 byte0;
        uint memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

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

    /** RLPItem conversions into data types **/

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

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

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

    // any non-zero byte except "0x80" is considered true
    function toBoolean(RLPItem memory item) internal pure returns (bool) {
        require(item.len == 1, "RLPDecoder toBoolean invalid length");
        uint result;
        uint memPtr = item.memPtr;
        assembly {
            result := byte(0, mload(memPtr))
        }

        // SEE Github Issue #5.
        // Summary: Most commonly used RLP libraries (i.e Geth) will encode
        // "0" as "0x80" instead of as "0". We handle this edge case explicitly
        // here.
        if (result == 0 || result == STRING_SHORT_START) {
            return false;
        } else {
            return true;
        }
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        // 1 byte for the length prefix
        require(item.len == 21, "RLPDecoder toAddress invalid length");

        return address(toUint(item));
    }

    function toUint(RLPItem memory item) internal pure returns (uint) {
        require(item.len > 0 && item.len <= 33, "RLPDecoder toUint invalid length");

        uint offset = _payloadOffset(item.memPtr);
        require(item.len >= offset, "RLPDecoder: invalid RLP item offset size");
        uint len = item.len - offset;

        uint result;
        uint memPtr = item.memPtr + offset;
        assembly {
            result := mload(memPtr)

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

        return result;
    }

    // enforces 32 byte length
    function toUintStrict(RLPItem memory item) internal pure returns (uint) {
        // one byte prefix
        require(item.len == 33, "RLPDecoder toUintStrict invalid length");

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

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes memory) {
        require(item.len > 0, "RLPDecoder toBytes invalid length");

        uint offset = _payloadOffset(item.memPtr);
        require(item.len >= offset, "RLPDecoder: invalid RLP item offset size");
        uint len = item.len - offset; // data length
        bytes memory result = new bytes(len);

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

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

    /*
     * Private Helpers
     */

    // @return number of payload items inside an encoded list.
    function numItems(RLPItem memory item) internal pure returns (uint) {
        if (item.len == 0) return 0;

        uint count = 0;
        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
            currPtr = currPtr + _itemLength(currPtr); // skip over an item
            count++;
        }

        return count;
    }

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

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

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

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

        return itemLen;
    }

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

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

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

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

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

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

File 8 of 9: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 9 of 9: UltraLightNodeEVMDecoder.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.7.0;
pragma abicoder v2;

import "./RLPDecode.sol";

library UltraLightNodeEVMDecoder {
    using RLPDecode for RLPDecode.RLPItem;
    using RLPDecode for RLPDecode.Iterator;

    struct Log {
        address contractAddress;
        bytes32 topicZero;
        bytes data;
    }

    function getReceiptLog(bytes memory data, uint logIndex) internal pure returns (Log memory) {
        RLPDecode.Iterator memory it = RLPDecode.toRlpItem(data).iterator();
        uint idx;
        while (it.hasNext()) {
            if (idx == 3) {
                return toReceiptLog(it.next().getItemByIndex(logIndex).toRlpBytes());
            } else it.next();
            idx++;
        }
        revert("no log index in receipt");
    }

    function toReceiptLog(bytes memory data) internal pure returns (Log memory) {
        RLPDecode.Iterator memory it = RLPDecode.toRlpItem(data).iterator();
        Log memory log;

        uint idx;
        while (it.hasNext()) {
            if (idx == 0) {
                log.contractAddress = it.next().toAddress();
            } else if (idx == 1) {
                RLPDecode.RLPItem memory item = it.next().getItemByIndex(0);
                log.topicZero = bytes32(item.toUint());
            } else if (idx == 2) log.data = it.next().toBytes();
            else it.next();
            idx++;
        }
        return log;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_stargateBridgeAddress","type":"address"},{"internalType":"address","name":"_stgTokenAddress","type":"address"},{"internalType":"uint16","name":"_localChainId","type":"uint16"},{"internalType":"address","name":"_ulnAddress","type":"address"},{"internalType":"address","name":"_relayerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"PACKET_SIGNATURE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes","name":"srcAddress","type":"bytes"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct LayerZeroPacket.Packet","name":"packet","type":"tuple"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"receiptsRoot","type":"bytes32"}],"name":"assertMessagePath","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint16","name":"srcChain","type":"uint16"},{"internalType":"uint256","name":"sizeOfSrcAddress","type":"uint256"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"}],"name":"getPacket","outputs":[{"components":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes","name":"srcAddress","type":"bytes"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct LayerZeroPacket.Packet","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getUtilsVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hashRoot","type":"bytes32"},{"internalType":"uint256[]","name":"receiptSlotIndex","type":"uint256[]"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"bytes[]","name":"proof","type":"bytes[]"}],"name":"getVerifyLog","outputs":[{"components":[{"internalType":"bytes32","name":"contractAddress","type":"bytes32"},{"internalType":"bytes32","name":"topicZeroSig","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IValidationLibraryHelper.ULNLog","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"localChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"secureStgPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"secureStgTokenPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"stargateBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stgTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uln","outputs":[{"internalType":"contract IUltraLightNode","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"utilsVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_receiptsRoot","type":"bytes32"},{"internalType":"bytes","name":"_transactionProof","type":"bytes"},{"internalType":"uint256","name":"_remoteAddressSize","type":"uint256"}],"name":"validateProof","outputs":[{"components":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes","name":"srcAddress","type":"bytes"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct LayerZeroPacket.Packet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}]

6101206040526000805460ff191660031790553480156200001f57600080fd5b50604051620028b2380380620028b28339810160408190526200004291620000a3565b606094851b6001600160601b031990811660805293851b841660a05260f09290921b6001600160f01b03191660e052831b82166101005290911b1660c05262000119565b80516001600160a01b03811681146200009e57600080fd5b919050565b600080600080600060a08688031215620000bb578081fd5b620000c68662000086565b9450620000d66020870162000086565b9350604086015161ffff81168114620000ed578182fd5b9250620000fd6060870162000086565b91506200010d6080870162000086565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160f01c6101005160601c61272c62000186600039806102d252806108ab528061097a52508061028a52806108015250806102265280610a0252508061024a528061046b5250806102ae5280610400525061272c6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636c473aff1161008c578063be9d395e11610066578063be9d395e146101c4578063d633ad61146101d9578063e0cabadd146101e1578063ea455df9146101f4576100ea565b80636c473aff1461018757806378d823f71461018f578063b71e0f71146101a4576100ea565b806347713b39116100c857806347713b39146101355780635711c2a81461014a5780635b056da51461016a5780636348d2691461017f576100ea565b80630f222e65146100ef57806318a7cca8146101185780633fc18d4c1461012d575b600080fd5b6101026100fd366004611bf2565b610207565b60405161010f919061248a565b60405180910390f35b610120610224565b60405161010f9190612119565b610120610248565b61013d61026c565b60405161010f91906124f2565b61015d610158366004611ce3565b610275565b60405161010f9190612175565b610172610288565b60405161010f91906124b9565b6101206102ac565b6101206102d0565b6101a261019d366004611e56565b6102f4565b005b6101b76101b2366004611c66565b610304565b60405161010f91906123e5565b6101cc6104e3565b60405161010f919061216c565b61013d610507565b6101b76101ef366004611d16565b610510565b61015d610202366004611ce3565b610524565b61020f6118ec565b61021b8585858561052f565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1681565b6060610280826106de565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6102ff8383836107ff565b505050565b61030c61190b565b6000821161034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906123ae565b60405180910390fd5b600080808080610361888a018a611f43565b9450945094509450945060006103798b84848761052f565b60208101519091507fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f6146103d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061224f565b805160408201516000916103f1919089908c90610b19565b90506103fe81878e6107ff565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff161415610469576104638160c001516106de565b60c08201525b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff1614156104d4576104ce8160c00151610c0f565b60c08201525b9b9a5050505050505050505050565b7fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f681565b60005460ff1690565b61051861190b565b61021b85858585610b19565b606061028082610c0f565b6105376118ec565b8151845114610572576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121aa565b60008251116105ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103469061231a565b6105b5611949565b606060005b8451811015610661578481815181106105cf57fe5b6020026020010151915081805190602001208814610619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612218565b61063f87828151811061062857fe5b602002602001015161063984610cb9565b90610d2d565b925060018551038110156106595761065683610ee9565b97505b6001016105ba565b506000610672600361063985611006565b905060006106886106838389610d2d565b611092565b90506106926118ec565b6106a361069e8361113e565b610ee9565b81526106b661069e60006106398561113e565b60208201526106cc6106c78361113e565b6111ee565b60408201529998505050505050505050565b6020810151606090600160ff821614156107f8576000806000806000806000898060200190518101906107119190611fc8565b9750975097509750975097509750506000815111156107f05781516000901561073b575060148201515b803b806107ed5760008260405160200161075591906120e9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152602083810183526000808552925191945091926107ab928f928f928f928f928f928f928b9201612500565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529c506102839b505050505050505050505050565b50505b505050505050505b5090919050565b7f000000000000000000000000000000000000000000000000000000000000000061ffff16836020015161ffff1614610864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612286565b825160608401516040517fa466222200000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263a4662222926108e09291906004016124c8565b60c06040518083038186803b1580156108f857600080fd5b505afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109309190611db8565b60a081015185516040517febfa08e900000000000000000000000000000000000000000000000000000000815292935060009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263ebfa08e9926109af92899060040161213a565b604080518083038186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fe9190611b0b565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826040015173ffffffffffffffffffffffffffffffffffffffff1614610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906122e3565b82816020015114610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610346906121e1565b816020015167ffffffffffffffff1681600001511015610b12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034690612351565b5050505050565b610b2161190b565b602085015160608601516068870151858801607c01519190610b41611963565b610b4b818961131b565b50610b5b8160008c60888c611355565b506000610b7389610b6d86601c61142f565b9061142f565b9050610b7d611963565b610b87818361131b565b50610ba360008d610b998d609c6114a6565b8492919086611355565b506040805160e08101825261ffff808e16825298909816602089015267ffffffffffffffff909416938701939093525073ffffffffffffffffffffffffffffffffffffffff9093166060850152915160808401525060a082018490525160c08201529050949350505050565b606060008083806020019051810190610c289190611d73565b9150915060008083511115610c3e575060148201515b73ffffffffffffffffffffffffffffffffffffffff8116610cb05760405161dead90600090610c719083906020016120e9565b60405160208183030381529060405290508084604051602001610c95929190612188565b60405160208183030381529060405295505050505050610283565b50929392505050565b610cc1611949565b602082018051835160009190911a908015801590610ce2575060c060ff8316105b15610d1157600192909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b6040805180820190915290815260208101929092525092915050565b610d35611949565b610d3e83611521565b610d93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126b56021913960400191505060405180910390fd5b610d9c8361155b565b8210610e0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f524c50206974656d206f7574206f6620626f756e647300000000000000000000604482015290519081900360640190fd5b8251602084015190810190600090610e20906115b3565b60208601510190506000805b85811015610e4b57610e3d83611652565b928301929150600101610e2c565b50610e5582611652565b9050828183011115610ec857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f524c50206974656d206f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b60405180604001604052808281526020018381525093505050505b92915050565b805160009015801590610efe57508151602110155b610f6957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c504465636f64657220746f55696e7420696e76616c6964206c656e677468604482015290519081900360640190fd5b6000610f7883602001516115b3565b90508083600001511015610fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825160208085015183018051928490039291831015610ffd57826020036101000a820491505b50949350505050565b61100e611949565b600061101d83602001516115b3565b60208401518451908201805192935060009290921a91908015801590611046575060c060ff8416105b1561107557600191909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b604080518082019091529081526020810191909152949350505050565b61109a61197d565b6110a382611521565b61110e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f72206973206e6f74206c69737400604482015290519081900360640190fd5b600061111d83602001516115b3565b60208085015160408051808201909152868152920190820152915050919050565b611146611949565b61114f82611727565b6111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f524c504465636f646572206974657261746f7220686173206e6f206e65787400604482015290519081900360640190fd5b602082015160006111ca82611652565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090611248576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806126d66021913960400191505060405180910390fd5b600061125783602001516115b3565b905080836000015110156112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061268d6028913960400191505060405180910390fd5b825181900360008167ffffffffffffffff811180156112d457600080fd5b506040519080825280601f01601f1916602001820160405280156112ff576020820181803683370190505b5090506000816020019050610ffd84876020015101828561173c565b611323611963565b60208206156113385760208206602003820191505b506020828101829052604080518085526000815290920101905290565b61135d611963565b85602001518286011115611387576113878661137f88602001518886016117c3565b6002026117da565b6000808751805188602083010193508089870111156113a65788860182525b5050508484015b602084106113ea57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016113ad565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a01908116901991909116179052508495945050505050565b6000828211156114a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561151a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b805160009061153257506000610283565b6020820151805160001a9060c082101561155157600092505050610283565b5060019392505050565b805160009061156c57506000610283565b60008061157c84602001516115b3565b602085015185519181019250015b808210156115aa5761159b82611652565b6001909301929091019061158a565b50909392505050565b8051600090811a60808110156115cd576000915050610283565b60b88110806115e8575060c081108015906115e8575060f881105b156115f7576001915050610283565b60c0811015611629577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4a019050610283565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0a019050610283565b80516000908190811a608081101561166d5760019150611720565b60b88110156116a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181019150611720565b60c08110156116cd5760b78103600185019450806020036101000a85510460018201810193505050611720565b60f8811015611700577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181019150611720565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b80518051602091820151919092015191011190565b80611746576102ff565b5b602081106117845782518252602092830192909101907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001611747565b915181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052565b6000818311156117d4575081610ee3565b50919050565b81516117e6838361131b565b506117f183826117f7565b50505050565b6117ff611963565b61151a83846000015151848551611814611963565b825182111561182257600080fd5b84602001518285011115611844576118448561137f87602001518786016117c3565b6000808651805187602083010193508088870111156118635787860182525b505050602084015b602084106118a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909301926020918201910161186b565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b6040805160608082018352600080835260208301529181019190915290565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001600081525090565b6040518060400160405280611990611949565b8152602001600081525090565b803561028381612641565b805161028381612641565b600082601f8301126119c3578081fd5b813560206119d86119d3836125b7565b612593565b82815281810190858301855b85811015611a0d576119fb898684358b0101611a74565b845292840192908401906001016119e4565b5090979650505050505050565b600082601f830112611a2a578081fd5b81356020611a3a6119d3836125b7565b8281528181019085830183850287018401881015611a56578586fd5b855b85811015611a0d57813584529284019290840190600101611a58565b600082601f830112611a84578081fd5b8135611a926119d3826125d5565b818152846020838601011115611aa6578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611ad0578081fd5b8151611ade6119d3826125d5565b818152846020838601011115611af2578283fd5b611b03826020830160208701612615565b949350505050565b600060408284031215611b1c578081fd5b6040516040810181811067ffffffffffffffff82111715611b3957fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611b64578081fd5b60405160c0810181811067ffffffffffffffff82111715611b8157fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b803561028381612666565b805161028381612666565b803561028381612676565b805161028381612676565b60008060008060808587031215611c07578384fd5b84359350602085013567ffffffffffffffff80821115611c25578485fd5b611c3188838901611a1a565b9450604087013593506060870135915080821115611c4d578283fd5b50611c5a878288016119b3565b91505092959194509250565b60008060008060608587031215611c7b578182fd5b84359350602085013567ffffffffffffffff80821115611c99578384fd5b818701915087601f830112611cac578384fd5b813581811115611cba578485fd5b886020828501011115611ccb578485fd5b95986020929092019750949560400135945092505050565b600060208284031215611cf4578081fd5b813567ffffffffffffffff811115611d0a578182fd5b611b0384828501611a74565b60008060008060808587031215611d2b578182fd5b843567ffffffffffffffff811115611d41578283fd5b611d4d87828801611a74565b9450506020850135611d5e81612666565b93969395505050506040820135916060013590565b60008060408385031215611d85578182fd5b825167ffffffffffffffff811115611d9b578283fd5b611da785828601611ac0565b925050602083015190509250929050565b600060c08284031215611dc9578081fd5b60405160c0810181811067ffffffffffffffff82111715611de657fe5b6040528251611df481612666565b81526020830151611e0481612676565b60208201526040830151611e1781612641565b6040820152611e2860608401611bd1565b6060820152611e3960808401611be7565b6080820152611e4a60a084016119a8565b60a08201529392505050565b600080600060608486031215611e6a578081fd5b833567ffffffffffffffff80821115611e81578283fd5b9085019060e08288031215611e94578283fd5b611e9e60e0612593565b611ea783611bc6565b8152611eb560208401611bc6565b6020820152611ec660408401611bdc565b6040820152611ed76060840161199d565b6060820152608083013582811115611eed578485fd5b611ef989828601611a74565b60808301525060a083013560a082015260c083013582811115611f1a578485fd5b611f2689828601611a74565b60c083015250976020870135975060409096013595945050505050565b600080600080600060a08688031215611f5a578283fd5b8535611f6581612666565b945060208601359350604086013567ffffffffffffffff80821115611f88578485fd5b611f9489838a016119b3565b94506060880135915080821115611fa9578283fd5b50611fb688828901611a1a565b95989497509295608001359392505050565b6000806000806000806000806101c0898b031215611fe4578586fd5b885160ff81168114611ff4578687fd5b8098505060208901519650604089015195506060890151945061201a8a60808b01611b0b565b93506120298a60c08b01611b53565b925061018089015167ffffffffffffffff80821115612046578384fd5b6120528c838d01611ac0565b93506101a08b0151915080821115612068578283fd5b506120758b828c01611ac0565b9150509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b600081518084526120b7816020860160208601612615565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff93909316835261ffff919091166020830152604082015260600190565b90815260200190565b60006020825261151a602083018461209f565b60006040825261219b604083018561209f565b90508260208301529392505050565b6020808252601c908201527f50726f6f664c69623a20696e76616c69642070726f6f662073697a6500000000604082015260600190565b6020808252601e908201527f50726f6f664c69623a20696e76616c6964207265636569707420726f6f740000604082015260600190565b6020808252601a908201527f50726f6f664c69623a20696e76616c696420686173686c696e6b000000000000604082015260600190565b6020808252601f908201527f50726f6f664c69623a207061636b6574206e6f74207265636f676e697a656400604082015260600190565b60208082526026908201527f50726f6f664c69623a20696e76616c69642064657374696e6174696f6e20636860408201527f61696e2049440000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f50726f6f664c69623a20696e76616c69642072656c6179657200000000000000604082015260600190565b6020808252601d908201527f50726f6f664c69623a2070726f6f662073697a65206d757374203e2030000000604082015260600190565b60208082526028908201527f50726f6f664c69623a206e6f7420656e6f75676820626c6f636b20636f6e666960408201527f726d6174696f6e73000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f50726f6f664c69623a20696e76616c696420616464726573732073697a650000604082015260600190565b60006020825261ffff8084511660208401528060208501511660408401525067ffffffffffffffff6040840151166060830152606083015161242a6080840182612085565b50608083015160e060a084015261244561010084018261209f565b905060a084015160c084015260c08401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160e085015261021b828261209f565b60006020825282516020830152602083015160408301526040830151606080840152611b03608084018261209f565b61ffff91909116815260200190565b61ffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60ff91909116815260200190565b60006101c060ff8b16835289602084015288604084015287606084015286516080840152602087015160a0840152855160c0840152602086015160e084015260408601516101008401526060860151610120840152608086015161014084015260a08601516101608401528061018084015261257e8184018661209f565b90508281036101a08401526104d4818561209f565b60405181810167ffffffffffffffff811182821017156125af57fe5b604052919050565b600067ffffffffffffffff8211156125cb57fe5b5060209081020190565b600067ffffffffffffffff8211156125e957fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612630578181015183820152602001612618565b838111156117f15750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461266357600080fd5b50565b61ffff8116811461266357600080fd5b67ffffffffffffffff8116811461266357600080fdfe524c504465636f6465723a20696e76616c696420524c50206974656d206f66667365742073697a65524c504465636f646572206974657261746f72206973206e6f742061206c697374524c504465636f64657220746f427974657320696e76616c6964206c656e677468a2646970667358221220e05db307eef7efe5b23be1bea53750eb0992943554a8729deaebd6dc8be36f0f64736f6c63430007060033000000000000000000000000352d8275aae3e0c2404d9f68f6cee084b5beb3dd0000000000000000000000006694340fc020c5e6b96567843da2df01b2ce1eb6000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000fe7c30860d01e28371d40434806f4a8fcdd3a098

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

000000000000000000000000352d8275aae3e0c2404d9f68f6cee084b5beb3dd0000000000000000000000006694340fc020c5e6b96567843da2df01b2ce1eb6000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000fe7c30860d01e28371d40434806f4a8fcdd3a098

-----Decoded View---------------
Arg [0] : _stargateBridgeAddress (address): 0x352d8275aae3e0c2404d9f68f6cee084b5beb3dd
Arg [1] : _stgTokenAddress (address): 0x6694340fc020c5e6b96567843da2df01b2ce1eb6
Arg [2] : _localChainId (uint16): 10
Arg [3] : _ulnAddress (address): 0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [4] : _relayerAddress (address): 0xfe7c30860d01e28371d40434806f4a8fcdd3a098

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000352d8275aae3e0c2404d9f68f6cee084b5beb3dd
Arg [1] : 0000000000000000000000006694340fc020c5e6b96567843da2df01b2ce1eb6
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [4] : 000000000000000000000000fe7c30860d01e28371d40434806f4a8fcdd3a098


Deployed ByteCode Sourcemap

1212:8296:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8805:238;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1671:39;;;:::i;:::-;;;;;;;:::i;1625:40::-;;;:::i;1422:29::-;;;:::i;:::-;;;;;;;:::i;7405:136::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1716:36::-;;;:::i;:::-;;;;;;;:::i;1573:46::-;;;:::i;1758:36::-;;;:::i;9318:188::-;;;;;;:::i;:::-;;:::i;:::-;;2177:1066;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1457:109::-;;;:::i;:::-;;;;;;;:::i;8698:101::-;;;:::i;9049:237::-;;;;;;:::i;:::-;;:::i;7253:146::-;;;;;;:::i;:::-;;:::i;8805:238::-;8945:13;;:::i;:::-;8976:60;8992:8;9002:16;9020:8;9030:5;8976:15;:60::i;:::-;8969:67;8805:238;-1:-1:-1;;;;;8805:238:4:o;1671:39::-;;;:::o;1625:40::-;;;:::o;1422:29::-;;;;;;:::o;7405:136::-;7476:12;7507:27;7525:8;7507:17;:27::i;:::-;7500:34;;7405:136;;;;:::o;1716:36::-;;;:::o;1573:46::-;;;:::o;1758:36::-;;;:::o;9318:188::-;9448:51;9467:6;9475:9;9486:12;9448:18;:51::i;:::-;9318:188;;;:::o;2177:1066::-;2314:29;;:::i;:::-;2384:1;2363:18;:22;2355:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;2432:20;;;;;2544:71;;;;2555:17;2544:71;:::i;:::-;2431:184;;;;;;;;;;2626:17;2646:65;2662:13;2677:16;2695:8;2705:5;2646:15;:65::i;:::-;2729:16;;;;2626:85;;-1:-1:-1;1500:66:4;2729:36;2721:80;;;;;;;;;;;;:::i;:::-;2912:19;;2858:8;;;;2819:36;;2858:74;;:8;2877:13;;2892:18;;2858;:74::i;:::-;2819:113;;2943:52;2962:6;2970:9;2981:13;2943:18;:52::i;:::-;3031:21;3010:42;;:6;:17;;;:42;;;3006:98;;;3071:33;3089:6;:14;;;3071:17;:33::i;:::-;3054:14;;;:50;3006:98;3140:15;3119:36;;:6;:17;;;:36;;;3115:97;;;3174:38;3197:6;:14;;;3174:22;:38::i;:::-;3157:14;;;:55;3115:97;3230:6;2177:1066;-1:-1:-1;;;;;;;;;;;2177:1066:4:o;1457:109::-;1500:66;1457:109;:::o;8698:101::-;8756:5;8780:12;;;8698:101;:::o;9049:237::-;9178:29;;:::i;:::-;9225:54;:4;9240:8;9250:16;9268:10;9225:14;:54::i;7253:146::-;7329:12;7360:32;7383:8;7360:22;:32::i;7547:1145::-;7670:13;;:::i;:::-;7719:5;:12;7703:5;:12;:28;7695:69;;;;;;;;;;;;:::i;:::-;7796:1;7782:5;:12;:15;7774:57;;;;;;;;;;;;:::i;:::-;7841:29;;:::i;:::-;7880:23;7919:6;7914:326;7935:5;:12;7931:1;:16;7914:326;;;7981:5;7987:1;7981:8;;;;;;;;;;;;;;7968:21;;8033:10;8023:21;;;;;;8011:8;:33;8003:72;;;;;;;;;;;;:::i;:::-;8096:60;8147:5;8153:1;8147:8;;;;;;;;;;;;;;8096:31;8116:10;8096:19;:31::i;:::-;:50;;:60::i;:::-;8089:67;;8193:1;8178:5;:12;:16;8174:1;:20;8170:59;;;8215:13;:4;:11;:13::i;:::-;8207:22;-1:-1:-1;8170:59:4;7949:3;;7914:326;;;;8297:32;8332:39;8369:1;8332:17;:4;:15;:17::i;:39::-;8297:74;-1:-1:-1;8381:28:4;8413:47;:36;8297:74;8440:8;8413:26;:36::i;:::-;:45;:47::i;:::-;8381:79;;8470:17;;:::i;:::-;8527:18;:9;:2;:7;:9::i;:::-;:16;:18::i;:::-;8497:49;;8583:40;:31;8519:27;8583:9;:2;:7;:9::i;:40::-;8556:16;;;:68;8645:19;:9;:2;:7;:9::i;:::-;:17;:19::i;:::-;8634:8;;;:30;:8;7547:1145;-1:-1:-1;;;;;;;;;7547:1145:4:o;4722:2525::-;4985:2;4971:17;;4965:24;4795:12;;5287:1;5271:17;;;;5267:1898;;;5390:17;5425;5460:21;5499:28;5545:26;5589:27;5634:32;5694:8;5683:110;;;;;;;;;;;;:::i;:::-;5354:439;;;;;;;;;;;;;;;5943:1;5914:19;:26;:30;5910:1245;;;6109:21;;6057:17;;6109:25;6105:127;;-1:-1:-1;6208:2:4;6188:23;;6182:30;6167:47;6608:22;;6654:9;6650:491;;6872:30;6922:9;6905:27;;;;;;;;:::i;:::-;;;;;;;;;;;;7070:9;;;;;6954:26;7070:9;;;6983:97;;6905:27;;-1:-1:-1;6954:26:4;;6983:97;;6994:12;;7008:9;;7019;;7030:13;;7045:1;;7048;;6905:27;;6983:97;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;7102:20:4;;-1:-1:-1;;;;;;;;;;;;7102:20:4;6650:491;5910:1245;;;5267:1898;;;;;;;;-1:-1:-1;7232:8:4;;4722:2525;-1:-1:-1;4722:2525:4:o;3249:765::-;3409:12;3388:33;;:6;:17;;;:33;;;3380:84;;;;;;;;;;;;:::i;:::-;3552:17;;3571;;;;3535:54;;;;;3475:57;;3535:16;:3;:16;;;;:54;;3552:17;3571;3535:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3667:16;;;;3685:17;;3644:70;;;;;3475:114;;-1:-1:-1;3599:42:4;;3644:22;:3;:22;;;;:70;;3704:9;;3644:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3599:115;;3753:14;3732:35;;:9;:17;;;:35;;;3724:73;;;;;;;;;;;;:::i;:::-;3834:12;3816:9;:14;;;:30;3808:73;;;;;;;;;;;;:::i;:::-;3927:9;:35;;;3900:62;;:9;:23;;;:62;;3892:115;;;;;;;;;;;;:::i;:::-;3249:765;;;;;:::o;209:1518:5:-;368:29;;:::i;:::-;870:2;860:13;;854:20;911:2;901:13;;895:20;980:3;970:14;;964:21;1068:45;;;1078:34;1068:45;1062:52;;895:20;1172:37;;:::i;:::-;1219:39;:16;1241;1219:21;:39::i;:::-;-1:-1:-1;1268:62:5;:16;1299:1;1302:4;1308:3;1313:16;1268:30;:62::i;:::-;-1:-1:-1;1352:16:5;1371:34;1388:16;1371:12;:4;1380:2;1371:8;:12::i;:::-;:16;;:34::i;:::-;1352:53;;1415:34;;:::i;:::-;1459:31;:13;1478:11;1459:18;:31::i;:::-;-1:-1:-1;1500:76:5;1528:1;1531:4;1537:25;:16;1558:3;1537:20;:25::i;:::-;1500:13;;:76;;1564:11;1500:27;:76::i;:::-;-1:-1:-1;1604:116:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1604:116:5;;;;;;;;1668:20;;1604:116;;;;-1:-1:-1;1604:116:5;;;;;;1702:17;1604:116;;;;;-1:-1:-1;209:1518:5;;;;;;:::o;4020:696:4:-;4098:12;4123:27;4152:11;4178:8;4167:38;;;;;;;;;;;;:::i;:::-;4122:83;;;;4216:17;4284:1;4260:14;:21;:25;4256:110;;;-1:-1:-1;4351:2:4;4331:23;;4325:30;4310:46;4380:23;;;4376:258;;4539:29;;4449:42;;4419:19;;4539:29;;4449:42;;4539:29;;;:::i;:::-;;;;;;;;;;;;;4506:62;;4600:17;4619:3;4589:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4582:41;;;;;;;;;4376:258;-1:-1:-1;4701:8:4;;4020:696;-1:-1:-1;;;4020:696:4:o;1466:548:6:-;1527:14;;:::i;:::-;1617:4;1607:15;;1751:13;;1795:11;;1553;1743:22;;;;;1820:7;;;;;:35;;-1:-1:-1;260:4:6;1831:24;;;;1820:35;1816:155;;;1920:4;1908:17;;;;;1952:8;;1816:155;1987:20;;;;;;;;;;;;;;;;;;;-1:-1:-1;1987:20:6;1466:548;-1:-1:-1;;1466:548:6:o;4113:652::-;4195:14;;:::i;:::-;4229:12;4236:4;4229:6;:12::i;:::-;4221:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4303:14;4312:4;4303:8;:14::i;:::-;4297:3;:20;4289:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4382:8;;4368:11;;;;:22;;;;4354:11;;4429:27;;:14;:27::i;:::-;4415:11;;;;:41;;-1:-1:-1;4466:12:6;;4488:124;4509:3;4505:1;:7;4488:124;;;4543:19;4555:6;4543:11;:19::i;:::-;4585:16;;;;4533:29;-1:-1:-1;4514:3:6;;4488:124;;;;4631:19;4643:6;4631:11;:19::i;:::-;4621:29;;4689:6;4678:7;4669:6;:16;:26;;4661:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4734:24;;;;;;;;4742:7;4734:24;;;;4751:6;4734:24;;;4727:31;;;;;4113:652;;;;;:::o;7147:648::-;7231:8;;7207:4;;7231:12;;;;:30;;-1:-1:-1;7247:8:6;;7259:2;-1:-1:-1;7247:14:6;7231:30;7223:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7309:11;7323:27;7338:4;:11;;;7323:14;:27::i;:::-;7309:41;;7380:6;7368:4;:8;;;:18;;7360:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7452:8;;7515:11;;;;;:20;;7578:13;;7452:17;;;;;7578:13;7666:11;;7663:2;;;7735:3;7731:2;7727:12;7722:3;7718:22;7710:6;7706:35;7696:45;;7663:2;-1:-1:-1;7782:6:6;7147:648;-1:-1:-1;;;;7147:648:6:o;4830:538::-;4894:14;;:::i;:::-;4920:11;4934:27;4949:4;:11;;;4934:14;:27::i;:::-;5006:11;;;;5038:8;;5089:19;;;5138:13;;4920:41;;-1:-1:-1;4971:11:6;5130:22;;;;;5089:19;5175:6;;;;;:34;;-1:-1:-1;260:4:6;5185:24;;;;5175:34;5171:154;;;5274:4;5262:17;;;;;5306:8;;5171:154;5341:20;;;;;;;;;;;;;;;;;;;;4830:538;-1:-1:-1;;;;4830:538:6:o;2175:251::-;2237:15;;:::i;:::-;2272:12;2279:4;2272:6;:12::i;:::-;2264:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2331:8;2356:27;2371:4;:11;;;2356:14;:27::i;:::-;2342:11;;;;;2400:19;;;;;;;;;;;;2342:41;;2400:19;;;;;-1:-1:-1;;2175:251:6;;;:::o;756:310::-;815:14;;:::i;:::-;849:13;857:4;849:7;:13::i;:::-;841:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:12;;;;909:8;960:16;920:12;960:11;:16::i;:::-;1001;;;986:12;;;;:31;1035:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;1035:24:6;;756:310;-1:-1:-1;756:310:6:o;8169:549::-;8262:8;;8230:12;;8254:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8323:11;8337:27;8352:4;:11;;;8337:14;:27::i;:::-;8323:41;;8394:6;8382:4;:8;;;:18;;8374:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8466:8;;:17;;;8455:8;8466:17;8530:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8530:14:6;;8508:36;;8555:12;8621:6;8615:4;8611:17;8600:28;;8648:40;8667:6;8653:4;:11;;;:20;8675:7;8684:3;8648:4;:40::i;1079:456:0:-;1150:13;;:::i;:::-;1190:2;1179:8;:13;:18;1175:81;;1242:2;1231:8;:13;1225:2;:20;1213:32;;;;1175:81;-1:-1:-1;1311:12:0;;;;:23;;;1384:4;1378:11;;1402:16;;;-1:-1:-1;1431:14:0;;1479:18;;;1471:27;1458:41;;1311:12;1079:456::o;1907:1366::-;2074:13;;:::i;:::-;2115:3;:12;;;2109:3;2103;:9;:24;2099:100;;;2143:45;2150:3;2155:28;2159:3;:12;;;2179:3;2173;:9;2155:3;:28::i;:::-;2186:1;2155:32;2143:6;:45::i;:::-;2209:9;2228:8;2338:3;2332:10;2421:6;2415:13;2549:3;2544:2;2536:6;2532:15;2528:25;2520:33;;2645:6;2639:3;2634;2630:13;2627:25;2624:2;;;2695:3;2690;2686:13;2678:6;2671:29;2624:2;-1:-1:-1;;;2734:21:0;;;2825:165;2839:2;2832:3;:9;2825:165;;2908:10;;2895:24;;2843:9;;;;;2954:2;2946:10;;;;2970:9;2825:165;;;3115:10;3170:11;;3044:19;3050:2;:8;;;3044:3;:15;:19;3166:22;;;3127:9;;3111:26;;;;3214:21;3201:35;;-1:-1:-1;3263:3:0;1907:1366;;;;;;;:::o;3128:155:7:-;3186:7;3218:1;3213;:6;;3205:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:7;;;3128:155::o;2682:175::-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:1;2682:175;-1:-1:-1;;;2682:175:7:o;5472:318:6:-;5552:8;;5532:4;;5548:31;;-1:-1:-1;5574:5:6;5567:12;;5548:31;5625:11;;;;5686:13;;5590:11;5678:22;;260:4;5724:24;;5720:42;;;5757:5;5750:12;;;;;;5720:42;-1:-1:-1;5779:4:6;;5472:318;-1:-1:-1;;;5472:318:6:o;8826:413::-;8908:8;;8888:4;;8904:27;;-1:-1:-1;8930:1:6;8923:8;;8904:27;8942:10;8966:12;8995:27;9010:4;:11;;;8995:14;:27::i;:::-;8981:11;;;;9060:8;;8981:41;;;;-1:-1:-1;9046:22:6;9078:132;9095:6;9085:7;:16;9078:132;;;9137:20;9149:7;9137:11;:20::i;:::-;9192:7;;;;;9127:30;;;;9078:132;;;-1:-1:-1;9227:5:6;;8826:413;-1:-1:-1;;;8826:413:6:o;10559:512::-;10694:13;;10618:4;;10686:22;;171:4;10732:26;;10728:336;;;10767:1;10760:8;;;;;10728:336;216:4;10787:25;;;:83;;-1:-1:-1;260:4:6;10817:25;;;;;:52;;-1:-1:-1;303:4:6;10846:23;;10817:52;10783:281;;;10879:1;10872:8;;;;;10783:281;260:4;10899:24;;10895:169;;;10974:35;;;-1:-1:-1;10967:42:6;;10895:169;11031:33;;;-1:-1:-1;11024:40:6;;9288:1219;9442:13;;9344:4;;;;9434:22;;171:4;9480:26;;9476:1000;;;9518:1;9508:11;;9476:1000;;;216:4;9538:25;;9534:942;;;9575:30;;;;-1:-1:-1;9534:942:6;;;260:4;9624:24;;9620:856;;;9717:4;9710:5;9706:16;9796:1;9788:6;9784:14;9774:24;;9935:7;9931:2;9927:16;9922:3;9918:26;9909:6;9903:13;9899:46;10032:1;10023:7;10019:15;10010:7;10006:29;9995:40;;;;9673:376;;;303:4;10069:23;;10065:411;;;10118:28;;;;-1:-1:-1;10065:411:6;;;10230:4;10223:5;10219:16;10274:1;10266:6;10262:14;10252:24;;10345:7;10341:2;10337:16;10332:3;10328:26;10319:6;10313:13;10309:46;10449:1;10440:7;10436:15;10427:7;10423:29;10412:40;;;;10186:280;-1:-1:-1;10493:7:6;9288:1219;-1:-1:-1;;9288:1219:6:o;1237:170::-;1337:9;;1392:8;;1378:11;;;;;1363:12;;;;;1378:22;;-1:-1:-1;;1237:170:6:o;11229:725::-;11331:8;11327:21;;11341:7;;11327:21;11405:194;340:2;11412:16;;11405:194;;11502:10;;11489:24;;340:2;11541:16;;;;11571:17;;;;11430:16;;11405:194;;;11779:10;;11850:11;;340:2;11707:15;;;;11701:3;:22;:26;;11791:9;;11775:26;;;11846:22;;11916:21;;;;11903:35;;11746:202::o;5296:135:0:-;5347:4;5371:1;5367;:5;5363:44;;;-1:-1:-1;5395:1:0;5388:8;;5363:44;-1:-1:-1;5423:1:0;5296:135;-1:-1:-1;5296:135:0:o;5123:167::-;5218:7;;5235:19;5218:3;5245:8;5235:4;:19::i;:::-;;5264;5271:3;5276:6;5264;:19::i;:::-;;5123:167;;;:::o;4956:161::-;5033:13;;:::i;:::-;5065:45;5071:3;5076;:7;;;:14;5092:4;5098;:11;3737:13;;:::i;:::-;3777:4;:11;3770:3;:18;;3762:27;;;;;;3816:3;:12;;;3810:3;3804;:9;:24;3800:100;;;3844:45;3851:3;3856:28;3860:3;:12;;;3880:3;3874;:9;3856:3;:28::i;3844:45::-;3910:9;3929:8;4035:3;4029:10;4114:6;4108:13;4238:3;4233:2;4225:6;4221:15;4217:25;4209:33;;4330:6;4324:3;4319;4315:13;4312:25;4309:2;;;4380:3;4375;4371:13;4363:6;4356:29;4309:2;-1:-1:-1;;;4429:2:0;4419:13;;4502:165;4516:2;4509:3;:9;4502:165;;4585:10;;4572:24;;4520:9;;;;;4631:2;4623:10;;;;4647:9;4502:165;;;4792:10;4847:11;;4721:19;4727:2;:8;;;4721:3;:15;:19;4843:22;;;4804:9;;4788:26;;;;4891:21;4878:35;;-1:-1:-1;4940:3:0;3641:1309;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;14:138:9:-;84:20;;113:33;84:20;113:33;:::i;157:142::-;238:13;;260:33;238:13;260:33;:::i;304:669::-;;415:3;408:4;400:6;396:17;392:27;382:2;;437:5;430;423:20;382:2;477:6;464:20;503:4;527:63;542:47;586:2;542:47;:::i;:::-;527:63;:::i;:::-;624:15;;;655:12;;;;687:15;;;720:5;734:210;748:2;745:1;742:9;734:210;;;805:64;865:3;860:2;853:3;840:17;832:6;828:30;824:39;805:64;:::i;:::-;793:77;;890:12;;;;922;;;;766:1;759:9;734:210;;;-1:-1:-1;962:5:9;;372:601;-1:-1:-1;;;;;;;372:601:9:o;978:703::-;;1091:3;1084:4;1076:6;1072:17;1068:27;1058:2;;1113:5;1106;1099:20;1058:2;1153:6;1140:20;1179:4;1203:63;1218:47;1262:2;1218:47;:::i;1203:63::-;1300:15;;;1331:12;;;;1363:15;;;1409:11;;;1397:24;;1393:33;;1390:42;-1:-1:-1;1387:2:9;;;1449:5;1442;1435:20;1387:2;1475:5;1489:163;1503:2;1500:1;1497:9;1489:163;;;1560:17;;1548:30;;1598:12;;;;1630;;;;1521:1;1514:9;1489:163;;1686:485;;1783:3;1776:4;1768:6;1764:17;1760:27;1750:2;;1805:5;1798;1791:20;1750:2;1845:6;1832:20;1876:49;1891:33;1921:2;1891:33;:::i;1876:49::-;1950:2;1941:7;1934:19;1996:3;1989:4;1984:2;1976:6;1972:15;1968:26;1965:35;1962:2;;;2017:5;2010;2003:20;1962:2;2086;2079:4;2071:6;2067:17;2060:4;2051:7;2047:18;2034:55;2109:16;;;2127:4;2105:27;2098:42;;;;2113:7;1740:431;-1:-1:-1;;1740:431:9:o;2176:447::-;;2284:3;2277:4;2269:6;2265:17;2261:27;2251:2;;2306:5;2299;2292:20;2251:2;2339:6;2333:13;2370:49;2385:33;2415:2;2385:33;:::i;2370:49::-;2444:2;2435:7;2428:19;2490:3;2483:4;2478:2;2470:6;2466:15;2462:26;2459:35;2456:2;;;2511:5;2504;2497:20;2456:2;2528:64;2589:2;2582:4;2573:7;2569:18;2562:4;2554:6;2550:17;2528:64;:::i;:::-;2610:7;2241:382;-1:-1:-1;;;;2241:382:9:o;2628:477::-;;2746:4;2734:9;2729:3;2725:19;2721:30;2718:2;;;2768:5;2761;2754:20;2718:2;2805:4;2799:11;2849:4;2841:6;2837:17;2920:6;2908:10;2905:22;2884:18;2872:10;2869:34;2866:62;2863:2;;;2931:9;2863:2;2958:4;2951:24;3023:16;;3008:32;;3094:2;3079:18;;;3073:25;3056:15;;;3049:50;;;;-1:-1:-1;2993:6:9;2708:397;-1:-1:-1;2708:397:9:o;3110:711::-;;3226:4;3214:9;3209:3;3205:19;3201:30;3198:2;;;3248:5;3241;3234:20;3198:2;3285;3279:9;3327:4;3319:6;3315:17;3398:6;3386:10;3383:22;3362:18;3350:10;3347:34;3344:62;3341:2;;;3409:9;3341:2;3440:10;3436:2;3429:22;;3469:6;3460:15;;3505:9;3499:16;3491:6;3484:32;3570:2;3559:9;3555:18;3549:25;3544:2;3536:6;3532:15;3525:50;3629:2;3618:9;3614:18;3608:25;3603:2;3595:6;3591:15;3584:50;3688:2;3677:9;3673:18;3667:25;3662:2;3654:6;3650:15;3643:50;3748:3;3737:9;3733:19;3727:26;3721:3;3713:6;3709:16;3702:52;3809:3;3798:9;3794:19;3788:26;3782:3;3774:6;3770:16;3763:52;;3188:633;;;;:::o;3826:136::-;3895:20;;3924:32;3895:20;3924:32;:::i;3967:140::-;4047:13;;4069:32;4047:13;4069:32;:::i;4112:136::-;4181:20;;4210:32;4181:20;4210:32;:::i;4253:140::-;4333:13;;4355:32;4333:13;4355:32;:::i;4398:781::-;;;;;4620:3;4608:9;4599:7;4595:23;4591:33;4588:2;;;4642:6;4634;4627:22;4588:2;4683:9;4670:23;4660:33;;4744:2;4733:9;4729:18;4716:32;4767:18;4808:2;4800:6;4797:14;4794:2;;;4829:6;4821;4814:22;4794:2;4857:67;4916:7;4907:6;4896:9;4892:22;4857:67;:::i;:::-;4847:77;;4971:2;4960:9;4956:18;4943:32;4933:42;;5028:2;5017:9;5013:18;5000:32;4984:48;;5057:2;5047:8;5044:16;5041:2;;;5078:6;5070;5063:22;5041:2;;5106:67;5165:7;5154:8;5143:9;5139:24;5106:67;:::i;:::-;5096:77;;;4578:601;;;;;;;:::o;5184:777::-;;;;;5349:2;5337:9;5328:7;5324:23;5320:32;5317:2;;;5370:6;5362;5355:22;5317:2;5411:9;5398:23;5388:33;;5472:2;5461:9;5457:18;5444:32;5495:18;5536:2;5528:6;5525:14;5522:2;;;5557:6;5549;5542:22;5522:2;5600:6;5589:9;5585:22;5575:32;;5645:7;5638:4;5634:2;5630:13;5626:27;5616:2;;5672:6;5664;5657:22;5616:2;5717;5704:16;5743:2;5735:6;5732:14;5729:2;;;5764:6;5756;5749:22;5729:2;5814:7;5809:2;5800:6;5796:2;5792:15;5788:24;5785:37;5782:2;;;5840:6;5832;5825:22;5782:2;5307:654;;5876:2;5868:11;;;;;-1:-1:-1;5898:6:9;;5951:2;5936:18;5923:32;;-1:-1:-1;5307:654:9;-1:-1:-1;;;5307:654:9:o;5966:342::-;;6087:2;6075:9;6066:7;6062:23;6058:32;6055:2;;;6108:6;6100;6093:22;6055:2;6153:9;6140:23;6186:18;6178:6;6175:30;6172:2;;;6223:6;6215;6208:22;6172:2;6251:51;6294:7;6285:6;6274:9;6270:22;6251:51;:::i;6313:614::-;;;;;6484:3;6472:9;6463:7;6459:23;6455:33;6452:2;;;6506:6;6498;6491:22;6452:2;6551:9;6538:23;6584:18;6576:6;6573:30;6570:2;;;6621:6;6613;6606:22;6570:2;6649:51;6692:7;6683:6;6672:9;6668:22;6649:51;:::i;:::-;6639:61;;;6750:2;6739:9;6735:18;6722:32;6763;6789:5;6763:32;:::i;:::-;6442:485;;6814:5;;-1:-1:-1;;;;6866:2:9;6851:18;;6838:32;;6917:2;6902:18;6889:32;;6442:485::o;6932:418::-;;;7081:2;7069:9;7060:7;7056:23;7052:32;7049:2;;;7102:6;7094;7087:22;7049:2;7140:9;7134:16;7173:18;7165:6;7162:30;7159:2;;;7210:6;7202;7195:22;7159:2;7238:62;7292:7;7283:6;7272:9;7268:22;7238:62;:::i;:::-;7228:72;;;7340:2;7329:9;7325:18;7319:25;7309:35;;7039:311;;;;;:::o;7355:1053::-;;7519:3;7507:9;7498:7;7494:23;7490:33;7487:2;;;7541:6;7533;7526:22;7487:2;7579;7573:9;7621:3;7613:6;7609:16;7691:6;7679:10;7676:22;7655:18;7643:10;7640:34;7637:62;7634:2;;;7702:9;7634:2;7729;7722:22;7766:16;;7791:32;7766:16;7791:32;:::i;:::-;7832:21;;7898:2;7883:18;;7877:25;7911:34;7877:25;7911:34;:::i;:::-;7973:2;7961:15;;7954:32;8031:2;8016:18;;8010:25;8044:35;8010:25;8044:35;:::i;:::-;8107:2;8095:15;;8088:32;8153:50;8199:2;8184:18;;8153:50;:::i;:::-;8148:2;8140:6;8136:15;8129:75;8238:51;8284:3;8273:9;8269:19;8238:51;:::i;:::-;8232:3;8224:6;8220:16;8213:77;8324:52;8371:3;8360:9;8356:19;8324:52;:::i;:::-;8318:3;8306:16;;8299:78;8310:6;7477:931;-1:-1:-1;;;7477:931:9:o;8921:1291::-;;;;9090:2;9078:9;9069:7;9065:23;9061:32;9058:2;;;9111:6;9103;9096:22;9058:2;9156:9;9143:23;9185:18;9226:2;9218:6;9215:14;9212:2;;;9247:6;9239;9232:22;9212:2;9275:22;;;;9331:4;9313:16;;;9309:27;9306:2;;;9354:6;9346;9339:22;9306:2;9385:20;9400:4;9385:20;:::i;:::-;9428:23;9448:2;9428:23;:::i;:::-;9421:5;9414:38;9484:32;9512:2;9508;9504:11;9484:32;:::i;:::-;9479:2;9472:5;9468:14;9461:56;9549:32;9577:2;9573;9569:11;9549:32;:::i;:::-;9544:2;9537:5;9533:14;9526:56;9614:33;9643:2;9639;9635:11;9614:33;:::i;:::-;9609:2;9602:5;9598:14;9591:57;9694:3;9690:2;9686:12;9673:26;9724:2;9714:8;9711:16;9708:2;;;9745:6;9737;9730:22;9708:2;9787:46;9825:7;9814:8;9810:2;9806:17;9787:46;:::i;:::-;9781:3;9774:5;9770:15;9763:71;;9888:3;9884:2;9880:12;9867:26;9861:3;9854:5;9850:15;9843:51;9940:3;9936:2;9932:12;9919:26;9970:2;9960:8;9957:16;9954:2;;;9991:6;9983;9976:22;9954:2;10033:46;10071:7;10060:8;10056:2;10052:17;10033:46;:::i;:::-;10027:3;10016:15;;10009:71;-1:-1:-1;10020:5:9;10151:2;10136:18;;10123:32;;-1:-1:-1;10202:2:9;10187:18;;;10174:32;;9048:1164;-1:-1:-1;;;;;9048:1164:9:o;10217:917::-;;;;;;10455:3;10443:9;10434:7;10430:23;10426:33;10423:2;;;10477:6;10469;10462:22;10423:2;10521:9;10508:23;10540:32;10566:5;10540:32;:::i;:::-;10591:5;-1:-1:-1;10643:2:9;10628:18;;10615:32;;-1:-1:-1;10698:2:9;10683:18;;10670:32;10721:18;10751:14;;;10748:2;;;10783:6;10775;10768:22;10748:2;10811:65;10868:7;10859:6;10848:9;10844:22;10811:65;:::i;:::-;10801:75;;10929:2;10918:9;10914:18;10901:32;10885:48;;10958:2;10948:8;10945:16;10942:2;;;10979:6;10971;10964:22;10942:2;;11007:69;11068:7;11057:8;11046:9;11042:24;11007:69;:::i;:::-;10413:721;;;;-1:-1:-1;10413:721:9;;11123:3;11108:19;11095:33;;10413:721;-1:-1:-1;;;10413:721:9:o;11139:1200::-;;;;;;;;;11447:3;11435:9;11426:7;11422:23;11418:33;11415:2;;;11469:6;11461;11454:22;11415:2;11506:9;11500:16;11556:4;11549:5;11545:16;11538:5;11535:27;11525:2;;11581:6;11573;11566:22;11525:2;11609:5;11599:15;;;11654:2;11643:9;11639:18;11633:25;11623:35;;11698:2;11687:9;11683:18;11677:25;11667:35;;11742:2;11731:9;11727:18;11721:25;11711:35;;11765:71;11828:7;11822:3;11811:9;11807:19;11765:71;:::i;:::-;11755:81;;11855:69;11916:7;11910:3;11899:9;11895:19;11855:69;:::i;:::-;11845:79;;11968:3;11957:9;11953:19;11947:26;11992:18;12033:2;12025:6;12022:14;12019:2;;;12054:6;12046;12039:22;12019:2;12082:62;12136:7;12127:6;12116:9;12112:22;12082:62;:::i;:::-;12072:72;;12190:3;12179:9;12175:19;12169:26;12153:42;;12220:2;12210:8;12207:16;12204:2;;;12241:6;12233;12226:22;12204:2;;12269:64;12325:7;12314:8;12303:9;12299:24;12269:64;:::i;:::-;12259:74;;;11405:934;;;;;;;;;;;:::o;12344:129::-;12423:42;12412:54;12400:67;;12390:83::o;12478:318::-;;12559:5;12553:12;12586:6;12581:3;12574:19;12602:63;12658:6;12651:4;12646:3;12642:14;12635:4;12628:5;12624:16;12602:63;:::i;:::-;12710:2;12698:15;12715:66;12694:88;12685:98;;;;12785:4;12681:109;;12529:267;-1:-1:-1;;12529:267:9:o;12801:264::-;12950:2;12946:15;;;;12963:66;12942:88;12930:101;;13056:2;13047:12;;12920:145::o;13070:226::-;13246:42;13234:55;;;;13216:74;;13204:2;13189:18;;13171:125::o;13301:379::-;13531:42;13519:55;;;;13501:74;;13623:6;13611:19;;;;13606:2;13591:18;;13584:47;13662:2;13647:18;;13640:34;13489:2;13474:18;;13456:224::o;13685:177::-;13831:25;;;13819:2;13804:18;;13786:76::o;13867:219::-;;14014:2;14003:9;13996:21;14034:46;14076:2;14065:9;14061:18;14053:6;14034:46;:::i;14091:290::-;;14266:2;14255:9;14248:21;14286:46;14328:2;14317:9;14313:18;14305:6;14286:46;:::i;:::-;14278:54;;14368:6;14363:2;14352:9;14348:18;14341:34;14238:143;;;;;:::o;14640:352::-;14842:2;14824:21;;;14881:2;14861:18;;;14854:30;14920;14915:2;14900:18;;14893:58;14983:2;14968:18;;14814:178::o;14997:354::-;15199:2;15181:21;;;15238:2;15218:18;;;15211:30;15277:32;15272:2;15257:18;;15250:60;15342:2;15327:18;;15171:180::o;15356:350::-;15558:2;15540:21;;;15597:2;15577:18;;;15570:30;15636:28;15631:2;15616:18;;15609:56;15697:2;15682:18;;15530:176::o;15711:355::-;15913:2;15895:21;;;15952:2;15932:18;;;15925:30;15991:33;15986:2;15971:18;;15964:61;16057:2;16042:18;;15885:181::o;16071:402::-;16273:2;16255:21;;;16312:2;16292:18;;;16285:30;16351:34;16346:2;16331:18;;16324:62;16422:8;16417:2;16402:18;;16395:36;16463:3;16448:19;;16245:228::o;16478:349::-;16680:2;16662:21;;;16719:2;16699:18;;;16692:30;16758:27;16753:2;16738:18;;16731:55;16818:2;16803:18;;16652:175::o;16832:353::-;17034:2;17016:21;;;17073:2;17053:18;;;17046:30;17112:31;17107:2;17092:18;;17085:59;17176:2;17161:18;;17006:179::o;17190:404::-;17392:2;17374:21;;;17431:2;17411:18;;;17404:30;17470:34;17465:2;17450:18;;17443:62;17541:10;17536:2;17521:18;;17514:38;17584:3;17569:19;;17364:230::o;17599:354::-;17801:2;17783:21;;;17840:2;17820:18;;;17813:30;17879:32;17874:2;17859:18;;17852:60;17944:2;17929:18;;17773:180::o;17958:1017::-;;18133:2;18122:9;18115:21;18155:6;18216:2;18207:6;18201:13;18197:22;18192:2;18181:9;18177:18;18170:50;18284:2;18278;18270:6;18266:15;18260:22;18256:31;18251:2;18240:9;18236:18;18229:59;;18352:18;18346:2;18338:6;18334:15;18328:22;18324:47;18319:2;18308:9;18304:18;18297:75;18419:2;18411:6;18407:15;18401:22;18432:55;18482:3;18471:9;18467:19;18453:12;18432:55;:::i;:::-;;18536:3;18528:6;18524:16;18518:23;18578:4;18572:3;18561:9;18557:19;18550:33;18606:55;18656:3;18645:9;18641:19;18625:14;18606:55;:::i;:::-;18592:69;;18716:3;18708:6;18704:16;18698:23;18692:3;18681:9;18677:19;18670:52;18771:3;18763:6;18759:16;18753:23;18842:66;18830:9;18822:6;18818:22;18814:95;18807:4;18796:9;18792:20;18785:125;18927:42;18962:6;18946:14;18927:42;:::i;18980:457::-;;19155:2;19144:9;19137:21;19200:6;19194:13;19189:2;19178:9;19174:18;19167:41;19262:2;19254:6;19250:15;19244:22;19239:2;19228:9;19224:18;19217:50;19314:2;19306:6;19302:15;19296:22;19356:4;19349;19338:9;19334:20;19327:34;19378:53;19426:3;19415:9;19411:19;19397:12;19378:53;:::i;19442:188::-;19616:6;19604:19;;;;19586:38;;19574:2;19559:18;;19541:89::o;19635:308::-;19837:6;19825:19;;;;19807:38;;19893:42;19881:55;19876:2;19861:18;;19854:83;19795:2;19780:18;;19762:181::o;19948:184::-;20120:4;20108:17;;;;20090:36;;20078:2;20063:18;;20045:87::o;20137:1316::-;;20586:3;20628:4;20620:6;20616:17;20605:9;20598:36;20670:6;20665:2;20654:9;20650:18;20643:34;20713:6;20708:2;20697:9;20693:18;20686:34;20756:6;20751:2;20740:9;20736:18;20729:34;20806:6;20800:13;20794:3;20783:9;20779:19;20772:42;20869:2;20861:6;20857:15;20851:22;20845:3;20834:9;20830:19;20823:51;20917:6;20911:13;20905:3;20894:9;20890:19;20883:42;20980:2;20972:6;20968:15;20962:22;20956:3;20945:9;20941:19;20934:51;21040:2;21032:6;21028:15;21022:22;21016:3;21005:9;21001:19;20994:51;21100:2;21092:6;21088:15;21082:22;21076:3;21065:9;21061:19;21054:51;21160:3;21152:6;21148:16;21142:23;21136:3;21125:9;21121:19;21114:52;21221:3;21213:6;21209:16;21203:23;21197:3;21186:9;21182:19;21175:52;21264:2;21258:3;21247:9;21243:19;21236:31;21290:46;21332:2;21321:9;21317:18;21309:6;21290:46;:::i;:::-;21276:60;;21385:9;21377:6;21373:22;21367:3;21356:9;21352:19;21345:51;21413:34;21440:6;21432;21413:34;:::i;21458:242::-;21528:2;21522:9;21558:17;;;21605:18;21590:34;;21626:22;;;21587:62;21584:2;;;21652:9;21584:2;21679;21672:22;21502:198;;-1:-1:-1;21502:198:9:o;21705:181::-;;21802:18;21794:6;21791:30;21788:2;;;21824:9;21788:2;-1:-1:-1;21875:4:9;21856:17;;;21852:28;;21778:108::o;21891:240::-;;21974:18;21966:6;21963:30;21960:2;;;21996:9;21960:2;-1:-1:-1;22044:4:9;22032:17;22051:66;22028:90;22120:4;22024:101;;21950:181::o;22136:258::-;22208:1;22218:113;22232:6;22229:1;22226:13;22218:113;;;22308:11;;;22302:18;22289:11;;;22282:39;22254:2;22247:10;22218:113;;;22349:6;22346:1;22343:13;22340:2;;;-1:-1:-1;;22384:1:9;22366:16;;22359:27;22189:205::o;22399:156::-;22487:42;22480:5;22476:54;22469:5;22466:65;22456:2;;22545:1;22542;22535:12;22456:2;22446:109;:::o;22560:119::-;22647:6;22640:5;22636:18;22629:5;22626:29;22616:2;;22669:1;22666;22659:12;22684:131;22771:18;22764:5;22760:30;22753:5;22750:41;22740:2;;22805:1;22802;22795:12

Metadata Hash

e05db307eef7efe5b23be1bea53750eb0992943554a8729deaebd6dc8be36f0f
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.