ETH Price: $2,417.31 (-9.28%)
Gas: 2.32 Gwei

Token

ISLAND (ISLAND)
 

Overview

Max Total Supply

945,600,191.103854 ISLAND

Holders

4,233 ( 0.071%)
Created with Highcharts 10.2.1

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)

Filtered by Token Holder
acidtechno.eth
Balance
2,329.528097701179008185 ISLAND

Value
$57.23 ( ~0.0236751019124476 Eth) [0.0002%]
0x46ae568842e3f3d2bb7e2a4f6ca8e38692c6ab86
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Nifty Island is an open gaming platform powered by user-generated content, where NFT, memecoin, AI agent, and web3 communities can play, create, and earn rewards.

Market

Volume (24H):$1,675,749.00
Market Capitalization:$3,957,095.00
Circulating Supply:161,021,587.00 ISLAND
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Bitget
ISLAND-USDT$0.0246
0.0000102 Eth
$1,374,185.00
54,055,371.570 ISLAND
82.1304%
2
Gate.io
ISLAND-USDT$0.0245
0.0000102 Eth
$119,789.00
4,830,921.400 ISLAND
7.3400%
3
MEXC
ISLAND-USDT$0.0245
0.0000102 Eth
$71,964.00
2,931,588.110 ISLAND
4.4542%
4
Bilaxy
ISLAND-ETH$0.0263
0.0000109 Eth
$47,487.00
1,805,456.000 ISLAND
2.7432%
5
Uniswap V3 (Ethereum)
0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0242
0.0000100 Eth
$38,120.00
1,553,270.961 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662
2.3600%
6
Raydium (CLMM)
HX6ZNKJJ7ZY653VODWZBAYPSG7BRGLFQ4I4RA7D5NKKZ-SO11111111111111111111111111111111111111112$0.0247
0.0000102 Eth
$28,825.00
1,130,459.997 HX6ZNKJJ7ZY653VODWZBAYPSG7BRGLFQ4I4RA7D5NKKZ
1.7176%
7
KuCoin
ISLAND-USDT$0.0245
0.0000101 Eth
$18,958.40
774,293.500 ISLAND
1.1764%
8
Uniswap V3 (Base)
0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662-0X4200000000000000000000000000000000000006$0.0242
0.0000100 Eth
$12,137.73
497,857.512 0X157A6DF6B74F4E5E45AF4E4615FDE7B49225A662
0.7564%
9
WEEX
ISLAND-USDT$0.0245
0.0000101 Eth
$966.31
38,133.000 ISLAND
0.0579%
10
WOO X
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
File 1 of 56 : ISLAND.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// SPDX-License-Identifier: UNLICENSED
pragma 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.io
contract 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);
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 3 of 56 : ILayerZeroReceiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { Origin } from "./ILayerZeroEndpointV2.sol";
interface ILayerZeroReceiver {
function allowInitializePath(Origin calldata _origin) external view returns (bool);
function nextNonce(uint32 _eid, bytes32 _sender) external view returns (uint64);
function lzReceive(
Origin calldata _origin,
bytes32 _guid,
bytes calldata _message,
address _executor,
bytes calldata _extraData
) external payable;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 56 : IMessageLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { 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 compatible
function version() external view returns (uint64 major, uint8 minor, uint8 endpointVersion);
function messageLibType() external view returns (MessageLibType);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 56 : IMessageLibManager.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
struct SetConfigParam {
uint32 eid;
uint32 configType;
bytes config;
}
interface IMessageLibManager {
struct Timeout {
address lib;
uint256 expiry;
}
event LibraryRegistered(address newLib);
event DefaultSendLibrarySet(uint32 eid, address newLib);
event DefaultReceiveLibrarySet(uint32 eid, address 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

File 9 of 56 : ISendLib.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { 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,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 56 : AddressCast.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: LZBL-1.2
pragma 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 56 : PacketV1Codec.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: LZBL-1.2
pragma 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)
// version
uint256 private constant PACKET_VERSION_OFFSET = 0;
// nonce
uint256 private constant NONCE_OFFSET = 1;
// path
uint256 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 13 of 56 : IOAppMsgInspector.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// SPDX-License-Identifier: MIT
pragma 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 failure
error 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 56 : IOAppOptionsType3.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
* @dev Struct representing enforced option parameters.
*/
struct EnforcedOptionParam {
uint32 eid; // Endpoint ID
uint16 msgType; // Message Type
bytes 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 options
error InvalidOptions(bytes options);
// Event emitted when enforced options are set
event EnforcedOptionSet(EnforcedOptionParam[] _enforcedOptions);
/**
* @notice Sets enforced options for specific endpoint and message type combinations.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 16 of 56 : OAppOptionsType3.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { 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().
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

File 21 of 56 : IOAppPreCrimeSimulator.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// @dev Import the Origin so it's exposed to OAppPreCrimeSimulator implementers.
// solhint-disable-next-line no-unused-import
import { 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 implementation
error 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 56 : IPreCrime.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
struct PreCrimePeer {
uint32 eid;
bytes32 preCrime;
bytes32 oApp;
}
// TODO not done yet
interface 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(
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 56 : Packet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 56 : OAppPreCrimeSimulator.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 56 : IOFT.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { MessagingReceipt, MessagingFee } from "@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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 27 of 56 : OFTMsgCodec.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
library OFTMsgCodec {
// Offset constants for encoding and decoding OFT messages
uint8 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)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 56 : OFT.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { 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) {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 56 : OFTCore.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import { 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 56 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 56 : draft-IERC6093.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 56 : IERC1363.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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)'))
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 56 : IERC165.sol
1
2
3
4
5
6
// 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";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 56 : IERC20.sol
1
2
3
4
5
6
// 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";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 56 : IERC5267.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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()
external
view
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 56 : ERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 56 : ERC20Permit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 56 : IERC20Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 39 of 56 : IERC20Permit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 40 of 56 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 41 of 56 : SafeERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 42 of 56 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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].
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 43 of 56 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 44 of 56 : ECDSA.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 45 of 56 : EIP712.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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].
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 46 of 56 : MessageHashUtils.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 47 of 56 : Errors.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 48 of 56 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// 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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 49 of 56 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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 infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 50 of 56 : SafeCast.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 51 of 56 : SignedMath.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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 == b
return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 52 of 56 : Nonces.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 53 of 56 : Panic.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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-state
library Panic {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 54 of 56 : ShortStrings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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 *;
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 55 of 56 : StorageSlot.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 56 of 56 : Strings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated 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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"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"}]

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.