ERC-20
Gaming
Overview
Max Total Supply
945,600,191.103854 ISLAND
Holders
4,233 ( 0.071%)
Market
Price
$0.02 @ 0.000010 ETH (-8.41%)
Onchain Market Cap
$23,231,912.10
Circulating Supply Market Cap
$3,957,095.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
2,329.528097701179008185 ISLANDValue
$57.23 ( ~0.0236751019124476 Eth) [0.0002%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | ![]() | ISLAND-USDT | $0.0246 0.0000102 Eth | $1,374,185.00 54,055,371.570 ISLAND | 82.1304% |
2 | ![]() | ISLAND-USDT | $0.0245 0.0000102 Eth | $119,789.00 4,830,921.400 ISLAND | 7.3400% |
3 | ![]() | ISLAND-USDT | $0.0245 0.0000102 Eth | $71,964.00 2,931,588.110 ISLAND | 4.4542% |
4 | ![]() | ISLAND-ETH | $0.0263 0.0000109 Eth | $47,487.00 1,805,456.000 ISLAND | 2.7432% |
5 | ![]() | 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $0.0242 0.0000100 Eth | $38,120.00 1,553,270.961 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662 | 2.3600% |
6 | ![]() | HX6ZNKJJ7ZY653VODWZBAYPSG7BRGLFQ4I4RA7D5NKKZ-SO11111111111111111111111111111111111111112 | $0.0247 0.0000102 Eth | $28,825.00 1,130,459.997 HX6ZNKJJ7ZY653VODWZBAYPSG7BRGLFQ4I4RA7D5NKKZ | 1.7176% |
7 | ![]() | ISLAND-USDT | $0.0245 0.0000101 Eth | $18,958.40 774,293.500 ISLAND | 1.1764% |
8 | ![]() | 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662-0X4200000000000000000000000000000000000006 | $0.0242 0.0000100 Eth | $12,137.73 497,857.512 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662 | 0.7564% |
9 | ![]() | ISLAND-USDT | $0.0245 0.0000101 Eth | $966.31 38,133.000 ISLAND | 0.0579% |
10 | ![]() | ISLAND-USDT | $0.0246 0.0000102 Eth | $113.12 4,591.850 ISLAND | 0.0070% |
Contract Source Code Verified (Exact Match)
Contract Name:
ISLAND
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.22;import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";import { OFT } from "@layerzerolabs/oft-evm/contracts/OFT.sol";import { ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";/// @title ISLAND Token/// @custom:security-contact support@niftyisland.iocontract ISLAND is OFT, ERC20Permit {constructor(string memory _name,string memory _symbol,address _lzEndpoint,address _delegate,address _multisig,uint256 _supply) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) ERC20Permit(_name) {if (_supply > 0) {_mint(_multisig, _supply);}}}
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;
12345678910111213141516171819// SPDX-License-Identifier: MITpragma solidity >=0.8.0;import { Origin } from "./ILayerZeroEndpointV2.sol";interface ILayerZeroReceiver {function allowInitializePath(Origin calldata _origin) external view returns (bool);function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);function lzReceive(Origin calldata _origin,bytes32 _guid,bytes calldata _message,address _executor,bytes calldata _extraData) external payable;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.0;import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";import { SetConfigParam } from "./IMessageLibManager.sol";enum MessageLibType {Send,Receive,SendAndReceive}interface IMessageLib is IERC165 {function setConfig(address _oapp, SetConfigParam[] calldata _config) external;function getConfig(uint32 _eid, address _oapp, uint32 _configType) external view returns (bytes memory config);function isSupportedEid(uint32 _eid) external view returns (bool);// message libs of same major version are compatiblefunction version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);function messageLibType() external view returns (MessageLibType);}
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 newLib);event DefaultReceiveLibraryTimeoutSet(uint32 eid, address oldLib, uint256 expiry);event SendLibrarySet(address sender, uint32 eid, address newLib);event ReceiveLibrarySet(address receiver, uint32 eid, 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: MITpragma solidity >=0.8.0;import { MessagingFee } from "./ILayerZeroEndpointV2.sol";import { IMessageLib } from "./IMessageLib.sol";struct Packet {uint64 nonce;uint32 srcEid;address sender;uint32 dstEid;bytes32 receiver;bytes32 guid;bytes message;}interface ISendLib is IMessageLib {function send(Packet calldata _packet,bytes calldata _options,bool _payInLzToken) external returns (MessagingFee memory, bytes memory encodedPacket);function quote(Packet calldata _packet,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: LZBL-1.2pragma solidity ^0.8.20;library AddressCast {error AddressCast_InvalidSizeForAddress();error AddressCast_InvalidAddress();function toBytes32(bytes calldata _addressBytes) internal pure returns (bytes32 result) {if (_addressBytes.length > 32) revert AddressCast_InvalidAddress();result = bytes32(_addressBytes);unchecked {uint256 offset = 32 - _addressBytes.length;result = result >> (offset * 8);}}function toBytes32(address _address) internal pure returns (bytes32 result) {result = bytes32(uint256(uint160(_address)));}function toBytes(bytes32 _addressBytes32, uint256 _size) internal pure returns (bytes memory result) {if (_size == 0 || _size > 32) revert AddressCast_InvalidSizeForAddress();result = new bytes(_size);unchecked {uint256 offset = 256 - _size * 8;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: LZBL-1.2pragma solidity ^0.8.20;import { Packet } from "../../interfaces/ISendLib.sol";import { AddressCast } from "../../libs/AddressCast.sol";library PacketV1Codec {using AddressCast for address;using AddressCast for bytes32;uint8 internal constant PACKET_VERSION = 1;// header (version + nonce + path)// versionuint256 private constant PACKET_VERSION_OFFSET = 0;// nonceuint256 private constant NONCE_OFFSET = 1;// pathuint256 private constant SRC_EID_OFFSET = 9;uint256 private constant SENDER_OFFSET = 13;uint256 private constant DST_EID_OFFSET = 45;uint256 private constant RECEIVER_OFFSET = 49;// payload (guid + message)uint256 private constant GUID_OFFSET = 81; // keccak256(nonce + path)uint256 private constant MESSAGE_OFFSET = 113;
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);
12345678910111213141516171819202122// SPDX-License-Identifier: MITpragma solidity ^0.8.20;/*** @title IOAppMsgInspector* @dev Interface for the OApp Message Inspector, allowing examination of message and options contents.*/interface IOAppMsgInspector {// Custom error message for inspection failureerror InspectionFailed(bytes message, bytes options);/*** @notice Allows the inspector to examine LayerZero message contents and optionally throw a revert if invalid.* @param _message The message payload to be inspected.* @param _options Additional options or parameters for inspection.* @return valid A boolean indicating whether the inspection passed (true) or failed (false).** @dev Optionally done as a revert, OR use the boolean provided to handle the failure.*/function inspect(bytes calldata _message, bytes calldata _options) external view returns (bool valid);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;/*** @dev Struct representing enforced option parameters.*/struct EnforcedOptionParam {uint32 eid; // Endpoint IDuint16 msgType; // Message Typebytes options; // Additional options}/*** @title IOAppOptionsType3* @dev Interface for the OApp with Type 3 Options, allowing the setting and combining of enforced options.*/interface IOAppOptionsType3 {// Custom error message for invalid optionserror InvalidOptions(bytes options);// Event emitted when enforced options are setevent EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);/*** @notice Sets enforced options for specific endpoint and message type combinations.
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 { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";import { IOAppOptionsType3, EnforcedOptionParam } from "../interfaces/IOAppOptionsType3.sol";/*** @title OAppOptionsType3* @dev Abstract contract implementing the IOAppOptionsType3 interface with type 3 options.*/abstract contract OAppOptionsType3 is IOAppOptionsType3, Ownable {uint16 internal constant OPTION_TYPE_3 = 3;// @dev The "msgType" should be defined in the child contract.mapping(uint32 eid => mapping(uint16 msgType => bytes enforcedOption)) public enforcedOptions;/*** @dev Sets the enforced options for specific endpoint and message type combinations.* @param _enforcedOptions An array of EnforcedOptionParam structures specifying enforced options.** @dev Only the owner/admin of the OApp can call this function.* @dev Provides a way for the OApp to enforce things like paying for PreCrime, AND/OR minimum dst lzReceive gas amounts etc.* @dev These enforced options can vary as the potential options/execution on the remote may differ as per the msgType.* eg. Amount of lzReceive() gas necessary to deliver a lzCompose() message adds overhead you dont want to pay* if you are only making a standard LayerZero message ie. lzReceive() WITHOUT sendCompose().
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;// @dev Import the Origin so it's exposed to OAppPreCrimeSimulator implementers.// solhint-disable-next-line no-unused-importimport { InboundPacket, Origin } from "../libs/Packet.sol";/*** @title IOAppPreCrimeSimulator Interface* @dev Interface for the preCrime simulation functionality in an OApp.*/interface IOAppPreCrimeSimulator {// @dev simulation result used in PreCrime implementationerror SimulationResult(bytes result);error OnlySelf();/*** @dev Emitted when the preCrime contract address is set.* @param preCrimeAddress The address of the preCrime contract.*/event PreCrimeSet(address preCrimeAddress);/*** @dev Retrieves the address of the preCrime contract implementation.* @return The address of the preCrime contract.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;struct PreCrimePeer {uint32 eid;bytes32 preCrime;bytes32 oApp;}// TODO not done yetinterface IPreCrime {error OnlyOffChain();// for simulate()error PacketOversize(uint256 max, uint256 actual);error PacketUnsorted();error SimulationFailed(bytes reason);// for preCrime()error SimulationResultNotFound(uint32 eid);error InvalidSimulationResult(uint32 eid, bytes reason);error CrimeFound(bytes crime);function getConfig(bytes[] calldata _packets, uint256[] calldata _packetMsgValues) external returns (bytes memory);function simulate(
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { Origin } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";import { PacketV1Codec } from "@layerzerolabs/lz-evm-protocol-v2/contracts/messagelib/libs/PacketV1Codec.sol";/*** @title InboundPacket* @dev Structure representing an inbound packet received by the contract.*/struct InboundPacket {Origin origin; // Origin information of the packet.uint32 dstEid; // Destination endpointId of the packet.address receiver; // Receiver address for the packet.bytes32 guid; // Unique identifier of the packet.uint256 value; // msg.value of the packet.address executor; // Executor address for the packet.bytes message; // Message payload of the packet.bytes extraData; // Additional arbitrary data for the packet.}/*** @title PacketDecoder* @dev Library for decoding LayerZero packets.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";import { IPreCrime } from "./interfaces/IPreCrime.sol";import { IOAppPreCrimeSimulator, InboundPacket, Origin } from "./interfaces/IOAppPreCrimeSimulator.sol";/*** @title OAppPreCrimeSimulator* @dev Abstract contract serving as the base for preCrime simulation functionality in an OApp.*/abstract contract OAppPreCrimeSimulator is IOAppPreCrimeSimulator, Ownable {// The address of the preCrime implementation.address public preCrime;/*** @dev Retrieves the address of the OApp contract.* @return The address of the OApp contract.** @dev The simulator contract is the base contract for the OApp by default.* @dev If the simulator is a separate contract, override this function.*/function oApp() external view virtual returns (address) {return address(this);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { MessagingReceipt, MessagingFee } from "@layerzerolabs/oapp-evm/contracts/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 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.20;library OFTMsgCodec {// Offset constants for encoding and decoding OFT messagesuint8 private constant SEND_TO_OFFSET = 32;uint8 private constant SEND_AMOUNT_SD_OFFSET = 40;/*** @dev Encodes an OFT LayerZero message.* @param _sendTo The recipient address.* @param _amountShared The amount in shared decimals.* @param _composeMsg The composed message.* @return _msg The encoded message.* @return hasCompose A boolean indicating whether the message has a composed payload.*/function encode(bytes32 _sendTo,uint64 _amountShared,bytes memory _composeMsg) internal view returns (bytes memory _msg, bool hasCompose) {hasCompose = _composeMsg.length > 0;// @dev Remote chains will want to know the composed function caller ie. msg.sender on the src._msg = hasCompose? abi.encodePacked(_sendTo, _amountShared, addressToBytes32(msg.sender), _composeMsg)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";import { IOFT, OFTCore } from "./OFTCore.sol";/*** @title OFT Contract* @dev OFT is an ERC-20 token that extends the functionality of the OFTCore contract.*/abstract contract OFT is OFTCore, ERC20 {/*** @dev Constructor for the OFT contract.* @param _name The name of the OFT.* @param _symbol The symbol of the OFT.* @param _lzEndpoint The LayerZero endpoint address.* @param _delegate The delegate capable of making OApp configurations inside of the endpoint.*/constructor(string memory _name,string memory _symbol,address _lzEndpoint,address _delegate) ERC20(_name, _symbol) OFTCore(decimals(), _lzEndpoint, _delegate) {}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import { OApp, Origin } from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol";import { OAppOptionsType3 } from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol";import { IOAppMsgInspector } from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppMsgInspector.sol";import { OAppPreCrimeSimulator } from "@layerzerolabs/oapp-evm/contracts/precrime/OAppPreCrimeSimulator.sol";import { IOFT, SendParam, OFTLimit, OFTReceipt, OFTFeeDetail, MessagingReceipt, MessagingFee } from "./interfaces/IOFT.sol";import { OFTMsgCodec } from "./libs/OFTMsgCodec.sol";import { OFTComposeMsgCodec } from "./libs/OFTComposeMsgCodec.sol";/*** @title OFTCore* @dev Abstract contract for the OftChain (OFT) token.*/abstract contract OFTCore is IOFT, OApp, OAppPreCrimeSimulator, OAppOptionsType3 {using OFTMsgCodec for bytes;using OFTMsgCodec for bytes32;// @notice Provides a conversion rate when swapping between denominations of SD and LD// - shareDecimals == SD == shared Decimals// - localDecimals == LD == local decimals// @dev Considers that tokens have different decimal amounts on various chains.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)pragma solidity ^0.8.20;import {Context} from "../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.** The initial owner is set to the address provided by the deployer. 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;/*** @dev The caller account is not authorized to perform an operation.*/error OwnableUnauthorizedAccount(address account);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)pragma solidity ^0.8.20;/*** @dev Standard ERC-20 Errors* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.*/interface IERC20Errors {/*** @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.* @param balance Current balance for the interacting account.* @param needed Minimum amount required to perform a transfer.*/error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);/*** @dev Indicates a failure with the token `sender`. Used in transfers.* @param sender Address whose tokens are being transferred.*/error ERC20InvalidSender(address sender);/*** @dev Indicates a failure with the token `receiver`. Used in transfers.* @param receiver Address to which tokens are being transferred.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)pragma solidity ^0.8.20;import {IERC20} from "./IERC20.sol";import {IERC165} from "./IERC165.sol";/*** @title IERC1363* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].** Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.*/interface IERC1363 is IERC20, IERC165 {/** Note: the ERC-165 identifier for this interface is 0xb0202a11.* 0xb0202a11 ===* bytes4(keccak256('transferAndCall(address,uint256)')) ^* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^* bytes4(keccak256('approveAndCall(address,uint256)')) ^* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))*/
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)pragma solidity ^0.8.20;import {IERC165} from "../utils/introspection/IERC165.sol";
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "../token/ERC20/IERC20.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)pragma solidity ^0.8.20;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 v5.1.0) (token/ERC20/ERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "./IERC20.sol";import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";import {Context} from "../../utils/Context.sol";import {IERC20Errors} from "../../interfaces/draft-IERC6093.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}.** 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 ERC-20
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/ERC20Permit.sol)pragma solidity ^0.8.20;import {IERC20Permit} from "./IERC20Permit.sol";import {ERC20} from "../ERC20.sol";import {ECDSA} from "../../../utils/cryptography/ECDSA.sol";import {EIP712} from "../../../utils/cryptography/EIP712.sol";import {Nonces} from "../../../utils/Nonces.sol";/*** @dev Implementation of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].** Adds the {permit} method, which can be used to change an account's ERC-20 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.*/abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {bytes32 private constant PERMIT_TYPEHASH =keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");/*** @dev Permit deadline has expired.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";/*** @dev Interface for the optional metadata functions from the ERC-20 standard.*/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.*/function decimals() external view returns (uint8);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Permit.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].** Adds the {permit} method, which can be used to change an account's ERC-20 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 v5.1.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-20 standard as defined in the ERC.*/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 value of tokens in existence.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";import {IERC1363} from "../../../interfaces/IERC1363.sol";import {Address} from "../../../utils/Address.sol";/*** @title SafeERC20* @dev Wrappers around ERC-20 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 {/*** @dev An operation with an ERC-20 token failed.*/error SafeERC20FailedOperation(address token);/*** @dev Indicates a failed `decreaseAllowance` request.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol)pragma solidity ^0.8.20;import {Errors} from "./Errors.sol";/*** @dev Collection of functions related to the address type*/library Address {/*** @dev There's no code at `target` (it is not a contract).*/error AddressEmptyCode(address target);/*** @dev Replacement for Solidity's `transfer`: sends `amount` wei to* `recipient`, forwarding all available gas and reverting on errors.** https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost* of certain opcodes, possibly making contracts go over the 2300 gas limit* imposed by `transfer`, making them unable to receive funds via* `transfer`. {sendValue} removes this limitation.** https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)pragma solidity ^0.8.20;/*** @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 (last updated v5.1.0) (utils/cryptography/ECDSA.sol)pragma solidity ^0.8.20;/*** @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}/*** @dev The signature derives the `address(0)`.*/error ECDSAInvalidSignature();/*** @dev The signature has an invalid length.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/EIP712.sol)pragma solidity ^0.8.20;import {MessageHashUtils} from "./MessageHashUtils.sol";import {ShortStrings, ShortString} from "../ShortStrings.sol";import {IERC5267} from "../../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 scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose* encoding is very generic and therefore its 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 order to* produce the hash of their typed data 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 v5.1.0) (utils/cryptography/MessageHashUtils.sol)pragma solidity ^0.8.20;import {Strings} from "../Strings.sol";/*** @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.** The library provides methods for generating a hash of a message that conforms to the* https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]* specifications.*/library MessageHashUtils {/*** @dev Returns the keccak256 digest of an ERC-191 signed data with version* `0x45` (`personal_sign` messages).** The digest is calculated by prefixing a bytes32 `messageHash` with* `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.** NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with* keccak256, although any bytes32 value can be safely used because the final digest will* be re-hashed.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol)pragma solidity ^0.8.20;/*** @dev Collection of common custom errors used in multiple contracts** IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.* It is recommended to avoid relying on the error API for critical functionality.** _Available since v5.1._*/library Errors {/*** @dev The ETH balance of the account is not enough to perform the operation.*/error InsufficientBalance(uint256 balance, uint256 needed);/*** @dev A call to an address target failed. The target may have reverted.*/error FailedCall();/*** @dev The deployment failed.
12345678910111213141516171819202122232425// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[ERC].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)pragma solidity ^0.8.20;import {Panic} from "../Panic.sol";import {SafeCast} from "./SafeCast.sol";/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Floor, // Toward negative infinityCeil, // Toward positive infinityTrunc, // Toward zeroExpand // Away from zero}/*** @dev Returns the addition of two unsigned integers, with an success flag (no overflow).*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {unchecked {uint256 c = a + b;if (c < a) return (false, 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)// This file was procedurally generated from scripts/generate/templates/SafeCast.js.pragma solidity ^0.8.20;/*** @dev Wrappers over Solidity's uintXX/intXX/bool 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.*/library SafeCast {/*** @dev Value doesn't fit in an uint of `bits` size.*/error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);/*** @dev An int value doesn't fit in an uint of `bits` size.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.20;import {SafeCast} from "./SafeCast.sol";/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.** IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.* However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute* one branch when needed, making this function more expensive.*/function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {unchecked {// branchless ternary works because:// b ^ (a ^ b) == a// b ^ 0 == breturn b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)pragma solidity ^0.8.20;/*** @dev Provides tracking nonces for addresses. Nonces will only increment.*/abstract contract Nonces {/*** @dev The nonce used for an `account` is not the expected current nonce.*/error InvalidAccountNonce(address account, uint256 currentNonce);mapping(address account => uint256) private _nonces;/*** @dev Returns the next unused nonce for an address.*/function nonces(address owner) public view virtual returns (uint256) {return _nonces[owner];}/*** @dev Consumes a nonce.** Returns the current value and increments nonce.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)pragma solidity ^0.8.20;/*** @dev Helper library for emitting standardized panic codes.** ```solidity* contract Example {* using Panic for uint256;** // Use any of the declared internal constants* function foo() { Panic.GENERIC.panic(); }** // Alternatively* function foo() { Panic.panic(Panic.GENERIC); }* }* ```** Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].** _Available since v5.1._*/// slither-disable-next-line unused-statelibrary Panic {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/ShortStrings.sol)pragma solidity ^0.8.20;import {StorageSlot} from "./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 v5.1.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.20;/*** @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 ERC-1967 implementation slot:* ```solidity* contract ERC1967 {* // Define the slot. Alternatively, use the SlotDerivation library to derive the slot.* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;** function _getImplementation() internal view returns (address) {* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;* }** function _setImplementation(address newImplementation) internal {* require(newImplementation.code.length > 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)pragma solidity ^0.8.20;import {Math} from "./math/Math.sol";import {SignedMath} from "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant HEX_DIGITS = "0123456789abcdef";uint8 private constant ADDRESS_LENGTH = 20;/*** @dev The `value` string doesn't fit in the specified `length`.*/error StringsInsufficientHexLength(uint256 value, uint256 length);/*** @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;
1234567891011121314151617181920212223242526{"viaIR": true,"optimizer": {"enabled": true,"runs": 200,"details": {"yulDetails": {"optimizerSteps": "u"}}},"evmVersion": "paris","outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"metadata": {"useLiteralContent": true
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"address","name":"_multisig","type":"address"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[],"name":"InvalidLocalDecimals","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"name":"SimulationResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"indexed":false,"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"EnforcedOptionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"inspector","type":"address"}],"name":"MsgInspectorSet","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":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preCrimeAddress","type":"address"}],"name":"PreCrimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_AND_CALL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","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"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint16","name":"_msgType","type":"uint16"},{"internalType":"bytes","name":"_extraOptions","type":"bytes"}],"name":"combineOptions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"}],"name":"enforcedOptions","outputs":[{"internalType":"bytes","name":"enforcedOption","type":"bytes"}],"stateMutability":"view","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":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"isPeer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"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":"uint32","name":"dstEid","type":"uint32"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct InboundPacket[]","name":"_packets","type":"tuple[]"}],"name":"lzReceiveAndRevert","outputs":[],"stateMutability":"payable","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":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceiveSimulate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"msgInspector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oApp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","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":"peers","outputs":[{"internalType":"bytes32","name":"peer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preCrime","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"oftLimit","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":"oftReceipt","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":"msgFee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"setEnforcedOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgInspector","type":"address"}],"name":"setMsgInspector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_preCrime","type":"address"}],"name":"setPreCrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101a060405234620000cd57620000266200001962000298565b94939093929192620002d3565b60405161402262000dd18239608051818181610c02015281816114f101528181611fb1015281816124ed01528181612a94015281816139a10152613dbb015260a051818181610ea6015281816132ca015281816134320152613755015260c051816127d1015260e051816127fe0152610100518161279e015261012051816136f6015261014051816136d501526101605181612bd901526101805181612c06015261402290f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200010a57604052565b620000d2565b90620001276200011f60405190565b9283620000e8565b565b6001600160401b0381116200010a57602090601f01601f19160190565b0190565b60005b8381106200015e5750506000910152565b81810151838201526020016200014d565b9092919262000188620001828262000129565b62000110565b9381855281830111620000cd57620001279160208501906200014a565b9080601f83011215620000cd578151620001c2926020016200016f565b90565b6001600160a01b031690565b6001600160a01b0381165b03620000cd57565b905051906200012782620001d1565b80620001dc565b905051906200012782620001f3565b909160c082840312620000cd5781516001600160401b038111620000cd578362000235918401620001a5565b60208301519093906001600160401b038111620000cd57816200025a918501620001a5565b926200026a8260408301620001e4565b92620001c26200027e8460608501620001e4565b9360a0620002908260808701620001e4565b9401620001fa565b620002bb62004e1380380380620002af8162000110565b92833981019062000209565b909192939495565b620001c2620001c2620001c29290565b91839291620002e794929695968062000341565b620002f36000620002c3565b8111620002fe575050565b62000127916200088f565b9062000319620001828362000129565b918252565b6200032a600162000309565b603160f81b602082015290565b620001c26200031e565b906200012795949392916200035562000337565b6200012796959493929162000391565b620001c290620001c5906001600160a01b031682565b620001c29062000365565b620001c2906200037b565b9294620003cf94620003eb979296620003aa946200041f565b620003b7600a8262000903565b61016052620003c8600b8462000903565b6101805290565b620003e3620003dc825190565b9160200190565b206101205290565b620003f8620003dc825190565b20610140524660e0526200040b6200099c565b60c052620004193062000386565b61010052565b62000127948594859491939092906200043762000a28565b916200062f565b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000477575b60208310146200047157565b6200043e565b91607f169162000465565b9160001960089290920291821b911b5b9181191691161790565b9190620004b1620001c2620004ba93620002c3565b90835462000482565b9055565b62000127916000916200049c565b818110620004d8575050565b80620004e86000600193620004be565b01620004cc565b9190601f8111620004ff57505050565b620005136200012793600052602060002090565b906020601f84018190048301931062000537575b6020601f909101040190620004cc565b909150819062000527565b906200054c815190565b906001600160401b0382116200010a5762000574826200056d855462000454565b85620004ef565b602090601f8311600114620005b357620004ba929160009183620005a7575b5050600019600883021c1916906002021790565b01519050388062000593565b601f19831691620005c985600052602060002090565b9260005b8181106200060a57509160029391856001969410620005f0575b50505002019055565b01516000196008601f8516021c19169055388080620005e7565b91936020600181928787015181550195019201620005cd565b90620001279162000542565b91946200064791946200064f94620001279762000657565b600862000623565b600962000623565b6200012793849384939192909190620006ae565b634e487b7160e01b600052601160045260246000fd5b60ff908116911690039060ff82116200069657565b6200066b565b60ff16604d81116200069657600a0a90565b929091620006bc9262000706565b620006c662000a34565b9060ff821660ff821610620006f057620006eb91620006e59162000681565b6200069c565b60a052565b6040516301e9714b60e41b8152600490fd5b0390fd5b6200012792839283928392839290916200074e565b620001c5620001c2620001c29290565b620001c2906200071b565b6000910312620000cd57565b6040513d6000823e3d90fd5b6200075e6200076492936200082a565b62000386565b60805262000777620001c560006200072b565b6001600160a01b0382161462000818576200079e6200075e6080516001600160a01b031690565b803b15620000cd57620007e3600092918392620007ba60405190565b948593849283919063ca5eb5e160e01b8352600483016001600160a01b03909116815260200190565b03925af180156200081257620007f65750565b62000127906000620008098183620000e8565b81019062000736565b62000742565b604051632d618d8160e21b8152600490fd5b6200083660006200072b565b6001600160a01b0381166001600160a01b038316146200085c5750620001279062000a6c565b62000702906200086b60405190565b631e4fbdf760e01b8152918291600483016001600160a01b03909116815260200190565b91906200089d60006200072b565b926001600160a01b0384166001600160a01b03821614620008c45762000127929362000b5f565b6200070284620008d360405190565b63ec442f0560e01b8152918291600483016001600160a01b03909116815260200190565b620001c260ff620002c3565b805162000919620009156020620002c3565b9190565b10156200092c57620001c2915062000d5b565b60006200093a620009419390565b0162000623565b620001c2620001c2620008f7565b909594926200012794620009866200098d926200097f6080966200097860a088019c6000890152565b6020870152565b6040850152565b6060830152565b01906001600160a01b03169052565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f62000a01620009cc6101205190565b6101405190620009f4620009e03062000386565b60405195869460208601944692866200094f565b90810382520382620000e8565b62000a0e620003dc825190565b2090565b62000a22620001c2620001c29290565b60ff1690565b620001c2601262000a12565b620001c2600662000a12565b906001600160a01b039062000492565b9062000a64620001c2620004ba9262000386565b825462000a40565b62000a9b62000a9462000a876000546001600160a01b031690565b6200075e84600062000a50565b9162000386565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e062000ac760405190565b80805b0390a3565b9062000adb9062000386565b600052602052604060002090565b620001c29081565b620001c2905462000ae9565b6001600160a01b0390911681526060810193926200012792909160409162000b26906020830152565b0152565b906000199062000492565b9062000b49620001c2620004ba92620002c3565b825462000b2a565b919082018092116200069657565b62000b6b60006200072b565b6001600160a01b0381166001600160a01b0383160362000c3a5762000bfa62000bf360008051602062004df38339815191529362000bca62000aca94620001c562000bc28a62000bbc600762000af1565b62000b51565b600762000b35565b6001600160a01b0387160362000c12576200075e62000bc28862000bef600762000af1565b0390565b9362000386565b9362000c0560405190565b9182918290815260200190565b6200075e62000c2387600562000acf565b62000c3389620001468362000af1565b9062000b35565b62000c5162000c4b83600562000acf565b62000af1565b84811062000c9c5762000bf360008051602062004df38339815191529362000bca62000aca94620001c562000c898a62000bfa970390565b62000c9685600562000acf565b62000b35565b82620007028662000cac60405190565b63391434e360e21b81529384936004850162000afd565b62000ce862000cf2602093620001469362000cdc815190565b80835293849260200190565b958691016200014a565b601f01601f191690565b6020808252620001c29291019062000cc3565b62000d2b62000d2762000d20835190565b9260200190565b5190565b906020811062000d39575090565b62000d4c90600019906020036008021b90565b1690565b620001c290620002c3565b8062000d65825190565b62000d7562000915601f620002c3565b1162000daa5750620001c28162000da362000d9e62000d98620001c29562000d0f565b62000d50565b915190565b17620002c3565b620007029062000db960405190565b63305a27a960e01b81529182916004830162000cfc56fe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146102ed578063095ea7b3146102e85780630d35b415146102e3578063111ecdad146102de57806313137d65146102d9578063134d4f25146102d4578063156a0d0f146102cf57806317442b70146102ca57806318160ddd146102c55780631f5e1334146102c057806323b872dd146102bb578063313ce567146102b65780633400288b146102b15780633644e515146102ac5780633b6f743b146102a757806352ae2879146102165780635535d461146102a25780635a0dfe4d1461029d5780635e280f11146102985780636fc1b31e1461029357806370a082311461028e578063715018a6146102895780637d25a05e146102845780637ecebe001461027f57806382413eac1461027a57806384b0196e14610275578063857749b0146102705780638da5cb5b1461026b57806395d89b4114610266578063963efcaa146102615780639f68b9641461025c578063a9059cbb14610257578063b731ea0a14610252578063b98bd0701461024d578063bb0b6a5314610248578063bc70b35414610243578063bd815db01461023e578063c7c7f5b314610239578063ca5eb5e114610234578063d045a0dc1461022f578063d42438851461022a578063d505accf14610225578063dd62ed3e14610220578063f2fde38b1461021b578063fc0c546a146102165763ff7bd03d036102fd5761125f565b610959565b611233565b611217565b6111dc565b61114f565b611135565b61111d565b6110f3565b61104e565b61102f565b610fd3565b610f7b565b610f0c565b610ee4565b610eca565b610e91565b610e76565b610e5b565b610e40565b610e0c565b610d1b565b610cbc565b610c86565b610c6e565b610c53565b610c3b565b610be9565b610b8e565b610b72565b610931565b6108b2565b610899565b610835565b610819565b6107d5565b610797565b610769565b61071c565b6106c1565b61067c565b610596565b610541565b610403565b610371565b60009103126102fd57565b600080fd5b60005b8381106103155750506000910152565b8181015183820152602001610305565b61034661034f6020936103599361033a815190565b80835293849260200190565b95869101610302565b601f01601f191690565b0190565b602080825261036e92910190610325565b90565b346102fd576103813660046102f2565b61039861038c61130c565b6040519182918261035d565b0390f35b6001600160a01b031690565b6001600160a01b0381165b036102fd57565b905035906103c7826103a8565b565b806103b3565b905035906103c7826103c9565b91906040838203126102fd5761036e9060206103f882866103ba565b94016103cf565b9052565b346102fd5761039861041f6104193660046103dc565b90611316565b60405191829182901515815260200190565b908160e09103126102fd5790565b906020828203126102fd5781356001600160401b0381116102fd5761036e9201610431565b8051825261036e91604081019160200151906020818403910152610325565b9061036e91610464565b906104a3610499835190565b8083529160200190565b90816104b56020830284019460200190565b926000915b8383106104c957505050505090565b909192939460206104ec6104e583856001950387528951610483565b9760200190565b93019301919392906104ba565b93929061052f6060916103c79461052260a089019260008a019080518252602090810151910152565b878203604089015261048d565b94019080518252602090810151910152565b346102fd5761039861055c61055736600461043f565b611431565b604051919391938493846104f9565b61036e916008021c6001600160a01b031690565b9061036e915461056b565b61036e6000600461057f565b346102fd576105a63660046102f2565b6103986105b161058a565b604051918291826001600160a01b03909116815260200190565b908160609103126102fd5790565b909182601f830112156102fd578135916001600160401b0383116102fd5760200192600183028401116102fd57565b60e0818303126102fd5761061c82826105cb565b9261062a83606084016103cf565b9260808301356001600160401b0381116102fd578161064a9185016105d9565b92909361065a8360a083016103ba565b9260c08201356001600160401b0381116102fd5761067892016105d9565b9091565b61069661068a366004610608565b959490949391936114e5565b604051005b6106a861036e61036e9290565b61ffff1690565b61036e600261069b565b61036e6106af565b346102fd576106d13660046102f2565b6103986106dc6106b9565b6040519182918261ffff909116815260200190565b6001600160e01b031990911681526040810192916103c7916020905b01906001600160401b03169052565b346102fd5761072c3660046102f2565b6107346115d3565b9061039861074160405190565b928392836106f1565b6001600160401b0390911681526040810192916103c79160209061070d565b346102fd576107793660046102f2565b6107816115f9565b9061039861078e60405190565b9283928361074a565b346102fd576107a73660046102f2565b6103986107b261161b565b6040515b9182918290815260200190565b61036e600161069b565b61036e6107c3565b346102fd576107e53660046102f2565b6103986106dc6107cd565b90916060828403126102fd5761036e61080984846103ba565b9360406103f882602087016103ba565b346102fd5761039861041f61082f3660046107f0565b91611625565b346102fd576108453660046102f2565b61039861085061164e565b6040519182918260ff909116815260200190565b63ffffffff81166103b3565b905035906103c782610864565b91906040838203126102fd5761036e9060206103f88286610870565b346102fd576106966108ac36600461087d565b9061166f565b346102fd576108c23660046102f2565b6103986107b2611679565b8015156103b3565b905035906103c7826108cd565b91906040838203126102fd578235906001600160401b0382116102fd5760206109108261036e948701610431565b94016108d5565b6040810192916103c7919080518252602090810151910152565b346102fd5761039861094d6109473660046108e2565b90611681565b60405191829182610917565b346102fd576109693660046102f2565b6103986105b16116d3565b61ffff81166103b3565b905035906103c782610974565b91906040838203126102fd5761036e9060206109a78286610870565b940161097e565b6109c161036e61036e9263ffffffff1690565b63ffffffff1690565b906109d4906109ae565b600052602052604060002090565b6106a861036e61036e9261ffff1690565b906109d4906109e2565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610a49575b6020831014610a4457565b610a13565b91607f1691610a39565b80546000939291610a70610a6683610a29565b8085529360200190565b9160018116908115610ac25750600114610a8957505050565b610a9c9192939450600052602060002090565b916000925b818410610aae5750500190565b805484840152602090930192600101610aa1565b92949550505060ff1916825215156020020190565b9061036e91610a53565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b03821117610b1857604052565b610ae1565b906103c7610b3792610b2e60405190565b93848092610ad7565b0383610af7565b90600010610b4f5761036e90610b1d565b6109fd565b610b6d61036e92610b6860009360036109ca565b6109f3565b610b3e565b346102fd5761039861038c610b8836600461098b565b90610b54565b346102fd5761039861041f610ba436600461087d565b906116dc565b61036e9061039c906001600160a01b031682565b61036e90610baa565b61036e90610bbe565b6103ff90610bc7565b6020810192916103c79190610bd0565b346102fd57610bf93660046102f2565b604051806103987f000000000000000000000000000000000000000000000000000000000000000082610bd9565b906020828203126102fd5761036e916103ba565b346102fd57610696610c4e366004610c27565b61177c565b346102fd576103986107b2610c69366004610c27565b61178f565b346102fd57610c7e3660046102f2565b6106966117de565b346102fd57610398610ca2610c9c36600461087d565b906117e6565b604051918291826001600160401b03909116815260200190565b346102fd576103986107b2610cd2366004610c27565b6117fb565b9060a0828203126102fd57610cec81836105cb565b9260608301356001600160401b0381116102fd5782610d1260809461036e9387016105d9565b949095016103ba565b346102fd5761039861041f610d31366004610cd7565b92919091611804565b90610d5a610d53610d49845190565b8084529260200190565b9260200190565b9060005b818110610d6b5750505090565b909192610d88610d816001928651815260200190565b9460200190565b929101610d5e565b93959194610de8610de0610dff95610dd2610df89561036e9c9a610dc560e08c019260008d01906001600160f81b0319169052565b8a820360208c0152610325565b9088820360408a0152610325565b976060870152565b6001600160a01b03166080850152565b60a0830152565b60c0818403910152610d3a565b346102fd57610e1c3660046102f2565b610398610e27611841565b93610e3797959793919360405190565b97889788610d90565b346102fd57610e503660046102f2565b610398610850611887565b346102fd57610e6b3660046102f2565b6103986105b16118a4565b346102fd57610e863660046102f2565b61039861038c6118ae565b346102fd57610ea13660046102f2565b6103987f00000000000000000000000000000000000000000000000000000000000000006107b2565b346102fd57610eda3660046102f2565b610398600061041f565b346102fd5761039861041f610efa3660046103dc565b906118b8565b61036e6000600261057f565b346102fd57610f1c3660046102f2565b6103986105b1610f00565b909182601f830112156102fd578135916001600160401b0383116102fd5760200192602083028401116102fd57565b906020828203126102fd5781356001600160401b0381116102fd576106789201610f27565b346102fd57610696610f8e366004610f56565b90611a19565b906020828203126102fd5761036e91610870565b61036e916008021c81565b9061036e9154610fa8565b6000610fce61036e9260016109ca565b610fb3565b346102fd576103986107b2610fe9366004610f94565b610fbe565b916060838303126102fd576110038284610870565b92611011836020830161097e565b9260408201356001600160401b0381116102fd5761067892016105d9565b346102fd5761039861038c611045366004610fee565b92919091611af0565b611059366004610f56565b90611da5565b908160409103126102fd5790565b90916080828403126102fd5781356001600160401b0381116102fd576110988461036e928501610431565b9360606110a8826020870161105f565b94016103ba565b815181526020808301516001600160401b0316818301526040928301518051938301939093529182015160608201528251608082015291015160a082015260c00190565b61110761110136600461106d565b91611f83565b9061039861111460405190565b928392836110af565b346102fd57610696611130366004610c27565b612038565b610696611143366004610608565b95949094939193612041565b346102fd57610696611162366004610c27565b6120b0565b60ff81166103b3565b905035906103c782611167565b60e0818303126102fd5761119182826103ba565b9261119f83602084016103ba565b926111ad81604085016103cf565b926111bb82606083016103cf565b9261036e6111cc8460808501611170565b9360c06103f88260a087016103cf565b346102fd576106966111ef36600461117d565b95949094939193612139565b91906040838203126102fd5761036e9060206110a882866103ba565b346102fd576103986107b261122d3660046111fb565b90612242565b346102fd57610696611246366004610c27565b6122cc565b906060828203126102fd5761036e916105cb565b346102fd5761039861041f61127536600461124b565b6122d5565b8054600093929161128d610a6683610a29565b9160018116908115610ac257506001146112a657505050565b6112b99192939450600052602060002090565b916000925b8184106112cb5750500190565b8054848401526020909301926001016112be565b9061036e9161127a565b906103c7610b37926112fa60405190565b938480926112df565b61036e906112e9565b61036e6008611303565b6113219190336122fd565b600190565b906103c761133360405190565b9283610af7565b61036e6040611326565b61134c61133a565b906000825260006020830152565b905250565b61036e611344565b61036e61036e61036e9290565b61036e61036e61036e926001600160401b031690565b6001600160401b038111610b185760208091020190565b906113b36113ae8361138a565b611326565b918252565b6113c061133a565b906000825260606020830152565b61036e6113b8565b60005b8281106113e557505050565b6020906113f06113ce565b81840152016113d9565b906103c761141061140a846113a1565b9361138a565b601f1901602084016113d6565b3561036e816103c9565b3561036e81610864565b61143961135f565b5061144261135f565b5061144d6000611367565b9161036e6114b46114886114676001600160401b03611374565b61148261147261133a565b9161147b898452565b6020830152565b956113fa565b936114956040820161141d565b906114ae60006114a76060840161141d565b9201611427565b9161231d565b61147b6114c293929361133a565b938452565b63ffffffff90911681526040810192916103c79160200152565b0152565b969594939291906115157f0000000000000000000000000000000000000000000000000000000000000000610bc7565b611527335b916001600160a01b031690565b036115a2578761153e61153982611427565b612369565b98602082019961155761155361036e8d61141d565b9190565b0361156857506103c797985061240f565b61157b6115758b92611427565b9161141d565b9061159e61158860405190565b63309afaf360e21b8152928392600484016114c7565b0390fd5b6040516391ac5e4f60e01b8152336004820152602490fd5b6115c761036e61036e9290565b6001600160401b031690565b62b9270b60e21b9061036e60016115ba565b61036e60016115ba565b61036e60026115ba565b6116016115e5565b9061036e6115ef565b61036e9081565b61036e905461160a565b61036e6007611611565b6113219291906116368333836125c8565b61262d565b61164861036e61036e9290565b60ff1690565b61036e601261163b565b906103c7916116656126da565b906103c791612745565b906103c791611658565b61036e612788565b906116ce61036e9261169161135f565b506116c66116a16040830161141d565b916116be6116b16060830161141d565b919384926114ae84611427565b91905061286a565b929091611427565b612a75565b61036e30610bc7565b6115536116fe6116f9611702936116f1600090565b5060016109ca565b611611565b9290565b1490565b6103c7906117126126da565b611747565b906001600160a01b03905b9181191691161790565b9061173c61036e61174392610bc7565b8254611717565b9055565b6117777ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197916105b181600461172c565b0390a1565b6103c790611706565b906109d490610bc7565b6116f961036e9161179e600090565b506005611785565b6117ae6126da565b6103c76117cc565b61039c61036e61036e9290565b61036e906117b6565b6103c76117d960006117c3565b612b6a565b6103c76117a6565b50506117f0600090565b5061036e60006115ba565b61036e90612bbd565b50505061180f600090565b5061170261151a61039c30610bc7565b369037565b906103c761183461140a846113a1565b601f19016020840161181f565b611849612bd4565b90611852612c01565b9061185c30610bc7565b6118666000611367565b6118786118736000611367565b611824565b600f60f81b9594934693929190565b61036e600661163b565b61036e9061039c565b61036e9054611891565b61036e600061189a565b61036e6009611303565b61132191903361262d565b906103c7916118d06126da565b611a07565b6001600160401b038111610b1857602090601f01601f19160190565b90826000939282370152565b9092919261190d6113ae826118d5565b93818552818301116102fd576103c79160208501906118f1565b9080601f830112156102fd5781602061036e933591016118fd565b9190916060818403126102fd576119596060611326565b926119648183610870565b8452611973816020840161097e565b602085015260408201356001600160401b0381116102fd576119959201611927565b6040830152565b9291906119ab6113ae8261138a565b93818552602080860192028101918383116102fd5781905b8382106119d1575050505050565b81356001600160401b0381116102fd576020916119f18784938701611942565b8152019101906119c3565b61036e91369161199c565b6103c791611a14916119fc565b612e71565b906103c7916118c3565b61036e90610b1d565b61036e9136916118fd565b909392938483116102fd5784116102fd578101920390565b610359611a6792602092611a61815190565b94859290565b93849101610302565b909161035990839080936118f1565b611a8d9061036e9492611a4f565b91611a70565b906103c791939293611ab5611aa760405190565b958693602085019384611a7f565b90810382520383610af7565b919061034f81611ad8816103599560209181520190565b80956118f1565b602080825261036e93910191611ac1565b611b1491610b68611b0f9296949596611b07606090565b5060036109ca565b611a23565b8051611b236115536000611367565b14611baa5783611b336000611367565b8114611ba357611b466115536002611367565b1015611b7057505061159e611b5a60405190565b639a6d49cd60e01b815292839260048401611adf565b90928083611b8c611b87611b9d9461036e97611a2c565b612f5a565b81611b976002611367565b91611a37565b91611a93565b5092509050565b509161036e91611a2c565b634e487b7160e01b600052603260045260246000fd5b90359061013e1936829003018212156102fd570190565b90821015611bf957602061036e9202810190611bcb565b611bb5565b903590601e1936829003018212156102fd57018035906001600160401b0382116102fd57602001913682900383136102fd57565b3561036e816103a8565b5061036e906020810190610870565b5061036e9060208101906103cf565b6001600160401b0381166103b3565b905035906103c782611c5a565b5061036e906020810190611c69565b906040611cc96103c793611ca9611c9f6000830183611c3c565b63ffffffff168552565b611cc0611cb96020830183611c4b565b6020860152565b82810190611c76565b6001600160401b0316910152565b929061036e97959694611d1192611d04611d2395611cfd60e089019560008a0190611c85565b6060880152565b8583036080870152611ac1565b6001600160a01b0390951660a0830152565b60c0818503910152611ac1565b6040513d6000823e3d90fd5b90929192611d4c6113ae826118d5565b93818552818301116102fd576103c7916020850190610302565b9080601f830112156102fd57815161036e92602001611d3c565b906020828203126102fd5781516001600160401b0381116102fd5761036e9201611d66565b600091611db183611367565b81811015611ed257611dc4818385611be2565b9084820191611dea611de6611dda888601611427565b610ba46020870161141d565b1590565b611ec757611df730610bc7565b9263d045a0dc93611e0a60c0840161141d565b94611e1760a0850161141d565b95611e26610100860186611bfe565b9290611e43611e3760e08901611c32565b97610120810190611bfe565b90863b156102fd578d98611e6b96611e7694611e5e60405190565b9d8e9b8c9a8b9960e01b90565b895260048901611cd7565b03925af1918215611ec257611e9192611e96575b5060010190565b611db1565b611eb590863d8811611ebb575b611ead8183610af7565b8101906102f2565b38611e8a565b503d611ea3565b611d30565b506001019050611db1565b83611ee4611edf33610bc7565b610bc7565b90611eee60405190565b638e9e709960e01b815291829060049082905afa8015611ec25761159e91600091611f2e575b50604051638351eea760e01b81529182916004830161035d565b611f4b91503d806000833e611f438183610af7565b810190611d80565b82611f14565b61036e6060611326565b611f63611f51565b9060008252602080808401600081520161135a61135f565b61036e611f5b565b906106789291611f91611f7b565b50611f9a61135f565b50612ffc565b6103c790611fac6126da565b611fd57f0000000000000000000000000000000000000000000000000000000000000000610bc7565b803b156102fd57612017600092918392611fee60405190565b948593849283919063ca5eb5e160e01b8352600483016001600160a01b03909116815260200190565b03925af18015611ec2576120285750565b6103c7906000611ead8183610af7565b6103c790611fa0565b95949392919061205361039c30610bc7565b3303612062576103c7966130e5565b60405163029a949d60e31b8152600490fd5b6103c7906120806126da565b6117777fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760916105b181600261172c565b6103c790612074565b91946121086114e19298979561210160a0966120f16103c79a6120e160c08a019e60008b0152565b6001600160a01b03166020890152565b6001600160a01b03166040870152565b6060850152565b6080830152565b6001600160a01b0390911681526040810192916103c7916020905b01906001600160a01b03169052565b9695929491949390936121498190565b421161221b57906121ce856121b68a6121d39796956121aa6121887f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990565b9161219284613104565b8d61219c60405190565b9788966020880196876120b9565b90810382520382610af7565b6121c86121c1825190565b9160200190565b20613127565b613150565b6001600160a01b0385166001600160a01b038216036121f757506103c792936122fd565b849061159e61220560405190565b6325c0072360e11b81529283926004840161210f565b61159e9061222860405190565b63313c898160e11b81529182916004830190815260200190565b61036e9161225d6116f992612255600090565b506006611785565b611785565b6103c79061226e6126da565b61227860006117c3565b6001600160a01b0381166001600160a01b0383161461229b57506103c790612b6a565b61159e906122a860405190565b631e4fbdf760e01b8152918291600483016001600160a01b03909116815260200190565b6103c790612262565b61170261155361036e60206122f66116f96122ef87611427565b60016109ca565b940161141d565b916001916103c793613171565b9081526040810192916103c79160200152565b6123329193925061232c600090565b506132c1565b9081928261233d8290565b8110612347575050565b61159e61235360405190565b6371c4efed60e01b81529283926004840161230a565b6123776116f98260016109ca565b9061238561036e6000611367565b821461238f575090565b61159e9061239c60405190565b63f6ff4fb760e01b81529182916004830163ffffffff909116815260200190565b3561036e81611c5a565b6103ff9061069b565b6001600160a01b03909116815261036e936080820193909261240291906123f8906020850152565b60408301906123c7565b6060818403910152610325565b929450945091506124286124238484613333565b61336b565b9261243b61243682856133e7565b613429565b92612454600084019461244d86611427565b9087613457565b9261245f8383613498565b6124bc575b5050506124a161249b6124977fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c94611427565b9590565b93610bc7565b936124b76124ae60405190565b928392836114c7565b0390a3565b6124e792916124e16124d160408794016123bd565b936124db88611427565b926134ab565b9261351a565b916125117f0000000000000000000000000000000000000000000000000000000000000000610bc7565b803b156102fd5761254860009491859261252a60405190565b9687938492839190633e5ac80960e11b8352838d8d600486016123d0565b03925af1928315611ec2576124976124a19261249b927fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c9661258d575b509450612464565b61259d906000611ead8183610af7565b38612585565b6001600160a01b0390911681526060810193926103c79290916040916114e19061147b565b916125d38284612242565b60001981036125e3575b50505050565b81811061260957916125fa61260094926000940390565b91613171565b388080806125dd565b8261159e8361261760405190565b637dc7a0d960e11b8152938493600485016125a3565b92919061263a60006117c3565b936001600160a01b0385166001600160a01b038216146126a9576001600160a01b0385166001600160a01b03831614612678576103c7939450613549565b61159e8561268560405190565b63ec442f0560e01b8152918291600483016001600160a01b03909116815260200190565b61159e856126b660405190565b634b637e8f60e11b8152918291600483016001600160a01b03909116815260200190565b6126e26118a4565b33906126ed8261151a565b036126f55750565b61159e9061270260405190565b63118cdaa760e01b8152918291600483016001600160a01b03909116815260200190565b9060001990611722565b9061273e61036e6117439290565b8254612726565b907f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9161277c826127778360016109ca565b612730565b6117776124ae60405190565b61279130610bc7565b6127c36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661151a565b14806127fb575b156127f3577f000000000000000000000000000000000000000000000000000000000000000090565b61036e6136af565b507f000000000000000000000000000000000000000000000000000000000000000046146127ca565b905051906103c7826108cd565b906020828203126102fd5761036e91612824565b604080825261036e93919261285c91840190610325565b916020818403910152610325565b90916128ad6128e29361287b606090565b5061289161288b6020860161141d565b91613743565b6128a76128a160a0870187611bfe565b90611a2c565b91613787565b9390928394600014612987576128c16106af565b905b6128da6128cf82611427565b916080810190611bfe565b929091611af0565b91826128ee600461189a565b906128fc61039c60006117c3565b6001600160a01b0383160361291057505050565b61294b92612922611edf602094610bc7565b9061292c60405190565b80958194829361294063043a78eb60e01b90565b845260048401612845565b03915afa8015611ec25761295c5750565b61297d9060203d602011612980575b6129758183610af7565b810190612831565b50565b503d61296b565b61298f6107c3565b906128c3565b61036e60a0611326565b905051906103c7826103c9565b91906040838203126102fd5761147b9060206129c86040611326565b946129d3838261299f565b86520161299f565b906040828203126102fd5761036e916129ac565b805163ffffffff1682529061036e90608080612a3e612a2c60a08501612a1a60208901516020880152565b60408801518682036040880152610325565b60608701518582036060870152610325565b9401511515910152565b92916020612a656103c793604087019087820360008901526129ef565b9401906001600160a01b03169052565b90612af9612b2b94612af0604095612a8b61135f565b50612ae9612ab87f0000000000000000000000000000000000000000000000000000000000000000610bc7565b95612ae3612ac589612369565b612adc612ad0612995565b63ffffffff909b168b52565b60208a0152565b88880152565b6060860152565b15156080840152565b612b0230610bc7565b91612b0c60405190565b809581948293612b2063ddc28c5860e01b90565b845260048401612a48565b03915afa908115611ec257600091612b41575090565b61036e915060403d604011612b63575b612b5b8183610af7565b8101906129db565b503d612b51565b612b8b612b85612b7a600061189a565b611edf84600061172c565b91610bc7565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0612bb660405190565b80806124b7565b6116f961036e91612bcc600090565b50600c611785565b61036e7f0000000000000000000000000000000000000000000000000000000000000000600a5b906138ab565b61036e7f0000000000000000000000000000000000000000000000000000000000000000600b612bfb565b90612c35825190565b811015611bf9576020809102010190565b9160001960089290920291821b911b611722565b9190612c6b61036e61174393611367565b908354612c46565b6103c791600091612c5a565b818110612c8a575050565b80612c986000600193612c73565b01612c7f565b9190601f8111612cad57505050565b612cbf6103c793600052602060002090565b906020601f840181900483019310612ce1575b6020601f909101040190612c7f565b9091508190612cd2565b90612cf4815190565b906001600160401b038211610b1857612d1782612d118554610a29565b85612c9e565b602090601f8311600114612d5257611743929160009183612d47575b5050600019600883021c1916906002021790565b015190503880612d33565b601f19831691612d6785600052602060002090565b9260005b818110612da557509160029391856001969410612d8c575b50505002019055565b01516000196008601f8516021c19169055388080612d83565b91936020600181928787015181550195019201612d6b565b906103c791612ceb565b805163ffffffff16825261036e91606081019160409060208181015161ffff16908401520151906040818403910152610325565b9061036e91612dc7565b90612e11610499835190565b9081612e236020830284019460200190565b926000915b838310612e3757505050505090565b90919293946020612e536104e583856001950387528951612dfb565b9301930191939290612e28565b602080825261036e92910190612e05565b90600091612e7f6000611367565b612e8a61036e835190565b811015612f155780612eac6040612ea4612f109486612c2c565b510151612f5a565b612f0a6040612ebb8386612c2c565b510151612f05612ee66003612ee08a612ed4888b612c2c565b51015163ffffffff1690565b906109ca565b612eff6020612ef5878a612c2c565b51015161ffff1690565b906109f3565b612dbd565b60010190565b612e7f565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67491925061177790612f4760405190565b91829182612e60565b61036e600361069b565b6002810151612f75612f6d6106a8612f50565b9161ffff1690565b03612f7d5750565b61159e90612f8a60405190565b639a6d49cd60e01b81529182916004830161035d565b91906040838203126102fd5761147b906020612fbc6040611326565b94612fc783826103cf565b8652016103cf565b61036e903690612fa0565b63ffffffff90911681526060810193926103c79290916040916114e19061147b565b9290916130696130509161300e611f7b565b5061301761135f565b506130246040870161141d565b946130476130346060890161141d565b88979061304089611427565b91336138d4565b8095919861286a565b9061306361305d89611427565b93612fcf565b9261394f565b927f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a84956130c56130c16130bb60006130a061133a565b6130aa8683830152565b6130b5896020830152565b99015190565b94611427565b9390565b926124b76130d233610bc7565b956130dc60405190565b93849384612fda565b906103c796959493929161240f565b9061273e61036e61174392611367565b61310f906000612bcc565b61036e61311b82611611565b91600183015b906130f4565b61036e90613133612788565b6042916040519161190160f01b8352600283015260228201522090565b9161036e939161316893613162600090565b50613abb565b90929192613bb1565b90919261317e60006117c3565b6001600160a01b0381166001600160a01b0384161461323d576001600160a01b0381166001600160a01b0385161461320c57506131c9846131c48561225d866006611785565b6130f4565b6131d257505050565b6124b761320261249b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610bc7565b936107b660405190565b61159e9061321960405190565b634a1406b160e11b8152918291600483016001600160a01b03909116815260200190565b61159e9061324a60405190565b63e602df0560e01b8152918291600483016001600160a01b03909116815260200190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81156132a4570490565b61326e565b818102929181159184041417156132bc57565b613284565b61036e906132f07f0000000000000000000000000000000000000000000000000000000000000000809261329a565b6132a9565b61036e602061163b565b61036e61036e61036e9260ff1690565b35906020811061331d575090565b61332f90600019906020036008021b90565b1690565b61335c90600061036e93613345600090565b506133566133516132f5565b6132ff565b92611a37565b9061330f565b61036e90611367565b61338861338361036e9261337d600090565b50613362565b6117b6565b610bbe565b61036e602861163b565b356001600160c01b03191690600881106133af575090565b6001600160c01b031960089182039091021b1690565b6115c761036e61036e926001600160401b031690565b61036e9060c01c6133c5565b61341e6134249161036e936133fa600090565b506134036132f5565b9061335661341861341261338d565b936132ff565b926132ff565b90613397565b6133db565b61036e906132f07f000000000000000000000000000000000000000000000000000000000000000091611374565b9091508161346861039c60006117c3565b6001600160a01b03831614613481575b61036e91613c7a565b61036e915061349161dead6117c3565b9150613478565b506134a761155361335161338d565b1190565b61036e916128a19181611b9761335161338d565b6103ff906001600160401b031660c01b90565b60e01b90565b6103ff9063ffffffff1660e01b90565b600460209361350d6008846135056135139661036e9b9a986134bf565b0180926134d8565b01918252565b0190611a4f565b6121aa61036e939461352a606090565b506040519586946020860194856134e8565b919082018092116132bc57565b61355360006117c3565b6001600160a01b0381166001600160a01b038316036135f75761320261249b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936135b86124b79461039c6135b18a6135ac6007611611565b61353c565b60076130f4565b6001600160a01b038716036135dc57611edf6135b1886135d86007611611565b0390565b611edf6135ea876005611785565b6131218961035983611611565b6136056116f9836005611785565b8481106136525761249b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936135b86124b79461039c6136478a613202970390565b6131c4856005611785565b8261159e8661366060405190565b63391434e360e21b8152938493600485016125a3565b909594926103c7946136a861212a926136a160809661369a60a088019c6000890152565b6020870152565b6040850152565b6060830152565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6137347f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006121aa61372130610bc7565b6040519586946020860194469286613676565b61373f6121c1825190565b2090565b61377a61036e91613752600090565b507f00000000000000000000000000000000000000000000000000000000000000009061329a565b6115ba565b0180926134bf565b909180516137986115536000611367565b119283156137e2576137df91926121aa6137b133613cc9565b946137bb60405190565b958694602086019485600860209361350d858461377f6135139661036e9b9a989052565b91565b6137df91506121aa926137f460405190565b93849260208401928360208161377f61035993600896959052565b61036e60ff611367565b8054600093929161382c610a6683610a29565b9160018116908115610ac2575060011461384557505050565b6138589192939450600052602060002090565b916000925b81841061386a5750500190565b80548484015260209093019260010161385d565b9061036e91613819565b906103c7610b379261389960405190565b9384809261387e565b61036e90613888565b90816138bb61155361036e61380f565b146138ca575061036e90613d0e565b61036e91506138a2565b936103c79390926138e49261231d565b92908094613d35565b905051906103c782611c5a565b91906080838203126102fd576119959060406139166060611326565b94613921838261299f565b865261393083602083016138ed565b6020870152016129ac565b906080828203126102fd5761036e916138fa565b608093600093613a25612b2093613964611f7b565b50613a1d602061397c6139778a88015190565b613d73565b950193613987855190565b6139936115538b611367565b11613a7d575b613a166139c57f0000000000000000000000000000000000000000000000000000000000000000610bc7565b98613a0f632637a45097613a086139e36139de89612369565b925190565b6139f08f61155390611367565b11976139fa612995565b9e8f019063ffffffff169052565b60208d0152565b60408b0152565b6060890152565b151586880152565b613a3e613a3160405190565b9788968795869460e01b90565b03925af1908115611ec257600091613a54575090565b61036e915060803d608011613a76575b613a6e8183610af7565b81019061393b565b503d613a64565b613a8d613a88865190565b613db6565b613999565b6114e16103c794611995606094989795613ab1608086019a6000870152565b60ff166020850152565b9091613ac684613362565b613af26115537f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0611367565b11613b6e5790613b1460209460009493613b0b60405190565b94859485613a92565b838052039060015afa15611ec257600051600091613b31836117c3565b6001600160a01b0381166001600160a01b03841614613b5a5750613b5483611367565b91929190565b915091613b6690611367565b909160019190565b505050613b7b60006117c3565b9160039190565b634e487b7160e01b600052602160045260246000fd5b60041115613ba257565b613b82565b906103c782613b98565b613bbb6000613ba7565b613bc482613ba7565b03613bcd575050565b613bd76001613ba7565b613be082613ba7565b03613bf75760405163f645eedf60e01b8152600490fd5b613c016002613ba7565b613c0a82613ba7565b03613c385761159e613c1b83613362565b60405163fce698f760e01b81529182916004830190815260200190565b613c4b613c456003613ba7565b91613ba7565b14613c535750565b61159e90613c6060405190565b6335e2f38360e21b81529182916004830190815260200190565b9190613c8660006117c3565b926001600160a01b0384166001600160a01b03821614613caa576103c79293613549565b61159e8461268560405190565b61036e9081906001600160a01b031681565b613ce6613ce161036e92613cdb600090565b50610bbe565b613cb7565b611367565b906113b36113ae836118d5565b906103c7611834613d0884613ceb565b936118d5565b613d1781613e7f565b90613d2a613d256020611367565b613cf8565b918252602082015290565b9190613d4160006117c3565b926001600160a01b0384166001600160a01b03821614613d6657926103c79293613549565b61159e846126b660405190565b803403613d7d5790565b6040516304fb820960e51b8152346004820152602490fd5b905051906103c7826103a8565b906020828203126102fd5761036e91613d95565b613ddf7f0000000000000000000000000000000000000000000000000000000000000000610bc7565b90613de960405190565b63393f876560e21b815291602083600481845afa928315611ec257600093613e4e575b50613e1a61039c60006117c3565b6001600160a01b03841614613e3c57613e356103c793610bc7565b3390613f0b565b6040516329b99a9560e11b8152600490fd5b613e7191935060203d602011613e78575b613e698183610af7565b810190613da2565b9138613e0c565b503d613e5f565b613e92613e9791613e8e600090565b5090565b613362565b613ea160ff611367565b16613eac601f611367565b8111613eb55790565b604051632cd44ac360e21b8152600490fd5b613eda6134d261036e9263ffffffff1690565b6001600160e01b03191690565b6001600160a01b039182168152911660208201526060810192916103c79160400152565b90613f5090613f416103c795600495613f276323b872dd613ec7565b93613f3160405190565b9788956020870190815201613ee7565b60208201810382520383610af7565b906000602091613f5e600090565b50828151910182855af115611d30573d60005190613f7f6115536000611367565b03613fd85750613f8e81610bc7565b3b613f9c6115536000611367565b145b613fa55750565b613fb161159e91610bc7565b604051635274afe760e01b8152918291600483016001600160a01b03909116815260200190565b613fe56115536001611367565b1415613f9e56fea2646970667358221220b78fc08f569b333e0b96a3e5f646f8be906f5ea781744cdbc70f561f0b78a76364736f6c63430008160033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000185055dd8fe4132430c0495a96e81a6366f4a72f000000000000000000000000a096164cb225b078b721429b9184f1369fd981200000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000000000000000000649534c414e440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649534c414e440000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c806306fdde03146102ed578063095ea7b3146102e85780630d35b415146102e3578063111ecdad146102de57806313137d65146102d9578063134d4f25146102d4578063156a0d0f146102cf57806317442b70146102ca57806318160ddd146102c55780631f5e1334146102c057806323b872dd146102bb578063313ce567146102b65780633400288b146102b15780633644e515146102ac5780633b6f743b146102a757806352ae2879146102165780635535d461146102a25780635a0dfe4d1461029d5780635e280f11146102985780636fc1b31e1461029357806370a082311461028e578063715018a6146102895780637d25a05e146102845780637ecebe001461027f57806382413eac1461027a57806384b0196e14610275578063857749b0146102705780638da5cb5b1461026b57806395d89b4114610266578063963efcaa146102615780639f68b9641461025c578063a9059cbb14610257578063b731ea0a14610252578063b98bd0701461024d578063bb0b6a5314610248578063bc70b35414610243578063bd815db01461023e578063c7c7f5b314610239578063ca5eb5e114610234578063d045a0dc1461022f578063d42438851461022a578063d505accf14610225578063dd62ed3e14610220578063f2fde38b1461021b578063fc0c546a146102165763ff7bd03d036102fd5761125f565b610959565b611233565b611217565b6111dc565b61114f565b611135565b61111d565b6110f3565b61104e565b61102f565b610fd3565b610f7b565b610f0c565b610ee4565b610eca565b610e91565b610e76565b610e5b565b610e40565b610e0c565b610d1b565b610cbc565b610c86565b610c6e565b610c53565b610c3b565b610be9565b610b8e565b610b72565b610931565b6108b2565b610899565b610835565b610819565b6107d5565b610797565b610769565b61071c565b6106c1565b61067c565b610596565b610541565b610403565b610371565b60009103126102fd57565b600080fd5b60005b8381106103155750506000910152565b8181015183820152602001610305565b61034661034f6020936103599361033a815190565b80835293849260200190565b95869101610302565b601f01601f191690565b0190565b602080825261036e92910190610325565b90565b346102fd576103813660046102f2565b61039861038c61130c565b6040519182918261035d565b0390f35b6001600160a01b031690565b6001600160a01b0381165b036102fd57565b905035906103c7826103a8565b565b806103b3565b905035906103c7826103c9565b91906040838203126102fd5761036e9060206103f882866103ba565b94016103cf565b9052565b346102fd5761039861041f6104193660046103dc565b90611316565b60405191829182901515815260200190565b908160e09103126102fd5790565b906020828203126102fd5781356001600160401b0381116102fd5761036e9201610431565b8051825261036e91604081019160200151906020818403910152610325565b9061036e91610464565b906104a3610499835190565b8083529160200190565b90816104b56020830284019460200190565b926000915b8383106104c957505050505090565b909192939460206104ec6104e583856001950387528951610483565b9760200190565b93019301919392906104ba565b93929061052f6060916103c79461052260a089019260008a019080518252602090810151910152565b878203604089015261048d565b94019080518252602090810151910152565b346102fd5761039861055c61055736600461043f565b611431565b604051919391938493846104f9565b61036e916008021c6001600160a01b031690565b9061036e915461056b565b61036e6000600461057f565b346102fd576105a63660046102f2565b6103986105b161058a565b604051918291826001600160a01b03909116815260200190565b908160609103126102fd5790565b909182601f830112156102fd578135916001600160401b0383116102fd5760200192600183028401116102fd57565b60e0818303126102fd5761061c82826105cb565b9261062a83606084016103cf565b9260808301356001600160401b0381116102fd578161064a9185016105d9565b92909361065a8360a083016103ba565b9260c08201356001600160401b0381116102fd5761067892016105d9565b9091565b61069661068a366004610608565b959490949391936114e5565b604051005b6106a861036e61036e9290565b61ffff1690565b61036e600261069b565b61036e6106af565b346102fd576106d13660046102f2565b6103986106dc6106b9565b6040519182918261ffff909116815260200190565b6001600160e01b031990911681526040810192916103c7916020905b01906001600160401b03169052565b346102fd5761072c3660046102f2565b6107346115d3565b9061039861074160405190565b928392836106f1565b6001600160401b0390911681526040810192916103c79160209061070d565b346102fd576107793660046102f2565b6107816115f9565b9061039861078e60405190565b9283928361074a565b346102fd576107a73660046102f2565b6103986107b261161b565b6040515b9182918290815260200190565b61036e600161069b565b61036e6107c3565b346102fd576107e53660046102f2565b6103986106dc6107cd565b90916060828403126102fd5761036e61080984846103ba565b9360406103f882602087016103ba565b346102fd5761039861041f61082f3660046107f0565b91611625565b346102fd576108453660046102f2565b61039861085061164e565b6040519182918260ff909116815260200190565b63ffffffff81166103b3565b905035906103c782610864565b91906040838203126102fd5761036e9060206103f88286610870565b346102fd576106966108ac36600461087d565b9061166f565b346102fd576108c23660046102f2565b6103986107b2611679565b8015156103b3565b905035906103c7826108cd565b91906040838203126102fd578235906001600160401b0382116102fd5760206109108261036e948701610431565b94016108d5565b6040810192916103c7919080518252602090810151910152565b346102fd5761039861094d6109473660046108e2565b90611681565b60405191829182610917565b346102fd576109693660046102f2565b6103986105b16116d3565b61ffff81166103b3565b905035906103c782610974565b91906040838203126102fd5761036e9060206109a78286610870565b940161097e565b6109c161036e61036e9263ffffffff1690565b63ffffffff1690565b906109d4906109ae565b600052602052604060002090565b6106a861036e61036e9261ffff1690565b906109d4906109e2565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610a49575b6020831014610a4457565b610a13565b91607f1691610a39565b80546000939291610a70610a6683610a29565b8085529360200190565b9160018116908115610ac25750600114610a8957505050565b610a9c9192939450600052602060002090565b916000925b818410610aae5750500190565b805484840152602090930192600101610aa1565b92949550505060ff1916825215156020020190565b9061036e91610a53565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b03821117610b1857604052565b610ae1565b906103c7610b3792610b2e60405190565b93848092610ad7565b0383610af7565b90600010610b4f5761036e90610b1d565b6109fd565b610b6d61036e92610b6860009360036109ca565b6109f3565b610b3e565b346102fd5761039861038c610b8836600461098b565b90610b54565b346102fd5761039861041f610ba436600461087d565b906116dc565b61036e9061039c906001600160a01b031682565b61036e90610baa565b61036e90610bbe565b6103ff90610bc7565b6020810192916103c79190610bd0565b346102fd57610bf93660046102f2565b604051806103987f0000000000000000000000001a44076050125825900e736c501f859c50fe728c82610bd9565b906020828203126102fd5761036e916103ba565b346102fd57610696610c4e366004610c27565b61177c565b346102fd576103986107b2610c69366004610c27565b61178f565b346102fd57610c7e3660046102f2565b6106966117de565b346102fd57610398610ca2610c9c36600461087d565b906117e6565b604051918291826001600160401b03909116815260200190565b346102fd576103986107b2610cd2366004610c27565b6117fb565b9060a0828203126102fd57610cec81836105cb565b9260608301356001600160401b0381116102fd5782610d1260809461036e9387016105d9565b949095016103ba565b346102fd5761039861041f610d31366004610cd7565b92919091611804565b90610d5a610d53610d49845190565b8084529260200190565b9260200190565b9060005b818110610d6b5750505090565b909192610d88610d816001928651815260200190565b9460200190565b929101610d5e565b93959194610de8610de0610dff95610dd2610df89561036e9c9a610dc560e08c019260008d01906001600160f81b0319169052565b8a820360208c0152610325565b9088820360408a0152610325565b976060870152565b6001600160a01b03166080850152565b60a0830152565b60c0818403910152610d3a565b346102fd57610e1c3660046102f2565b610398610e27611841565b93610e3797959793919360405190565b97889788610d90565b346102fd57610e503660046102f2565b610398610850611887565b346102fd57610e6b3660046102f2565b6103986105b16118a4565b346102fd57610e863660046102f2565b61039861038c6118ae565b346102fd57610ea13660046102f2565b6103987f000000000000000000000000000000000000000000000000000000e8d4a510006107b2565b346102fd57610eda3660046102f2565b610398600061041f565b346102fd5761039861041f610efa3660046103dc565b906118b8565b61036e6000600261057f565b346102fd57610f1c3660046102f2565b6103986105b1610f00565b909182601f830112156102fd578135916001600160401b0383116102fd5760200192602083028401116102fd57565b906020828203126102fd5781356001600160401b0381116102fd576106789201610f27565b346102fd57610696610f8e366004610f56565b90611a19565b906020828203126102fd5761036e91610870565b61036e916008021c81565b9061036e9154610fa8565b6000610fce61036e9260016109ca565b610fb3565b346102fd576103986107b2610fe9366004610f94565b610fbe565b916060838303126102fd576110038284610870565b92611011836020830161097e565b9260408201356001600160401b0381116102fd5761067892016105d9565b346102fd5761039861038c611045366004610fee565b92919091611af0565b611059366004610f56565b90611da5565b908160409103126102fd5790565b90916080828403126102fd5781356001600160401b0381116102fd576110988461036e928501610431565b9360606110a8826020870161105f565b94016103ba565b815181526020808301516001600160401b0316818301526040928301518051938301939093529182015160608201528251608082015291015160a082015260c00190565b61110761110136600461106d565b91611f83565b9061039861111460405190565b928392836110af565b346102fd57610696611130366004610c27565b612038565b610696611143366004610608565b95949094939193612041565b346102fd57610696611162366004610c27565b6120b0565b60ff81166103b3565b905035906103c782611167565b60e0818303126102fd5761119182826103ba565b9261119f83602084016103ba565b926111ad81604085016103cf565b926111bb82606083016103cf565b9261036e6111cc8460808501611170565b9360c06103f88260a087016103cf565b346102fd576106966111ef36600461117d565b95949094939193612139565b91906040838203126102fd5761036e9060206110a882866103ba565b346102fd576103986107b261122d3660046111fb565b90612242565b346102fd57610696611246366004610c27565b6122cc565b906060828203126102fd5761036e916105cb565b346102fd5761039861041f61127536600461124b565b6122d5565b8054600093929161128d610a6683610a29565b9160018116908115610ac257506001146112a657505050565b6112b99192939450600052602060002090565b916000925b8184106112cb5750500190565b8054848401526020909301926001016112be565b9061036e9161127a565b906103c7610b37926112fa60405190565b938480926112df565b61036e906112e9565b61036e6008611303565b6113219190336122fd565b600190565b906103c761133360405190565b9283610af7565b61036e6040611326565b61134c61133a565b906000825260006020830152565b905250565b61036e611344565b61036e61036e61036e9290565b61036e61036e61036e926001600160401b031690565b6001600160401b038111610b185760208091020190565b906113b36113ae8361138a565b611326565b918252565b6113c061133a565b906000825260606020830152565b61036e6113b8565b60005b8281106113e557505050565b6020906113f06113ce565b81840152016113d9565b906103c761141061140a846113a1565b9361138a565b601f1901602084016113d6565b3561036e816103c9565b3561036e81610864565b61143961135f565b5061144261135f565b5061144d6000611367565b9161036e6114b46114886114676001600160401b03611374565b61148261147261133a565b9161147b898452565b6020830152565b956113fa565b936114956040820161141d565b906114ae60006114a76060840161141d565b9201611427565b9161231d565b61147b6114c293929361133a565b938452565b63ffffffff90911681526040810192916103c79160200152565b0152565b969594939291906115157f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b611527335b916001600160a01b031690565b036115a2578761153e61153982611427565b612369565b98602082019961155761155361036e8d61141d565b9190565b0361156857506103c797985061240f565b61157b6115758b92611427565b9161141d565b9061159e61158860405190565b63309afaf360e21b8152928392600484016114c7565b0390fd5b6040516391ac5e4f60e01b8152336004820152602490fd5b6115c761036e61036e9290565b6001600160401b031690565b62b9270b60e21b9061036e60016115ba565b61036e60016115ba565b61036e60026115ba565b6116016115e5565b9061036e6115ef565b61036e9081565b61036e905461160a565b61036e6007611611565b6113219291906116368333836125c8565b61262d565b61164861036e61036e9290565b60ff1690565b61036e601261163b565b906103c7916116656126da565b906103c791612745565b906103c791611658565b61036e612788565b906116ce61036e9261169161135f565b506116c66116a16040830161141d565b916116be6116b16060830161141d565b919384926114ae84611427565b91905061286a565b929091611427565b612a75565b61036e30610bc7565b6115536116fe6116f9611702936116f1600090565b5060016109ca565b611611565b9290565b1490565b6103c7906117126126da565b611747565b906001600160a01b03905b9181191691161790565b9061173c61036e61174392610bc7565b8254611717565b9055565b6117777ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197916105b181600461172c565b0390a1565b6103c790611706565b906109d490610bc7565b6116f961036e9161179e600090565b506005611785565b6117ae6126da565b6103c76117cc565b61039c61036e61036e9290565b61036e906117b6565b6103c76117d960006117c3565b612b6a565b6103c76117a6565b50506117f0600090565b5061036e60006115ba565b61036e90612bbd565b50505061180f600090565b5061170261151a61039c30610bc7565b369037565b906103c761183461140a846113a1565b601f19016020840161181f565b611849612bd4565b90611852612c01565b9061185c30610bc7565b6118666000611367565b6118786118736000611367565b611824565b600f60f81b9594934693929190565b61036e600661163b565b61036e9061039c565b61036e9054611891565b61036e600061189a565b61036e6009611303565b61132191903361262d565b906103c7916118d06126da565b611a07565b6001600160401b038111610b1857602090601f01601f19160190565b90826000939282370152565b9092919261190d6113ae826118d5565b93818552818301116102fd576103c79160208501906118f1565b9080601f830112156102fd5781602061036e933591016118fd565b9190916060818403126102fd576119596060611326565b926119648183610870565b8452611973816020840161097e565b602085015260408201356001600160401b0381116102fd576119959201611927565b6040830152565b9291906119ab6113ae8261138a565b93818552602080860192028101918383116102fd5781905b8382106119d1575050505050565b81356001600160401b0381116102fd576020916119f18784938701611942565b8152019101906119c3565b61036e91369161199c565b6103c791611a14916119fc565b612e71565b906103c7916118c3565b61036e90610b1d565b61036e9136916118fd565b909392938483116102fd5784116102fd578101920390565b610359611a6792602092611a61815190565b94859290565b93849101610302565b909161035990839080936118f1565b611a8d9061036e9492611a4f565b91611a70565b906103c791939293611ab5611aa760405190565b958693602085019384611a7f565b90810382520383610af7565b919061034f81611ad8816103599560209181520190565b80956118f1565b602080825261036e93910191611ac1565b611b1491610b68611b0f9296949596611b07606090565b5060036109ca565b611a23565b8051611b236115536000611367565b14611baa5783611b336000611367565b8114611ba357611b466115536002611367565b1015611b7057505061159e611b5a60405190565b639a6d49cd60e01b815292839260048401611adf565b90928083611b8c611b87611b9d9461036e97611a2c565b612f5a565b81611b976002611367565b91611a37565b91611a93565b5092509050565b509161036e91611a2c565b634e487b7160e01b600052603260045260246000fd5b90359061013e1936829003018212156102fd570190565b90821015611bf957602061036e9202810190611bcb565b611bb5565b903590601e1936829003018212156102fd57018035906001600160401b0382116102fd57602001913682900383136102fd57565b3561036e816103a8565b5061036e906020810190610870565b5061036e9060208101906103cf565b6001600160401b0381166103b3565b905035906103c782611c5a565b5061036e906020810190611c69565b906040611cc96103c793611ca9611c9f6000830183611c3c565b63ffffffff168552565b611cc0611cb96020830183611c4b565b6020860152565b82810190611c76565b6001600160401b0316910152565b929061036e97959694611d1192611d04611d2395611cfd60e089019560008a0190611c85565b6060880152565b8583036080870152611ac1565b6001600160a01b0390951660a0830152565b60c0818503910152611ac1565b6040513d6000823e3d90fd5b90929192611d4c6113ae826118d5565b93818552818301116102fd576103c7916020850190610302565b9080601f830112156102fd57815161036e92602001611d3c565b906020828203126102fd5781516001600160401b0381116102fd5761036e9201611d66565b600091611db183611367565b81811015611ed257611dc4818385611be2565b9084820191611dea611de6611dda888601611427565b610ba46020870161141d565b1590565b611ec757611df730610bc7565b9263d045a0dc93611e0a60c0840161141d565b94611e1760a0850161141d565b95611e26610100860186611bfe565b9290611e43611e3760e08901611c32565b97610120810190611bfe565b90863b156102fd578d98611e6b96611e7694611e5e60405190565b9d8e9b8c9a8b9960e01b90565b895260048901611cd7565b03925af1918215611ec257611e9192611e96575b5060010190565b611db1565b611eb590863d8811611ebb575b611ead8183610af7565b8101906102f2565b38611e8a565b503d611ea3565b611d30565b506001019050611db1565b83611ee4611edf33610bc7565b610bc7565b90611eee60405190565b638e9e709960e01b815291829060049082905afa8015611ec25761159e91600091611f2e575b50604051638351eea760e01b81529182916004830161035d565b611f4b91503d806000833e611f438183610af7565b810190611d80565b82611f14565b61036e6060611326565b611f63611f51565b9060008252602080808401600081520161135a61135f565b61036e611f5b565b906106789291611f91611f7b565b50611f9a61135f565b50612ffc565b6103c790611fac6126da565b611fd57f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b803b156102fd57612017600092918392611fee60405190565b948593849283919063ca5eb5e160e01b8352600483016001600160a01b03909116815260200190565b03925af18015611ec2576120285750565b6103c7906000611ead8183610af7565b6103c790611fa0565b95949392919061205361039c30610bc7565b3303612062576103c7966130e5565b60405163029a949d60e31b8152600490fd5b6103c7906120806126da565b6117777fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760916105b181600261172c565b6103c790612074565b91946121086114e19298979561210160a0966120f16103c79a6120e160c08a019e60008b0152565b6001600160a01b03166020890152565b6001600160a01b03166040870152565b6060850152565b6080830152565b6001600160a01b0390911681526040810192916103c7916020905b01906001600160a01b03169052565b9695929491949390936121498190565b421161221b57906121ce856121b68a6121d39796956121aa6121887f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990565b9161219284613104565b8d61219c60405190565b9788966020880196876120b9565b90810382520382610af7565b6121c86121c1825190565b9160200190565b20613127565b613150565b6001600160a01b0385166001600160a01b038216036121f757506103c792936122fd565b849061159e61220560405190565b6325c0072360e11b81529283926004840161210f565b61159e9061222860405190565b63313c898160e11b81529182916004830190815260200190565b61036e9161225d6116f992612255600090565b506006611785565b611785565b6103c79061226e6126da565b61227860006117c3565b6001600160a01b0381166001600160a01b0383161461229b57506103c790612b6a565b61159e906122a860405190565b631e4fbdf760e01b8152918291600483016001600160a01b03909116815260200190565b6103c790612262565b61170261155361036e60206122f66116f96122ef87611427565b60016109ca565b940161141d565b916001916103c793613171565b9081526040810192916103c79160200152565b6123329193925061232c600090565b506132c1565b9081928261233d8290565b8110612347575050565b61159e61235360405190565b6371c4efed60e01b81529283926004840161230a565b6123776116f98260016109ca565b9061238561036e6000611367565b821461238f575090565b61159e9061239c60405190565b63f6ff4fb760e01b81529182916004830163ffffffff909116815260200190565b3561036e81611c5a565b6103ff9061069b565b6001600160a01b03909116815261036e936080820193909261240291906123f8906020850152565b60408301906123c7565b6060818403910152610325565b929450945091506124286124238484613333565b61336b565b9261243b61243682856133e7565b613429565b92612454600084019461244d86611427565b9087613457565b9261245f8383613498565b6124bc575b5050506124a161249b6124977fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c94611427565b9590565b93610bc7565b936124b76124ae60405190565b928392836114c7565b0390a3565b6124e792916124e16124d160408794016123bd565b936124db88611427565b926134ab565b9261351a565b916125117f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b803b156102fd5761254860009491859261252a60405190565b9687938492839190633e5ac80960e11b8352838d8d600486016123d0565b03925af1928315611ec2576124976124a19261249b927fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c9661258d575b509450612464565b61259d906000611ead8183610af7565b38612585565b6001600160a01b0390911681526060810193926103c79290916040916114e19061147b565b916125d38284612242565b60001981036125e3575b50505050565b81811061260957916125fa61260094926000940390565b91613171565b388080806125dd565b8261159e8361261760405190565b637dc7a0d960e11b8152938493600485016125a3565b92919061263a60006117c3565b936001600160a01b0385166001600160a01b038216146126a9576001600160a01b0385166001600160a01b03831614612678576103c7939450613549565b61159e8561268560405190565b63ec442f0560e01b8152918291600483016001600160a01b03909116815260200190565b61159e856126b660405190565b634b637e8f60e11b8152918291600483016001600160a01b03909116815260200190565b6126e26118a4565b33906126ed8261151a565b036126f55750565b61159e9061270260405190565b63118cdaa760e01b8152918291600483016001600160a01b03909116815260200190565b9060001990611722565b9061273e61036e6117439290565b8254612726565b907f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9161277c826127778360016109ca565b612730565b6117776124ae60405190565b61279130610bc7565b6127c36001600160a01b037f000000000000000000000000157a6df6b74f4e5e45af4e4615fde7b49225a6621661151a565b14806127fb575b156127f3577f4b3454337f4d5bc355514b574f27a99e65fe985df62285c29af0d2a2bdd4fe7590565b61036e6136af565b507f000000000000000000000000000000000000000000000000000000000000000146146127ca565b905051906103c7826108cd565b906020828203126102fd5761036e91612824565b604080825261036e93919261285c91840190610325565b916020818403910152610325565b90916128ad6128e29361287b606090565b5061289161288b6020860161141d565b91613743565b6128a76128a160a0870187611bfe565b90611a2c565b91613787565b9390928394600014612987576128c16106af565b905b6128da6128cf82611427565b916080810190611bfe565b929091611af0565b91826128ee600461189a565b906128fc61039c60006117c3565b6001600160a01b0383160361291057505050565b61294b92612922611edf602094610bc7565b9061292c60405190565b80958194829361294063043a78eb60e01b90565b845260048401612845565b03915afa8015611ec25761295c5750565b61297d9060203d602011612980575b6129758183610af7565b810190612831565b50565b503d61296b565b61298f6107c3565b906128c3565b61036e60a0611326565b905051906103c7826103c9565b91906040838203126102fd5761147b9060206129c86040611326565b946129d3838261299f565b86520161299f565b906040828203126102fd5761036e916129ac565b805163ffffffff1682529061036e90608080612a3e612a2c60a08501612a1a60208901516020880152565b60408801518682036040880152610325565b60608701518582036060870152610325565b9401511515910152565b92916020612a656103c793604087019087820360008901526129ef565b9401906001600160a01b03169052565b90612af9612b2b94612af0604095612a8b61135f565b50612ae9612ab87f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b95612ae3612ac589612369565b612adc612ad0612995565b63ffffffff909b168b52565b60208a0152565b88880152565b6060860152565b15156080840152565b612b0230610bc7565b91612b0c60405190565b809581948293612b2063ddc28c5860e01b90565b845260048401612a48565b03915afa908115611ec257600091612b41575090565b61036e915060403d604011612b63575b612b5b8183610af7565b8101906129db565b503d612b51565b612b8b612b85612b7a600061189a565b611edf84600061172c565b91610bc7565b907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0612bb660405190565b80806124b7565b6116f961036e91612bcc600090565b50600c611785565b61036e7f49534c414e440000000000000000000000000000000000000000000000000006600a5b906138ab565b61036e7f3100000000000000000000000000000000000000000000000000000000000001600b612bfb565b90612c35825190565b811015611bf9576020809102010190565b9160001960089290920291821b911b611722565b9190612c6b61036e61174393611367565b908354612c46565b6103c791600091612c5a565b818110612c8a575050565b80612c986000600193612c73565b01612c7f565b9190601f8111612cad57505050565b612cbf6103c793600052602060002090565b906020601f840181900483019310612ce1575b6020601f909101040190612c7f565b9091508190612cd2565b90612cf4815190565b906001600160401b038211610b1857612d1782612d118554610a29565b85612c9e565b602090601f8311600114612d5257611743929160009183612d47575b5050600019600883021c1916906002021790565b015190503880612d33565b601f19831691612d6785600052602060002090565b9260005b818110612da557509160029391856001969410612d8c575b50505002019055565b01516000196008601f8516021c19169055388080612d83565b91936020600181928787015181550195019201612d6b565b906103c791612ceb565b805163ffffffff16825261036e91606081019160409060208181015161ffff16908401520151906040818403910152610325565b9061036e91612dc7565b90612e11610499835190565b9081612e236020830284019460200190565b926000915b838310612e3757505050505090565b90919293946020612e536104e583856001950387528951612dfb565b9301930191939290612e28565b602080825261036e92910190612e05565b90600091612e7f6000611367565b612e8a61036e835190565b811015612f155780612eac6040612ea4612f109486612c2c565b510151612f5a565b612f0a6040612ebb8386612c2c565b510151612f05612ee66003612ee08a612ed4888b612c2c565b51015163ffffffff1690565b906109ca565b612eff6020612ef5878a612c2c565b51015161ffff1690565b906109f3565b612dbd565b60010190565b612e7f565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b67491925061177790612f4760405190565b91829182612e60565b61036e600361069b565b6002810151612f75612f6d6106a8612f50565b9161ffff1690565b03612f7d5750565b61159e90612f8a60405190565b639a6d49cd60e01b81529182916004830161035d565b91906040838203126102fd5761147b906020612fbc6040611326565b94612fc783826103cf565b8652016103cf565b61036e903690612fa0565b63ffffffff90911681526060810193926103c79290916040916114e19061147b565b9290916130696130509161300e611f7b565b5061301761135f565b506130246040870161141d565b946130476130346060890161141d565b88979061304089611427565b91336138d4565b8095919861286a565b9061306361305d89611427565b93612fcf565b9261394f565b927f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a84956130c56130c16130bb60006130a061133a565b6130aa8683830152565b6130b5896020830152565b99015190565b94611427565b9390565b926124b76130d233610bc7565b956130dc60405190565b93849384612fda565b906103c796959493929161240f565b9061273e61036e61174392611367565b61310f906000612bcc565b61036e61311b82611611565b91600183015b906130f4565b61036e90613133612788565b6042916040519161190160f01b8352600283015260228201522090565b9161036e939161316893613162600090565b50613abb565b90929192613bb1565b90919261317e60006117c3565b6001600160a01b0381166001600160a01b0384161461323d576001600160a01b0381166001600160a01b0385161461320c57506131c9846131c48561225d866006611785565b6130f4565b6131d257505050565b6124b761320261249b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610bc7565b936107b660405190565b61159e9061321960405190565b634a1406b160e11b8152918291600483016001600160a01b03909116815260200190565b61159e9061324a60405190565b63e602df0560e01b8152918291600483016001600160a01b03909116815260200190565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81156132a4570490565b61326e565b818102929181159184041417156132bc57565b613284565b61036e906132f07f000000000000000000000000000000000000000000000000000000e8d4a51000809261329a565b6132a9565b61036e602061163b565b61036e61036e61036e9260ff1690565b35906020811061331d575090565b61332f90600019906020036008021b90565b1690565b61335c90600061036e93613345600090565b506133566133516132f5565b6132ff565b92611a37565b9061330f565b61036e90611367565b61338861338361036e9261337d600090565b50613362565b6117b6565b610bbe565b61036e602861163b565b356001600160c01b03191690600881106133af575090565b6001600160c01b031960089182039091021b1690565b6115c761036e61036e926001600160401b031690565b61036e9060c01c6133c5565b61341e6134249161036e936133fa600090565b506134036132f5565b9061335661341861341261338d565b936132ff565b926132ff565b90613397565b6133db565b61036e906132f07f000000000000000000000000000000000000000000000000000000e8d4a5100091611374565b9091508161346861039c60006117c3565b6001600160a01b03831614613481575b61036e91613c7a565b61036e915061349161dead6117c3565b9150613478565b506134a761155361335161338d565b1190565b61036e916128a19181611b9761335161338d565b6103ff906001600160401b031660c01b90565b60e01b90565b6103ff9063ffffffff1660e01b90565b600460209361350d6008846135056135139661036e9b9a986134bf565b0180926134d8565b01918252565b0190611a4f565b6121aa61036e939461352a606090565b506040519586946020860194856134e8565b919082018092116132bc57565b61355360006117c3565b6001600160a01b0381166001600160a01b038316036135f75761320261249b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936135b86124b79461039c6135b18a6135ac6007611611565b61353c565b60076130f4565b6001600160a01b038716036135dc57611edf6135b1886135d86007611611565b0390565b611edf6135ea876005611785565b6131218961035983611611565b6136056116f9836005611785565b8481106136525761249b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef936135b86124b79461039c6136478a613202970390565b6131c4856005611785565b8261159e8661366060405190565b63391434e360e21b8152938493600485016125a3565b909594926103c7946136a861212a926136a160809661369a60a088019c6000890152565b6020870152565b6040850152565b6060830152565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6137347fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc67f7efce4db356f7153b1bf60108c7a3c5a5c1b221334030f69eecaa16a801fadf96121aa61372130610bc7565b6040519586946020860194469286613676565b61373f6121c1825190565b2090565b61377a61036e91613752600090565b507f000000000000000000000000000000000000000000000000000000e8d4a510009061329a565b6115ba565b0180926134bf565b909180516137986115536000611367565b119283156137e2576137df91926121aa6137b133613cc9565b946137bb60405190565b958694602086019485600860209361350d858461377f6135139661036e9b9a989052565b91565b6137df91506121aa926137f460405190565b93849260208401928360208161377f61035993600896959052565b61036e60ff611367565b8054600093929161382c610a6683610a29565b9160018116908115610ac2575060011461384557505050565b6138589192939450600052602060002090565b916000925b81841061386a5750500190565b80548484015260209093019260010161385d565b9061036e91613819565b906103c7610b379261389960405190565b9384809261387e565b61036e90613888565b90816138bb61155361036e61380f565b146138ca575061036e90613d0e565b61036e91506138a2565b936103c79390926138e49261231d565b92908094613d35565b905051906103c782611c5a565b91906080838203126102fd576119959060406139166060611326565b94613921838261299f565b865261393083602083016138ed565b6020870152016129ac565b906080828203126102fd5761036e916138fa565b608093600093613a25612b2093613964611f7b565b50613a1d602061397c6139778a88015190565b613d73565b950193613987855190565b6139936115538b611367565b11613a7d575b613a166139c57f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b98613a0f632637a45097613a086139e36139de89612369565b925190565b6139f08f61155390611367565b11976139fa612995565b9e8f019063ffffffff169052565b60208d0152565b60408b0152565b6060890152565b151586880152565b613a3e613a3160405190565b9788968795869460e01b90565b03925af1908115611ec257600091613a54575090565b61036e915060803d608011613a76575b613a6e8183610af7565b81019061393b565b503d613a64565b613a8d613a88865190565b613db6565b613999565b6114e16103c794611995606094989795613ab1608086019a6000870152565b60ff166020850152565b9091613ac684613362565b613af26115537f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0611367565b11613b6e5790613b1460209460009493613b0b60405190565b94859485613a92565b838052039060015afa15611ec257600051600091613b31836117c3565b6001600160a01b0381166001600160a01b03841614613b5a5750613b5483611367565b91929190565b915091613b6690611367565b909160019190565b505050613b7b60006117c3565b9160039190565b634e487b7160e01b600052602160045260246000fd5b60041115613ba257565b613b82565b906103c782613b98565b613bbb6000613ba7565b613bc482613ba7565b03613bcd575050565b613bd76001613ba7565b613be082613ba7565b03613bf75760405163f645eedf60e01b8152600490fd5b613c016002613ba7565b613c0a82613ba7565b03613c385761159e613c1b83613362565b60405163fce698f760e01b81529182916004830190815260200190565b613c4b613c456003613ba7565b91613ba7565b14613c535750565b61159e90613c6060405190565b6335e2f38360e21b81529182916004830190815260200190565b9190613c8660006117c3565b926001600160a01b0384166001600160a01b03821614613caa576103c79293613549565b61159e8461268560405190565b61036e9081906001600160a01b031681565b613ce6613ce161036e92613cdb600090565b50610bbe565b613cb7565b611367565b906113b36113ae836118d5565b906103c7611834613d0884613ceb565b936118d5565b613d1781613e7f565b90613d2a613d256020611367565b613cf8565b918252602082015290565b9190613d4160006117c3565b926001600160a01b0384166001600160a01b03821614613d6657926103c79293613549565b61159e846126b660405190565b803403613d7d5790565b6040516304fb820960e51b8152346004820152602490fd5b905051906103c7826103a8565b906020828203126102fd5761036e91613d95565b613ddf7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c610bc7565b90613de960405190565b63393f876560e21b815291602083600481845afa928315611ec257600093613e4e575b50613e1a61039c60006117c3565b6001600160a01b03841614613e3c57613e356103c793610bc7565b3390613f0b565b6040516329b99a9560e11b8152600490fd5b613e7191935060203d602011613e78575b613e698183610af7565b810190613da2565b9138613e0c565b503d613e5f565b613e92613e9791613e8e600090565b5090565b613362565b613ea160ff611367565b16613eac601f611367565b8111613eb55790565b604051632cd44ac360e21b8152600490fd5b613eda6134d261036e9263ffffffff1690565b6001600160e01b03191690565b6001600160a01b039182168152911660208201526060810192916103c79160400152565b90613f5090613f416103c795600495613f276323b872dd613ec7565b93613f3160405190565b9788956020870190815201613ee7565b60208201810382520383610af7565b906000602091613f5e600090565b50828151910182855af115611d30573d60005190613f7f6115536000611367565b03613fd85750613f8e81610bc7565b3b613f9c6115536000611367565b145b613fa55750565b613fb161159e91610bc7565b604051635274afe760e01b8152918291600483016001600160a01b03909116815260200190565b613fe56115536001611367565b1415613f9e56fea2646970667358221220b78fc08f569b333e0b96a3e5f646f8be906f5ea781744cdbc70f561f0b78a76364736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000185055dd8fe4132430c0495a96e81a6366f4a72f000000000000000000000000a096164cb225b078b721429b9184f1369fd981200000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000000000000000000649534c414e440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649534c414e440000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): ISLAND
Arg [1] : _symbol (string): ISLAND
Arg [2] : _lzEndpoint (address): 0x1a44076050125825900e736c501f859c50fE728c
Arg [3] : _delegate (address): 0x185055Dd8FE4132430c0495A96E81a6366F4A72F
Arg [4] : _multisig (address): 0xa096164Cb225b078b721429b9184F1369fd98120
Arg [5] : _supply (uint256): 1000000000000000000000000000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000001a44076050125825900e736c501f859c50fe728c
Arg [3] : 000000000000000000000000185055dd8fe4132430c0495a96e81a6366f4a72f
Arg [4] : 000000000000000000000000a096164cb225b078b721429b9184f1369fd98120
Arg [5] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 49534c414e440000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 49534c414e440000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.