More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 431 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send | 21553539 | 10 mins ago | IN | 1.27373668 S | 0.01681868 | ||||
Send | 21424256 | 18 hrs ago | IN | 1.05916112 S | 0.01888432 | ||||
Send | 21392627 | 22 hrs ago | IN | 1.593956 S | 0.01914634 | ||||
Send | 21311397 | 33 hrs ago | IN | 2.37240291 S | 0.01679388 | ||||
Send | 21175100 | 2 days ago | IN | 2.0564914 S | 0.00670986 | ||||
Send | 21112058 | 2 days ago | IN | 14.70506809 S | 0.01631565 | ||||
Send | 20862181 | 4 days ago | IN | 5.18410629 S | 0.01995834 | ||||
Send | 20599832 | 5 days ago | IN | 2.37240291 S | 0.01679388 | ||||
Send | 20576969 | 5 days ago | IN | 1.53390558 S | 0.01888432 | ||||
Send | 20572858 | 5 days ago | IN | 1.27882829 S | 0.00769171 | ||||
Send | 20569440 | 5 days ago | IN | 2.1013441 S | 0.00743671 | ||||
Send | 20408969 | 6 days ago | IN | 2.03179442 S | 0.01947909 | ||||
Send | 20344327 | 7 days ago | IN | 3.97372142 S | 0.01998015 | ||||
Send | 20246830 | 7 days ago | IN | 1.02965345 S | 0.01631063 | ||||
Send | 20201130 | 7 days ago | IN | 2.37240291 S | 0.01802557 | ||||
Send | 20200989 | 7 days ago | IN | 4.57307858 S | 0.01944732 | ||||
Send | 20196283 | 7 days ago | IN | 3.26501399 S | 0.00646456 | ||||
Send | 19984382 | 8 days ago | IN | 2.01578744 S | 0.00777181 | ||||
Send | 19826470 | 9 days ago | IN | 1.72096951 S | 0.00670516 | ||||
Send | 19795313 | 10 days ago | IN | 1.11243894 S | 0.02635137 | ||||
Send | 19790632 | 10 days ago | IN | 2.37240291 S | 0.01975003 | ||||
Send | 19741074 | 10 days ago | IN | 2.37240291 S | 0.01971955 | ||||
Send | 19720958 | 10 days ago | IN | 4.54208786 S | 0.0186985 | ||||
Send | 19644636 | 10 days ago | IN | 1.51258192 S | 0.01861546 | ||||
Send | 19635173 | 10 days ago | IN | 3.82096683 S | 0.01655823 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | Age | From | To | Amount | |
---|---|---|---|---|---|---|
21554717 | 2 mins ago | 0.49314667 S | ||||
21553539 | 10 mins ago | 1.27373668 S | ||||
21553074 | 14 mins ago | 0.10349631 S | ||||
21552865 | 15 mins ago | 0.10270601 S | ||||
21552865 | 15 mins ago | 0.10270601 S | ||||
21552458 | 18 mins ago | 1.59269427 S | ||||
21552458 | 18 mins ago | 1.59269427 S | ||||
21551027 | 27 mins ago | 0.1028372 S | ||||
21550840 | 29 mins ago | 0.10520722 S | ||||
21550840 | 29 mins ago | 0.10520722 S | ||||
21550292 | 32 mins ago | 0.17097397 S | ||||
21550161 | 33 mins ago | 0.03672097 S | ||||
21549084 | 40 mins ago | 0.03672097 S | ||||
21548456 | 44 mins ago | 0.63895246 S | ||||
21548456 | 44 mins ago | 0.63895246 S | ||||
21547367 | 53 mins ago | 0.26092242 S | ||||
21545560 | 1 hr ago | 0.04061078 S | ||||
21545560 | 1 hr ago | 0.04061078 S | ||||
21544356 | 1 hr ago | 0.10359429 S | ||||
21543594 | 1 hr ago | 0.10430345 S | ||||
21543594 | 1 hr ago | 0.10430345 S | ||||
21542960 | 1 hr ago | 0.10430345 S | ||||
21541334 | 1 hr ago | 0.10451263 S | ||||
21535930 | 2 hrs ago | 0.10466891 S | ||||
21535930 | 2 hrs ago | 0.10466891 S |
Loading...
Loading
Contract Name:
StargatePoolUSDC
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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) {}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;// @dev Import the 'MessagingFee' and 'MessagingReceipt' so it's exposed to OApp implementers// solhint-disable-next-line no-unused-importimport { OAppSender, MessagingFee, MessagingReceipt } from "./OAppSender.sol";// @dev Import the 'Origin' so it's exposed to OApp implementers// solhint-disable-next-line no-unused-importimport { 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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 OAppILayerZeroEndpointV2 public immutable endpoint;// Mapping to store peers associated with corresponding endpointsmapping(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) {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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 messageserror 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";/*** @title IOAppCore*/interface IOAppCore {// Custom error messageserror OnlyPeer(uint32 eid, bytes32 sender);error NoPeer(uint32 eid);error InvalidEndpointCall();error InvalidDelegate();// Event emitted when a peer (OApp) is set for a corresponding endpointevent 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);
12345678910111213141516171819202122232425// SPDX-License-Identifier: MITpragma 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);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;library OFTComposeMsgCodec {// Offset constants for decoding composed messagesuint8 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);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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;
1234567891011121314151617181920// SPDX-License-Identifier: MITpragma 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 versionfunction 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;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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 conditionfunction 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(
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma 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);
123456789// SPDX-License-Identifier: MITpragma solidity >=0.8.0;interface IMessagingContext {function isSendingMessage() external view returns (bool);function getSendContext() external view returns (uint32 dstEid, address sender);}
1234567891011121314151617181920212223242526// 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.
1234567891011121314151617181920212223242526// 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()externalviewreturns (bytes1 fields,string memory name,string memory version,uint256 chainId,address verifyingContract,bytes32 salt,uint256[] memory extensions
1234567891011121314151617181920212223242526// 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
1234567891011121314151617181920212223242526// 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.*/
1234567891011121314151617181920212223242526// 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;
1234567891011121314151617181920212223242526// 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.*/
1234567891011121314151617181920212223242526// 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);
1234567891011121314151617181920212223242526// 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 {
1234567891011121314151617181920212223242526// 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
1234567891011121314151617181920212223242526// 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;
1234567891011121314151617181920212223242526// 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/4637uint256 _value; // default: 0}function current(Counter storage counter) internal view returns (uint256) {return counter._value;}function increment(Counter storage counter) internal {
1234567891011121314151617181920212223242526// 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 *;*
1234567891011121314151617181920212223242526// 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;
1234567891011121314151617181920212223242526// 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-assemblyassembly {ptr := add(buffer, add(32, length))
1234567891011121314151617181920212223242526// 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) {
1234567891011121314151617181920212223242526// 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].*
1234567891011121314151617181920212223242526// 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 infinityUp, // Toward infinityZero // 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) {
1234567891011121314151617181920212223242526// 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).*
1234567891011121314151617181920212223242526// 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.
12345678910111213141516171819202122232425// SPDX-License-Identifier: BUSL-1.1pragma 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-lengthimport { 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
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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();
123456789// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.0;/// @title Interface for Bridge USDC/// @dev https://github.com/circlefin/stablecoin-evm/blob/master/contracts/v1/FiatTokenV1.solinterface IBridgedUSDCMinter {function mint(address _to, uint256 _amount) external returns (bool);function burn(uint256 _amount) external;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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 senduint64 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;
12345678910111213141516// SPDX-License-Identifier: BUSL-1.1pragma 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;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.0;// Solidity does not support splitting import across multiple lines// solhint-disable-next-line max-line-lengthimport { 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,
1234567891011121314151617181920212223// SPDX-License-Identifier: BUSL-1.1pragma 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 FeeParamsfunction 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);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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 LDfunction 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 thefunction 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 LDfunction 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
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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;
1234567891011121314151617181920212223// SPDX-License-Identifier: BUSL-1.1pragma 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;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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-camelcaseevent Path_CreditBurned(uint64 amountSD);error Path_InsufficientCredit();error Path_AlreadyHasCredit();error Path_UnlimitedCredit();
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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 addressesuint256 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()
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma 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) {
12345678910111213141516171819{"evmVersion": "paris","optimizer": {"enabled": true,"runs": 5000},"outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}}}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.