S Price: $0.478429 (+4.80%)
    /

    Contract

    0xA272fFe20cFfe769CdFc4b63088DCD2C82a2D8F9

    Overview

    S Balance

    Sonic LogoSonic LogoSonic Logo0.627453417751455145 S

    S Value

    $0.30 (@ $0.48/S)

    Token Holdings

    Multichain Info

    No addresses found
    Transaction Hash
    Method
    Block
    Age
    From
    To
    Amount
    Send215535392025-04-22 13:28:4410 mins ago1745328524IN
    0xA272fFe2...C82a2D8F9
    1.27373668 S0.0168186850.0001
    Send214242562025-04-21 18:55:5918 hrs ago1745261759IN
    0xA272fFe2...C82a2D8F9
    1.05916112 S0.0188843255.01
    Send213926272025-04-21 15:09:3222 hrs ago1745248172IN
    0xA272fFe2...C82a2D8F9
    1.593956 S0.0191463455.01
    Send213113972025-04-21 4:31:1133 hrs ago1745209871IN
    0xA272fFe2...C82a2D8F9
    2.37240291 S0.0167938850.0001
    Send211751002025-04-20 12:08:462 days ago1745150926IN
    0xA272fFe2...C82a2D8F9
    2.0564914 S0.0067098650.0001
    Send211120582025-04-20 1:19:492 days ago1745111989IN
    0xA272fFe2...C82a2D8F9
    14.70506809 S0.0163156550
    Send208621812025-04-18 8:18:504 days ago1744964330IN
    0xA272fFe2...C82a2D8F9
    5.18410629 S0.0199583455.01
    Send205998322025-04-16 18:17:165 days ago1744827436IN
    0xA272fFe2...C82a2D8F9
    2.37240291 S0.0167938850.0001
    Send205769692025-04-16 15:39:235 days ago1744817963IN
    0xA272fFe2...C82a2D8F9
    1.53390558 S0.0188843255.01
    Send205728582025-04-16 15:11:125 days ago1744816272IN
    0xA272fFe2...C82a2D8F9
    1.27882829 S0.0076917157.43731333
    Send205694402025-04-16 14:46:385 days ago1744814798IN
    0xA272fFe2...C82a2D8F9
    2.1013441 S0.0074367153.55666666
    Send204089692025-04-15 16:53:256 days ago1744736005IN
    0xA272fFe2...C82a2D8F9
    2.03179442 S0.0194790955.01
    Send203443272025-04-15 8:38:217 days ago1744706301IN
    0xA272fFe2...C82a2D8F9
    3.97372142 S0.0199801550
    Send202468302025-04-14 18:39:407 days ago1744655980IN
    0xA272fFe2...C82a2D8F9
    1.02965345 S0.0163106350.0001
    Send202011302025-04-14 14:08:397 days ago1744639719IN
    0xA272fFe2...C82a2D8F9
    2.37240291 S0.0180255753.66336666
    Send202009892025-04-14 14:07:557 days ago1744639675IN
    0xA272fFe2...C82a2D8F9
    4.57307858 S0.0194473256.65
    Send201962832025-04-14 13:43:397 days ago1744638219IN
    0xA272fFe2...C82a2D8F9
    3.26501399 S0.0064645650.0001
    Send199843822025-04-13 13:55:548 days ago1744552554IN
    0xA272fFe2...C82a2D8F9
    2.01578744 S0.0077718155.01
    Send198264702025-04-12 16:38:559 days ago1744475935IN
    0xA272fFe2...C82a2D8F9
    1.72096951 S0.0067051650.0001
    Send197953132025-04-12 13:21:4310 days ago1744464103IN
    0xA272fFe2...C82a2D8F9
    1.11243894 S0.0263513776.77
    Send197906322025-04-12 12:53:0110 days ago1744462381IN
    0xA272fFe2...C82a2D8F9
    2.37240291 S0.0197500350.0001
    Send197410742025-04-12 7:24:1210 days ago1744442652IN
    0xA272fFe2...C82a2D8F9
    2.37240291 S0.0197195556.6
    Send197209582025-04-12 5:01:0110 days ago1744434061IN
    0xA272fFe2...C82a2D8F9
    4.54208786 S0.018698553.66733333
    Send196446362025-04-11 19:10:4510 days ago1744398645IN
    0xA272fFe2...C82a2D8F9
    1.51258192 S0.0186154655
    Send196351732025-04-11 18:09:2010 days ago1744394960IN
    0xA272fFe2...C82a2D8F9
    3.82096683 S0.0165582350.0001
    VIEW ADVANCED FILTER

    Latest 25 internal transactions (View All)

    Parent Transaction Hash Block Age From To Amount
    215547172025-04-22 13:37:122 mins ago1745329032
    0xA272fFe2...C82a2D8F9
    0.49314667 S
    215535392025-04-22 13:28:4410 mins ago1745328524
    0xA272fFe2...C82a2D8F9
    1.27373668 S
    215530742025-04-22 13:25:1014 mins ago1745328310
    0xA272fFe2...C82a2D8F9
    0.10349631 S
    215528652025-04-22 13:23:3715 mins ago1745328217
    0xA272fFe2...C82a2D8F9
    0.10270601 S
    215528652025-04-22 13:23:3715 mins ago1745328217
    0xA272fFe2...C82a2D8F9
    0.10270601 S
    215524582025-04-22 13:21:0018 mins ago1745328060
    0xA272fFe2...C82a2D8F9
    1.59269427 S
    215524582025-04-22 13:21:0018 mins ago1745328060
    0xA272fFe2...C82a2D8F9
    1.59269427 S
    215510272025-04-22 13:11:2527 mins ago1745327485
    0xA272fFe2...C82a2D8F9
    0.1028372 S
    215508402025-04-22 13:10:1129 mins ago1745327411
    0xA272fFe2...C82a2D8F9
    0.10520722 S
    215508402025-04-22 13:10:1129 mins ago1745327411
    0xA272fFe2...C82a2D8F9
    0.10520722 S
    215502922025-04-22 13:06:4032 mins ago1745327200
    0xA272fFe2...C82a2D8F9
    0.17097397 S
    215501612025-04-22 13:05:4733 mins ago1745327147
    0xA272fFe2...C82a2D8F9
    0.03672097 S
    215490842025-04-22 12:58:3940 mins ago1745326719
    0xA272fFe2...C82a2D8F9
    0.03672097 S
    215484562025-04-22 12:54:3144 mins ago1745326471
    0xA272fFe2...C82a2D8F9
    0.63895246 S
    215484562025-04-22 12:54:3144 mins ago1745326471
    0xA272fFe2...C82a2D8F9
    0.63895246 S
    215473672025-04-22 12:46:0253 mins ago1745325962
    0xA272fFe2...C82a2D8F9
    0.26092242 S
    215455602025-04-22 12:32:471 hr ago1745325167
    0xA272fFe2...C82a2D8F9
    0.04061078 S
    215455602025-04-22 12:32:471 hr ago1745325167
    0xA272fFe2...C82a2D8F9
    0.04061078 S
    215443562025-04-22 12:24:471 hr ago1745324687
    0xA272fFe2...C82a2D8F9
    0.10359429 S
    215435942025-04-22 12:19:331 hr ago1745324373
    0xA272fFe2...C82a2D8F9
    0.10430345 S
    215435942025-04-22 12:19:331 hr ago1745324373
    0xA272fFe2...C82a2D8F9
    0.10430345 S
    215429602025-04-22 12:14:581 hr ago1745324098
    0xA272fFe2...C82a2D8F9
    0.10430345 S
    215413342025-04-22 12:02:231 hr ago1745323343
    0xA272fFe2...C82a2D8F9
    0.10451263 S
    215359302025-04-22 11:18:062 hrs ago1745320686
    0xA272fFe2...C82a2D8F9
    0.10466891 S
    215359302025-04-22 11:18:062 hrs ago1745320686
    0xA272fFe2...C82a2D8F9
    0.10466891 S
    View All Internal Transactions
    Loading...
    Loading

    Contract Source Code Verified (Exact Match)

    Contract Name:
    StargatePoolUSDC

    Compiler Version
    v0.8.22+commit.4fc1097e

    Optimization Enabled:
    Yes with 5000 runs

    Other Settings:
    paris EvmVersion, None license
    File 1 of 47 : StargatePoolUSDC.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    import { IBridgedUSDCMinter } from "../interfaces/IBridgedUSDCMinter.sol";
    import { StargatePool } from "../StargatePool.sol";
    /**
    * @title A StargatePool specialized for USDC which includes a function to burn credit to keep the total circulating
    * amount constant.
    */
    contract StargatePoolUSDC is StargatePool {
    error StargatePoolUSDC_BurnAmountExceedsBalance();
    address public burnAdmin;
    uint64 public burnAllowanceSD;
    constructor(
    string memory _lpTokenName,
    string memory _lpTokenSymbol,
    address _token,
    uint8 _tokenDecimals,
    uint8 _sharedDecimals,
    address _endpoint,
    address _owner
    ) StargatePool(_lpTokenName, _lpTokenSymbol, _token, _tokenDecimals, _sharedDecimals, _endpoint, _owner) {}
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 2 of 47 : OApp.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    // @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers
    // solhint-disable-next-line no-unused-import
    import { OAppSender, MessagingFee, MessagingReceipt } from "./OAppSender.sol";
    // @dev Import the 'Origin' so it's exposed to OApp implementers
    // solhint-disable-next-line no-unused-import
    import { OAppReceiver, Origin } from "./OAppReceiver.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OApp
    * @dev Abstract contract serving as the base for OApp implementation, combining OAppSender and OAppReceiver functionality.
    */
    abstract contract OApp is OAppSender, OAppReceiver {
    /**
    * @dev Constructor to initialize the OApp with the provided endpoint and owner.
    * @param _endpoint The address of the LOCAL LayerZero endpoint.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    */
    constructor(address _endpoint, address _delegate) OAppCore(_endpoint, _delegate) {}
    /**
    * @notice Retrieves the OApp version information.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 3 of 47 : OAppCore.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    import { IOAppCore, ILayerZeroEndpointV2 } from "./interfaces/IOAppCore.sol";
    /**
    * @title OAppCore
    * @dev Abstract contract implementing the IOAppCore interface with basic OApp configurations.
    */
    abstract contract OAppCore is IOAppCore, Ownable {
    // The LayerZero endpoint associated with the given OApp
    ILayerZeroEndpointV2 public immutable endpoint;
    // Mapping to store peers associated with corresponding endpoints
    mapping(uint32 eid => bytes32 peer) public peers;
    /**
    * @dev Constructor to initialize the OAppCore with the provided endpoint and delegate.
    * @param _endpoint The address of the LOCAL Layer Zero endpoint.
    * @param _delegate The delegate capable of making OApp configurations inside of the endpoint.
    *
    * @dev The delegate typically should be set as the owner of the contract.
    */
    constructor(address _endpoint, address _delegate) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 4 of 47 : OAppReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { IOAppReceiver, Origin } from "./interfaces/IOAppReceiver.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OAppReceiver
    * @dev Abstract contract implementing the ILayerZeroReceiver interface and extending OAppCore for OApp receivers.
    */
    abstract contract OAppReceiver is IOAppReceiver, OAppCore {
    // Custom error message for when the caller is not the registered endpoint/
    error OnlyEndpoint(address addr);
    // @dev The version of the OAppReceiver implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant RECEIVER_VERSION = 2;
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    * @return receiverVersion The version of the OAppReceiver.sol contract.
    *
    * @dev Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented.
    * ie. this is a RECEIVE only OApp.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 5 of 47 : OAppSender.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { SafeERC20, IERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
    import { MessagingParams, MessagingFee, MessagingReceipt } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    import { OAppCore } from "./OAppCore.sol";
    /**
    * @title OAppSender
    * @dev Abstract contract implementing the OAppSender functionality for sending messages to a LayerZero endpoint.
    */
    abstract contract OAppSender is OAppCore {
    using SafeERC20 for IERC20;
    // Custom error messages
    error NotEnoughNative(uint256 msgValue);
    error LzTokenUnavailable();
    // @dev The version of the OAppSender implementation.
    // @dev Version is bumped when changes are made to this contract.
    uint64 internal constant SENDER_VERSION = 1;
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 6 of 47 : IOAppCore.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
    /**
    * @title IOAppCore
    */
    interface IOAppCore {
    // Custom error messages
    error OnlyPeer(uint32 eid, bytes32 sender);
    error NoPeer(uint32 eid);
    error InvalidEndpointCall();
    error InvalidDelegate();
    // Event emitted when a peer (OApp) is set for a corresponding endpoint
    event PeerSet(uint32 eid, bytes32 peer);
    /**
    * @notice Retrieves the OApp version information.
    * @return senderVersion The version of the OAppSender.sol contract.
    * @return receiverVersion The version of the OAppReceiver.sol contract.
    */
    function oAppVersion() external view returns (uint64 senderVersion, uint64 receiverVersion);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 7 of 47 : IOAppReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { ILayerZeroReceiver, Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroReceiver.sol";
    interface IOAppReceiver is ILayerZeroReceiver {
    /**
    * @notice Indicates whether an address is an approved composeMsg sender to the Endpoint.
    * @param _origin The origin information containing the source endpoint and sender address.
    * - srcEid: The source chain endpoint ID.
    * - sender: The sender address on the src chain.
    * - nonce: The nonce of the message.
    * @param _message The lzReceive payload.
    * @param _sender The sender address.
    * @return isSender Is a valid sender.
    *
    * @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.
    * @dev The default sender IS the OAppReceiver implementer.
    */
    function isComposeMsgSender(
    Origin calldata _origin,
    bytes calldata _message,
    address _sender
    ) external view returns (bool isSender);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 8 of 47 : IOFT.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    import { MessagingReceipt, MessagingFee } from "../../oapp/OAppSender.sol";
    /**
    * @dev Struct representing token parameters for the OFT send() operation.
    */
    struct SendParam {
    uint32 dstEid; // Destination endpoint ID.
    bytes32 to; // Recipient address.
    uint256 amountLD; // Amount to send in local decimals.
    uint256 minAmountLD; // Minimum amount to send in local decimals.
    bytes extraOptions; // Additional options supplied by the caller to be used in the LayerZero message.
    bytes composeMsg; // The composed message for the send() operation.
    bytes oftCmd; // The OFT command to be executed, unused in default OFT implementations.
    }
    /**
    * @dev Struct representing OFT limit information.
    * @dev These amounts can change dynamically and are up the the specific oft implementation.
    */
    struct OFTLimit {
    uint256 minAmountLD; // Minimum amount in local decimals that can be sent to the recipient.
    uint256 maxAmountLD; // Maximum amount in local decimals that can be sent to the recipient.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 9 of 47 : OFTComposeMsgCodec.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.20;
    library OFTComposeMsgCodec {
    // Offset constants for decoding composed messages
    uint8 private constant NONCE_OFFSET = 8;
    uint8 private constant SRC_EID_OFFSET = 12;
    uint8 private constant AMOUNT_LD_OFFSET = 44;
    uint8 private constant COMPOSE_FROM_OFFSET = 76;
    /**
    * @dev Encodes a OFT composed message.
    * @param _nonce The nonce value.
    * @param _srcEid The source endpoint ID.
    * @param _amountLD The amount in local decimals.
    * @param _composeMsg The composed message.
    * @return _msg The encoded Composed message.
    */
    function encode(
    uint64 _nonce,
    uint32 _srcEid,
    uint256 _amountLD,
    bytes memory _composeMsg // 0x[composeFrom][composeMsg]
    ) internal pure returns (bytes memory _msg) {
    _msg = abi.encodePacked(_nonce, _srcEid, _amountLD, _composeMsg);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 10 of 47 : ILayerZeroEndpointV2.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { IMessageLibManager } from "./IMessageLibManager.sol";
    import { IMessagingComposer } from "./IMessagingComposer.sol";
    import { IMessagingChannel } from "./IMessagingChannel.sol";
    import { IMessagingContext } from "./IMessagingContext.sol";
    struct MessagingParams {
    uint32 dstEid;
    bytes32 receiver;
    bytes message;
    bytes options;
    bool payInLzToken;
    }
    struct MessagingReceipt {
    bytes32 guid;
    uint64 nonce;
    MessagingFee fee;
    }
    struct MessagingFee {
    uint256 nativeFee;
    uint256 lzTokenFee;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 11 of 47 : ILayerZeroReceiver.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    import { Origin } from "./ILayerZeroEndpointV2.sol";
    interface ILayerZeroReceiver {
    function allowInitializePath(Origin calldata _origin) external view returns (bool);
    // todo: move to OAppReceiver? it is just convention for executor. we may can change it in a new Receiver version
    function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);
    function lzReceive(
    Origin calldata _origin,
    bytes32 _guid,
    bytes calldata _message,
    address _executor,
    bytes calldata _extraData
    ) external payable;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 12 of 47 : IMessageLibManager.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    struct SetConfigParam {
    uint32 eid;
    uint32 configType;
    bytes config;
    }
    interface IMessageLibManager {
    struct Timeout {
    address lib;
    uint256 expiry;
    }
    event LibraryRegistered(address newLib);
    event DefaultSendLibrarySet(uint32 eid, address newLib);
    event DefaultReceiveLibrarySet(uint32 eid, address oldLib, address newLib);
    event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);
    event SendLibrarySet(address sender, uint32 eid, address newLib);
    event ReceiveLibrarySet(address receiver, uint32 eid, address oldLib, address newLib);
    event ReceiveLibraryTimeoutSet(address receiver, uint32 eid, address oldLib, uint256 timeout);
    function registerLibrary(address _lib) external;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 13 of 47 : IMessagingChannel.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingChannel {
    event InboundNonceSkipped(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce);
    event PacketNilified(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    event PacketBurnt(uint32 srcEid, bytes32 sender, address receiver, uint64 nonce, bytes32 payloadHash);
    function eid() external view returns (uint32);
    // this is an emergency function if a message cannot be verified for some reasons
    // required to provide _nextNonce to avoid race condition
    function skip(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce) external;
    function nilify(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function burn(address _oapp, uint32 _srcEid, bytes32 _sender, uint64 _nonce, bytes32 _payloadHash) external;
    function nextGuid(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (bytes32);
    function inboundNonce(address _receiver, uint32 _srcEid, bytes32 _sender) external view returns (uint64);
    function outboundNonce(address _sender, uint32 _dstEid, bytes32 _receiver) external view returns (uint64);
    function inboundPayloadHash(
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 14 of 47 : IMessagingComposer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingComposer {
    event ComposeSent(address from, address to, bytes32 guid, uint16 index, bytes message);
    event ComposeDelivered(address from, address to, bytes32 guid, uint16 index);
    event LzComposeAlert(
    address indexed from,
    address indexed to,
    address indexed executor,
    bytes32 guid,
    uint16 index,
    uint256 gas,
    uint256 value,
    bytes message,
    bytes extraData,
    bytes reason
    );
    function composeQueue(
    address _from,
    address _to,
    bytes32 _guid,
    uint16 _index
    ) external view returns (bytes32 messageHash);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 15 of 47 : IMessagingContext.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.8.0;
    interface IMessagingContext {
    function isSendingMessage() external view returns (bool);
    function getSendContext() external view returns (uint32 dstEid, address sender);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 16 of 47 : Ownable.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
    pragma solidity ^0.8.0;
    import "../utils/Context.sol";
    /**
    * @dev Contract module which provides a basic access control mechanism, where
    * there is an account (an owner) that can be granted exclusive access to
    * specific functions.
    *
    * By default, the owner account will be the one that deploys the contract. This
    * can later be changed with {transferOwnership}.
    *
    * This module is used through inheritance. It will make available the modifier
    * `onlyOwner`, which can be applied to your functions to restrict their use to
    * the owner.
    */
    abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
    * @dev Initializes the contract setting the deployer as the initial owner.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 17 of 47 : IERC5267.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)
    pragma solidity ^0.8.0;
    interface IERC5267 {
    /**
    * @dev MAY be emitted to signal that the domain could have changed.
    */
    event EIP712DomainChanged();
    /**
    * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
    * signature.
    */
    function eip712Domain()
    external
    view
    returns (
    bytes1 fields,
    string memory name,
    string memory version,
    uint256 chainId,
    address verifyingContract,
    bytes32 salt,
    uint256[] memory extensions
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 18 of 47 : ERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)
    pragma solidity ^0.8.0;
    import "./IERC20.sol";
    import "./extensions/IERC20Metadata.sol";
    import "../../utils/Context.sol";
    /**
    * @dev Implementation of the {IERC20} interface.
    *
    * This implementation is agnostic to the way tokens are created. This means
    * that a supply mechanism has to be added in a derived contract using {_mint}.
    * For a generic mechanism see {ERC20PresetMinterPauser}.
    *
    * TIP: For a detailed writeup see our guide
    * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
    * to implement supply mechanisms].
    *
    * The default value of {decimals} is 18. To change this, you should override
    * this function so it returns a different value.
    *
    * We have followed general OpenZeppelin Contracts guidelines: functions revert
    * instead returning `false` on failure. This behavior is nonetheless
    * conventional and does not conflict with the expectations of ERC20
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 19 of 47 : IERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Interface of the ERC20 standard as defined in the EIP.
    */
    interface IERC20 {
    /**
    * @dev Emitted when `value` tokens are moved from one account (`from`) to
    * another (`to`).
    *
    * Note that `value` may be zero.
    */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
    * @dev Emitted when the allowance of a `spender` for an `owner` is set by
    * a call to {approve}. `value` is the new allowance.
    */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
    * @dev Returns the amount of tokens in existence.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 20 of 47 : ERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/ERC20Permit.sol)
    pragma solidity ^0.8.0;
    import "./IERC20Permit.sol";
    import "../ERC20.sol";
    import "../../../utils/cryptography/ECDSA.sol";
    import "../../../utils/cryptography/EIP712.sol";
    import "../../../utils/Counters.sol";
    /**
    * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    *
    * _Available since v3.4._
    */
    abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;
    mapping(address => Counters.Counter) private _nonces;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 21 of 47 : IERC20Metadata.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
    pragma solidity ^0.8.0;
    import "../IERC20.sol";
    /**
    * @dev Interface for the optional metadata functions from the ERC20 standard.
    *
    * _Available since v4.1._
    */
    interface IERC20Metadata is IERC20 {
    /**
    * @dev Returns the name of the token.
    */
    function name() external view returns (string memory);
    /**
    * @dev Returns the symbol of the token.
    */
    function symbol() external view returns (string memory);
    /**
    * @dev Returns the decimals places of the token.
    */
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 22 of 47 : IERC20Permit.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
    * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
    *
    * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
    * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
    * need to send a transaction, and thus is not required to hold Ether at all.
    *
    * ==== Security Considerations
    *
    * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
    * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
    * considered as an intention to spend the allowance in any specific way. The second is that because permits have
    * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
    * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
    * generally recommended is:
    *
    * ```solidity
    * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
    * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
    * doThing(..., value);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 23 of 47 : SafeERC20.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
    pragma solidity ^0.8.0;
    import "../IERC20.sol";
    import "../extensions/IERC20Permit.sol";
    import "../../../utils/Address.sol";
    /**
    * @title SafeERC20
    * @dev Wrappers around ERC20 operations that throw on failure (when the token
    * contract returns false). Tokens that return no value (and instead revert or
    * throw on failure) are also supported, non-reverting calls are assumed to be
    * successful.
    * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
    * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
    */
    library SafeERC20 {
    using Address for address;
    /**
    * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
    * non-reverting calls are assumed to be successful.
    */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 24 of 47 : Address.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
    pragma solidity ^0.8.1;
    /**
    * @dev Collection of functions related to the address type
    */
    library Address {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    * - an externally-owned account
    * - a contract in construction
    * - an address where a contract will be created
    * - an address where a contract lived, but was destroyed
    *
    * Furthermore, `isContract` will also return true if the target contract within
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 25 of 47 : Context.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Provides information about the current execution context, including the
    * sender of the transaction and its data. While these are generally available
    * via msg.sender and msg.data, they should not be accessed in such a direct
    * manner, since when dealing with meta-transactions the account sending and
    * paying for execution may not be the actual sender (as far as an application
    * is concerned).
    *
    * This contract is only required for intermediate, library-like contracts.
    */
    abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
    return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
    return msg.data;
    }
    function _contextSuffixLength() internal view virtual returns (uint256) {
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 26 of 47 : Counters.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
    pragma solidity ^0.8.0;
    /**
    * @title Counters
    * @author Matt Condon (@shrugs)
    * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
    * of elements in a mapping, issuing ERC721 ids, or counting request ids.
    *
    * Include with `using Counters for Counters.Counter;`
    */
    library Counters {
    struct Counter {
    // This variable should never be directly accessed by users of the library: interactions must be restricted to
    // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
    // this feature: see https://github.com/ethereum/solidity/issues/4637
    uint256 _value; // default: 0
    }
    function current(Counter storage counter) internal view returns (uint256) {
    return counter._value;
    }
    function increment(Counter storage counter) internal {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 27 of 47 : ShortStrings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)
    pragma solidity ^0.8.8;
    import "./StorageSlot.sol";
    // | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
    // | length | 0x BB |
    type ShortString is bytes32;
    /**
    * @dev This library provides functions to convert short memory strings
    * into a `ShortString` type that can be used as an immutable variable.
    *
    * Strings of arbitrary length can be optimized using this library if
    * they are short enough (up to 31 bytes) by packing them with their
    * length (1 byte) in a single EVM word (32 bytes). Additionally, a
    * fallback mechanism can be used for every other case.
    *
    * Usage example:
    *
    * ```solidity
    * contract Named {
    * using ShortStrings for *;
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 28 of 47 : StorageSlot.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
    // This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
    pragma solidity ^0.8.0;
    /**
    * @dev Library for reading and writing primitive types to specific storage slots.
    *
    * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
    * This library helps with reading and writing to such slots without the need for inline assembly.
    *
    * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
    *
    * Example usage to set ERC1967 implementation slot:
    * ```solidity
    * contract ERC1967 {
    * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
    *
    * function _getImplementation() internal view returns (address) {
    * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    * }
    *
    * function _setImplementation(address newImplementation) internal {
    * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
    * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 29 of 47 : Strings.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
    pragma solidity ^0.8.0;
    import "./math/Math.sol";
    import "./math/SignedMath.sol";
    /**
    * @dev String operations.
    */
    library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;
    /**
    * @dev Converts a `uint256` to its ASCII `string` decimal representation.
    */
    function toString(uint256 value) internal pure returns (string memory) {
    unchecked {
    uint256 length = Math.log10(value) + 1;
    string memory buffer = new string(length);
    uint256 ptr;
    /// @solidity memory-safe-assembly
    assembly {
    ptr := add(buffer, add(32, length))
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 30 of 47 : ECDSA.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)
    pragma solidity ^0.8.0;
    import "../Strings.sol";
    /**
    * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
    *
    * These functions can be used to verify that a message was signed by the holder
    * of the private keys of a given address.
    */
    library ECDSA {
    enum RecoverError {
    NoError,
    InvalidSignature,
    InvalidSignatureLength,
    InvalidSignatureS,
    InvalidSignatureV // Deprecated in v4.8
    }
    function _throwError(RecoverError error) private pure {
    if (error == RecoverError.NoError) {
    return; // no error: do nothing
    } else if (error == RecoverError.InvalidSignature) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 31 of 47 : EIP712.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)
    pragma solidity ^0.8.8;
    import "./ECDSA.sol";
    import "../ShortStrings.sol";
    import "../../interfaces/IERC5267.sol";
    /**
    * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
    *
    * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
    * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
    * they need in their contracts using a combination of `abi.encode` and `keccak256`.
    *
    * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
    * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
    * ({_hashTypedDataV4}).
    *
    * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
    * the chain id to protect against replay attacks on an eventual fork of the chain.
    *
    * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
    * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 32 of 47 : Math.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Standard math utilities missing in the Solidity language.
    */
    library Math {
    enum Rounding {
    Down, // Toward negative infinity
    Up, // Toward infinity
    Zero // Toward zero
    }
    /**
    * @dev Returns the largest of two numbers.
    */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a > b ? a : b;
    }
    /**
    * @dev Returns the smallest of two numbers.
    */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 33 of 47 : SafeCast.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)
    // This file was procedurally generated from scripts/generate/templates/SafeCast.js.
    pragma solidity ^0.8.0;
    /**
    * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
    * checks.
    *
    * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
    * easily result in undesired exploitation or bugs, since developers usually
    * assume that overflows raise errors. `SafeCast` restores this intuition by
    * reverting the transaction when such 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.
    *
    * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
    * all math on `uint256` and `int256` and then downcasting.
    */
    library SafeCast {
    /**
    * @dev Returns the downcasted uint248 from uint256, reverting on
    * overflow (when the input is greater than largest uint248).
    *
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 34 of 47 : SignedMath.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
    pragma solidity ^0.8.0;
    /**
    * @dev Standard signed math utilities missing in the Solidity language.
    */
    library SignedMath {
    /**
    * @dev Returns the largest of two signed numbers.
    */
    function max(int256 a, int256 b) internal pure returns (int256) {
    return a > b ? a : b;
    }
    /**
    * @dev Returns the smallest of two signed numbers.
    */
    function min(int256 a, int256 b) internal pure returns (int256) {
    return a < b ? a : b;
    }
    /**
    * @dev Returns the average of two signed numbers without overflow.
    * The result is rounded towards zero.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 35 of 47 : StargateBase.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol";
    import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/interfaces/IOAppCore.sol";
    import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol";
    // Solidity does not support splitting import across multiple lines
    // solhint-disable-next-line max-line-length
    import { OFTLimit, OFTFeeDetail, OFTReceipt, SendParam, MessagingReceipt, MessagingFee, IOFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft
        /interfaces/IOFT.sol";
    import { OFTComposeMsgCodec } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/libs/OFTComposeMsgCodec.sol";
    import { IStargate, Ticket } from "./interfaces/IStargate.sol";
    import { IStargateFeeLib, FeeParams } from "./interfaces/IStargateFeeLib.sol";
    import { ITokenMessaging, RideBusParams, TaxiParams } from "./interfaces/ITokenMessaging.sol";
    import { ITokenMessagingHandler } from "./interfaces/ITokenMessagingHandler.sol";
    import { ICreditMessagingHandler, Credit, TargetCredit } from "./interfaces/ICreditMessagingHandler.sol";
    import { Path } from "./libs/Path.sol";
    import { Transfer } from "./libs/Transfer.sol";
    /// @title The base contract for StargateOFT, StargatePool, StargatePoolMigratable, and StargatePoolNative.
    abstract contract StargateBase is Transfer, IStargate, ITokenMessagingHandler, ICreditMessagingHandler {
    using SafeCast for uint256;
    // Stargate status
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 36 of 47 : StargatePool.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import { StargateType, MessagingReceipt, MessagingFee, SendParam, OFTReceipt } from "./interfaces/IStargate.sol";
    import { IStargatePool } from "./interfaces/IStargatePool.sol";
    import { ITokenMessaging, TaxiParams } from "./interfaces/ITokenMessaging.sol";
    import { Transfer } from "./libs/Transfer.sol";
    import { StargateBase, FeeParams } from "./StargateBase.sol";
    import { LPToken } from "./utils/LPToken.sol";
    /// @title A Stargate contract representing a liquidity pool. Users can deposit tokens into the pool and receive
    /// @title LP tokens in exchange, which can be later be redeemed to recover their deposit and a reward which is
    /// @title a fraction of the fee accrued by the liquidity pool during the staking time.
    contract StargatePool is StargateBase, IStargatePool {
    LPToken internal immutable lp;
    uint64 internal tvlSD;
    uint64 internal poolBalanceSD;
    uint64 internal deficitOffsetSD;
    event Deposited(address indexed payer, address indexed receiver, uint256 amountLD);
    event Redeemed(address indexed payer, address indexed receiver, uint256 amountLD);
    error Stargate_OnlyTaxi();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 37 of 47 : IBridgedUSDCMinter.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    /// @title Interface for Bridge USDC
    /// @dev https://github.com/circlefin/stablecoin-evm/blob/master/contracts/v1/FiatTokenV1.sol
    interface IBridgedUSDCMinter {
    function mint(address _to, uint256 _amount) external returns (bool);
    function burn(uint256 _amount) external;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 38 of 47 : ICreditMessaging.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    import { MessagingFee } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol";
    /// @notice Stores the information related to a batch of credit transfers.
    struct TargetCreditBatch {
    uint16 assetId;
    TargetCredit[] credits;
    }
    /// @notice Stores the information related to a single credit transfer.
    struct TargetCredit {
    uint32 srcEid;
    uint64 amount; // the amount of credits to intended to send
    uint64 minAmount; // the minimum amount of credits to keep on local chain after sending
    }
    /// @title Credit Messaging API
    /// @dev This interface defines the API for quoting and sending credits to other chains.
    interface ICreditMessaging {
    /// @notice Sends credits to the destination endpoint.
    /// @param _dstEid The destination LayerZero endpoint ID.
    /// @param _creditBatches The credit batch payloads to send to the destination LayerZero endpoint ID.
    function sendCredits(uint32 _dstEid, TargetCreditBatch[] calldata _creditBatches) external payable;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 39 of 47 : ICreditMessagingHandler.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    import { TargetCredit } from "./ICreditMessaging.sol";
    struct Credit {
    uint32 srcEid;
    uint64 amount;
    }
    /// @dev This is an internal interface, defining functions to handle messages/calls from the credit messaging contract.
    interface ICreditMessagingHandler {
    function sendCredits(uint32 _dstEid, TargetCredit[] calldata _credits) external returns (Credit[] memory);
    function receiveCredits(uint32 _srcEid, Credit[] calldata _credits) external;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 40 of 47 : IStargate.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    // Solidity does not support splitting import across multiple lines
    // solhint-disable-next-line max-line-length
    import { IOFT, SendParam, MessagingFee, MessagingReceipt, OFTReceipt } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol";
    /// @notice Stargate implementation type.
    enum StargateType {
    Pool,
    OFT
    }
    /// @notice Ticket data for bus ride.
    struct Ticket {
    uint72 ticketId;
    bytes passengerBytes;
    }
    /// @title Interface for Stargate.
    /// @notice Defines an API for sending tokens to destination chains.
    interface IStargate is IOFT {
    /// @dev This function is same as `send` in OFT interface but returns the ticket data if in the bus ride mode,
    /// which allows the caller to ride and drive the bus in the same transaction.
    function sendToken(
    SendParam calldata _sendParam,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 41 of 47 : IStargateFeeLib.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    /// @notice Parameters used to assess fees to send tokens to a destination endpoint.
    struct FeeParams {
    address sender;
    uint32 dstEid;
    uint64 amountInSD;
    uint64 deficitSD;
    bool toOFT;
    bool isTaxi;
    }
    /// @title Interface for assessing fees to send tokens to a destination endpoint.
    interface IStargateFeeLib {
    /// @notice Apply a fee for a given request, allowing for state modification.
    /// @dev This is included for future proofing potential implementations
    /// @dev where state is modified in the feeLib based on a FeeParams
    function applyFee(FeeParams calldata _params) external returns (uint64 amountOutSD);
    /// @notice Apply a fee for a given request, without modifying state.
    function applyFeeView(FeeParams calldata _params) external view returns (uint64 amountOutSD);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 42 of 47 : IStargatePool.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    import { IStargate, SendParam, MessagingReceipt, MessagingFee, OFTReceipt } from "./IStargate.sol";
    /// @title An interface for Stargate Pools
    /// @notice Stargate Pools are a type of IStargate that allows users to pool token liquidity.
    interface IStargatePool is IStargate {
    /// @notice Deposit token into the pool
    /// @param _receiver The account to mint the LP tokens to
    /// @param _amountLD The amount of tokens to deposit in LD
    /// @return amountLD The actual amount of tokens deposited in LD
    function deposit(address _receiver, uint256 _amountLD) external payable returns (uint256 amountLD);
    /// @notice Redeem an amount of LP tokens from the senders account, claiming rewards.
    /// @param _amountLD The amount of LP tokens to redeem
    /// @param _receiver The account to transfer the
    function redeem(uint256 _amountLD, address _receiver) external returns (uint256 amountLD);
    /// @notice Get how many LP tokens are redeemable for a given account
    /// @param _owner The address of the account to check
    /// @return amountLD The amount of LP tokens redeemable, in LD
    function redeemable(address _owner) external view returns (uint256 amountLD);
    /// @notice Redeem LP tokens and send the withdrawn tokens to a destination endpoint.
    /// @param _sendParam The SendParam payload describing the redeem and send
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 43 of 47 : ITokenMessaging.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    import { MessagingReceipt, MessagingFee, Ticket } from "./IStargate.sol";
    /// @notice Payload for sending a taxi message.
    /// @dev A taxi message is sent immediately and is not stored on the bus.
    struct TaxiParams {
    address sender;
    uint32 dstEid;
    bytes32 receiver;
    uint64 amountSD;
    bytes composeMsg;
    bytes extraOptions;
    }
    /// @notice Payload for riding the bus.
    /// @dev Riding the bus is a two-step process:
    /// @dev - The message is sent to the bus,
    /// @dev - The bus is driven to the destination.
    struct RideBusParams {
    address sender;
    uint32 dstEid;
    bytes32 receiver;
    uint64 amountSD;
    bool nativeDrop;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 44 of 47 : ITokenMessagingHandler.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.0;
    import { Origin } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oapp/OApp.sol";
    /// @dev This is an internal interface, defining the function to handle token message from the token messaging contract.
    interface ITokenMessagingHandler {
    function receiveTokenBus(
    Origin calldata _origin,
    bytes32 _guid,
    uint8 _seatNumber,
    address _receiver,
    uint64 _amountSD
    ) external;
    function receiveTokenTaxi(
    Origin calldata _origin,
    bytes32 _guid,
    address _receiver,
    uint64 _amountSD,
    bytes calldata _composeMsg
    ) external;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 45 of 47 : Path.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    /// @dev The Path struct contains the bus base fare multiplier bps and the credit in the same slot for gas saving.
    struct Path {
    uint64 credit; // available credit for the path, in SD
    }
    using PathLib for Path global;
    /**
    * @title A library to operate on Paths.
    * @dev A Path is a route through which value can be sent. It entails the local chain and a destination chain, and has
    * a given amount of credit associated with it. Every time the value is sent from A to B, the credit on A is
    * decreased and credit on B is increased. If credit hits 0 then the path can no longer be used.
    */
    library PathLib {
    uint64 internal constant UNLIMITED_CREDIT = type(uint64).max;
    // solhint-disable-next-line event-name-camelcase
    event Path_CreditBurned(uint64 amountSD);
    error Path_InsufficientCredit();
    error Path_AlreadyHasCredit();
    error Path_UnlimitedCredit();
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 46 of 47 : Transfer.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
    import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
    /// @dev WARNING: Transferring tokens, when the token address is wrong, will fail silently.
    contract Transfer is Ownable {
    error Transfer_TransferFailed();
    error Transfer_ApproveFailed();
    // @dev default this to 2300, but it is modifiable
    // @dev this is intended to provide just enough gas to receive native tokens.
    // @dev ie. empty fallbacks or EOA addresses
    uint256 internal transferGasLimit = 2300;
    function getTransferGasLimit() external view returns (uint256) {
    return transferGasLimit;
    }
    function setTransferGasLimit(uint256 _gasLimit) external onlyOwner {
    transferGasLimit = _gasLimit;
    }
    /// @notice Transfer native coin to an account
    /// @dev If gas is unlimited, we pass 63/64 of the gasleft()
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    File 47 of 47 : LPToken.sol
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // SPDX-License-Identifier: BUSL-1.1
    pragma solidity ^0.8.22;
    import { ERC20Permit, ERC20 } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
    /// @title A contract representing an ERC20Permit used for representing liquidity pool ownership.
    contract LPToken is ERC20Permit {
    address public immutable stargate;
    uint8 internal immutable tokenDecimals;
    error LPToken_Unauthorized();
    modifier onlyStargate() {
    if (msg.sender != stargate) revert LPToken_Unauthorized();
    _;
    }
    /**
    * @notice Create a LP token to represent partial pool ownership.
    * @dev The sender of the message is set to the Stargate role. This is because it is expected that each
    * StargatePool will create its own LPToken.
    * @param _name The name of the ERC20
    * @param _symbol The symbol for the ERC20
    * @param _decimals How many decimals does the ERC20 has
    */
    constructor(string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol) ERC20Permit(_name) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Settings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "evmVersion": "paris",
    "optimizer": {
    "enabled": true,
    "runs": 5000
    },
    "outputSelection": {
    "*": {
    "*": [
    "evm.bytecode",
    "evm.deployedBytecode",
    "devdoc",
    "userdoc",
    "metadata",
    "abi"
    ]
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Contract Security Audit

    Contract ABI

    API
    [{"inputs":[{"internalType":"string","name":"_lpTokenName","type":"string"},{"internalType":"string","name":"_lpTokenSymbol","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_tokenDecimals","type":"uint8"},{"internalType":"uint8","name":"_sharedDecimals","type":"uint8"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidLocalDecimals","type":"error"},{"inputs":[],"name":"Path_AlreadyHasCredit","type":"error"},{"inputs":[],"name":"Path_InsufficientCredit","type":"error"},{"inputs":[],"name":"Path_UnlimitedCredit","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"inputs":[],"name":"StargatePoolUSDC_BurnAmountExceedsBalance","type":"error"},{"inputs":[],"name":"Stargate_InsufficientFare","type":"error"},{"inputs":[],"name":"Stargate_InvalidAmount","type":"error"},{"inputs":[],"name":"Stargate_InvalidPath","type":"error"},{"inputs":[],"name":"Stargate_InvalidTokenDecimals","type":"error"},{"inputs":[],"name":"Stargate_LzTokenUnavailable","type":"error"},{"inputs":[],"name":"Stargate_OnlyTaxi","type":"error"},{"inputs":[],"name":"Stargate_OutflowFailed","type":"error"},{"inputs":[],"name":"Stargate_Paused","type":"error"},{"inputs":[],"name":"Stargate_RecoverTokenUnsupported","type":"error"},{"inputs":[],"name":"Stargate_ReentrantCall","type":"error"},{"inputs":[],"name":"Stargate_SlippageTooHigh","type":"error"},{"inputs":[],"name":"Stargate_Unauthorized","type":"error"},{"inputs":[],"name":"Stargate_UnreceivedTokenNotFound","type":"error"},{"inputs":[],"name":"Transfer_ApproveFailed","type":"error"},{"inputs":[],"name":"Transfer_TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"feeLib","type":"address"},{"internalType":"address","name":"planner","type":"address"},{"internalType":"address","name":"treasurer","type":"address"},{"internalType":"address","name":"tokenMessaging","type":"address"},{"internalType":"address","name":"creditMessaging","type":"address"},{"internalType":"address","name":"lzToken","type":"address"}],"indexed":false,"internalType":"struct StargateBase.AddressConfig","name":"config","type":"tuple"}],"name":"AddressConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"uint64","name":"amount","type":"uint64"}],"indexed":false,"internalType":"struct Credit[]","name":"credits","type":"tuple[]"}],"name":"CreditsReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"uint64","name":"amount","type":"uint64"}],"indexed":false,"internalType":"struct Credit[]","name":"credits","type":"tuple[]"}],"name":"CreditsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":false,"internalType":"bool","name":"oft","type":"bool"}],"name":"OFTPathSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"amountSD","type":"uint64"}],"name":"Path_CreditBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"PauseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PlannerFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"payer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"amountSD","type":"uint64"}],"name":"TreasuryFeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint64","name":"amountSD","type":"uint64"}],"name":"TreasuryFeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"index","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"srcEid","type":"uint32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"composeMsg","type":"bytes"}],"name":"UnreceivedTokenCached","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"addTreasuryFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnAdmin","type":"address"},{"internalType":"uint64","name":"_burnAllowanceSD","type":"uint64"}],"name":"allowBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"burnAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAllowanceSD","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnLockedUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deficitOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAddressConfig","outputs":[{"components":[{"internalType":"address","name":"feeLib","type":"address"},{"internalType":"address","name":"planner","type":"address"},{"internalType":"address","name":"treasurer","type":"address"},{"internalType":"address","name":"tokenMessaging","type":"address"},{"internalType":"address","name":"creditMessaging","type":"address"},{"internalType":"address","name":"lzToken","type":"address"}],"internalType":"struct StargateBase.AddressConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"localEid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oftVersion","outputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"uint64","name":"version","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"paths","outputs":[{"internalType":"uint64","name":"credit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"plannerFee","outputs":[{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"}],"name":"quoteOFT","outputs":[{"components":[{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"uint256","name":"maxAmountLD","type":"uint256"}],"internalType":"struct OFTLimit","name":"limit","type":"tuple"},{"components":[{"internalType":"int256","name":"feeAmountLD","type":"int256"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct OFTFeeDetail[]","name":"oftFeeDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"receipt","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteRedeemSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"uint64","name":"amount","type":"uint64"}],"internalType":"struct Credit[]","name":"_credits","type":"tuple[]"}],"name":"receiveCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint8","name":"_seatNumber","type":"uint8"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint64","name":"_amountSD","type":"uint64"}],"name":"receiveTokenBus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint64","name":"_amountSD","type":"uint64"},{"internalType":"bytes","name":"_composeMsg","type":"bytes"}],"name":"receiveTokenTaxi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"redeemSend","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"redeemable","outputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint32","name":"_srcEid","type":"uint32"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"internalType":"bytes","name":"_composeMsg","type":"bytes"}],"name":"retryReceiveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint64","name":"minAmount","type":"uint64"}],"internalType":"struct TargetCredit[]","name":"_credits","type":"tuple[]"}],"name":"sendCredits","outputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"uint64","name":"amount","type":"uint64"}],"internalType":"struct Credit[]","name":"","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"sendToken","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"},{"components":[{"internalType":"uint72","name":"ticketId","type":"uint72"},{"internalType":"bytes","name":"passengerBytes","type":"bytes"}],"internalType":"struct Ticket","name":"ticket","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"feeLib","type":"address"},{"internalType":"address","name":"planner","type":"address"},{"internalType":"address","name":"treasurer","type":"address"},{"internalType":"address","name":"tokenMessaging","type":"address"},{"internalType":"address","name":"creditMessaging","type":"address"},{"internalType":"address","name":"lzToken","type":"address"}],"internalType":"struct StargateBase.AddressConfig","name":"_config","type":"tuple"}],"name":"setAddressConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deficitOffsetLD","type":"uint256"}],"name":"setDeficitOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_dstEid","type":"uint32"},{"internalType":"bool","name":"_oft","type":"bool"}],"name":"setOFTPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasLimit","type":"uint256"}],"name":"setTransferGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stargateType","outputs":[{"internalType":"enum StargateType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"unreceivedTokens","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawPlannerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint64","name":"_amountSD","type":"uint64"}],"name":"withdrawTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

    6101406040526108fc6001556002805460ff60a01b1916600160a01b1790553480156200002b57600080fd5b5060405162007f2238038062007f228339810160408190526200004e9162000301565b8686868686868684848484846200006533620001a7565b6001600160a01b03851660805260ff80841690851610156200009a57604051632e4b554360e01b815260040160405180910390fd5b620000a68385620003de565b620000b390600a620004fd565b60c05260ff831660a0526001600160a01b03821660e08190526040805163416ecebf60e01b8152905163416ecebf916004808201926020929091908290030181865afa15801562000108573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012e919062000515565b63ffffffff16610100526200014381620001a7565b50505050508686856040516200015990620001f7565b62000167939291906200056b565b604051809103906000f08015801562000184573d6000803e3d6000fd5b506001600160a01b03166101205250620005a89c50505050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611c0f806200631383390190565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002385781810151838201526020016200021e565b50506000910152565b600082601f8301126200025357600080fd5b81516001600160401b038082111562000270576200027062000205565b604051601f8301601f19908116603f011681019082821181831017156200029b576200029b62000205565b81604052838152866020858801011115620002b557600080fd5b620002c88460208301602089016200021b565b9695505050505050565b80516001600160a01b0381168114620002ea57600080fd5b919050565b805160ff81168114620002ea57600080fd5b600080600080600080600060e0888a0312156200031d57600080fd5b87516001600160401b03808211156200033557600080fd5b620003438b838c0162000241565b985060208a01519150808211156200035a57600080fd5b50620003698a828b0162000241565b9650506200037a60408901620002d2565b94506200038a60608901620002ef565b93506200039a60808901620002ef565b9250620003aa60a08901620002d2565b9150620003ba60c08901620002d2565b905092959891949750929550565b634e487b7160e01b600052601160045260246000fd5b60ff8281168282160390811115620003fa57620003fa620003c8565b92915050565b600181815b8085111562000441578160001904821115620004255762000425620003c8565b808516156200043357918102915b93841c939080029062000405565b509250929050565b6000826200045a57506001620003fa565b816200046957506000620003fa565b81600181146200048257600281146200048d57620004ad565b6001915050620003fa565b60ff841115620004a157620004a1620003c8565b50506001821b620003fa565b5060208310610133831016604e8410600b8410161715620004d2575081810a620003fa565b620004de838362000400565b8060001904821115620004f557620004f5620003c8565b029392505050565b60006200050e60ff84168362000449565b9392505050565b6000602082840312156200052857600080fd5b815163ffffffff811681146200050e57600080fd5b60008151808452620005578160208601602086016200021b565b601f01601f19169290920160200192915050565b6060815260006200058060608301866200053d565b82810360208401526200059481866200053d565b91505060ff83166040830152949350505050565b60805160a05160c05160e0516101005161012051615c03620007106000396000818161070401528181612177015281816123350152818161255c0152612a3101526000818161076f01528181611bb101528181612289015281816126e5015281816127a40152818161298d01528181612cf90152613c1e0152600081816106bb01528181611697015281816130cd01526148ee0152600081816108d50152818161095f01528181610b0601528181610e3101528181610e9c01528181611094015281816111f801528181611295015281816112bf015281816115b801528181611d0a0152818161210a015281816122c4015281816124f90152818161287c015281816129ce01528181612c6701528181613389015281816134ae015281816134d8015281816137370152613aa901526000610819015260008181610b5b01528181612c9601528181612ecc015281816139c801528181613a8601526142ff0152615c036000f3fe6080604052600436106103135760003560e01c80637bde82f21161019a578063a88835d7116100e1578063cc32d1761161008a578063e5328e0611610064578063e5328e0614610ae7578063f2fde38b14610b29578063fc0c546a14610b4957600080fd5b8063cc32d17614610a4d578063d0f3bad114610a87578063d621ad3f14610aaf57600080fd5b8063c7c7f5b3116100bb578063c7c7f5b3146109f8578063c859c48314610a0b578063cbef2aa914610a2b57600080fd5b8063a88835d7146109a3578063b0d7ca5d146109c3578063bedb86fb146109d857600080fd5b80638da5cb5b116101435780639f68b9641161011d5780639f68b96414610911578063a7229fd91461092d578063a85dc7f21461094d57600080fd5b80638da5cb5b146108855780639561b12f146108a357806396365d44146108c357600080fd5b806388543f0e1161017457806388543f0e1461083b5780638a5e52bb146108505780638c70830b1461086557600080fd5b80637bde82f2146107c757806381bdf98c146107e7578063857749b01461080757600080fd5b80633faa12c51161025e5780635e280f1111610207578063715018a6116101e1578063715018a614610748578063726075371461075d578063764f6a78146107a657600080fd5b80635e280f11146106a95780635fcbd285146106f557806366fd482a1461072857600080fd5b806347e7ef241161023857806347e7ef2414610655578063484267a4146106765780635114bf091461069657600080fd5b80633faa12c5146105f5578063434def5514610615578063461bb0b91461063557600080fd5b8063200d2ed2116102c0578063341a46481161029a578063341a46481461057257806338da6b8e146105855780633b6f743b146105d557600080fd5b8063200d2ed214610429578063203bd15f1461045c5780632bc5114c1461047c57600080fd5b8063156a0d0f116102f1578063156a0d0f1461039f57806316909bca146103e0578063192adc5d146103fc57600080fd5b80630141e41b146103185780630d35b4151461034e57806313bc4bc71461037d575b600080fd5b34801561032457600080fd5b50610338610333366004614ab9565b610b7d565b6040516103459190614b96565b60405180910390f35b34801561035a57600080fd5b5061036e610369366004614bbb565b610df1565b60405161034593929190614c40565b34801561038957600080fd5b5061039d610398366004614cf7565b6112f7565b005b3480156103ab57600080fd5b50604080517f02e49c2c0000000000000000000000000000000000000000000000000000000081526000602082015201610345565b3480156103ec57600080fd5b5060006040516103459190614d10565b34801561040857600080fd5b5061041c610417366004614d5f565b611358565b6040516103459190614db1565b34801561043557600080fd5b5060025461044a90600160a01b900460ff1681565b60405160ff9091168152602001610345565b34801561046857600080fd5b5061039d610477366004614e49565b611529565b34801561048857600080fd5b506105116040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526002546001600160a01b03908116825260055481166020830152600754811692820192909252600654821660608201526003548216608082015260045490911660a082015290565b6040516103459190600060c0820190506001600160a01b038084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b61039d610580366004614cf7565b611820565b34801561059157600080fd5b506105bc6105a0366004614ecb565b60086020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610345565b3480156105e157600080fd5b5061041c6105f0366004614d5f565b6118fa565b34801561060157600080fd5b5061039d610610366004614ee6565b611ba7565b34801561062157600080fd5b5061039d610630366004614f23565b611c7b565b34801561064157600080fd5b5061039d610650366004614f86565b611ee1565b610668610663366004614f98565b61208f565b604051908152602001610345565b34801561068257600080fd5b50610668610691366004614fc2565b612282565b3480156106a257600080fd5b5047610668565b3480156106b557600080fd5b506106dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610345565b34801561070157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006106dd565b34801561073457600080fd5b5061039d610743366004614fdd565b6123c2565b34801561075457600080fd5b5061039d612418565b34801561076957600080fd5b506107917f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610345565b6107b96107b4366004615009565b61242c565b6040516103459291906150a7565b3480156107d357600080fd5b506106686107e23660046150cb565b612922565b3480156107f357600080fd5b50600b546106dd906001600160a01b031681565b34801561081357600080fd5b5061044a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561084757600080fd5b50600154610668565b34801561085c57600080fd5b5061039d612b2b565b34801561087157600080fd5b5061039d610880366004614cf7565b612d39565b34801561089157600080fd5b506000546001600160a01b03166106dd565b3480156108af57600080fd5b5061039d6108be3660046150f7565b612d46565b3480156108cf57600080fd5b50600a547f00000000000000000000000000000000000000000000000000000000000000006801000000000000000090910467ffffffffffffffff1602610668565b34801561091d57600080fd5b5060405160018152602001610345565b34801561093957600080fd5b5061066861094836600461516a565b612e9b565b34801561095957600080fd5b50600a547f000000000000000000000000000000000000000000000000000000000000000070010000000000000000000000000000000090910467ffffffffffffffff1602610668565b3480156109af57600080fd5b5061039d6109be3660046151a6565b612f89565b3480156109cf57600080fd5b5061039d6131a6565b3480156109e457600080fd5b5061039d6109f336600461522f565b61320f565b6107b9610a06366004615009565b6132ca565b348015610a1757600080fd5b5061039d610a26366004614fdd565b6132fe565b610a3e610a39366004615009565b6133f9565b6040516103459392919061524c565b348015610a5957600080fd5b506002546105bc907501000000000000000000000000000000000000000000900467ffffffffffffffff1681565b348015610a9357600080fd5b50600b546105bc90600160a01b900467ffffffffffffffff1681565b348015610abb57600080fd5b50610668610aca3660046152a7565b600960209081526000928352604080842090915290825290205481565b348015610af357600080fd5b50610668600a5467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b348015610b3557600080fd5b5061039d610b44366004614fc2565b6135ce565b348015610b5557600080fd5b506106dd7f000000000000000000000000000000000000000000000000000000000000000081565b600254606090600160a01b900460ff16600114610bf557600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6040517fdb22c33c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556003546001600160a01b0316338114610c3457604051635bd25eff60e01b815260040160405180910390fd5b60008367ffffffffffffffff811115610c4f57610c4f6152ca565b604051908082528060200260200182016040528015610c9457816020015b6040805180820190915260008082526020820152815260200190600190039081610c6d5790505b5090506000805b85811015610d965736878783818110610cb657610cb66152f9565b90506060020190506000610d20826020016020810190610cd69190615328565b610ce66060850160408601615328565b60086000610cf76020880188614ecb565b63ffffffff1663ffffffff16815260200190815260200160002061367a9092919063ffffffff16565b905067ffffffffffffffff811615610d8c576040805180820190915280610d4a6020850185614ecb565b63ffffffff16815267ffffffffffffffff83166020909101528585610d6e81615374565b965081518110610d8057610d806152f9565b60200260200101819052505b5050600101610c9b565b508082527fce105e156370093e6600169f7c01277f740d45fbcf95435227ce6f43ad0c3abd8783604051610dcb9291906153ac565b60405180910390a1509150506002805460ff60a01b1916600160a01b1790559392505050565b60408051808201909152600080825260208201526060610e24604051806040016040528060008152602001600081525090565b60408051808201909152807f00000000000000000000000000000000000000000000000000000000000000008152602001610ebf60086000886000016020810190610e6f9190614ecb565b63ffffffff16815260208101919091526040016000205467ffffffffffffffff1667ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b81525092506000610eec8460200151866040013511610ee2578560400135613730565b8460200151613730565b90506000610f1c610f006020880188614ecb565b83610f17610f1160c08b018b6153cb565b15919050565b613770565b600254604080517f81993cd000000000000000000000000000000000000000000000000000000000815283516001600160a01b039081166004830152602085015163ffffffff1660248301529184015167ffffffffffffffff9081166044830152606085015116606482015260808401511515608482015260a0840151151560a48201529293506000929116906381993cd09060c401602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190615430565b90508267ffffffffffffffff168167ffffffffffffffff161461127a5760408051600180825281830190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816110255790505094508267ffffffffffffffff168167ffffffffffffffff1610156111475760405180604001604052806110bc6110b78487611088919061544d565b67ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b613885565b6110e6907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61546e565b81526020016040518060400160405280600c81526020017f70726f746f636f6c20666565000000000000000000000000000000000000000081525081525085600081518110611137576111376152f9565b602002602001018190525061127a565b8267ffffffffffffffff168167ffffffffffffffff16111561127a57600061116f848361544d565b905061117b828261393b565b909250905067ffffffffffffffff808516908316036111da5760408051600080825260208201909252906111d2565b6040805180820190915260008152606060208201528152602001906001900390816111aa5790505b509550611278565b604051806040016040528061121b6110b78467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b81526020016040518060400160405280600681526020017f72657761726400000000000000000000000000000000000000000000000000008152508152508660008151811061126c5761126c6152f9565b60200260200101819052505b505b60405180604001604052806112b88567ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8416029052959794965050505050565b6005546001600160a01b031633811461132357604051635bd25eff60e01b815260040160405180910390fd5b61132c82613730565b600a60106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b604080518082019091526000808252602082015261137c610f1160c08501856153cb565b6113b2576040517f2d9560be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113c18460400135613730565b6006546040805160c081019091523381529192506001600160a01b031690633292cf02906020808201906113f790890189614ecb565b63ffffffff1681526020888101359082015267ffffffffffffffff8516604082015260600161142960a08901896153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161147060808901896153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526114e191908790600401615529565b6040805180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152191906155d7565b949350505050565b600254600160a01b900460ff1660011461156c57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556006546001600160a01b03163381146115ab57604051635bd25eff60e01b815260040160405180910390fd5b67ffffffffffffffff84167f0000000000000000000000000000000000000000000000000000000000000000028215801590606090611644576116416115f760608c0160408d01615328565b61160460208d018d614ecb565b8589898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398f92505050565b90505b600061165089856139c1565b9050801561176257611661886139ee565b8215611706576040517f7cb590120000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906116d3908c908e9060009088906004016155f3565b600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505050505b6001600160a01b0389168a7fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61173f60208f018f614ecb565b6040805163ffffffff9092168252602082018990520160405180910390a3611800565b61176f60208c018c614ecb565b8985846040516020016117859493929190615625565b60408051601f19818403018152918152815160209283012060008d8152600984528281208180528452918220557e7c17198cd078035dc663f9a0961f84cb6265411d0b4c793f96d432f6af4b55918c91906117e2908f018f614ecb565b8c88876040516117f7969594939291906156a3565b60405180910390a15b50506002805460ff60a01b1916600160a01b179055505050505050505050565b6007546001600160a01b031633811461184c57604051635bd25eff60e01b815260040160405180910390fd5b61185582613a3c565b60006118613384613a74565b905080600260158282829054906101000a900467ffffffffffffffff1661188891906156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa064a2faa279f4d67c85c8fc69d4ebb7de2739a9e6dd864dfdd1b9e066d4bfd0816040516118ed919067ffffffffffffffff91909116815260200190565b60405180910390a1505050565b6040805180820190915260008082526020820152600061191d8460400135613730565b90508067ffffffffffffffff16600003611963576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611975610f1160c08701876153cb565b90508015611ae3576006546040805160c081019091523381526001600160a01b0390911690633292cf02906020808201906119b2908a018a614ecb565b63ffffffff1681526020898101359082015267ffffffffffffffff861660408201526060016119e460a08a018a6153cb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611a2b60808a018a6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152611a9c91908890600401615529565b6040805180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adc91906155d7565b9250611b9f565b600080611af360808801886153cb565b60065492109250506001600160a01b03166375d2208c611b166020890189614ecb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff91909116600482015283151560248201526044016040805180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b91906155d7565b9350505b505092915050565b611baf613ad9565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168263ffffffff1603611c14576040517fada8342400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8083166000908152600860205260409020611c36918390613b4d16565b6040805163ffffffff8416815282151560208201527faf6b8dd4c5a827e03f548d06181b36aaba61e22436ff1cfa9bc409d576366a6091015b60405180910390a15050565b600254600160a01b900460ff16600114611cbe57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556006546001600160a01b0316338114611cfd57604051635bd25eff60e01b815260040160405180910390fd5b67ffffffffffffffff82167f0000000000000000000000000000000000000000000000000000000000000000026000611d3685836139c1565b90508015611da357611d47846139ee565b6001600160a01b038516877fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c611d8060208c018c614ecb565b6040805163ffffffff9092168252602082018790520160405180910390a3611ec4565b611db06020890189614ecb565b60405160e09190911b7fffffffff00000000000000000000000000000000000000000000000000000000166020820152606086901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660248201526038810183905260580160408051601f19818403018152918152815160209283012060008a81526009845282812060ff8b168252845291909120557e7c17198cd078035dc663f9a0961f84cb6265411d0b4c793f96d432f6af4b559088908890611e78908c018c614ecb565b6040805193845260ff909216602084015263ffffffff16908201526001600160a01b03871660608201526080810184905260c060a0820181905260009082015260e00160405180910390a15b50506002805460ff60a01b1916600160a01b179055505050505050565b611ee9613ad9565b611ef66020820182614fc2565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f336040820160208301614fc2565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f706060820160408301614fc2565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611fad6080820160608301614fc2565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611fea60a0820160808301614fc2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905561202760c0820160a08301614fc2565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040517f9774229668135b546675daf425e41c0848f60aa32d0951881245f4f528cc33f090612084908390615713565b60405180910390a150565b600254600090600160a01b900460ff166001146120d557600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556120f182613a3c565b60006120fd3384613a74565b905061210881613c17565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8216026040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018390529193507f0000000000000000000000000000000000000000000000000000000000000000909116906340c10f1990604401600060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b5050600a80548493509091506000906121f590849067ffffffffffffffff166156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001600160a01b0316336001600160a01b03167f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a78460405161226091815260200190565b60405180910390a3506002805460ff60a01b1916600160a01b17905592915050565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001660009081526008602052604081205467ffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000026001600160a01b0383166122fa578091506123b7565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561237e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a29190615792565b90508082116123b157816123b3565b805b9250505b50919050565b905090565b6123ca613ad9565b600b805467ffffffffffffffff909216600160a01b027fffffffff000000000000000000000000000000000000000000000000000000009092166001600160a01b0390931692909217179055565b612420613ad9565b61242a6000613c7e565b565b612434614a58565b6040805180820190915260008082526020820152600254600160a01b900460ff1660011461248b57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556124ae610f1160c08701876153cb565b6124e4576040517f2d9560be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006124f38660400135613730565b905060007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8316026040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379cc679090604401600060405180830381600087803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b5050604051838152600092503391507f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc9060200160405180910390a3600061261261260a60208a018a614ecb565b846001613770565b9050600061262c826126278b60600135613730565b613cdb565b600a8054919250859160009061264d90849067ffffffffffffffff1661544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506126b681600860008c600001602081019061268e9190614ecb565b63ffffffff1663ffffffff168152602001908152602001600020613f3990919063ffffffff16565b8067ffffffffffffffff168467ffffffffffffffff1611156127755760006126de828661544d565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600090815260086020526040902091925061272491908390613f3916565b80600a60088282829054906101000a900467ffffffffffffffff16612749919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050612830565b8067ffffffffffffffff168467ffffffffffffffff16101561283057600061279d858361544d565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660009081526008602052604090209192506127e391908390613fc716565b80600a60088282829054906101000a900467ffffffffffffffff1661280891906156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b600061284b612844368b90038b018b6157ab565b6000614061565b90506128598a82848b6140b6565b9650604051806040016040528085815260200161289f8467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b9052875190965033907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a6128d660208e018e614ecb565b60208a8101516040805163ffffffff90941684529183018a90529082015260600160405180910390a350506002805460ff60a01b1916600160a01b179055509296919550909350505050565b600254600090600160a01b900460ff1660011461296857600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b179055600061298684613730565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660009081526008602052604090209192506129cc91908390613f3916565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff8216026040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290529092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906379cc679090604401600060405180830381600087803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b5050600a8054849350909150600090612ab590849067ffffffffffffffff1661544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550612ae58383614245565b612aee816139ee565b6040518281526001600160a01b0384169033907f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc90602001612260565b600b546001600160a01b03163314612b5657604051635bd25eff60e01b815260040160405180910390fd5b600a54600b546801000000000000000090910467ffffffffffffffff908116600160a01b909204161115612bb6576040517f6e05a01a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b54600a805467ffffffffffffffff600160a01b909304831692839291600891612bf0918591680100000000000000009091041661544d565b825467ffffffffffffffff9182166101009390930a928302928202191691909117909155600b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1690556040517f42966c680000000000000000000000000000000000000000000000000000000081529083167f00000000000000000000000000000000000000000000000000000000000000000260048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691506342966c6890602401600060405180830381600087803b158015612cdb57600080fd5b505af1158015612cef573d6000803e3d6000fd5b50505063ffffffff7f000000000000000000000000000000000000000000000000000000000000000081166000908152600860205260409020612d36925090839061428a16565b50565b612d41613ad9565b600155565b600254600160a01b900460ff16600114612d8957600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556003546001600160a01b0316338114612dc857604051635bd25eff60e01b815260040160405180910390fd5b60005b82811015612e465736848483818110612de657612de66152f9565b9050604002019050612e3d816020016020810190612e049190615328565b60086000612e156020860186614ecb565b63ffffffff1663ffffffff168152602001908152602001600020613fc790919063ffffffff16565b50600101612dcb565b507f10c5f2b007767d266c6c75c86ae9ed0c74e6320b30bda231af7396a990e7263c848484604051612e7a939291906157dd565b60405180910390a150506002805460ff60a01b1916600160a01b1790555050565b6007546000906001600160a01b0316338114612eca57604051635bd25eff60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603612f7357600254600a54600091612f4c916110889167ffffffffffffffff7501000000000000000000000000000000000000000000909104811691680100000000000000009004166156f2565b612f546142ce565b612f5e9190615850565b9050808411612f6d5783612f6f565b805b9350505b612f7e858585614372565b91505b509392505050565b600254600160a01b900460ff16600114612fcc57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b179055604051612ff89086908690869086908690602001615863565b60408051601f19818403018152918152815160209283012060008a81526009845282812060ff8b1682529093529120541461305f576040517faba8b6ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600087815260096020908152604080832060ff8a1684529091528120556130868484614245565b61309761309284613730565b6139ee565b801561313e576040517f7cb590120000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb590129061310b9087908b90600090889088906004016158d5565b600060405180830381600087803b15801561312557600080fd5b505af1158015613139573d6000803e3d6000fd5b505050505b6040805163ffffffff87168152602081018590526001600160a01b0386169189917fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c910160405180910390a350506002805460ff60a01b1916600160a01b1790555050505050565b6005546001600160a01b03163381146131d257604051635bd25eff60e01b815260040160405180910390fd5b476131df3382600061445f565b6040518181527f19e23b96a5e0d494b59baca97d1fe386cf8e80a978dfd8845d25f1a9d5c7e18390602001611c6f565b6005546001600160a01b031633811461323b57604051635bd25eff60e01b815260040160405180910390fd5b600254600119600160a01b90910460ff160161326a576040516376a9ad7360e01b815260040160405180910390fd5b81613276576001613279565b60035b6002805460ff92909216600160a01b0260ff60a01b1990921691909117905560405182151581527f878ac8a2ca79520471f8f3c8494fa802c03ce3bf034252aad7f22318984fdbdb90602001611c6f565b6132d2614a58565b60408051808201909152600080825260208201526132f18585856133f9565b5090969095509350505050565b6007546001600160a01b031633811461332a57604051635bd25eff60e01b815260040160405180910390fd5b81600260158282829054906101000a900467ffffffffffffffff1661334f919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506133b1836133ac8467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b614245565b604080516001600160a01b038516815267ffffffffffffffff841660208201527fa46907b6b80b882da80d6e36cc905dde57fafff0a5442c8898526fe952d1e65391016118ed565b613401614a58565b6040805180820190915260008082526020820152604080518082019091526000815260606020820152600254600160a01b900460ff1660011461346d57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556000808061348d896144a0565b92509250925060405180604001604052806134d18467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000000290565b81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff84160290529450600061352261351b368b90038b018b6157ab565b8751614061565b9050831561353d576135368a82848b6140b6565b965061354f565b6135498a82848b61451a565b90975094505b865133907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a61358160208e018e614ecb565b89516020808c01516040805163ffffffff90951685529184019290925282015260600160405180910390a350506002805460ff60a01b1916600160a01b1790555092969195509350915050565b6135d6613ad9565b6001600160a01b038116613671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b612d3681613c7e565b825460009067ffffffffffffffff1667fffffffffffffffe1981016136cb576040517f5a5cc94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168367ffffffffffffffff161015612f815782810367ffffffffffffffff808216908616116137045784613706565b805b865467ffffffffffffffff8285031667ffffffffffffffff19909116178755925050509392505050565b600061376a7f0000000000000000000000000000000000000000000000000000000000000000838161376457613764615926565b04614716565b92915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600a546000906137d29067ffffffffffffffff7001000000000000000000000000000000008204811691166156f2565b600a5490915060009067ffffffffffffffff68010000000000000000909104811690831611613802576000613825565b600a546138259068010000000000000000900467ffffffffffffffff168361544d565b6040805160c08101825233815263ffffffff8916602080830182905267ffffffffffffffff8a811684860152948516606084015260009182526008905291909120548216909114608082015284151560a0820152925050505b9392505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115613937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160448201527f6e20696e743235360000000000000000000000000000000000000000000000006064820152608401613668565b5090565b600254600090819067ffffffffffffffff7501000000000000000000000000000000000000000000909104811690841681101561398057838503810192509050613988565b848492509250505b9250929050565b6060848484846040516020016139a89493929190615955565b6040516020818303038152906040529050949350505050565b600061387e7f000000000000000000000000000000000000000000000000000000000000000084846147b0565b80600a60088282829054906101000a900467ffffffffffffffff16613a13919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b3415612d36576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613a7f82613730565b905061376a7f000000000000000000000000000000000000000000000000000000000000000084307f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff86160261485c565b6000546001600160a01b0316331461242a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613668565b815467ffffffffffffffff168115613bbf5767ffffffffffffffff811615613ba1576040517fca2bc39800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191667ffffffffffffffff178355505050565b67ffffffffffffffff81811614613c02576040517fca2bc39800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191683555b505050565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000081166000908152600860205260409020613c59918390613fc716565b80600a60088282829054906101000a900467ffffffffffffffff16613a1391906156f2565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600254604080517f43d9564d00000000000000000000000000000000000000000000000000000000815284516001600160a01b039081166004830152602086015163ffffffff1660248301529185015167ffffffffffffffff9081166044830152606086015116606482015260808501511515608482015260a0850151151560a482015260009291909116906343d9564d9060c4016020604051808303816000875af1158015613d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db39190615430565b604084015190915067ffffffffffffffff8082169083161015613e3a57613dda828261544d565b60028054601590613e0f9084907501000000000000000000000000000000000000000000900467ffffffffffffffff166156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550613ed1565b8067ffffffffffffffff168267ffffffffffffffff161115613ed1576000613e62828461544d565b9050613e6e838261393b565b909350905067ffffffffffffffff811615613ecf5780600260158282829054906101000a900467ffffffffffffffff16613ea8919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b505b8267ffffffffffffffff168267ffffffffffffffff161080613efb575067ffffffffffffffff8216155b15613f32576040517fa1e8654500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b815467ffffffffffffffff1667fffffffffffffffe198101613f5a57505050565b8167ffffffffffffffff168167ffffffffffffffff161015613fa8576040517f2b4d0ad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191691900367ffffffffffffffff16179055565b815467ffffffffffffffff1667fffffffffffffffe198101613fe857505050565b613ff282826156f2565b905067fffffffffffffffe1967ffffffffffffffff821601614040576040517f5a5cc94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191667ffffffffffffffff919091161790915550565b6040805180820190915260008082526020820152825134146140af576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090919050565b6140be614a58565b6020840151156140d5576140d584602001516148a4565b60065484516040805160c081019091523381526001600160a01b039092169163ff6fb300919060208082019061410d908b018b614ecb565b63ffffffff16815260208a8101359082015267ffffffffffffffff8816604082015260600161413f60a08b018b6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161418660808b018b6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526141f99190899088906004016159d3565b60806040518083038185885af1158015614217573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061423c9190615a83565b95945050505050565b600061425183836139c1565b905080613c12576040517f06a6167e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142948282613f39565b60405167ffffffffffffffff821681527f1fdac7d956f6016d09c5485e7edebdec210d236cfcd4f5477962710cc375edfc90602001611c6f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190615792565b600254600090600160a01b900460ff166001146143b857600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556007546001600160a01b03163381146143f757604051635bd25eff60e01b815260040160405180910390fd5b6001600160a01b038516614437576040517f809fc44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144448585856000614917565b50506002805460ff60a01b1916600160a01b17905592915050565b61446a838383614923565b613c12576040517f7c75c3d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806144b4610f1160c08601866153cb565b92506144c4338560400135613a74565b915060006144df6144d86020870187614ecb565b8486613770565b90506144f2816126278760600135613730565b9150614509826008600061268e60208a018a614ecb565b61451282613c17565b509193909250565b614522614a58565b604080518082019091526000815260606020820152602085015115614573576040517fb5e0bf8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546040805160a081019091523381526001600160a01b03909116906385afd453906020808201906145a8908b018b614ecb565b63ffffffff16815260208a8101359082015267ffffffffffffffff8816604082015260600160006145dc60808c018c6153cb565b9190911190915250604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815282516001600160a01b03166004820152602083015163ffffffff166024820152908201516044820152606082015167ffffffffffffffff1660648201526080909101511515608482015260a4016000604051808303816000875af115801561467d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526146a59190810190615a9f565b60408201515187519294509092509080821461470b57818111156146d9578181036146d286826000614923565b505061470b565b6040517fa028531600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505094509492505050565b600067ffffffffffffffff821115613937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201527f34206269747300000000000000000000000000000000000000000000000000006064820152608401613668565b6040516001600160a01b0383166024820152604481018290526000906115219085907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261494a565b614868848484846149d7565b61489e576040517f7c75c3d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6004546001600160a01b0316806148e7576040517fb5e0bf8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61491381337f00000000000000000000000000000000000000000000000000000000000000008561485c565b5050565b61486884848484614a2b565b60008082614931575a614935565b6001545b9050600080600080878986f195945050505050565b6000806000846001600160a01b0316846040516149679190615b94565b6000604051808303816000865af19150503d80600081146149a4576040519150601f19603f3d011682016040523d82523d6000602084013e6149a9565b606091505b5091509150816149ba57600061423c565b8051158061423c57508080602001905181019061423c9190615bb0565b6040516001600160a01b038085166024830152831660448201526064810182905260009061423c9086907f23b872dd00000000000000000000000000000000000000000000000000000000906084016147f8565b60006001600160a01b038516614a4d57614a46848484614923565b9050611521565b61423c8585856147b0565b604051806060016040528060008019168152602001600067ffffffffffffffff168152602001614a9b604051806040016040528060008152602001600081525090565b905290565b803563ffffffff81168114614ab457600080fd5b919050565b600080600060408486031215614ace57600080fd5b614ad784614aa0565b9250602084013567ffffffffffffffff80821115614af457600080fd5b818601915086601f830112614b0857600080fd5b813581811115614b1757600080fd5b876020606083028501011115614b2c57600080fd5b6020830194508093505050509250925092565b60008151808452602080850194506020840160005b83811015614b8b578151805163ffffffff16885283015167ffffffffffffffff168388015260409096019590820190600101614b54565b509495945050505050565b60208152600061387e6020830184614b3f565b600060e082840312156123b757600080fd5b600060208284031215614bcd57600080fd5b813567ffffffffffffffff811115614be457600080fd5b61152184828501614ba9565b60005b83811015614c0b578181015183820152602001614bf3565b50506000910152565b60008151808452614c2c816020860160208601614bf0565b601f01601f19169290920160200192915050565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b83811015614cd9578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40018552815180518852830151838801879052614cc687890182614c14565b9750509382019390820190600101614c7c565b50508751606088015250505060208501516080850152509050611521565b600060208284031215614d0957600080fd5b5035919050565b6020810160028310614d4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b8015158114612d3657600080fd5b60008060408385031215614d7257600080fd5b823567ffffffffffffffff811115614d8957600080fd5b614d9585828601614ba9565b9250506020830135614da681614d51565b809150509250929050565b81518152602080830151908201526040810161376a565b6000606082840312156123b757600080fd5b80356001600160a01b0381168114614ab457600080fd5b67ffffffffffffffff81168114612d3657600080fd5b60008083601f840112614e1957600080fd5b50813567ffffffffffffffff811115614e3157600080fd5b60208301915083602082850101111561398857600080fd5b60008060008060008060e08789031215614e6257600080fd5b614e6c8888614dc8565b955060608701359450614e8160808801614dda565b935060a0870135614e9181614df1565b925060c087013567ffffffffffffffff811115614ead57600080fd5b614eb989828a01614e07565b979a9699509497509295939492505050565b600060208284031215614edd57600080fd5b61387e82614aa0565b60008060408385031215614ef957600080fd5b614f0283614aa0565b91506020830135614da681614d51565b803560ff81168114614ab457600080fd5b600080600080600060e08688031215614f3b57600080fd5b614f458787614dc8565b945060608601359350614f5a60808701614f12565b9250614f6860a08701614dda565b915060c0860135614f7881614df1565b809150509295509295909350565b600060c082840312156123b757600080fd5b60008060408385031215614fab57600080fd5b614fb483614dda565b946020939093013593505050565b600060208284031215614fd457600080fd5b61387e82614dda565b60008060408385031215614ff057600080fd5b614ff983614dda565b91506020830135614da681614df1565b6000806000838503608081121561501f57600080fd5b843567ffffffffffffffff81111561503657600080fd5b61504287828801614ba9565b9450506040601f198201121561505757600080fd5b5060208401915061506a60608501614dda565b90509250925092565b8051825267ffffffffffffffff60208201511660208301526040810151613c12604084018280518252602090810151910152565b60c081016150b58285615073565b82516080830152602083015160a083015261387e565b600080604083850312156150de57600080fd5b823591506150ee60208401614dda565b90509250929050565b60008060006040848603121561510c57600080fd5b61511584614aa0565b9250602084013567ffffffffffffffff8082111561513257600080fd5b818601915086601f83011261514657600080fd5b81358181111561515557600080fd5b8760208260061b8501011115614b2c57600080fd5b60008060006060848603121561517f57600080fd5b61518884614dda565b925061519660208501614dda565b9150604084013590509250925092565b600080600080600080600060c0888a0312156151c157600080fd5b873596506151d160208901614f12565b95506151df60408901614aa0565b94506151ed60608901614dda565b93506080880135925060a088013567ffffffffffffffff81111561521057600080fd5b61521c8a828b01614e07565b989b979a50959850939692959293505050565b60006020828403121561524157600080fd5b813561387e81614d51565b6152568185615073565b82516080820152602083015160a082015260e060c082015268ffffffffffffffffff82511660e082015260006020830151604061010084015261529d610120840182614c14565b9695505050505050565b600080604083850312156152ba57600080fd5b823591506150ee60208401614f12565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533a57600080fd5b813561387e81614df1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153a5576153a5615345565b5060010190565b63ffffffff831681526040602082015260006115216040830184614b3f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261540057600080fd5b83018035915067ffffffffffffffff82111561541b57600080fd5b60200191503681900382131561398857600080fd5b60006020828403121561544257600080fd5b815161387e81614df1565b67ffffffffffffffff828116828216039080821115613f3257613f32615345565b808202600082127f8000000000000000000000000000000000000000000000000000000000000000841416156154a6576154a6615345565b818105831482151761376a5761376a615345565b6001600160a01b03815116825263ffffffff60208201511660208301526040810151604083015267ffffffffffffffff60608201511660608301526000608082015160c0608085015261551060c0850182614c14565b905060a083015184820360a086015261423c8282614c14565b60408152600061553c60408301856154ba565b905082151560208301529392505050565b6040805190810167ffffffffffffffff81118282101715615570576155706152ca565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561559f5761559f6152ca565b604052919050565b6000604082840312156155b957600080fd5b6155c161554d565b9050815181526020820151602082015292915050565b6000604082840312156155e957600080fd5b61387e83836155a7565b6001600160a01b038516815283602082015261ffff8316604082015260806060820152600061529d6080830184614c14565b7fffffffff000000000000000000000000000000000000000000000000000000008560e01b1681527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600482015282601882015260008251615693816038850160208701614bf0565b9190910160380195945050505050565b86815260ff8616602082015263ffffffff851660408201526001600160a01b038416606082015282608082015260c060a082015260006156e660c0830184614c14565b98975050505050505050565b67ffffffffffffffff818116838216019080821115613f3257613f32615345565b60c081016001600160a01b038061572985614dda565b1683528061573960208601614dda565b1660208401528061574c60408601614dda565b1660408401528061575f60608601614dda565b1660608401528061577260808601614dda565b1660808401528061578560a08601614dda565b1660a08401525092915050565b6000602082840312156157a457600080fd5b5051919050565b6000604082840312156157bd57600080fd5b6157c561554d565b82358152602083013560208201528091505092915050565b63ffffffff848116825260406020808401829052838201859052600092869160608601855b88811015615842578361581486614aa0565b1682528285013561582481614df1565b67ffffffffffffffff16828401529385019390850190600101615802565b509998505050505050505050565b8181038181111561376a5761376a615345565b7fffffffff000000000000000000000000000000000000000000000000000000008660e01b1681527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b1660048201528360188201528183603883013760009101603801908152949350505050565b6001600160a01b038616815284602082015261ffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7fffffffffffffffff0000000000000000000000000000000000000000000000008560c01b1681527fffffffff000000000000000000000000000000000000000000000000000000008460e01b16600882015282600c820152600082516159c381602c850160208701614bf0565b91909101602c0195945050505050565b6080815260006159e660808301866154ba565b90506159ff602083018580518252602090810151910152565b6001600160a01b0383166060830152949350505050565b600060808284031215615a2857600080fd5b6040516060810181811067ffffffffffffffff82111715615a4b57615a4b6152ca565b8060405250809150825181526020830151615a6581614df1565b6020820152615a7784604085016155a7565b60408201525092915050565b600060808284031215615a9557600080fd5b61387e8383615a16565b60008060a08385031215615ab257600080fd5b615abc8484615a16565b9150608083015167ffffffffffffffff80821115615ad957600080fd5b9084019060408287031215615aed57600080fd5b615af561554d565b825168ffffffffffffffffff81168114615b0e57600080fd5b815260208381015183811115615b2357600080fd5b80850194505087601f850112615b3857600080fd5b835183811115615b4a57615b4a6152ca565b615b5c82601f19601f84011601615576565b93508084528882828701011115615b7257600080fd5b615b8181838601848801614bf0565b5081019190915292959294509192505050565b60008251615ba6818460208701614bf0565b9190910192915050565b600060208284031215615bc257600080fd5b815161387e81614d5156fea264697066735822122058bed3a09ec7e5cc9846cc3987bc29489bdd47be8514ad3f6aa4d793ba889cc364736f6c634300081600336101a06040523480156200001257600080fd5b5060405162001c0f38038062001c0f833981016040819052620000359162000292565b6040805180820190915260018152603160f81b60208201528390819081856003620000618382620003a8565b506004620000708282620003a8565b50620000829150839050600562000140565b610120526200009381600662000140565b61014052815160208084019190912060e052815190820120610100524660a0526200012160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c05250336101605260ff166101805250620004ce9050565b60006020835110156200016057620001588362000179565b905062000173565b816200016d8482620003a8565b5060ff90505b92915050565b600080829050601f81511115620001b0578260405163305a27a960e01b8152600401620001a7919062000474565b60405180910390fd5b8051620001bd82620004a9565b179392505050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001f8578181015183820152602001620001de565b50506000910152565b600082601f8301126200021357600080fd5b81516001600160401b0380821115620002305762000230620001c5565b604051601f8301601f19908116603f011681019082821181831017156200025b576200025b620001c5565b816040528381528660208588010111156200027557600080fd5b62000288846020830160208901620001db565b9695505050505050565b600080600060608486031215620002a857600080fd5b83516001600160401b0380821115620002c057600080fd5b620002ce8783880162000201565b94506020860151915080821115620002e557600080fd5b50620002f48682870162000201565b925050604084015160ff811681146200030c57600080fd5b809150509250925092565b600181811c908216806200032c57607f821691505b6020821081036200034d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a3576000816000526020600020601f850160051c810160208610156200037e5750805b601f850160051c820191505b818110156200039f578281556001016200038a565b5050505b505050565b81516001600160401b03811115620003c457620003c4620001c5565b620003dc81620003d5845462000317565b8462000353565b602080601f831160018114620004145760008415620003fb5750858301515b600019600386901b1c1916600185901b1785556200039f565b600085815260208120601f198616915b82811015620004455788860151825594840194600190910190840162000424565b5085821015620004645787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000825180602084015262000495816040850160208701620001db565b601f01601f19169190910160400192915050565b805160208083015191908110156200034d5760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516116c26200054d60003960006101a80152600081816102070152818161044e01526104be015260006105760152600061054b01526000610ce201526000610cba01526000610c1501526000610c3f01526000610c6901526116c26000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b257806395d89b4111610081578063a9059cbb11610066578063a9059cbb146102c6578063d505accf146102d9578063dd62ed3e146102ec57600080fd5b806395d89b41146102ab578063a457c2d7146102b357600080fd5b806370a082311461024157806379cc67901461026a5780637ecebe001461027d57806384b0196e1461029057600080fd5b8063313ce5671161010957806339509351116100ee57806339509351146101da57806340c10f19146101ed5780636c099dee1461020257600080fd5b8063313ce567146101a15780633644e515146101d257600080fd5b806306fdde031461013b578063095ea7b31461015957806318160ddd1461017c57806323b872dd1461018e575b600080fd5b610143610325565b60405161015091906113c4565b60405180910390f35b61016c6101673660046113fa565b6103b7565b6040519015158152602001610150565b6002545b604051908152602001610150565b61016c61019c366004611424565b6103d1565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610150565b6101806103f5565b61016c6101e83660046113fa565b610404565b6102006101fb3660046113fa565b610443565b005b6102297f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610150565b61018061024f366004611460565b6001600160a01b031660009081526020819052604090205490565b6102006102783660046113fa565b6104b3565b61018061028b366004611460565b61051f565b61029861053d565b604051610150979695949392919061147b565b6101436105e2565b61016c6102c13660046113fa565b6105f1565b61016c6102d43660046113fa565b6106a0565b6102006102e7366004611530565b6106ae565b6101806102fa3660046115a3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b606060038054610334906115d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610360906115d6565b80156103ad5780601f10610382576101008083540402835291602001916103ad565b820191906000526020600020905b81548152906001019060200180831161039057829003601f168201915b5050505050905090565b6000336103c5818585610812565b60019150505b92915050565b6000336103df85828561096b565b6103ea858585610a1b565b506001949350505050565b60006103ff610c08565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906103c5908290869061043e908790611623565b610812565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a5576040517fba06efeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104af8282610d33565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610515576040517fba06efeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104af8282610df2565b6001600160a01b0381166000908152600760205260408120546103cb565b6000606080828080836105717f00000000000000000000000000000000000000000000000000000000000000006005610f53565b61059c7f00000000000000000000000000000000000000000000000000000000000000006006610f53565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b606060048054610334906115d6565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156106935760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103ea8286868403610812565b6000336103c5818585610a1b565b834211156106fe5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161068a565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861072d8c610ffe565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061078882611026565b905060006107988287878761106e565b9050896001600160a01b0316816001600160a01b0316146107fb5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161068a565b6108068a8a8a610812565b50505050505050505050565b6001600160a01b03831661088d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b0382166109095760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a155781811015610a085760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161068a565b610a158484848403610812565b50505050565b6001600160a01b038316610a975760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b038216610b135760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b03831660009081526020819052604090205481811015610ba25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610a15565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610c6157507f000000000000000000000000000000000000000000000000000000000000000046145b15610c8b57507f000000000000000000000000000000000000000000000000000000000000000090565b6103ff604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b6001600160a01b038216610d895760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161068a565b8060026000828254610d9b9190611623565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216610e6e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b03821660009081526020819052604090205481811015610efd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161068a565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161095e565b606060ff8314610f6d57610f6683611096565b90506103cb565b818054610f79906115d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa5906115d6565b8015610ff25780601f10610fc757610100808354040283529160200191610ff2565b820191906000526020600020905b815481529060010190602001808311610fd557829003601f168201915b505050505090506103cb565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b60006103cb611033610c08565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b600080600061107f878787876110d5565b9150915061108c816111b7565b5095945050505050565b606060006110a38361131f565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561110c57506000905060036111ae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611160573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166111a7576000600192509250506111ae565b9150600090505b94509492505050565b60008160048111156111cb576111cb61165d565b036111d35750565b60018160048111156111e7576111e761165d565b036112345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161068a565b60028160048111156112485761124861165d565b036112955760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161068a565b60038160048111156112a9576112a961165d565b0361131c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161068a565b50565b600060ff8216601f8111156103cb576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815180845260005b818110156113865760208185018101518683018201520161136a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006113d76020830184611360565b9392505050565b80356001600160a01b03811681146113f557600080fd5b919050565b6000806040838503121561140d57600080fd5b611416836113de565b946020939093013593505050565b60008060006060848603121561143957600080fd5b611442846113de565b9250611450602085016113de565b9150604084013590509250925092565b60006020828403121561147257600080fd5b6113d7826113de565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e060208401526114b860e084018a611360565b83810360408501526114ca818a611360565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b8181101561151e57835183529284019291840191600101611502565b50909c9b505050505050505050505050565b600080600080600080600060e0888a03121561154b57600080fd5b611554886113de565b9650611562602089016113de565b95506040880135945060608801359350608088013560ff8116811461158657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156115b657600080fd5b6115bf836113de565b91506115cd602084016113de565b90509250929050565b600181811c908216806115ea57607f821691505b602082108103611020577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b808201808211156103cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220b01be794a387189911d440646b5ba0a63c9fb90dcea8cee9cb89be9b6970d81b64736f6c6343000816003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000565786abe5ba0f9d307adfa681379f0788bedef70000000000000000000000000000000000000000000000000000000000000007555344432d4c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006532a555344430000000000000000000000000000000000000000000000000000

    Deployed Bytecode

    0x6080604052600436106103135760003560e01c80637bde82f21161019a578063a88835d7116100e1578063cc32d1761161008a578063e5328e0611610064578063e5328e0614610ae7578063f2fde38b14610b29578063fc0c546a14610b4957600080fd5b8063cc32d17614610a4d578063d0f3bad114610a87578063d621ad3f14610aaf57600080fd5b8063c7c7f5b3116100bb578063c7c7f5b3146109f8578063c859c48314610a0b578063cbef2aa914610a2b57600080fd5b8063a88835d7146109a3578063b0d7ca5d146109c3578063bedb86fb146109d857600080fd5b80638da5cb5b116101435780639f68b9641161011d5780639f68b96414610911578063a7229fd91461092d578063a85dc7f21461094d57600080fd5b80638da5cb5b146108855780639561b12f146108a357806396365d44146108c357600080fd5b806388543f0e1161017457806388543f0e1461083b5780638a5e52bb146108505780638c70830b1461086557600080fd5b80637bde82f2146107c757806381bdf98c146107e7578063857749b01461080757600080fd5b80633faa12c51161025e5780635e280f1111610207578063715018a6116101e1578063715018a614610748578063726075371461075d578063764f6a78146107a657600080fd5b80635e280f11146106a95780635fcbd285146106f557806366fd482a1461072857600080fd5b806347e7ef241161023857806347e7ef2414610655578063484267a4146106765780635114bf091461069657600080fd5b80633faa12c5146105f5578063434def5514610615578063461bb0b91461063557600080fd5b8063200d2ed2116102c0578063341a46481161029a578063341a46481461057257806338da6b8e146105855780633b6f743b146105d557600080fd5b8063200d2ed214610429578063203bd15f1461045c5780632bc5114c1461047c57600080fd5b8063156a0d0f116102f1578063156a0d0f1461039f57806316909bca146103e0578063192adc5d146103fc57600080fd5b80630141e41b146103185780630d35b4151461034e57806313bc4bc71461037d575b600080fd5b34801561032457600080fd5b50610338610333366004614ab9565b610b7d565b6040516103459190614b96565b60405180910390f35b34801561035a57600080fd5b5061036e610369366004614bbb565b610df1565b60405161034593929190614c40565b34801561038957600080fd5b5061039d610398366004614cf7565b6112f7565b005b3480156103ab57600080fd5b50604080517f02e49c2c0000000000000000000000000000000000000000000000000000000081526000602082015201610345565b3480156103ec57600080fd5b5060006040516103459190614d10565b34801561040857600080fd5b5061041c610417366004614d5f565b611358565b6040516103459190614db1565b34801561043557600080fd5b5060025461044a90600160a01b900460ff1681565b60405160ff9091168152602001610345565b34801561046857600080fd5b5061039d610477366004614e49565b611529565b34801561048857600080fd5b506105116040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526002546001600160a01b03908116825260055481166020830152600754811692820192909252600654821660608201526003548216608082015260045490911660a082015290565b6040516103459190600060c0820190506001600160a01b038084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401528060a08501511660a08401525092915050565b61039d610580366004614cf7565b611820565b34801561059157600080fd5b506105bc6105a0366004614ecb565b60086020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610345565b3480156105e157600080fd5b5061041c6105f0366004614d5f565b6118fa565b34801561060157600080fd5b5061039d610610366004614ee6565b611ba7565b34801561062157600080fd5b5061039d610630366004614f23565b611c7b565b34801561064157600080fd5b5061039d610650366004614f86565b611ee1565b610668610663366004614f98565b61208f565b604051908152602001610345565b34801561068257600080fd5b50610668610691366004614fc2565b612282565b3480156106a257600080fd5b5047610668565b3480156106b557600080fd5b506106dd7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b81565b6040516001600160a01b039091168152602001610345565b34801561070157600080fd5b507f0000000000000000000000004b459cd35839579c27cbf0cef3af1e47024284e76106dd565b34801561073457600080fd5b5061039d610743366004614fdd565b6123c2565b34801561075457600080fd5b5061039d612418565b34801561076957600080fd5b506107917f000000000000000000000000000000000000000000000000000000000000767c81565b60405163ffffffff9091168152602001610345565b6107b96107b4366004615009565b61242c565b6040516103459291906150a7565b3480156107d357600080fd5b506106686107e23660046150cb565b612922565b3480156107f357600080fd5b50600b546106dd906001600160a01b031681565b34801561081357600080fd5b5061044a7f000000000000000000000000000000000000000000000000000000000000000681565b34801561084757600080fd5b50600154610668565b34801561085c57600080fd5b5061039d612b2b565b34801561087157600080fd5b5061039d610880366004614cf7565b612d39565b34801561089157600080fd5b506000546001600160a01b03166106dd565b3480156108af57600080fd5b5061039d6108be3660046150f7565b612d46565b3480156108cf57600080fd5b50600a547f00000000000000000000000000000000000000000000000000000000000000016801000000000000000090910467ffffffffffffffff1602610668565b34801561091d57600080fd5b5060405160018152602001610345565b34801561093957600080fd5b5061066861094836600461516a565b612e9b565b34801561095957600080fd5b50600a547f000000000000000000000000000000000000000000000000000000000000000170010000000000000000000000000000000090910467ffffffffffffffff1602610668565b3480156109af57600080fd5b5061039d6109be3660046151a6565b612f89565b3480156109cf57600080fd5b5061039d6131a6565b3480156109e457600080fd5b5061039d6109f336600461522f565b61320f565b6107b9610a06366004615009565b6132ca565b348015610a1757600080fd5b5061039d610a26366004614fdd565b6132fe565b610a3e610a39366004615009565b6133f9565b6040516103459392919061524c565b348015610a5957600080fd5b506002546105bc907501000000000000000000000000000000000000000000900467ffffffffffffffff1681565b348015610a9357600080fd5b50600b546105bc90600160a01b900467ffffffffffffffff1681565b348015610abb57600080fd5b50610668610aca3660046152a7565b600960209081526000928352604080842090915290825290205481565b348015610af357600080fd5b50610668600a5467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b348015610b3557600080fd5b5061039d610b44366004614fc2565b6135ce565b348015610b5557600080fd5b506106dd7f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889481565b600254606090600160a01b900460ff16600114610bf557600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6040517fdb22c33c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556003546001600160a01b0316338114610c3457604051635bd25eff60e01b815260040160405180910390fd5b60008367ffffffffffffffff811115610c4f57610c4f6152ca565b604051908082528060200260200182016040528015610c9457816020015b6040805180820190915260008082526020820152815260200190600190039081610c6d5790505b5090506000805b85811015610d965736878783818110610cb657610cb66152f9565b90506060020190506000610d20826020016020810190610cd69190615328565b610ce66060850160408601615328565b60086000610cf76020880188614ecb565b63ffffffff1663ffffffff16815260200190815260200160002061367a9092919063ffffffff16565b905067ffffffffffffffff811615610d8c576040805180820190915280610d4a6020850185614ecb565b63ffffffff16815267ffffffffffffffff83166020909101528585610d6e81615374565b965081518110610d8057610d806152f9565b60200260200101819052505b5050600101610c9b565b508082527fce105e156370093e6600169f7c01277f740d45fbcf95435227ce6f43ad0c3abd8783604051610dcb9291906153ac565b60405180910390a1509150506002805460ff60a01b1916600160a01b1790559392505050565b60408051808201909152600080825260208201526060610e24604051806040016040528060008152602001600081525090565b60408051808201909152807f00000000000000000000000000000000000000000000000000000000000000018152602001610ebf60086000886000016020810190610e6f9190614ecb565b63ffffffff16815260208101919091526040016000205467ffffffffffffffff1667ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b81525092506000610eec8460200151866040013511610ee2578560400135613730565b8460200151613730565b90506000610f1c610f006020880188614ecb565b83610f17610f1160c08b018b6153cb565b15919050565b613770565b600254604080517f81993cd000000000000000000000000000000000000000000000000000000000815283516001600160a01b039081166004830152602085015163ffffffff1660248301529184015167ffffffffffffffff9081166044830152606085015116606482015260808401511515608482015260a0840151151560a48201529293506000929116906381993cd09060c401602060405180830381865afa158015610fcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff39190615430565b90508267ffffffffffffffff168167ffffffffffffffff161461127a5760408051600180825281830190925290816020015b6040805180820190915260008152606060208201528152602001906001900390816110255790505094508267ffffffffffffffff168167ffffffffffffffff1610156111475760405180604001604052806110bc6110b78487611088919061544d565b67ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b613885565b6110e6907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61546e565b81526020016040518060400160405280600c81526020017f70726f746f636f6c20666565000000000000000000000000000000000000000081525081525085600081518110611137576111376152f9565b602002602001018190525061127a565b8267ffffffffffffffff168167ffffffffffffffff16111561127a57600061116f848361544d565b905061117b828261393b565b909250905067ffffffffffffffff808516908316036111da5760408051600080825260208201909252906111d2565b6040805180820190915260008152606060208201528152602001906001900390816111aa5790505b509550611278565b604051806040016040528061121b6110b78467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b81526020016040518060400160405280600681526020017f72657761726400000000000000000000000000000000000000000000000000008152508152508660008151811061126c5761126c6152f9565b60200260200101819052505b505b60405180604001604052806112b88567ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b81526020017f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff8416029052959794965050505050565b6005546001600160a01b031633811461132357604051635bd25eff60e01b815260040160405180910390fd5b61132c82613730565b600a60106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050565b604080518082019091526000808252602082015261137c610f1160c08501856153cb565b6113b2576040517f2d9560be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113c18460400135613730565b6006546040805160c081019091523381529192506001600160a01b031690633292cf02906020808201906113f790890189614ecb565b63ffffffff1681526020888101359082015267ffffffffffffffff8516604082015260600161142960a08901896153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161147060808901896153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526114e191908790600401615529565b6040805180830381865afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152191906155d7565b949350505050565b600254600160a01b900460ff1660011461156c57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556006546001600160a01b03163381146115ab57604051635bd25eff60e01b815260040160405180910390fd5b67ffffffffffffffff84167f0000000000000000000000000000000000000000000000000000000000000001028215801590606090611644576116416115f760608c0160408d01615328565b61160460208d018d614ecb565b8589898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398f92505050565b90505b600061165089856139c1565b9050801561176257611661886139ee565b8215611706576040517f7cb590120000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b1690637cb59012906116d3908c908e9060009088906004016155f3565b600060405180830381600087803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b505050505b6001600160a01b0389168a7fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61173f60208f018f614ecb565b6040805163ffffffff9092168252602082018990520160405180910390a3611800565b61176f60208c018c614ecb565b8985846040516020016117859493929190615625565b60408051601f19818403018152918152815160209283012060008d8152600984528281208180528452918220557e7c17198cd078035dc663f9a0961f84cb6265411d0b4c793f96d432f6af4b55918c91906117e2908f018f614ecb565b8c88876040516117f7969594939291906156a3565b60405180910390a15b50506002805460ff60a01b1916600160a01b179055505050505050505050565b6007546001600160a01b031633811461184c57604051635bd25eff60e01b815260040160405180910390fd5b61185582613a3c565b60006118613384613a74565b905080600260158282829054906101000a900467ffffffffffffffff1661188891906156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fa064a2faa279f4d67c85c8fc69d4ebb7de2739a9e6dd864dfdd1b9e066d4bfd0816040516118ed919067ffffffffffffffff91909116815260200190565b60405180910390a1505050565b6040805180820190915260008082526020820152600061191d8460400135613730565b90508067ffffffffffffffff16600003611963576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611975610f1160c08701876153cb565b90508015611ae3576006546040805160c081019091523381526001600160a01b0390911690633292cf02906020808201906119b2908a018a614ecb565b63ffffffff1681526020898101359082015267ffffffffffffffff861660408201526060016119e460a08a018a6153cb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611a2b60808a018a6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b168152611a9c91908890600401615529565b6040805180830381865afa158015611ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adc91906155d7565b9250611b9f565b600080611af360808801886153cb565b60065492109250506001600160a01b03166375d2208c611b166020890189614ecb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff91909116600482015283151560248201526044016040805180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b91906155d7565b9350505b505092915050565b611baf613ad9565b7f000000000000000000000000000000000000000000000000000000000000767c63ffffffff168263ffffffff1603611c14576040517fada8342400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8083166000908152600860205260409020611c36918390613b4d16565b6040805163ffffffff8416815282151560208201527faf6b8dd4c5a827e03f548d06181b36aaba61e22436ff1cfa9bc409d576366a6091015b60405180910390a15050565b600254600160a01b900460ff16600114611cbe57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556006546001600160a01b0316338114611cfd57604051635bd25eff60e01b815260040160405180910390fd5b67ffffffffffffffff82167f0000000000000000000000000000000000000000000000000000000000000001026000611d3685836139c1565b90508015611da357611d47846139ee565b6001600160a01b038516877fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c611d8060208c018c614ecb565b6040805163ffffffff9092168252602082018790520160405180910390a3611ec4565b611db06020890189614ecb565b60405160e09190911b7fffffffff00000000000000000000000000000000000000000000000000000000166020820152606086901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660248201526038810183905260580160408051601f19818403018152918152815160209283012060008a81526009845282812060ff8b168252845291909120557e7c17198cd078035dc663f9a0961f84cb6265411d0b4c793f96d432f6af4b559088908890611e78908c018c614ecb565b6040805193845260ff909216602084015263ffffffff16908201526001600160a01b03871660608201526080810184905260c060a0820181905260009082015260e00160405180910390a15b50506002805460ff60a01b1916600160a01b179055505050505050565b611ee9613ad9565b611ef66020820182614fc2565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f336040820160208301614fc2565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611f706060820160408301614fc2565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611fad6080820160608301614fc2565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055611fea60a0820160808301614fc2565b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905561202760c0820160a08301614fc2565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556040517f9774229668135b546675daf425e41c0848f60aa32d0951881245f4f528cc33f090612084908390615713565b60405180910390a150565b600254600090600160a01b900460ff166001146120d557600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556120f182613a3c565b60006120fd3384613a74565b905061210881613c17565b7f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff8216026040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152602482018390529193507f0000000000000000000000004b459cd35839579c27cbf0cef3af1e47024284e7909116906340c10f1990604401600060405180830381600087803b1580156121bd57600080fd5b505af11580156121d1573d6000803e3d6000fd5b5050600a80548493509091506000906121f590849067ffffffffffffffff166156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001600160a01b0316336001600160a01b03167f8752a472e571a816aea92eec8dae9baf628e840f4929fbcc2d155e6233ff68a78460405161226091815260200190565b60405180910390a3506002805460ff60a01b1916600160a01b17905592915050565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000767c1660009081526008602052604081205467ffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000001026001600160a01b0383166122fa578091506123b7565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000917f0000000000000000000000004b459cd35839579c27cbf0cef3af1e47024284e7909116906370a0823190602401602060405180830381865afa15801561237e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a29190615792565b90508082116123b157816123b3565b805b9250505b50919050565b905090565b6123ca613ad9565b600b805467ffffffffffffffff909216600160a01b027fffffffff000000000000000000000000000000000000000000000000000000009092166001600160a01b0390931692909217179055565b612420613ad9565b61242a6000613c7e565b565b612434614a58565b6040805180820190915260008082526020820152600254600160a01b900460ff1660011461248b57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556124ae610f1160c08701876153cb565b6124e4576040517f2d9560be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006124f38660400135613730565b905060007f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff8316026040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091507f0000000000000000000000004b459cd35839579c27cbf0cef3af1e47024284e76001600160a01b0316906379cc679090604401600060405180830381600087803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b5050604051838152600092503391507f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc9060200160405180910390a3600061261261260a60208a018a614ecb565b846001613770565b9050600061262c826126278b60600135613730565b613cdb565b600a8054919250859160009061264d90849067ffffffffffffffff1661544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506126b681600860008c600001602081019061268e9190614ecb565b63ffffffff1663ffffffff168152602001908152602001600020613f3990919063ffffffff16565b8067ffffffffffffffff168467ffffffffffffffff1611156127755760006126de828661544d565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000767c8116600090815260086020526040902091925061272491908390613f3916565b80600a60088282829054906101000a900467ffffffffffffffff16612749919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050612830565b8067ffffffffffffffff168467ffffffffffffffff16101561283057600061279d858361544d565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000767c811660009081526008602052604090209192506127e391908390613fc716565b80600a60088282829054906101000a900467ffffffffffffffff1661280891906156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b600061284b612844368b90038b018b6157ab565b6000614061565b90506128598a82848b6140b6565b9650604051806040016040528085815260200161289f8467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b9052875190965033907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a6128d660208e018e614ecb565b60208a8101516040805163ffffffff90941684529183018a90529082015260600160405180910390a350506002805460ff60a01b1916600160a01b179055509296919550909350505050565b600254600090600160a01b900460ff1660011461296857600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b179055600061298684613730565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000767c811660009081526008602052604090209192506129cc91908390613f3916565b7f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff8216026040517f79cc6790000000000000000000000000000000000000000000000000000000008152336004820152602481018290529092507f0000000000000000000000004b459cd35839579c27cbf0cef3af1e47024284e76001600160a01b0316906379cc679090604401600060405180830381600087803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b5050600a8054849350909150600090612ab590849067ffffffffffffffff1661544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550612ae58383614245565b612aee816139ee565b6040518281526001600160a01b0384169033907f27d4634c833b7622a0acddbf7f746183625f105945e95c723ad1d5a9f2a0b6fc90602001612260565b600b546001600160a01b03163314612b5657604051635bd25eff60e01b815260040160405180910390fd5b600a54600b546801000000000000000090910467ffffffffffffffff908116600160a01b909204161115612bb6576040517f6e05a01a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b54600a805467ffffffffffffffff600160a01b909304831692839291600891612bf0918591680100000000000000009091041661544d565b825467ffffffffffffffff9182166101009390930a928302928202191691909117909155600b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1690556040517f42966c680000000000000000000000000000000000000000000000000000000081529083167f00000000000000000000000000000000000000000000000000000000000000010260048201526001600160a01b037f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d40388941691506342966c6890602401600060405180830381600087803b158015612cdb57600080fd5b505af1158015612cef573d6000803e3d6000fd5b50505063ffffffff7f000000000000000000000000000000000000000000000000000000000000767c81166000908152600860205260409020612d36925090839061428a16565b50565b612d41613ad9565b600155565b600254600160a01b900460ff16600114612d8957600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556003546001600160a01b0316338114612dc857604051635bd25eff60e01b815260040160405180910390fd5b60005b82811015612e465736848483818110612de657612de66152f9565b9050604002019050612e3d816020016020810190612e049190615328565b60086000612e156020860186614ecb565b63ffffffff1663ffffffff168152602001908152602001600020613fc790919063ffffffff16565b50600101612dcb565b507f10c5f2b007767d266c6c75c86ae9ed0c74e6320b30bda231af7396a990e7263c848484604051612e7a939291906157dd565b60405180910390a150506002805460ff60a01b1916600160a01b1790555050565b6007546000906001600160a01b0316338114612eca57604051635bd25eff60e01b815260040160405180910390fd5b7f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d40388946001600160a01b0316856001600160a01b031603612f7357600254600a54600091612f4c916110889167ffffffffffffffff7501000000000000000000000000000000000000000000909104811691680100000000000000009004166156f2565b612f546142ce565b612f5e9190615850565b9050808411612f6d5783612f6f565b805b9350505b612f7e858585614372565b91505b509392505050565b600254600160a01b900460ff16600114612fcc57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b179055604051612ff89086908690869086908690602001615863565b60408051601f19818403018152918152815160209283012060008a81526009845282812060ff8b1682529093529120541461305f576040517faba8b6ef00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600087815260096020908152604080832060ff8a1684529091528120556130868484614245565b61309761309284613730565b6139ee565b801561313e576040517f7cb590120000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b1690637cb590129061310b9087908b90600090889088906004016158d5565b600060405180830381600087803b15801561312557600080fd5b505af1158015613139573d6000803e3d6000fd5b505050505b6040805163ffffffff87168152602081018590526001600160a01b0386169189917fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c910160405180910390a350506002805460ff60a01b1916600160a01b1790555050505050565b6005546001600160a01b03163381146131d257604051635bd25eff60e01b815260040160405180910390fd5b476131df3382600061445f565b6040518181527f19e23b96a5e0d494b59baca97d1fe386cf8e80a978dfd8845d25f1a9d5c7e18390602001611c6f565b6005546001600160a01b031633811461323b57604051635bd25eff60e01b815260040160405180910390fd5b600254600119600160a01b90910460ff160161326a576040516376a9ad7360e01b815260040160405180910390fd5b81613276576001613279565b60035b6002805460ff92909216600160a01b0260ff60a01b1990921691909117905560405182151581527f878ac8a2ca79520471f8f3c8494fa802c03ce3bf034252aad7f22318984fdbdb90602001611c6f565b6132d2614a58565b60408051808201909152600080825260208201526132f18585856133f9565b5090969095509350505050565b6007546001600160a01b031633811461332a57604051635bd25eff60e01b815260040160405180910390fd5b81600260158282829054906101000a900467ffffffffffffffff1661334f919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506133b1836133ac8467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b614245565b604080516001600160a01b038516815267ffffffffffffffff841660208201527fa46907b6b80b882da80d6e36cc905dde57fafff0a5442c8898526fe952d1e65391016118ed565b613401614a58565b6040805180820190915260008082526020820152604080518082019091526000815260606020820152600254600160a01b900460ff1660011461346d57600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556000808061348d896144a0565b92509250925060405180604001604052806134d18467ffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000010290565b81526020017f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff84160290529450600061352261351b368b90038b018b6157ab565b8751614061565b9050831561353d576135368a82848b6140b6565b965061354f565b6135498a82848b61451a565b90975094505b865133907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a61358160208e018e614ecb565b89516020808c01516040805163ffffffff90951685529184019290925282015260600160405180910390a350506002805460ff60a01b1916600160a01b1790555092969195509350915050565b6135d6613ad9565b6001600160a01b038116613671576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b612d3681613c7e565b825460009067ffffffffffffffff1667fffffffffffffffe1981016136cb576040517f5a5cc94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168367ffffffffffffffff161015612f815782810367ffffffffffffffff808216908616116137045784613706565b805b865467ffffffffffffffff8285031667ffffffffffffffff19909116178755925050509392505050565b600061376a7f0000000000000000000000000000000000000000000000000000000000000001838161376457613764615926565b04614716565b92915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152600a546000906137d29067ffffffffffffffff7001000000000000000000000000000000008204811691166156f2565b600a5490915060009067ffffffffffffffff68010000000000000000909104811690831611613802576000613825565b600a546138259068010000000000000000900467ffffffffffffffff168361544d565b6040805160c08101825233815263ffffffff8916602080830182905267ffffffffffffffff8a811684860152948516606084015260009182526008905291909120548216909114608082015284151560a0820152925050505b9392505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115613937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160448201527f6e20696e743235360000000000000000000000000000000000000000000000006064820152608401613668565b5090565b600254600090819067ffffffffffffffff7501000000000000000000000000000000000000000000909104811690841681101561398057838503810192509050613988565b848492509250505b9250929050565b6060848484846040516020016139a89493929190615955565b6040516020818303038152906040529050949350505050565b600061387e7f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889484846147b0565b80600a60088282829054906101000a900467ffffffffffffffff16613a13919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b3415612d36576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613a7f82613730565b905061376a7f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889484307f000000000000000000000000000000000000000000000000000000000000000167ffffffffffffffff86160261485c565b6000546001600160a01b0316331461242a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401613668565b815467ffffffffffffffff168115613bbf5767ffffffffffffffff811615613ba1576040517fca2bc39800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191667ffffffffffffffff178355505050565b67ffffffffffffffff81811614613c02576040517fca2bc39800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191683555b505050565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000767c81166000908152600860205260409020613c59918390613fc716565b80600a60088282829054906101000a900467ffffffffffffffff16613a1391906156f2565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600254604080517f43d9564d00000000000000000000000000000000000000000000000000000000815284516001600160a01b039081166004830152602086015163ffffffff1660248301529185015167ffffffffffffffff9081166044830152606086015116606482015260808501511515608482015260a0850151151560a482015260009291909116906343d9564d9060c4016020604051808303816000875af1158015613d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613db39190615430565b604084015190915067ffffffffffffffff8082169083161015613e3a57613dda828261544d565b60028054601590613e0f9084907501000000000000000000000000000000000000000000900467ffffffffffffffff166156f2565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550613ed1565b8067ffffffffffffffff168267ffffffffffffffff161115613ed1576000613e62828461544d565b9050613e6e838261393b565b909350905067ffffffffffffffff811615613ecf5780600260158282829054906101000a900467ffffffffffffffff16613ea8919061544d565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b505b8267ffffffffffffffff168267ffffffffffffffff161080613efb575067ffffffffffffffff8216155b15613f32576040517fa1e8654500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b815467ffffffffffffffff1667fffffffffffffffe198101613f5a57505050565b8167ffffffffffffffff168167ffffffffffffffff161015613fa8576040517f2b4d0ad500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191691900367ffffffffffffffff16179055565b815467ffffffffffffffff1667fffffffffffffffe198101613fe857505050565b613ff282826156f2565b905067fffffffffffffffe1967ffffffffffffffff821601614040576040517f5a5cc94600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825467ffffffffffffffff191667ffffffffffffffff919091161790915550565b6040805180820190915260008082526020820152825134146140af576040517f3442dd9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090919050565b6140be614a58565b6020840151156140d5576140d584602001516148a4565b60065484516040805160c081019091523381526001600160a01b039092169163ff6fb300919060208082019061410d908b018b614ecb565b63ffffffff16815260208a8101359082015267ffffffffffffffff8816604082015260600161413f60a08b018b6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161418660808b018b6153cb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526141f99190899088906004016159d3565b60806040518083038185885af1158015614217573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061423c9190615a83565b95945050505050565b600061425183836139c1565b905080613c12576040517f06a6167e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6142948282613f39565b60405167ffffffffffffffff821681527f1fdac7d956f6016d09c5485e7edebdec210d236cfcd4f5477962710cc375edfc90602001611c6f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000029219dd400f2bf60e5a23d13be72b486d40388946001600160a01b0316906370a0823190602401602060405180830381865afa15801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bd9190615792565b600254600090600160a01b900460ff166001146143b857600254600119600160a01b90910460ff1601610bc3576040516376a9ad7360e01b815260040160405180910390fd5b6002805460ff60a01b1916600160a11b1790556007546001600160a01b03163381146143f757604051635bd25eff60e01b815260040160405180910390fd5b6001600160a01b038516614437576040517f809fc44b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6144448585856000614917565b50506002805460ff60a01b1916600160a01b17905592915050565b61446a838383614923565b613c12576040517f7c75c3d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806144b4610f1160c08601866153cb565b92506144c4338560400135613a74565b915060006144df6144d86020870187614ecb565b8486613770565b90506144f2816126278760600135613730565b9150614509826008600061268e60208a018a614ecb565b61451282613c17565b509193909250565b614522614a58565b604080518082019091526000815260606020820152602085015115614573576040517fb5e0bf8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546040805160a081019091523381526001600160a01b03909116906385afd453906020808201906145a8908b018b614ecb565b63ffffffff16815260208a8101359082015267ffffffffffffffff8816604082015260600160006145dc60808c018c6153cb565b9190911190915250604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815282516001600160a01b03166004820152602083015163ffffffff166024820152908201516044820152606082015167ffffffffffffffff1660648201526080909101511515608482015260a4016000604051808303816000875af115801561467d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526146a59190810190615a9f565b60408201515187519294509092509080821461470b57818111156146d9578181036146d286826000614923565b505061470b565b6040517fa028531600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505094509492505050565b600067ffffffffffffffff821115613937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201527f34206269747300000000000000000000000000000000000000000000000000006064820152608401613668565b6040516001600160a01b0383166024820152604481018290526000906115219085907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261494a565b614868848484846149d7565b61489e576040517f7c75c3d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6004546001600160a01b0316806148e7576040517fb5e0bf8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61491381337f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b8561485c565b5050565b61486884848484614a2b565b60008082614931575a614935565b6001545b9050600080600080878986f195945050505050565b6000806000846001600160a01b0316846040516149679190615b94565b6000604051808303816000865af19150503d80600081146149a4576040519150601f19603f3d011682016040523d82523d6000602084013e6149a9565b606091505b5091509150816149ba57600061423c565b8051158061423c57508080602001905181019061423c9190615bb0565b6040516001600160a01b038085166024830152831660448201526064810182905260009061423c9086907f23b872dd00000000000000000000000000000000000000000000000000000000906084016147f8565b60006001600160a01b038516614a4d57614a46848484614923565b9050611521565b61423c8585856147b0565b604051806060016040528060008019168152602001600067ffffffffffffffff168152602001614a9b604051806040016040528060008152602001600081525090565b905290565b803563ffffffff81168114614ab457600080fd5b919050565b600080600060408486031215614ace57600080fd5b614ad784614aa0565b9250602084013567ffffffffffffffff80821115614af457600080fd5b818601915086601f830112614b0857600080fd5b813581811115614b1757600080fd5b876020606083028501011115614b2c57600080fd5b6020830194508093505050509250925092565b60008151808452602080850194506020840160005b83811015614b8b578151805163ffffffff16885283015167ffffffffffffffff168388015260409096019590820190600101614b54565b509495945050505050565b60208152600061387e6020830184614b3f565b600060e082840312156123b757600080fd5b600060208284031215614bcd57600080fd5b813567ffffffffffffffff811115614be457600080fd5b61152184828501614ba9565b60005b83811015614c0b578181015183820152602001614bf3565b50506000910152565b60008151808452614c2c816020860160208601614bf0565b601f01601f19169290920160200192915050565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b83811015614cd9578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40018552815180518852830151838801879052614cc687890182614c14565b9750509382019390820190600101614c7c565b50508751606088015250505060208501516080850152509050611521565b600060208284031215614d0957600080fd5b5035919050565b6020810160028310614d4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b8015158114612d3657600080fd5b60008060408385031215614d7257600080fd5b823567ffffffffffffffff811115614d8957600080fd5b614d9585828601614ba9565b9250506020830135614da681614d51565b809150509250929050565b81518152602080830151908201526040810161376a565b6000606082840312156123b757600080fd5b80356001600160a01b0381168114614ab457600080fd5b67ffffffffffffffff81168114612d3657600080fd5b60008083601f840112614e1957600080fd5b50813567ffffffffffffffff811115614e3157600080fd5b60208301915083602082850101111561398857600080fd5b60008060008060008060e08789031215614e6257600080fd5b614e6c8888614dc8565b955060608701359450614e8160808801614dda565b935060a0870135614e9181614df1565b925060c087013567ffffffffffffffff811115614ead57600080fd5b614eb989828a01614e07565b979a9699509497509295939492505050565b600060208284031215614edd57600080fd5b61387e82614aa0565b60008060408385031215614ef957600080fd5b614f0283614aa0565b91506020830135614da681614d51565b803560ff81168114614ab457600080fd5b600080600080600060e08688031215614f3b57600080fd5b614f458787614dc8565b945060608601359350614f5a60808701614f12565b9250614f6860a08701614dda565b915060c0860135614f7881614df1565b809150509295509295909350565b600060c082840312156123b757600080fd5b60008060408385031215614fab57600080fd5b614fb483614dda565b946020939093013593505050565b600060208284031215614fd457600080fd5b61387e82614dda565b60008060408385031215614ff057600080fd5b614ff983614dda565b91506020830135614da681614df1565b6000806000838503608081121561501f57600080fd5b843567ffffffffffffffff81111561503657600080fd5b61504287828801614ba9565b9450506040601f198201121561505757600080fd5b5060208401915061506a60608501614dda565b90509250925092565b8051825267ffffffffffffffff60208201511660208301526040810151613c12604084018280518252602090810151910152565b60c081016150b58285615073565b82516080830152602083015160a083015261387e565b600080604083850312156150de57600080fd5b823591506150ee60208401614dda565b90509250929050565b60008060006040848603121561510c57600080fd5b61511584614aa0565b9250602084013567ffffffffffffffff8082111561513257600080fd5b818601915086601f83011261514657600080fd5b81358181111561515557600080fd5b8760208260061b8501011115614b2c57600080fd5b60008060006060848603121561517f57600080fd5b61518884614dda565b925061519660208501614dda565b9150604084013590509250925092565b600080600080600080600060c0888a0312156151c157600080fd5b873596506151d160208901614f12565b95506151df60408901614aa0565b94506151ed60608901614dda565b93506080880135925060a088013567ffffffffffffffff81111561521057600080fd5b61521c8a828b01614e07565b989b979a50959850939692959293505050565b60006020828403121561524157600080fd5b813561387e81614d51565b6152568185615073565b82516080820152602083015160a082015260e060c082015268ffffffffffffffffff82511660e082015260006020830151604061010084015261529d610120840182614c14565b9695505050505050565b600080604083850312156152ba57600080fd5b823591506150ee60208401614f12565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533a57600080fd5b813561387e81614df1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036153a5576153a5615345565b5060010190565b63ffffffff831681526040602082015260006115216040830184614b3f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261540057600080fd5b83018035915067ffffffffffffffff82111561541b57600080fd5b60200191503681900382131561398857600080fd5b60006020828403121561544257600080fd5b815161387e81614df1565b67ffffffffffffffff828116828216039080821115613f3257613f32615345565b808202600082127f8000000000000000000000000000000000000000000000000000000000000000841416156154a6576154a6615345565b818105831482151761376a5761376a615345565b6001600160a01b03815116825263ffffffff60208201511660208301526040810151604083015267ffffffffffffffff60608201511660608301526000608082015160c0608085015261551060c0850182614c14565b905060a083015184820360a086015261423c8282614c14565b60408152600061553c60408301856154ba565b905082151560208301529392505050565b6040805190810167ffffffffffffffff81118282101715615570576155706152ca565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561559f5761559f6152ca565b604052919050565b6000604082840312156155b957600080fd5b6155c161554d565b9050815181526020820151602082015292915050565b6000604082840312156155e957600080fd5b61387e83836155a7565b6001600160a01b038516815283602082015261ffff8316604082015260806060820152600061529d6080830184614c14565b7fffffffff000000000000000000000000000000000000000000000000000000008560e01b1681527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600482015282601882015260008251615693816038850160208701614bf0565b9190910160380195945050505050565b86815260ff8616602082015263ffffffff851660408201526001600160a01b038416606082015282608082015260c060a082015260006156e660c0830184614c14565b98975050505050505050565b67ffffffffffffffff818116838216019080821115613f3257613f32615345565b60c081016001600160a01b038061572985614dda565b1683528061573960208601614dda565b1660208401528061574c60408601614dda565b1660408401528061575f60608601614dda565b1660608401528061577260808601614dda565b1660808401528061578560a08601614dda565b1660a08401525092915050565b6000602082840312156157a457600080fd5b5051919050565b6000604082840312156157bd57600080fd5b6157c561554d565b82358152602083013560208201528091505092915050565b63ffffffff848116825260406020808401829052838201859052600092869160608601855b88811015615842578361581486614aa0565b1682528285013561582481614df1565b67ffffffffffffffff16828401529385019390850190600101615802565b509998505050505050505050565b8181038181111561376a5761376a615345565b7fffffffff000000000000000000000000000000000000000000000000000000008660e01b1681527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b1660048201528360188201528183603883013760009101603801908152949350505050565b6001600160a01b038616815284602082015261ffff8416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7fffffffffffffffff0000000000000000000000000000000000000000000000008560c01b1681527fffffffff000000000000000000000000000000000000000000000000000000008460e01b16600882015282600c820152600082516159c381602c850160208701614bf0565b91909101602c0195945050505050565b6080815260006159e660808301866154ba565b90506159ff602083018580518252602090810151910152565b6001600160a01b0383166060830152949350505050565b600060808284031215615a2857600080fd5b6040516060810181811067ffffffffffffffff82111715615a4b57615a4b6152ca565b8060405250809150825181526020830151615a6581614df1565b6020820152615a7784604085016155a7565b60408201525092915050565b600060808284031215615a9557600080fd5b61387e8383615a16565b60008060a08385031215615ab257600080fd5b615abc8484615a16565b9150608083015167ffffffffffffffff80821115615ad957600080fd5b9084019060408287031215615aed57600080fd5b615af561554d565b825168ffffffffffffffffff81168114615b0e57600080fd5b815260208381015183811115615b2357600080fd5b80850194505087601f850112615b3857600080fd5b835183811115615b4a57615b4a6152ca565b615b5c82601f19601f84011601615576565b93508084528882828701011115615b7257600080fd5b615b8181838601848801614bf0565b5081019190915292959294509192505050565b60008251615ba6818460208701614bf0565b9190910192915050565b600060208284031215615bc257600080fd5b815161387e81614d5156fea264697066735822122058bed3a09ec7e5cc9846cc3987bc29489bdd47be8514ad3f6aa4d793ba889cc364736f6c63430008160033

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

    00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b000000000000000000000000565786abe5ba0f9d307adfa681379f0788bedef70000000000000000000000000000000000000000000000000000000000000007555344432d4c50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006532a555344430000000000000000000000000000000000000000000000000000

    -----Decoded View---------------
    Arg [0] : _lpTokenName (string): USDC-LP
    Arg [1] : _lpTokenSymbol (string): S*USDC
    Arg [2] : _token (address): 0x29219dd400f2Bf60E5a23d13Be72B486D4038894
    Arg [3] : _tokenDecimals (uint8): 6
    Arg [4] : _sharedDecimals (uint8): 6
    Arg [5] : _endpoint (address): 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B
    Arg [6] : _owner (address): 0x565786AbE5BA0f9D307AdfA681379F0788bEdEf7

    -----Encoded View---------------
    11 Constructor Arguments found :
    Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
    Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
    Arg [2] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
    Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
    Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
    Arg [5] : 0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b
    Arg [6] : 000000000000000000000000565786abe5ba0f9d307adfa681379f0788bedef7
    Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
    Arg [8] : 555344432d4c5000000000000000000000000000000000000000000000000000
    Arg [9] : 0000000000000000000000000000000000000000000000000000000000000006
    Arg [10] : 532a555344430000000000000000000000000000000000000000000000000000


    Block Age Transaction Gas Used Reward
    view all blocks ##produced##

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

    Validator Index Block Age Amount
    View All Withdrawals

    Transaction Hash Block Age Value Eth2 PubKey Valid
    View All Deposits
    [ Download: CSV Export  ]
    [ Download: CSV Export  ]

    A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.