ETH Price: $2,191.94 (+3.03%)

Token

Masa Token (MASA)
 

Overview

Max Total Supply

1,561,937,744.499611 MASA

Holders

4,347 ( 0.115%)
Created with Highcharts 10.2.1

Market

Price

$0.03 @ 0.000015 ETH (-13.01%)

Onchain Market Cap

$51,789,778.95

Circulating Supply Market Cap

$17,576,651.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 MASA

Value
$0.00
0xc708fd9337903730ed5489fb676bc74bbd366f1e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Masa is the Decentralized AI Data and LLM Network. Own, share, and earn from your data and compute to power AI applications.

Market

Volume (24H):$6,194,270.00
Market Capitalization:$17,576,651.00
Circulating Supply:529,991,127.00 MASA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
HTX
MASA-USDT$0.0332
0.0000152 Eth
$3,770,108.00
109,436,093.390 MASA
60.2669%
2
Gate.io
MASA-USDT$0.0332
0.0000152 Eth
$670,626.00
19,801,224.560 MASA
10.9046%
3
BitMart
MASA-USDT$0.0331
0.0000152 Eth
$634,367.00
19,166,278.400 MASA
10.5550%
4
Bybit
MASA-USDT$0.0332
0.0000152 Eth
$360,043.00
10,606,460.700 MASA
5.8410%
5
XT.COM
MASA-USDT$0.0332
0.0000152 Eth
$197,783.00
5,838,724.330 MASA
3.2154%
6
Bitget
MASA-USDT$0.0333
0.0000152 Eth
$185,851.00
5,362,793.650 MASA
2.9533%
7
MEXC
MASA-USDT$0.0332
0.0000152 Eth
$111,852.00
3,372,428.510 MASA
1.8572%
8
Uniswap V3 (Ethereum)
0X944824290CC12F31AE18EF51216A223BA4063092-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0333
0.0000153 Eth
$81,993.00
2,338,226.933 0X944824290CC12F31AE18EF51216A223BA4063092
1.2877%
9
PancakeSwap V3 (Ethereum)
0X944824290CC12F31AE18EF51216A223BA4063092-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0333
0.0000153 Eth
$46,308.00
1,305,309.509 0X944824290CC12F31AE18EF51216A223BA4063092
0.7188%
10
Tapbit
MASA-USDT$0.0331
0.0000152 Eth
$35,723.00
1,025,751.700 MASA
0.5649%
11
Bilaxy
MASA-ETH$0.0348
0.0000160 Eth
$33,362.00
958,282.000 MASA
0.5277%
12
PancakeSwap V3 (BSC)
0X944824290CC12F31AE18EF51216A223BA4063092-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C$0.0365
0.0000167 Eth
$32,501.00
856,607.246 0X944824290CC12F31AE18EF51216A223BA4063092
0.4717%
13
KuCoin
MASA-USDT$0.0331
0.0000152 Eth
$26,898.00
811,683.500 MASA
0.4470%
14
BTSE
MASA-USDT$0.033
0.0000151 Eth
$23,024.00
697,751.322 MASA
0.3843%
15
Hibt
MASA-USDT$0.0332
0.0000152 Eth
$12,527.48
370,239.128 MASA
0.2039%
16
Uniswap V3 (Ethereum)
0X77E06C9ECCF2E797FD462A92B6D7642EF85B0A44-0X944824290CC12F31AE18EF51216A223BA4063092$0.0334
0.0000153 Eth
$11,067.83
40.365 0X77E06C9ECCF2E797FD462A92B6D7642EF85B0A44
0.0000%
17
Phemex
MASA-USDT$0.033
0.0000152 Eth
$6,643.48
201,103.720 MASA
0.1107%
18
Bitrue
MASA-USDT$0.0331
0.0000152 Eth
$6,014.27
181,605.138 MASA
0.1000%
19
CoinEx
MASA-USDT$0.0332
0.0000152 Eth
$5,425.48
157,096.585 MASA
0.0865%
20
Coinone
MASA-KRW$0.041
0.0000187 Eth
$5,017.43
122,507.042 MASA
0.0675%
21
CoinDCX
MASA-INR$0.0399
0.0000182 Eth
$2,600.53
0.000 MASA
0.0000%
22
Coinlist
MASA-USDT$0.0333
0.0000152 Eth
$1,537.74
46,169.923 MASA
0.0254%
23
Matcha (BSC)
0X55D398326F99059FF775485246999027B3197955-0X944824290CC12F31AE18EF51216A223BA4063092$0.0404
0.0000185 Eth
$488.08
487.830 0X55D398326F99059FF775485246999027B3197955
0.0003%
24
Mudrex
MASA-USDT$0.0331
0.0000154 Eth
$331.10
9,996.679 MASA
0.0055%
25
Matcha (Ethereum)
0X944824290CC12F31AE18EF51216A223BA4063092-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48$0.0407
0.0000167 Eth
$124.11
3,048.000 0X944824290CC12F31AE18EF51216A223BA4063092
0.0017%
26
NovaDAX
MASA-BRL$0.0434
0.0000204 Eth
$11.24
259.080 MASA
0.0001%

Contract Source Code Verified (Exact Match)

Contract Name:
MasaToken

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 1 runs

Other Settings:
paris EvmVersion
File 1 of 50 : MasaToken.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 {ERC20Pausable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Pausable.sol";
import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol";
import {OFT} from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol";
/**
* @title MasaToken
* @dev MasaToken is a LayerZero OFT contract for Masa Token on Ethereum chain
*/
contract MasaToken is
AccessControlEnumerable,
ERC20Pausable,
ERC20Burnable,
OFT
{
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
/**
* @dev Constructor that gives _delegate all of the existing roles.
* @param _lzEndpoint LayerZero endpoint address
* @param _delegate address to be given all roles, and capable of making OApp configurations inside of the endpoint
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 50 : 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 3 of 50 : 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 4 of 50 : 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 5 of 50 : IOAppReceiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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 Retrieves the address responsible for 'sending' composeMsg's to the Endpoint.
* @return sender The address responsible for 'sending' composeMsg's to the Endpoint.
*
* @dev Applications can optionally choose to implement a separate composeMsg sender that is NOT the bridging layer.
* @dev The default sender IS the OApp implementer.
*/
function composeMsgSender() external view returns (address sender);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 12 of 50 : 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 13 of 50 : 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 14 of 50 : 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 15 of 50 : 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 "../oapp/OApp.sol";
import { OAppOptionsType3 } from "../oapp/libs/OAppOptionsType3.sol";
import { IOAppMsgInspector } from "../oapp/interfaces/IOAppMsgInspector.sol";
import { OAppPreCrimeSimulator } from "../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 16 of 50 : 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 17 of 50 : 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 18 of 50 : 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 19 of 50 : 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 20 of 50 : 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 21 of 50 : 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 22 of 50 : 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 23 of 50 : 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 24 of 50 : 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 25 of 50 : 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 26 of 50 : 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 27 of 50 : 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 28 of 50 : 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 29 of 50 : 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 30 of 50 : AccessControl.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 50 : AccessControlEnumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControlEnumerable.sol";
import "./AccessControl.sol";
import "../utils/structs/EnumerableSet.sol";
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
using EnumerableSet for EnumerableSet.AddressSet;
mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 50 : IAccessControl.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 50 : IAccessControlEnumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 35 of 50 : Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 37 of 50 : ERC20Burnable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 50 : ERC20Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Pausable.sol)
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../security/Pausable.sol";
/**
* @dev ERC20 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*
* IMPORTANT: This contract does not include public pause and unpause functions. In
* addition to inheriting this contract, you must define both functions, invoking the
* {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate
* access control, e.g. using {AccessControl} or {Ownable}. Not doing so will
* make the contract unpausable.
*/
abstract contract ERC20Pausable is ERC20, Pausable {
/**
* @dev See {ERC20-_beforeTokenTransfer}.
*
* Requirements:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

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

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

File 45 of 50 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 46 of 50 : 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 v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* 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[EIP 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 47 of 50 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

File 50 of 50 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
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
{
"optimizer": {
"enabled": true,
"runs": 1,
"details": {
"yul": false
}
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_delegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"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"},{"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":[{"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":"amountLD","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":"amountLD","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":"address","name":"account","type":"address"}],"name":"Paused","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","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":"amount","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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":"composeMsgSender","outputs":[{"internalType":"address","name":"sender","type":"address"}],"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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[],"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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"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":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"amount","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":"amount","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"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162005433380380620054338339810160408190526200003491620006a2565b6040518060400160405280600a81526020016926b0b9b0902a37b5b2b760b11b815250604051806040016040528060048152602001634d41534160e01b81525083838383620000886200025960201b60201c565b84848181818162000099336200025e565b6001600160a01b038083166080528116620000c757604051632d618d8160e21b815260040160405180910390fd5b6080516001600160a01b031663ca5eb5e1826040518263ffffffff1660e01b8152600401620000f79190620006f6565b600060405180830381600087803b1580156200011257600080fd5b505af115801562000127573d6000803e3d6000fd5b50505050505050506200013f620002b060201b60201c565b60ff168360ff16101562000166576040516301e9714b60e41b815260040160405180910390fd5b620001736006846200071c565b6200018090600a6200086d565b60a05250600a91506200019690508382620009b7565b50600b620001a58282620009b7565b5050600c805460ff1916905550620001cd935060009250620001c79150503390565b620002b5565b620001e86000805160206200541383398151915233620002b5565b62000203600080516020620053f383398151915233620002b5565b62000210600082620002f9565b6200022b6000805160206200541383398151915282620002f9565b62000246600080516020620053f383398151915282620002f9565b620002518162000305565b505062000bba565b601290565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600690565b6001600160a01b0381163314620002e95760405162461bcd60e51b8152600401620002e09062000ad5565b60405180910390fd5b620002f5828262000346565b5050565b620002f5828262000371565b6200030f62000397565b6001600160a01b038116620003385760405162461bcd60e51b8152600401620002e09062000b2b565b62000343816200025e565b50565b620003528282620003c6565b60008281526001602052604090206200036c90826200042e565b505050565b6200037d82826200044e565b60008281526001602052604090206200036c9082620004d6565b6002546001600160a01b03163314620003c45760405162461bcd60e51b8152600401620002e09062000b3d565b565b620003d28282620004ed565b15620002f5576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600062000445836001600160a01b03841662000516565b90505b92915050565b6200045a8282620004ed565b620002f5576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004923390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000445836001600160a01b0384166200061a565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600081815260018301602052604081205480156200060f5760006200053d60018362000b78565b8554909150600090620005539060019062000b78565b9050818114620005bf57600086600001828154811062000577576200057762000b8e565b90600052602060002001549050808760000184815481106200059d576200059d62000b8e565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620005d357620005d362000ba4565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000448565b600091505062000448565b6000818152600183016020526040812054620006635750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000448565b50600062000448565b60006001600160a01b03821662000448565b62000689816200066c565b81146200034357600080fd5b805162000448816200067e565b60008060408385031215620006ba57620006ba600080fd5b6000620006c8858562000695565b9250506020620006db8582860162000695565b9150509250929050565b620006f0816200066c565b82525050565b60208101620004488284620006e5565b634e487b7160e01b600052601160045260246000fd5b60ff91821691908116908282039081111562000448576200044862000706565b80825b600185111562000782578086048111156200075e576200075e62000706565b60018516156200076d57908102905b80026200077a8560011c90565b94506200073f565b94509492505050565b6000826200079c5750600162000866565b81620007ab5750600062000866565b8160018114620007c45760028114620007cf5762000803565b600191505062000866565b60ff841115620007e357620007e362000706565b8360020a915084821115620007fc57620007fc62000706565b5062000866565b5060208310610133831016604e8410600b84101617156200083b575081810a8381111562000835576200083562000706565b62000866565b6200084a84848460016200073c565b9250905081840481111562000863576200086362000706565b81025b9392505050565b600060ff831692506200044560001984846200078b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680620008c557607f821691505b602082108103620008da57620008da6200089a565b50919050565b600062000448620008ee8381565b90565b620008fc83620008e0565b815460001960089490940293841b1916921b91909117905550565b60006200036c818484620008f1565b81811015620002f5576200093c60008262000917565b60010162000926565b601f8211156200036c576000818152602090206020601f850104810160208510156200096e5750805b620009826020601f86010483018262000926565b5050505050565b6000196008929092029190911c191690565b6000620009a9838362000989565b600290930290921792915050565b81516001600160401b03811115620009d357620009d362000884565b620009df8254620008b0565b620009ec82828562000945565b6020601f83116001811462000a1f576000841562000a0a5750858201515b62000a1685826200099b565b86555062000a7e565b600085815260208120601f198616915b8281101562000a51578885015182556020948501946001909201910162000a2f565b8683101562000a71578489015162000a6d601f89168262000989565b8355505b6001600288020188555050505b505050505050565b602f81526000602082017f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636581526e103937b632b9903337b91039b2b63360891b602082015291505b5060400190565b60208082528101620004488162000a86565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b6020820152915062000ace565b60208082528101620004488162000ae7565b60208082528181019081527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408301526060820162000448565b8181038181111562000448576200044862000706565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a0516147cd62000c26600039600081816107a2015281816121de01528181612253015261249001526000818161061301528181610bb801528181611637015281816119c901528181611d73015281816120f8015281816125b4015261266d01526147cd6000f3fe6080604052600436106102b25760003560e01c806301ffc9a7146102b757806306fdde03146102ed578063095ea7b31461030f5780630d35b4151461032f578063111ecdad1461035e57806313137d651461038b578063134d4f25146103a0578063156a0d0f146103c257806317442b70146103e657806318160ddd146104045780631f5e13341461042257806323b872dd14610437578063248a9ca3146104575780632f2ff15d14610477578063313ce567146104975780633400288b146104b457806336568abe146104d457806339509351146104f45780633b6f743b146105145780633f4ba83a1461054157806340c10f191461055657806342966c681461057657806352ae2879146105965780635535d461146105a95780635a0dfe4d146105c95780635c975abb146105e95780635e280f11146106015780636fc1b31e1461064257806370a0823114610662578063715018a61461069857806379cc6790146106ad5780637d25a05e146106cd5780638456cb59146106fd578063857749b0146107125780638da5cb5b146107265780639010d07c1461073b57806391d148541461075b57806395d89b411461077b578063963efcaa146107905780639f68b964146107c4578063a217fddf146107d8578063a457c2d7146107ed578063a9059cbb1461080d578063b731ea0a1461082d578063b92d0eff14610596578063b98bd0701461084d578063bb0b6a531461086d578063bc70b3541461089a578063bd815db0146108ba578063c7c7f5b3146108cd578063ca15c873146108ee578063ca5eb5e11461090e578063d045a0dc1461092e578063d424388514610941578063d539139314610961578063d547741f14610983578063dd62ed3e146109a3578063e63ab1e9146109c3578063f2fde38b146109e5578063fc0c546a14610596578063ff7bd03d14610a05575b600080fd5b3480156102c357600080fd5b506102d76102d2366004612bad565b610a25565b6040516102e49190612bd8565b60405180910390f35b3480156102f957600080fd5b50610302610a50565b6040516102e49190612c48565b34801561031b57600080fd5b506102d761032a366004612c95565b610ae2565b34801561033b57600080fd5b5061034f61034a366004612ced565b610afa565b6040516102e493929190612def565b34801561036a57600080fd5b5060065461037e906001600160a01b031681565b6040516102e49190612e27565b61039e610399366004612e9b565b610bb6565b005b3480156103ac57600080fd5b506103b5600281565b6040516102e49190612f5a565b3480156103ce57600080fd5b5062b9270b60e21b60016040516102e4929190612f80565b3480156103f257600080fd5b506001806040516102e4929190612f9b565b34801561041057600080fd5b506009545b6040516102e49190612fa9565b34801561042e57600080fd5b506103b5600181565b34801561044357600080fd5b506102d7610452366004612fb7565b610c6e565b34801561046357600080fd5b50610415610472366004613007565b610c94565b34801561048357600080fd5b5061039e610492366004613028565b610ca9565b3480156104a357600080fd5b5060125b6040516102e49190613064565b3480156104c057600080fd5b5061039e6104cf366004613089565b610cca565b3480156104e057600080fd5b5061039e6104ef366004613028565b610d28565b34801561050057600080fd5b506102d761050f366004612c95565b610d5e565b34801561052057600080fd5b5061053461052f3660046130be565b610d80565b6040516102e4919061310a565b34801561054d57600080fd5b5061039e610ddb565b34801561056257600080fd5b5061039e610571366004612c95565b610e19565b34801561058257600080fd5b5061039e610591366004613007565b610e7a565b3480156105a257600080fd5b503061037e565b3480156105b557600080fd5b506103026105c436600461312d565b610e87565b3480156105d557600080fd5b506102d76105e4366004613089565b610f2c565b3480156105f557600080fd5b50600c5460ff166102d7565b34801561060d57600080fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b6040516102e49190613195565b34801561064e57600080fd5b5061039e61065d3660046131a3565b610f48565b34801561066e57600080fd5b5061041561067d3660046131a3565b6001600160a01b031660009081526007602052604090205490565b3480156106a457600080fd5b5061039e610fa6565b3480156106b957600080fd5b5061039e6106c8366004612c95565b610fb8565b3480156106d957600080fd5b506106f06106e8366004613089565b600092915050565b6040516102e491906131c4565b34801561070957600080fd5b5061039e610fcd565b34801561071e57600080fd5b5060066104a7565b34801561073257600080fd5b5061037e611009565b34801561074757600080fd5b5061037e6107563660046131d2565b611018565b34801561076757600080fd5b506102d7610776366004613028565b611030565b34801561078757600080fd5b50610302611059565b34801561079c57600080fd5b506104157f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d057600080fd5b5060006102d7565b3480156107e457600080fd5b50610415600081565b3480156107f957600080fd5b506102d7610808366004612c95565b611068565b34801561081957600080fd5b506102d7610828366004612c95565b6110b0565b34801561083957600080fd5b5060045461037e906001600160a01b031681565b34801561085957600080fd5b5061039e61086836600461323e565b6110be565b34801561087957600080fd5b50610415610888366004613285565b60036020526000908152604090205481565b3480156108a657600080fd5b506103026108b53660046132a6565b611229565b61039e6108c836600461323e565b6113a4565b6108e06108db366004613328565b611521565b6040516102e49291906133be565b3480156108fa57600080fd5b50610415610909366004613007565b611601565b34801561091a57600080fd5b5061039e6109293660046131a3565b611618565b61039e61093c366004612e9b565b6116a1565b34801561094d57600080fd5b5061039e61095c3660046131a3565b6116d0565b34801561096d57600080fd5b5061041560008051602061475883398151915281565b34801561098f57600080fd5b5061039e61099e366004613028565b611723565b3480156109af57600080fd5b506104156109be3660046133d9565b61173f565b3480156109cf57600080fd5b5061041560008051602061473883398151915281565b3480156109f157600080fd5b5061039e610a003660046131a3565b61176a565b348015610a1157600080fd5b506102d7610a203660046133fb565b6117a1565b60006001600160e01b03198216635a05180f60e01b1480610a4a5750610a4a826117d7565b92915050565b6060600a8054610a5f90613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b90613432565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b600033610af081858561180c565b5060019392505050565b60408051808201909152600080825260208201526060610b18612b43565b60408051808201825260008082526001600160401b03602080840182905284518381529081019094529195509182610b73565b604080518082019091526000815260606020820152815260200190600190039081610b4b5790505b509350600080610b98604089013560608a0135610b9360208c018c613285565b6118c0565b60408051808201909152918252602082015296989597505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314610c0a57336040516391ac5e4f60e01b8152600401610c019190612e27565b60405180910390fd5b60208701803590610c2490610c1f908a613285565b6118fe565b14610c5657610c366020880188613285565b876020013560405163309afaf360e21b8152600401610c0192919061347a565b610c6587878787878787611934565b50505050505050565b600033610c7c858285611a94565b610c87858585611ade565b60019150505b9392505050565b60009081526020819052604090206001015490565b610cb282610c94565b610cbb81611bc7565b610cc58383611bd1565b505050565b610cd2611bf3565b63ffffffff821660009081526003602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b90610d1c908490849061347a565b60405180910390a15050565b6001600160a01b0381163314610d505760405162461bcd60e51b8152600401610c01906134e4565b610d5a8282611c22565b5050565b600033610af0818585610d71838361173f565b610d7b919061350a565b61180c565b610d88612b43565b6000610da460408501356060860135610b936020880188613285565b915050600080610db48684611c44565b9092509050610dd1610dc96020880188613285565b838388611d69565b9695505050505050565b610df360008051602061473883398151915233611030565b610e0f5760405162461bcd60e51b8152600401610c0190613561565b610e17611e3e565b565b610e3160008051602061475883398151915233611030565b610e4d5760405162461bcd60e51b8152600401610c01906135b2565b600c5460ff1615610e705760405162461bcd60e51b8152600401610c0190613609565b610d5a8282611e8a565b610e843382611f1a565b50565b600560209081526000928352604080842090915290825290208054610eab90613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed790613432565b8015610f245780601f10610ef957610100808354040283529160200191610f24565b820191906000526020600020905b815481529060010190602001808311610f0757829003601f168201915b505050505081565b63ffffffff919091166000908152600360205260409020541490565b610f50611bf3565b600680546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d441419790610f9b908390612e27565b60405180910390a150565b610fae611bf3565b610e176000611fcb565b610fc3823383611a94565b610d5a8282611f1a565b610fe560008051602061473883398151915233611030565b6110015760405162461bcd60e51b8152600401610c019061365b565b610e1761201d565b6002546001600160a01b031690565b6000828152600160205260408120610c8d908361205a565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600b8054610a5f90613432565b60003381611076828661173f565b9050838110156110985760405162461bcd60e51b8152600401610c01906136ad565b6110a5828686840361180c565b506001949350505050565b600033610af0818585611ade565b6110c6611bf3565b60005b818110156111f75761110b8383838181106110e6576110e66136bd565b90506020028101906110f891906136d3565b6111069060408101906136f7565b612066565b82828281811061111d5761111d6136bd565b905060200281019061112f91906136d3565b61113d9060408101906136f7565b60056000868686818110611153576111536136bd565b905060200281019061116591906136d3565b611173906020810190613285565b63ffffffff1663ffffffff16815260200190815260200160002060008686868181106111a1576111a16136bd565b90506020028101906111b391906136d3565b6111c4906040810190602001613755565b61ffff1681526020810191909152604001600020916111e4919083613833565b50806111ef816138f0565b9150506110c9565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b6748282604051610d1c929190613a79565b63ffffffff8416600090815260056020908152604080832061ffff8716845290915281208054606092919061125d90613432565b80601f016020809104026020016040519081016040528092919081815260200182805461128990613432565b80156112d65780601f106112ab576101008083540402835291602001916112d6565b820191906000526020600020905b8154815290600101906020018083116112b957829003601f168201915b5050505050905080516000036113265783838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092945061139c9350505050565b600083900361133657905061139c565b6002831061137f576113488484612066565b806113568460028188613a8b565b60405160200161136893929190613af0565b60405160208183030381529060405291505061139c565b8383604051639a6d49cd60e01b8152600401610c01929190613b09565b949350505050565b60005b818110156114a057368383838181106113c2576113c26136bd565b90506020028101906113d49190613b1b565b90506113f06113e66020830183613285565b6020830135610f2c565b6113fa575061148e565b3063d045a0dc60c08301358360a08101356114196101008301836136f7565b61142a610100890160e08a016131a3565b6114386101208a018a6136f7565b6040518963ffffffff1660e01b815260040161145a9796959493929190613bbc565b6000604051808303818588803b15801561147357600080fd5b505af1158015611487573d6000803e3d6000fd5b5050505050505b80611498816138f0565b9150506113a7565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115079190810190613cf2565b604051638351eea760e01b8152600401610c019190612c48565b611529612b5d565b611531612b43565b6000806115536040880135606089013561154e60208b018b613285565b6120a8565b915091506000806115648984611c44565b909250905061159061157960208b018b613285565b838361158a368d90038d018d613d76565b8b6120c5565b60408051808201909152858152602080820186905282519298509096503391907ffff873bb909b73d08a8c1af4b21779e87103bb8ea8cf3b3a0067eb8526b8b80a906115de908d018d613285565b876040516115ed92919061347a565b60405180910390a350505050935093915050565b6000818152600160205260408120610a4a906121d0565b611620611bf3565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e19061166c908490600401612e27565b600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b5050505050565b3330146116c15760405163029a949d60e31b815260040160405180910390fd5b610c6587878787878787610c56565b6116d8611bf3565b600480546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090610f9b908390612e27565b61172c82610c94565b61173581611bc7565b610cc58383611c22565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b611772611bf3565b6001600160a01b0381166117985760405162461bcd60e51b8152600401610c0190613dda565b610e8481611fcb565b60006020820180359060039083906117b99086613285565b63ffffffff1681526020810191909152604001600020541492915050565b60006001600160e01b03198216637965db0b60e01b1480610a4a57506301ffc9a760e01b6001600160e01b0319831614610a4a565b6001600160a01b0383166118325760405162461bcd60e51b8152600401610c0190613e2b565b6001600160a01b0382166118585760405162461bcd60e51b8152600401610c0190613e7a565b6001600160a01b0380841660008181526008602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906118b3908590612fa9565b60405180910390a3505050565b6000806118cc856121da565b9150819050838110156118f65780846040516371c4efed60e01b8152600401610c01929190613e8a565b935093915050565b63ffffffff811660009081526003602052604081205480610a4a578260405163f6ff4fb760e01b8152600401610c019190613e98565b60006119466119438787612211565b90565b905060006119728261196061195b8a8a612229565b61224c565b61196d60208d018d613285565b612281565b90506028861115611a395760006119af61199260608c0160408d01613ea6565b61199f60208d018d613285565b846119aa8c8c612295565b6122e0565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb5901290611a059086908d906000908790600401613edc565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c611a7260208d018d613285565b84604051611a8192919061347a565b60405180910390a3505050505050505050565b6000611aa0848461173f565b90506000198114611ad85781811015611acb5760405162461bcd60e51b8152600401610c0190613f4d565b611ad8848484840361180c565b50505050565b6001600160a01b038316611b045760405162461bcd60e51b8152600401610c0190613f9f565b6001600160a01b038216611b2a5760405162461bcd60e51b8152600401610c0190613fef565b611b35838383612312565b6001600160a01b03831660009081526007602052604090205481811015611b6e5760405162461bcd60e51b8152600401610c0190614042565b6001600160a01b03808516600081815260076020526040808220868603905592861680825290839020805486019055915160008051602061477883398151915290611bba908690612fa9565b60405180910390a3611ad8565b610e84813361231d565b611bdb8282612376565b6000828152600160205260409020610cc590826123fa565b33611bfc611009565b6001600160a01b031614610e175760405162461bcd60e51b8152600401610c0190614084565b611c2c828261240f565b6000828152600160205260409020610cc59082612474565b6060806000611ca18560200135611c5a86612489565b611c6760a08901896136f7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506124b592505050565b9093509050600081611cb4576001611cb7565b60025b9050611cd7611cc96020880188613285565b826108b560808a018a6136f7565b6006549093506001600160a01b031615611d605760065460405163043a78eb60e01b81526001600160a01b039091169063043a78eb90611d1d9087908790600401614094565b602060405180830381865afa158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e91906140c4565b505b50509250929050565b611d71612b43565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611dc0896118fe565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611df5929190614153565b6040805180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906141bc565b95945050505050565b611e46612519565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611e809190612e27565b60405180910390a1565b6001600160a01b038216611eb05760405162461bcd60e51b8152600401610c0190614211565b611ebc60008383612312565b8060096000828254611ece919061350a565b90915550506001600160a01b0382166000818152600760205260408082208054850190555160008051602061477883398151915290611f0e908590612fa9565b60405180910390a35050565b6001600160a01b038216611f405760405162461bcd60e51b8152600401610c019061425f565b611f4c82600083612312565b6001600160a01b03821660009081526007602052604090205481811015611f855760405162461bcd60e51b8152600401610c01906142ae565b6001600160a01b038316600081815260076020526040808220858503905560098054869003905551909190600080516020614778833981519152906118b3908690612fa9565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61202561253b565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e733390565b6000610c8d838361255e565b60006120756002828486613a8b565b61207e916142be565b60f01c905060038114610cc5578282604051639a6d49cd60e01b8152600401610c01929190613b09565b6000806120b68585856118c0565b90925090506118f63383611f1a565b6120cd612b5d565b60006120dc8460000151612588565b6020850151909150156120f6576120f684602001516125b0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016121468c6118fe565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401612182929190614153565b60806040518083038185885af11580156121a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121c59190614362565b979650505050505050565b6000610a4a825490565b60007f00000000000000000000000000000000000000000000000000000000000000006122078184614399565b610a4a91906143ad565b60006122206020828486613a8b565b610c8d916143c5565b6000612239602860208486613a8b565b612242916143e3565b60c01c9392505050565b6000610a4a7f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166143ad565b600061228d8484611e8a565b509092915050565b60606122a48260288186613a8b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b6060848484846040516020016122f99493929190614448565b6040516020818303038152906040529050949350505050565b610cc5838383612692565b6123278282611030565b610d5a57612334816126b5565b61233f8360206126c7565b604051602001612350929190614484565b60408051601f198184030181529082905262461bcd60e51b8252610c0191600401612c48565b6123808282611030565b610d5a576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123b63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610c8d836001600160a01b038416612832565b6124198282611030565b15610d5a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610c8d836001600160a01b038416612881565b6000610a4a7f000000000000000000000000000000000000000000000000000000000000000083614399565b80516060901515806124e85784846040516020016124d49291906144d6565b60405160208183030381529060405261250f565b848433856040516020016124ff94939291906144fc565b6040516020818303038152906040525b9150935093915050565b600c5460ff16610e175760405162461bcd60e51b8152600401610c0190614553565b600c5460ff1615610e175760405162461bcd60e51b8152600401610c019061458a565b6000826000018281548110612575576125756136bd565b9060005260206000200154905092915050565b60008134146125ac57346040516304fb820960e51b8152600401610c019190612fa9565b5090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263491906145a5565b90506001600160a01b03811661265d576040516329b99a9560e11b815260040160405180910390fd5b610d5a6001600160a01b038216337f00000000000000000000000000000000000000000000000000000000000000008561297b565b600c5460ff1615610cc55760405162461bcd60e51b8152600401610c0190613609565b6060610a4a6001600160a01b03831660145b606060006126d68360026143ad565b6126e190600261350a565b6001600160401b038111156126f8576126f8613458565b6040519080825280601f01601f191660200182016040528015612722576020820181803683370190505b509050600360fc1b8160008151811061273d5761273d6136bd565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061276c5761276c6136bd565b60200101906001600160f81b031916908160001a90535060006127908460026143ad565b61279b90600161350a565b90505b6001811115612813576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106127cf576127cf6136bd565b1a60f81b8282815181106127e5576127e56136bd565b60200101906001600160f81b031916908160001a90535060049490941c9361280c816145c6565b905061279e565b508315610c8d5760405162461bcd60e51b8152600401610c019061460f565b600081815260018301602052604081205461287957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a4a565b506000610a4a565b6000818152600183016020526040812054801561296a5760006128a560018361461f565b85549091506000906128b99060019061461f565b905081811461291e5760008660000182815481106128d9576128d96136bd565b90600052602060002001549050808760000184815481106128fc576128fc6136bd565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061292f5761292f614632565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a4a565b6000915050610a4a565b5092915050565b611ad8846323b872dd60e01b85858560405160240161299c93929190614648565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526000612a23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a609092919063ffffffff16565b9050805160001480612a44575080806020019051810190612a4491906140c4565b610cc55760405162461bcd60e51b8152600401610c01906146b7565b606061139c848460008585600080866001600160a01b03168587604051612a8791906146c7565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b50915091506121c58783838760608315612b14578251600003612b0d576001600160a01b0385163b612b0d5760405162461bcd60e51b8152600401610c0190614707565b508161139c565b61139c8383815115612b295781518083602001fd5b8060405162461bcd60e51b8152600401610c019190612c48565b604051806040016040528060008152602001600081525090565b6040805160608101825260008082526020820152908101612b7c612b43565b905290565b6001600160e01b03191690565b612b9781612b81565b8114610e8457600080fd5b8035610a4a81612b8e565b600060208284031215612bc257612bc2600080fd5b600061139c8484612ba2565b8015155b82525050565b60208101610a4a8284612bce565b60005b83811015612c01578181015183820152602001612be9565b50506000910152565b601f01601f191690565b6000612c1e825190565b808452602084019350612c35818560208601612be6565b612c3e81612c0a565b9093019392505050565b60208082528101610c8d8184612c14565b6001600160a01b031690565b6000610a4a82612c59565b612b9781612c65565b8035610a4a81612c70565b80612b97565b8035610a4a81612c84565b60008060408385031215612cab57612cab600080fd5b6000612cb78585612c79565b9250506020612cc885828601612c8a565b9150509250929050565b600060e08284031215612ce757612ce7600080fd5b50919050565b600060208284031215612d0257612d02600080fd5b81356001600160401b03811115612d1b57612d1b600080fd5b61139c84828501612cd2565b80612bd2565b80516040830190612d3e8482612d27565b506020820151611ad86020850182612d27565b80516000906040840190612d658582612d27565b5060208301518482036020860152611e358282612c14565b6000610c8d8383612d51565b6000612d93825190565b80845260208401935083602082028501612dad8560200190565b8060005b85811015612de25784840389528151612dca8582612d7d565b94506020830160209a909a0199925050600101612db1565b5091979650505050505050565b60a08101612dfd8286612d2d565b8181036040830152612e0f8185612d89565b905061139c6060830184612d2d565b612bd281612c65565b60208101610a4a8284612e1e565b600060608284031215612ce757612ce7600080fd5b60008083601f840112612e5f57612e5f600080fd5b5081356001600160401b03811115612e7957612e79600080fd5b602083019150836001820283011115612e9457612e94600080fd5b9250929050565b600080600080600080600060e0888a031215612eb957612eb9600080fd5b6000612ec58a8a612e35565b9750506060612ed68a828b01612c8a565b96505060808801356001600160401b03811115612ef557612ef5600080fd5b612f018a828b01612e4a565b955095505060a0612f148a828b01612c79565b93505060c08801356001600160401b03811115612f3357612f33600080fd5b612f3f8a828b01612e4a565b925092505092959891949750929550565b61ffff8116612bd2565b60208101610a4a8284612f50565b612bd281612b81565b6001600160401b038116612bd2565b60408101612f8e8285612f68565b610c8d6020830184612f71565b60408101612f8e8285612f71565b60208101610a4a8284612d27565b600080600060608486031215612fcf57612fcf600080fd5b6000612fdb8686612c79565b9350506020612fec86828701612c79565b9250506040612ffd86828701612c8a565b9150509250925092565b60006020828403121561301c5761301c600080fd5b600061139c8484612c8a565b6000806040838503121561303e5761303e600080fd5b600061304a8585612c8a565b9250506020612cc885828601612c79565b60ff8116612bd2565b60208101610a4a828461305b565b63ffffffff8116612b97565b8035610a4a81613072565b6000806040838503121561309f5761309f600080fd5b6000612cb7858561307e565b801515612b97565b8035610a4a816130ab565b600080604083850312156130d4576130d4600080fd5b82356001600160401b038111156130ed576130ed600080fd5b6130f985828601612cd2565b9250506020612cc8858286016130b3565b60408101610a4a8284612d2d565b61ffff8116612b97565b8035610a4a81613118565b6000806040838503121561314357613143600080fd5b600061314f858561307e565b9250506020612cc885828601613122565b6000610a4a61317161194384612c59565b612c59565b6000610a4a82613160565b6000610a4a82613176565b612bd281613181565b60208101610a4a828461318c565b6000602082840312156131b8576131b8600080fd5b600061139c8484612c79565b60208101610a4a8284612f71565b600080604083850312156131e8576131e8600080fd5b6000612cb78585612c8a565b60008083601f84011261320957613209600080fd5b5081356001600160401b0381111561322357613223600080fd5b602083019150836020820283011115612e9457612e94600080fd5b6000806020838503121561325457613254600080fd5b82356001600160401b0381111561326d5761326d600080fd5b613279858286016131f4565b92509250509250929050565b60006020828403121561329a5761329a600080fd5b600061139c848461307e565b600080600080606085870312156132bf576132bf600080fd5b60006132cb878761307e565b94505060206132dc87828801613122565b93505060408501356001600160401b038111156132fb576132fb600080fd5b61330787828801612e4a565b95989497509550505050565b600060408284031215612ce757612ce7600080fd5b60008060006080848603121561334057613340600080fd5b83356001600160401b0381111561335957613359600080fd5b61336586828701612cd2565b935050602061337686828701613313565b9250506060612ffd86828701612c79565b805160808301906133988482612d27565b5060208201516133ab6020850182612f71565b506040820151611ad86040850182612d2d565b60c081016133cc8285613387565b610c8d6080830184612d2d565b600080604083850312156133ef576133ef600080fd5b600061304a8585612c79565b60006060828403121561341057613410600080fd5b600061139c8484612e35565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061344657607f821691505b602082108103612ce757612ce761341c565b634e487b7160e01b600052604160045260246000fd5b63ffffffff8116612bd2565b60408101613488828561346e565b610c8d6020830184612d27565b602f81526000602082017f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636581526e103937b632b9903337b91039b2b63360891b602082015291505b5060400190565b60208082528101610a4a81613495565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a4a57610a4a6134f4565b6039815260006020820160008051602061471883398151915281527876652070617573657220726f6c6520746f20756e706175736560381b602082015291506134dd565b60208082528101610a4a8161351d565b603681526000602082016000805160206147188339815191528152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b602082015291506134dd565b60208082528101610a4a81613571565b602a81526000602082017f45524332305061757361626c653a20746f6b656e207472616e736665722077688152691a5b19481c185d5cd95960b21b602082015291506134dd565b60208082528101610a4a816135c2565b6037815260006020820160008051602061471883398151915281527676652070617573657220726f6c6520746f20706175736560481b602082015291506134dd565b60208082528101610a4a81613619565b602581526000602082017f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77815264207a65726f60d81b602082015291506134dd565b60208082528101610a4a8161366b565b634e487b7160e01b600052603260045260246000fd5b60008235605e19368490030181126136ed576136ed600080fd5b9190910192915050565b6000808335601e193685900301811261371257613712600080fd5b8084019250823591506001600160401b0382111561373257613732600080fd5b60208301925060018202360383131561374d5761374d600080fd5b509250929050565b60006020828403121561376a5761376a600080fd5b600061139c8484613122565b6000610a4a6119438381565b61378b83613776565b815460001960089490940293841b1916921b91909117905550565b6000610cc5818484613782565b81811015610d5a576137c66000826137a6565b6001016137b3565b601f821115610cc5576000818152602090206020601f850104810160208510156137f55750805b61169a6020601f8601048301826137b3565b6000196008929092029190911c191690565b60006138258383613807565b600290930290921792915050565b826001600160401b0381111561384b5761384b613458565b6138558254613432565b6138608282856137ce565b6000601f83116001811461388e576000841561387c5750858201355b6138868582613819565b865550610c65565b600085815260208120601f198616915b828110156138be578885013582556020948501946001909201910161389e565b868310156138db57848901356138d7601f891682613807565b8355505b60016002880201885550505050505050505050565b60006000198203613903576139036134f4565b5060010190565b6000610c8d602084018461307e565b6000610c8d6020840184613122565b6000808335601e193685900301811261394357613943600080fd5b8381016020810193503591506001600160401b0382111561396657613966600080fd5b3682900383131561374d5761374d600080fd5b82818337506000910152565b818352600060208401935061399b838584613979565b612c3e83612c0a565b6000606083016139b4838061390a565b6139be858261346e565b506139cc6020840184613919565b6139d96020860182612f50565b506139e76040840184613928565b8583036040870152610dd1838284613985565b6000610c8d83836139a4565b60008235605e1936849003018112613a2057613a20600080fd5b90910192915050565b818352600060208401935083602084028101838060005b87811015612de2578484038952613a578284613a06565b613a6185826139fa565b94506020830160209a909a0199925050600101613a40565b6020808252810161139c818486613a29565b60008085851115613a9e57613a9e600080fd5b83861115613aae57613aae600080fd5b5050820193919092039150565b6000613ac5825190565b613ad3818560208601612be6565b9290920192915050565b6000613aea838584613979565b50500190565b6000613afc8286613abb565b9150611e35828486613add565b6020808252810161139c818486613985565b6000823561013e19368490030181126136ed576136ed600080fd5b6000610c8d6020840184612c8a565b6001600160401b038116612b97565b8035610a4a81613b45565b6000610c8d6020840184613b54565b60608201613b7c828061390a565b613b86848261346e565b50613b946020830183613b36565b613ba16020850182612d27565b50613baf6040830183613b5f565b611ad86040850182612f71565b60e08101613bca828a613b6e565b613bd76060830189612d27565b8181036080830152613bea818789613985565b9050613bf960a0830186612e1e565b81810360c0830152613c0c818486613985565b9998505050505050505050565b613c2282612c0a565b81018181106001600160401b0382111715613c3f57613c3f613458565b6040525050565b6000613c5160405190565b9050613c5d8282613c19565b919050565b60006001600160401b03821115613c7b57613c7b613458565b613c8482612c0a565b60200192915050565b6000613ca0613c9b84613c62565b613c46565b905082815260208101848484011115613cbb57613cbb600080fd5b613cc6848285612be6565b509392505050565b600082601f830112613ce257613ce2600080fd5b815161139c848260208601613c8d565b600060208284031215613d0757613d07600080fd5b81516001600160401b03811115613d2057613d20600080fd5b61139c84828501613cce565b600060408284031215613d4157613d41600080fd5b613d4b6040613c46565b90506000613d598484612c8a565b8252506020613d6a84848301612c8a565b60208301525092915050565b600060408284031215613d8b57613d8b600080fd5b600061139c8484613d2c565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015291506134dd565b60208082528101610a4a81613d97565b602481526000602082017f45524332303a20617070726f76652066726f6d20746865207a65726f206164648152637265737360e01b602082015291506134dd565b60208082528101610a4a81613dea565b602281526000602082017f45524332303a20617070726f766520746f20746865207a65726f206164647265815261737360f01b602082015291506134dd565b60208082528101610a4a81613e3b565b604081016134888285612d27565b60208101610a4a828461346e565b600060208284031215613ebb57613ebb600080fd5b600061139c8484613b54565b600061ffff8216610a4a565b612bd281613ec7565b60808101613eea8287612e1e565b613ef76020830186612d27565b613f046040830185613ed3565b8181036060830152610dd18184612c14565b601d81526000602082017f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000815291505b5060200190565b60208082528101610a4a81613f16565b602581526000602082017f45524332303a207472616e736665722066726f6d20746865207a65726f206164815264647265737360d81b602082015291506134dd565b60208082528101610a4a81613f5d565b602381526000602082017f45524332303a207472616e7366657220746f20746865207a65726f206164647281526265737360e81b602082015291506134dd565b60208082528101610a4a81613faf565b602681526000602082017f45524332303a207472616e7366657220616d6f756e7420657863656564732062815265616c616e636560d01b602082015291506134dd565b60208082528101610a4a81613fff565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657291019081526000613f46565b60208082528101610a4a81614052565b604080825281016140a58185612c14565b9050818103602083015261139c8184612c14565b8051610a4a816130ab565b6000602082840312156140d9576140d9600080fd5b600061139c84846140b9565b805160009060a08401906140f9858261346e565b50602083015161410c6020860182612d27565b50604083015184820360408601526141248282612c14565b9150506060830151848203606086015261413e8282612c14565b9150506080830151613cc66080860182612bce565b6040808252810161416481856140e5565b9050610c8d6020830184612e1e565b8051610a4a81612c84565b60006040828403121561419357614193600080fd5b61419d6040613c46565b905060006141ab8484614173565b8252506020613d6a84848301614173565b6000604082840312156141d1576141d1600080fd5b600061139c848461417e565b601f81526000602082017f45524332303a206d696e7420746f20746865207a65726f20616464726573730081529150613f46565b60208082528101610a4a816141dd565b602181526000602082017f45524332303a206275726e2066726f6d20746865207a65726f206164647265738152607360f81b602082015291506134dd565b60208082528101610a4a81614221565b602281526000602082017f45524332303a206275726e20616d6f756e7420657863656564732062616c616e815261636560f01b602082015291506134dd565b60208082528101610a4a8161426f565b80356001600160f01b031916828260028210156142f1576142ec6001600160f01b0319836002036008021b90565b831692505b505092915050565b8051610a4a81613b45565b60006080828403121561431957614319600080fd5b6143236060613c46565b905060006143318484614173565b8252506020614342848483016142f9565b60208301525060406143568482850161417e565b60408301525092915050565b60006080828403121561437757614377600080fd5b600061139c8484614304565b634e487b7160e01b600052601260045260246000fd5b6000826143a8576143a8614383565b500490565b818102808215838204851417612974576129746134f4565b8035828260208210156142f1576142ec600019836020036008021b90565b80356001600160c01b031916828260088210156142f1576001600160c01b03196008838103021b6142ec565b6000610a4a8260c01b90565b612bd26001600160401b03821661440f565b6000610a4a8260e01b90565b612bd263ffffffff821661442d565b6000614454828761441b565b6008820191506144648286614439565b6004820191506144748285612d27565b602082019150610dd18284613abb565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260170160006144b08285613abb565b7001034b99036b4b9b9b4b733903937b6329607d1b8152601101915061139c8284613abb565b60006144e28285612d27565b6020820191506144f2828461441b565b5060080192915050565b60006145088287612d27565b602082019150614518828661441b565b6008820191506144748285612d27565b601481526000602082017314185d5cd8589b194e881b9bdd081c185d5cd95960621b81529150613f46565b60208082528101610a4a81614528565b601081526000602082016f14185d5cd8589b194e881c185d5cd95960821b81529150613f46565b60208082528101610a4a81614563565b8051610a4a81612c70565b6000602082840312156145ba576145ba600080fd5b600061139c848461459a565b6000816145d5576145d56134f4565b506000190190565b60208082527f537472696e67733a20686578206c656e67746820696e73756666696369656e7491019081526000613f46565b60208082528101610a4a816145dd565b81810381811115610a4a57610a4a6134f4565b634e487b7160e01b600052603160045260246000fd5b606081016146568286612e1e565b6146636020830185612e1e565b61139c6040830184612d27565b602a81526000602082017f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015291506134dd565b60208082528101610a4a81614670565b6000610c8d8284613abb565b601d81526000602082017f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081529150613f46565b60208082528101610a4a816146d356fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220145fce5e8bbec4db0f1113da7440b74c87dcd501ad1dd2296fdd4053ea10757064736f6c6343000814003365d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a60000000000000000000000001a44076050125825900e736c501f859c50fe728c0000000000000000000000000f97d276203408a410d430b5dada7870ae1e45c9

Deployed Bytecode

0x6080604052600436106102b25760003560e01c806301ffc9a7146102b757806306fdde03146102ed578063095ea7b31461030f5780630d35b4151461032f578063111ecdad1461035e57806313137d651461038b578063134d4f25146103a0578063156a0d0f146103c257806317442b70146103e657806318160ddd146104045780631f5e13341461042257806323b872dd14610437578063248a9ca3146104575780632f2ff15d14610477578063313ce567146104975780633400288b146104b457806336568abe146104d457806339509351146104f45780633b6f743b146105145780633f4ba83a1461054157806340c10f191461055657806342966c681461057657806352ae2879146105965780635535d461146105a95780635a0dfe4d146105c95780635c975abb146105e95780635e280f11146106015780636fc1b31e1461064257806370a0823114610662578063715018a61461069857806379cc6790146106ad5780637d25a05e146106cd5780638456cb59146106fd578063857749b0146107125780638da5cb5b146107265780639010d07c1461073b57806391d148541461075b57806395d89b411461077b578063963efcaa146107905780639f68b964146107c4578063a217fddf146107d8578063a457c2d7146107ed578063a9059cbb1461080d578063b731ea0a1461082d578063b92d0eff14610596578063b98bd0701461084d578063bb0b6a531461086d578063bc70b3541461089a578063bd815db0146108ba578063c7c7f5b3146108cd578063ca15c873146108ee578063ca5eb5e11461090e578063d045a0dc1461092e578063d424388514610941578063d539139314610961578063d547741f14610983578063dd62ed3e146109a3578063e63ab1e9146109c3578063f2fde38b146109e5578063fc0c546a14610596578063ff7bd03d14610a05575b600080fd5b3480156102c357600080fd5b506102d76102d2366004612bad565b610a25565b6040516102e49190612bd8565b60405180910390f35b3480156102f957600080fd5b50610302610a50565b6040516102e49190612c48565b34801561031b57600080fd5b506102d761032a366004612c95565b610ae2565b34801561033b57600080fd5b5061034f61034a366004612ced565b610afa565b6040516102e493929190612def565b34801561036a57600080fd5b5060065461037e906001600160a01b031681565b6040516102e49190612e27565b61039e610399366004612e9b565b610bb6565b005b3480156103ac57600080fd5b506103b5600281565b6040516102e49190612f5a565b3480156103ce57600080fd5b5062b9270b60e21b60016040516102e4929190612f80565b3480156103f257600080fd5b506001806040516102e4929190612f9b565b34801561041057600080fd5b506009545b6040516102e49190612fa9565b34801561042e57600080fd5b506103b5600181565b34801561044357600080fd5b506102d7610452366004612fb7565b610c6e565b34801561046357600080fd5b50610415610472366004613007565b610c94565b34801561048357600080fd5b5061039e610492366004613028565b610ca9565b3480156104a357600080fd5b5060125b6040516102e49190613064565b3480156104c057600080fd5b5061039e6104cf366004613089565b610cca565b3480156104e057600080fd5b5061039e6104ef366004613028565b610d28565b34801561050057600080fd5b506102d761050f366004612c95565b610d5e565b34801561052057600080fd5b5061053461052f3660046130be565b610d80565b6040516102e4919061310a565b34801561054d57600080fd5b5061039e610ddb565b34801561056257600080fd5b5061039e610571366004612c95565b610e19565b34801561058257600080fd5b5061039e610591366004613007565b610e7a565b3480156105a257600080fd5b503061037e565b3480156105b557600080fd5b506103026105c436600461312d565b610e87565b3480156105d557600080fd5b506102d76105e4366004613089565b610f2c565b3480156105f557600080fd5b50600c5460ff166102d7565b34801561060d57600080fd5b506106357f0000000000000000000000001a44076050125825900e736c501f859c50fe728c81565b6040516102e49190613195565b34801561064e57600080fd5b5061039e61065d3660046131a3565b610f48565b34801561066e57600080fd5b5061041561067d3660046131a3565b6001600160a01b031660009081526007602052604090205490565b3480156106a457600080fd5b5061039e610fa6565b3480156106b957600080fd5b5061039e6106c8366004612c95565b610fb8565b3480156106d957600080fd5b506106f06106e8366004613089565b600092915050565b6040516102e491906131c4565b34801561070957600080fd5b5061039e610fcd565b34801561071e57600080fd5b5060066104a7565b34801561073257600080fd5b5061037e611009565b34801561074757600080fd5b5061037e6107563660046131d2565b611018565b34801561076757600080fd5b506102d7610776366004613028565b611030565b34801561078757600080fd5b50610302611059565b34801561079c57600080fd5b506104157f000000000000000000000000000000000000000000000000000000e8d4a5100081565b3480156107d057600080fd5b5060006102d7565b3480156107e457600080fd5b50610415600081565b3480156107f957600080fd5b506102d7610808366004612c95565b611068565b34801561081957600080fd5b506102d7610828366004612c95565b6110b0565b34801561083957600080fd5b5060045461037e906001600160a01b031681565b34801561085957600080fd5b5061039e61086836600461323e565b6110be565b34801561087957600080fd5b50610415610888366004613285565b60036020526000908152604090205481565b3480156108a657600080fd5b506103026108b53660046132a6565b611229565b61039e6108c836600461323e565b6113a4565b6108e06108db366004613328565b611521565b6040516102e49291906133be565b3480156108fa57600080fd5b50610415610909366004613007565b611601565b34801561091a57600080fd5b5061039e6109293660046131a3565b611618565b61039e61093c366004612e9b565b6116a1565b34801561094d57600080fd5b5061039e61095c3660046131a3565b6116d0565b34801561096d57600080fd5b5061041560008051602061475883398151915281565b34801561098f57600080fd5b5061039e61099e366004613028565b611723565b3480156109af57600080fd5b506104156109be3660046133d9565b61173f565b3480156109cf57600080fd5b5061041560008051602061473883398151915281565b3480156109f157600080fd5b5061039e610a003660046131a3565b61176a565b348015610a1157600080fd5b506102d7610a203660046133fb565b6117a1565b60006001600160e01b03198216635a05180f60e01b1480610a4a5750610a4a826117d7565b92915050565b6060600a8054610a5f90613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8b90613432565b8015610ad85780601f10610aad57610100808354040283529160200191610ad8565b820191906000526020600020905b815481529060010190602001808311610abb57829003601f168201915b5050505050905090565b600033610af081858561180c565b5060019392505050565b60408051808201909152600080825260208201526060610b18612b43565b60408051808201825260008082526001600160401b03602080840182905284518381529081019094529195509182610b73565b604080518082019091526000815260606020820152815260200190600190039081610b4b5790505b509350600080610b98604089013560608a0135610b9360208c018c613285565b6118c0565b60408051808201909152918252602082015296989597505050505050565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b03163314610c0a57336040516391ac5e4f60e01b8152600401610c019190612e27565b60405180910390fd5b60208701803590610c2490610c1f908a613285565b6118fe565b14610c5657610c366020880188613285565b876020013560405163309afaf360e21b8152600401610c0192919061347a565b610c6587878787878787611934565b50505050505050565b600033610c7c858285611a94565b610c87858585611ade565b60019150505b9392505050565b60009081526020819052604090206001015490565b610cb282610c94565b610cbb81611bc7565b610cc58383611bd1565b505050565b610cd2611bf3565b63ffffffff821660009081526003602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b90610d1c908490849061347a565b60405180910390a15050565b6001600160a01b0381163314610d505760405162461bcd60e51b8152600401610c01906134e4565b610d5a8282611c22565b5050565b600033610af0818585610d71838361173f565b610d7b919061350a565b61180c565b610d88612b43565b6000610da460408501356060860135610b936020880188613285565b915050600080610db48684611c44565b9092509050610dd1610dc96020880188613285565b838388611d69565b9695505050505050565b610df360008051602061473883398151915233611030565b610e0f5760405162461bcd60e51b8152600401610c0190613561565b610e17611e3e565b565b610e3160008051602061475883398151915233611030565b610e4d5760405162461bcd60e51b8152600401610c01906135b2565b600c5460ff1615610e705760405162461bcd60e51b8152600401610c0190613609565b610d5a8282611e8a565b610e843382611f1a565b50565b600560209081526000928352604080842090915290825290208054610eab90613432565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed790613432565b8015610f245780601f10610ef957610100808354040283529160200191610f24565b820191906000526020600020905b815481529060010190602001808311610f0757829003601f168201915b505050505081565b63ffffffff919091166000908152600360205260409020541490565b610f50611bf3565b600680546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d441419790610f9b908390612e27565b60405180910390a150565b610fae611bf3565b610e176000611fcb565b610fc3823383611a94565b610d5a8282611f1a565b610fe560008051602061473883398151915233611030565b6110015760405162461bcd60e51b8152600401610c019061365b565b610e1761201d565b6002546001600160a01b031690565b6000828152600160205260408120610c8d908361205a565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600b8054610a5f90613432565b60003381611076828661173f565b9050838110156110985760405162461bcd60e51b8152600401610c01906136ad565b6110a5828686840361180c565b506001949350505050565b600033610af0818585611ade565b6110c6611bf3565b60005b818110156111f75761110b8383838181106110e6576110e66136bd565b90506020028101906110f891906136d3565b6111069060408101906136f7565b612066565b82828281811061111d5761111d6136bd565b905060200281019061112f91906136d3565b61113d9060408101906136f7565b60056000868686818110611153576111536136bd565b905060200281019061116591906136d3565b611173906020810190613285565b63ffffffff1663ffffffff16815260200190815260200160002060008686868181106111a1576111a16136bd565b90506020028101906111b391906136d3565b6111c4906040810190602001613755565b61ffff1681526020810191909152604001600020916111e4919083613833565b50806111ef816138f0565b9150506110c9565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b6748282604051610d1c929190613a79565b63ffffffff8416600090815260056020908152604080832061ffff8716845290915281208054606092919061125d90613432565b80601f016020809104026020016040519081016040528092919081815260200182805461128990613432565b80156112d65780601f106112ab576101008083540402835291602001916112d6565b820191906000526020600020905b8154815290600101906020018083116112b957829003601f168201915b5050505050905080516000036113265783838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092945061139c9350505050565b600083900361133657905061139c565b6002831061137f576113488484612066565b806113568460028188613a8b565b60405160200161136893929190613af0565b60405160208183030381529060405291505061139c565b8383604051639a6d49cd60e01b8152600401610c01929190613b09565b949350505050565b60005b818110156114a057368383838181106113c2576113c26136bd565b90506020028101906113d49190613b1b565b90506113f06113e66020830183613285565b6020830135610f2c565b6113fa575061148e565b3063d045a0dc60c08301358360a08101356114196101008301836136f7565b61142a610100890160e08a016131a3565b6114386101208a018a6136f7565b6040518963ffffffff1660e01b815260040161145a9796959493929190613bbc565b6000604051808303818588803b15801561147357600080fd5b505af1158015611487573d6000803e3d6000fd5b5050505050505b80611498816138f0565b9150506113a7565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa1580156114df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115079190810190613cf2565b604051638351eea760e01b8152600401610c019190612c48565b611529612b5d565b611531612b43565b6000806115536040880135606089013561154e60208b018b613285565b6120a8565b915091506000806115648984611c44565b909250905061159061157960208b018b613285565b838361158a368d90038d018d613d76565b8b6120c5565b60408051808201909152858152602080820186905282519298509096503391907ffff873bb909b73d08a8c1af4b21779e87103bb8ea8cf3b3a0067eb8526b8b80a906115de908d018d613285565b876040516115ed92919061347a565b60405180910390a350505050935093915050565b6000818152600160205260408120610a4a906121d0565b611620611bf3565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000001a44076050125825900e736c501f859c50fe728c169063ca5eb5e19061166c908490600401612e27565b600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b5050505050565b3330146116c15760405163029a949d60e31b815260040160405180910390fd5b610c6587878787878787610c56565b6116d8611bf3565b600480546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090610f9b908390612e27565b61172c82610c94565b61173581611bc7565b610cc58383611c22565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b611772611bf3565b6001600160a01b0381166117985760405162461bcd60e51b8152600401610c0190613dda565b610e8481611fcb565b60006020820180359060039083906117b99086613285565b63ffffffff1681526020810191909152604001600020541492915050565b60006001600160e01b03198216637965db0b60e01b1480610a4a57506301ffc9a760e01b6001600160e01b0319831614610a4a565b6001600160a01b0383166118325760405162461bcd60e51b8152600401610c0190613e2b565b6001600160a01b0382166118585760405162461bcd60e51b8152600401610c0190613e7a565b6001600160a01b0380841660008181526008602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906118b3908590612fa9565b60405180910390a3505050565b6000806118cc856121da565b9150819050838110156118f65780846040516371c4efed60e01b8152600401610c01929190613e8a565b935093915050565b63ffffffff811660009081526003602052604081205480610a4a578260405163f6ff4fb760e01b8152600401610c019190613e98565b60006119466119438787612211565b90565b905060006119728261196061195b8a8a612229565b61224c565b61196d60208d018d613285565b612281565b90506028861115611a395760006119af61199260608c0160408d01613ea6565b61199f60208d018d613285565b846119aa8c8c612295565b6122e0565b604051633e5ac80960e11b81529091506001600160a01b037f0000000000000000000000001a44076050125825900e736c501f859c50fe728c1690637cb5901290611a059086908d906000908790600401613edc565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c611a7260208d018d613285565b84604051611a8192919061347a565b60405180910390a3505050505050505050565b6000611aa0848461173f565b90506000198114611ad85781811015611acb5760405162461bcd60e51b8152600401610c0190613f4d565b611ad8848484840361180c565b50505050565b6001600160a01b038316611b045760405162461bcd60e51b8152600401610c0190613f9f565b6001600160a01b038216611b2a5760405162461bcd60e51b8152600401610c0190613fef565b611b35838383612312565b6001600160a01b03831660009081526007602052604090205481811015611b6e5760405162461bcd60e51b8152600401610c0190614042565b6001600160a01b03808516600081815260076020526040808220868603905592861680825290839020805486019055915160008051602061477883398151915290611bba908690612fa9565b60405180910390a3611ad8565b610e84813361231d565b611bdb8282612376565b6000828152600160205260409020610cc590826123fa565b33611bfc611009565b6001600160a01b031614610e175760405162461bcd60e51b8152600401610c0190614084565b611c2c828261240f565b6000828152600160205260409020610cc59082612474565b6060806000611ca18560200135611c5a86612489565b611c6760a08901896136f7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506124b592505050565b9093509050600081611cb4576001611cb7565b60025b9050611cd7611cc96020880188613285565b826108b560808a018a6136f7565b6006549093506001600160a01b031615611d605760065460405163043a78eb60e01b81526001600160a01b039091169063043a78eb90611d1d9087908790600401614094565b602060405180830381865afa158015611d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5e91906140c4565b505b50509250929050565b611d71612b43565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663ddc28c586040518060a001604052808863ffffffff168152602001611dc0896118fe565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611df5929190614153565b6040805180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906141bc565b95945050505050565b611e46612519565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611e809190612e27565b60405180910390a1565b6001600160a01b038216611eb05760405162461bcd60e51b8152600401610c0190614211565b611ebc60008383612312565b8060096000828254611ece919061350a565b90915550506001600160a01b0382166000818152600760205260408082208054850190555160008051602061477883398151915290611f0e908590612fa9565b60405180910390a35050565b6001600160a01b038216611f405760405162461bcd60e51b8152600401610c019061425f565b611f4c82600083612312565b6001600160a01b03821660009081526007602052604090205481811015611f855760405162461bcd60e51b8152600401610c01906142ae565b6001600160a01b038316600081815260076020526040808220858503905560098054869003905551909190600080516020614778833981519152906118b3908690612fa9565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61202561253b565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e733390565b6000610c8d838361255e565b60006120756002828486613a8b565b61207e916142be565b60f01c905060038114610cc5578282604051639a6d49cd60e01b8152600401610c01929190613b09565b6000806120b68585856118c0565b90925090506118f63383611f1a565b6120cd612b5d565b60006120dc8460000151612588565b6020850151909150156120f6576120f684602001516125b0565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016121468c6118fe565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401612182929190614153565b60806040518083038185885af11580156121a0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121c59190614362565b979650505050505050565b6000610a4a825490565b60007f000000000000000000000000000000000000000000000000000000e8d4a510006122078184614399565b610a4a91906143ad565b60006122206020828486613a8b565b610c8d916143c5565b6000612239602860208486613a8b565b612242916143e3565b60c01c9392505050565b6000610a4a7f000000000000000000000000000000000000000000000000000000e8d4a510006001600160401b0384166143ad565b600061228d8484611e8a565b509092915050565b60606122a48260288186613a8b565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b6060848484846040516020016122f99493929190614448565b6040516020818303038152906040529050949350505050565b610cc5838383612692565b6123278282611030565b610d5a57612334816126b5565b61233f8360206126c7565b604051602001612350929190614484565b60408051601f198184030181529082905262461bcd60e51b8252610c0191600401612c48565b6123808282611030565b610d5a576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123b63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610c8d836001600160a01b038416612832565b6124198282611030565b15610d5a576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610c8d836001600160a01b038416612881565b6000610a4a7f000000000000000000000000000000000000000000000000000000e8d4a5100083614399565b80516060901515806124e85784846040516020016124d49291906144d6565b60405160208183030381529060405261250f565b848433856040516020016124ff94939291906144fc565b6040516020818303038152906040525b9150935093915050565b600c5460ff16610e175760405162461bcd60e51b8152600401610c0190614553565b600c5460ff1615610e175760405162461bcd60e51b8152600401610c019061458a565b6000826000018281548110612575576125756136bd565b9060005260206000200154905092915050565b60008134146125ac57346040516304fb820960e51b8152600401610c019190612fa9565b5090565b60007f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263491906145a5565b90506001600160a01b03811661265d576040516329b99a9560e11b815260040160405180910390fd5b610d5a6001600160a01b038216337f0000000000000000000000001a44076050125825900e736c501f859c50fe728c8561297b565b600c5460ff1615610cc55760405162461bcd60e51b8152600401610c0190613609565b6060610a4a6001600160a01b03831660145b606060006126d68360026143ad565b6126e190600261350a565b6001600160401b038111156126f8576126f8613458565b6040519080825280601f01601f191660200182016040528015612722576020820181803683370190505b509050600360fc1b8160008151811061273d5761273d6136bd565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061276c5761276c6136bd565b60200101906001600160f81b031916908160001a90535060006127908460026143ad565b61279b90600161350a565b90505b6001811115612813576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106127cf576127cf6136bd565b1a60f81b8282815181106127e5576127e56136bd565b60200101906001600160f81b031916908160001a90535060049490941c9361280c816145c6565b905061279e565b508315610c8d5760405162461bcd60e51b8152600401610c019061460f565b600081815260018301602052604081205461287957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a4a565b506000610a4a565b6000818152600183016020526040812054801561296a5760006128a560018361461f565b85549091506000906128b99060019061461f565b905081811461291e5760008660000182815481106128d9576128d96136bd565b90600052602060002001549050808760000184815481106128fc576128fc6136bd565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061292f5761292f614632565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a4a565b6000915050610a4a565b5092915050565b611ad8846323b872dd60e01b85858560405160240161299c93929190614648565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526000612a23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a609092919063ffffffff16565b9050805160001480612a44575080806020019051810190612a4491906140c4565b610cc55760405162461bcd60e51b8152600401610c01906146b7565b606061139c848460008585600080866001600160a01b03168587604051612a8791906146c7565b60006040518083038185875af1925050503d8060008114612ac4576040519150601f19603f3d011682016040523d82523d6000602084013e612ac9565b606091505b50915091506121c58783838760608315612b14578251600003612b0d576001600160a01b0385163b612b0d5760405162461bcd60e51b8152600401610c0190614707565b508161139c565b61139c8383815115612b295781518083602001fd5b8060405162461bcd60e51b8152600401610c019190612c48565b604051806040016040528060008152602001600081525090565b6040805160608101825260008082526020820152908101612b7c612b43565b905290565b6001600160e01b03191690565b612b9781612b81565b8114610e8457600080fd5b8035610a4a81612b8e565b600060208284031215612bc257612bc2600080fd5b600061139c8484612ba2565b8015155b82525050565b60208101610a4a8284612bce565b60005b83811015612c01578181015183820152602001612be9565b50506000910152565b601f01601f191690565b6000612c1e825190565b808452602084019350612c35818560208601612be6565b612c3e81612c0a565b9093019392505050565b60208082528101610c8d8184612c14565b6001600160a01b031690565b6000610a4a82612c59565b612b9781612c65565b8035610a4a81612c70565b80612b97565b8035610a4a81612c84565b60008060408385031215612cab57612cab600080fd5b6000612cb78585612c79565b9250506020612cc885828601612c8a565b9150509250929050565b600060e08284031215612ce757612ce7600080fd5b50919050565b600060208284031215612d0257612d02600080fd5b81356001600160401b03811115612d1b57612d1b600080fd5b61139c84828501612cd2565b80612bd2565b80516040830190612d3e8482612d27565b506020820151611ad86020850182612d27565b80516000906040840190612d658582612d27565b5060208301518482036020860152611e358282612c14565b6000610c8d8383612d51565b6000612d93825190565b80845260208401935083602082028501612dad8560200190565b8060005b85811015612de25784840389528151612dca8582612d7d565b94506020830160209a909a0199925050600101612db1565b5091979650505050505050565b60a08101612dfd8286612d2d565b8181036040830152612e0f8185612d89565b905061139c6060830184612d2d565b612bd281612c65565b60208101610a4a8284612e1e565b600060608284031215612ce757612ce7600080fd5b60008083601f840112612e5f57612e5f600080fd5b5081356001600160401b03811115612e7957612e79600080fd5b602083019150836001820283011115612e9457612e94600080fd5b9250929050565b600080600080600080600060e0888a031215612eb957612eb9600080fd5b6000612ec58a8a612e35565b9750506060612ed68a828b01612c8a565b96505060808801356001600160401b03811115612ef557612ef5600080fd5b612f018a828b01612e4a565b955095505060a0612f148a828b01612c79565b93505060c08801356001600160401b03811115612f3357612f33600080fd5b612f3f8a828b01612e4a565b925092505092959891949750929550565b61ffff8116612bd2565b60208101610a4a8284612f50565b612bd281612b81565b6001600160401b038116612bd2565b60408101612f8e8285612f68565b610c8d6020830184612f71565b60408101612f8e8285612f71565b60208101610a4a8284612d27565b600080600060608486031215612fcf57612fcf600080fd5b6000612fdb8686612c79565b9350506020612fec86828701612c79565b9250506040612ffd86828701612c8a565b9150509250925092565b60006020828403121561301c5761301c600080fd5b600061139c8484612c8a565b6000806040838503121561303e5761303e600080fd5b600061304a8585612c8a565b9250506020612cc885828601612c79565b60ff8116612bd2565b60208101610a4a828461305b565b63ffffffff8116612b97565b8035610a4a81613072565b6000806040838503121561309f5761309f600080fd5b6000612cb7858561307e565b801515612b97565b8035610a4a816130ab565b600080604083850312156130d4576130d4600080fd5b82356001600160401b038111156130ed576130ed600080fd5b6130f985828601612cd2565b9250506020612cc8858286016130b3565b60408101610a4a8284612d2d565b61ffff8116612b97565b8035610a4a81613118565b6000806040838503121561314357613143600080fd5b600061314f858561307e565b9250506020612cc885828601613122565b6000610a4a61317161194384612c59565b612c59565b6000610a4a82613160565b6000610a4a82613176565b612bd281613181565b60208101610a4a828461318c565b6000602082840312156131b8576131b8600080fd5b600061139c8484612c79565b60208101610a4a8284612f71565b600080604083850312156131e8576131e8600080fd5b6000612cb78585612c8a565b60008083601f84011261320957613209600080fd5b5081356001600160401b0381111561322357613223600080fd5b602083019150836020820283011115612e9457612e94600080fd5b6000806020838503121561325457613254600080fd5b82356001600160401b0381111561326d5761326d600080fd5b613279858286016131f4565b92509250509250929050565b60006020828403121561329a5761329a600080fd5b600061139c848461307e565b600080600080606085870312156132bf576132bf600080fd5b60006132cb878761307e565b94505060206132dc87828801613122565b93505060408501356001600160401b038111156132fb576132fb600080fd5b61330787828801612e4a565b95989497509550505050565b600060408284031215612ce757612ce7600080fd5b60008060006080848603121561334057613340600080fd5b83356001600160401b0381111561335957613359600080fd5b61336586828701612cd2565b935050602061337686828701613313565b9250506060612ffd86828701612c79565b805160808301906133988482612d27565b5060208201516133ab6020850182612f71565b506040820151611ad86040850182612d2d565b60c081016133cc8285613387565b610c8d6080830184612d2d565b600080604083850312156133ef576133ef600080fd5b600061304a8585612c79565b60006060828403121561341057613410600080fd5b600061139c8484612e35565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061344657607f821691505b602082108103612ce757612ce761341c565b634e487b7160e01b600052604160045260246000fd5b63ffffffff8116612bd2565b60408101613488828561346e565b610c8d6020830184612d27565b602f81526000602082017f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636581526e103937b632b9903337b91039b2b63360891b602082015291505b5060400190565b60208082528101610a4a81613495565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a4a57610a4a6134f4565b6039815260006020820160008051602061471883398151915281527876652070617573657220726f6c6520746f20756e706175736560381b602082015291506134dd565b60208082528101610a4a8161351d565b603681526000602082016000805160206147188339815191528152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b602082015291506134dd565b60208082528101610a4a81613571565b602a81526000602082017f45524332305061757361626c653a20746f6b656e207472616e736665722077688152691a5b19481c185d5cd95960b21b602082015291506134dd565b60208082528101610a4a816135c2565b6037815260006020820160008051602061471883398151915281527676652070617573657220726f6c6520746f20706175736560481b602082015291506134dd565b60208082528101610a4a81613619565b602581526000602082017f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77815264207a65726f60d81b602082015291506134dd565b60208082528101610a4a8161366b565b634e487b7160e01b600052603260045260246000fd5b60008235605e19368490030181126136ed576136ed600080fd5b9190910192915050565b6000808335601e193685900301811261371257613712600080fd5b8084019250823591506001600160401b0382111561373257613732600080fd5b60208301925060018202360383131561374d5761374d600080fd5b509250929050565b60006020828403121561376a5761376a600080fd5b600061139c8484613122565b6000610a4a6119438381565b61378b83613776565b815460001960089490940293841b1916921b91909117905550565b6000610cc5818484613782565b81811015610d5a576137c66000826137a6565b6001016137b3565b601f821115610cc5576000818152602090206020601f850104810160208510156137f55750805b61169a6020601f8601048301826137b3565b6000196008929092029190911c191690565b60006138258383613807565b600290930290921792915050565b826001600160401b0381111561384b5761384b613458565b6138558254613432565b6138608282856137ce565b6000601f83116001811461388e576000841561387c5750858201355b6138868582613819565b865550610c65565b600085815260208120601f198616915b828110156138be578885013582556020948501946001909201910161389e565b868310156138db57848901356138d7601f891682613807565b8355505b60016002880201885550505050505050505050565b60006000198203613903576139036134f4565b5060010190565b6000610c8d602084018461307e565b6000610c8d6020840184613122565b6000808335601e193685900301811261394357613943600080fd5b8381016020810193503591506001600160401b0382111561396657613966600080fd5b3682900383131561374d5761374d600080fd5b82818337506000910152565b818352600060208401935061399b838584613979565b612c3e83612c0a565b6000606083016139b4838061390a565b6139be858261346e565b506139cc6020840184613919565b6139d96020860182612f50565b506139e76040840184613928565b8583036040870152610dd1838284613985565b6000610c8d83836139a4565b60008235605e1936849003018112613a2057613a20600080fd5b90910192915050565b818352600060208401935083602084028101838060005b87811015612de2578484038952613a578284613a06565b613a6185826139fa565b94506020830160209a909a0199925050600101613a40565b6020808252810161139c818486613a29565b60008085851115613a9e57613a9e600080fd5b83861115613aae57613aae600080fd5b5050820193919092039150565b6000613ac5825190565b613ad3818560208601612be6565b9290920192915050565b6000613aea838584613979565b50500190565b6000613afc8286613abb565b9150611e35828486613add565b6020808252810161139c818486613985565b6000823561013e19368490030181126136ed576136ed600080fd5b6000610c8d6020840184612c8a565b6001600160401b038116612b97565b8035610a4a81613b45565b6000610c8d6020840184613b54565b60608201613b7c828061390a565b613b86848261346e565b50613b946020830183613b36565b613ba16020850182612d27565b50613baf6040830183613b5f565b611ad86040850182612f71565b60e08101613bca828a613b6e565b613bd76060830189612d27565b8181036080830152613bea818789613985565b9050613bf960a0830186612e1e565b81810360c0830152613c0c818486613985565b9998505050505050505050565b613c2282612c0a565b81018181106001600160401b0382111715613c3f57613c3f613458565b6040525050565b6000613c5160405190565b9050613c5d8282613c19565b919050565b60006001600160401b03821115613c7b57613c7b613458565b613c8482612c0a565b60200192915050565b6000613ca0613c9b84613c62565b613c46565b905082815260208101848484011115613cbb57613cbb600080fd5b613cc6848285612be6565b509392505050565b600082601f830112613ce257613ce2600080fd5b815161139c848260208601613c8d565b600060208284031215613d0757613d07600080fd5b81516001600160401b03811115613d2057613d20600080fd5b61139c84828501613cce565b600060408284031215613d4157613d41600080fd5b613d4b6040613c46565b90506000613d598484612c8a565b8252506020613d6a84848301612c8a565b60208301525092915050565b600060408284031215613d8b57613d8b600080fd5b600061139c8484613d2c565b602681526000602082017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015291506134dd565b60208082528101610a4a81613d97565b602481526000602082017f45524332303a20617070726f76652066726f6d20746865207a65726f206164648152637265737360e01b602082015291506134dd565b60208082528101610a4a81613dea565b602281526000602082017f45524332303a20617070726f766520746f20746865207a65726f206164647265815261737360f01b602082015291506134dd565b60208082528101610a4a81613e3b565b604081016134888285612d27565b60208101610a4a828461346e565b600060208284031215613ebb57613ebb600080fd5b600061139c8484613b54565b600061ffff8216610a4a565b612bd281613ec7565b60808101613eea8287612e1e565b613ef76020830186612d27565b613f046040830185613ed3565b8181036060830152610dd18184612c14565b601d81526000602082017f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000815291505b5060200190565b60208082528101610a4a81613f16565b602581526000602082017f45524332303a207472616e736665722066726f6d20746865207a65726f206164815264647265737360d81b602082015291506134dd565b60208082528101610a4a81613f5d565b602381526000602082017f45524332303a207472616e7366657220746f20746865207a65726f206164647281526265737360e81b602082015291506134dd565b60208082528101610a4a81613faf565b602681526000602082017f45524332303a207472616e7366657220616d6f756e7420657863656564732062815265616c616e636560d01b602082015291506134dd565b60208082528101610a4a81613fff565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657291019081526000613f46565b60208082528101610a4a81614052565b604080825281016140a58185612c14565b9050818103602083015261139c8184612c14565b8051610a4a816130ab565b6000602082840312156140d9576140d9600080fd5b600061139c84846140b9565b805160009060a08401906140f9858261346e565b50602083015161410c6020860182612d27565b50604083015184820360408601526141248282612c14565b9150506060830151848203606086015261413e8282612c14565b9150506080830151613cc66080860182612bce565b6040808252810161416481856140e5565b9050610c8d6020830184612e1e565b8051610a4a81612c84565b60006040828403121561419357614193600080fd5b61419d6040613c46565b905060006141ab8484614173565b8252506020613d6a84848301614173565b6000604082840312156141d1576141d1600080fd5b600061139c848461417e565b601f81526000602082017f45524332303a206d696e7420746f20746865207a65726f20616464726573730081529150613f46565b60208082528101610a4a816141dd565b602181526000602082017f45524332303a206275726e2066726f6d20746865207a65726f206164647265738152607360f81b602082015291506134dd565b60208082528101610a4a81614221565b602281526000602082017f45524332303a206275726e20616d6f756e7420657863656564732062616c616e815261636560f01b602082015291506134dd565b60208082528101610a4a8161426f565b80356001600160f01b031916828260028210156142f1576142ec6001600160f01b0319836002036008021b90565b831692505b505092915050565b8051610a4a81613b45565b60006080828403121561431957614319600080fd5b6143236060613c46565b905060006143318484614173565b8252506020614342848483016142f9565b60208301525060406143568482850161417e565b60408301525092915050565b60006080828403121561437757614377600080fd5b600061139c8484614304565b634e487b7160e01b600052601260045260246000fd5b6000826143a8576143a8614383565b500490565b818102808215838204851417612974576129746134f4565b8035828260208210156142f1576142ec600019836020036008021b90565b80356001600160c01b031916828260088210156142f1576001600160c01b03196008838103021b6142ec565b6000610a4a8260c01b90565b612bd26001600160401b03821661440f565b6000610a4a8260e01b90565b612bd263ffffffff821661442d565b6000614454828761441b565b6008820191506144648286614439565b6004820191506144748285612d27565b602082019150610dd18284613abb565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b815260170160006144b08285613abb565b7001034b99036b4b9b9b4b733903937b6329607d1b8152601101915061139c8284613abb565b60006144e28285612d27565b6020820191506144f2828461441b565b5060080192915050565b60006145088287612d27565b602082019150614518828661441b565b6008820191506144748285612d27565b601481526000602082017314185d5cd8589b194e881b9bdd081c185d5cd95960621b81529150613f46565b60208082528101610a4a81614528565b601081526000602082016f14185d5cd8589b194e881c185d5cd95960821b81529150613f46565b60208082528101610a4a81614563565b8051610a4a81612c70565b6000602082840312156145ba576145ba600080fd5b600061139c848461459a565b6000816145d5576145d56134f4565b506000190190565b60208082527f537472696e67733a20686578206c656e67746820696e73756666696369656e7491019081526000613f46565b60208082528101610a4a816145dd565b81810381811115610a4a57610a4a6134f4565b634e487b7160e01b600052603160045260246000fd5b606081016146568286612e1e565b6146636020830185612e1e565b61139c6040830184612d27565b602a81526000602082017f5361666545524332303a204552433230206f7065726174696f6e20646964206e8152691bdd081cdd58d8d9595960b21b602082015291506134dd565b60208082528101610a4a81614670565b6000610c8d8284613abb565b601d81526000602082017f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081529150613f46565b60208082528101610a4a816146d356fe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220145fce5e8bbec4db0f1113da7440b74c87dcd501ad1dd2296fdd4053ea10757064736f6c63430008140033

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

0000000000000000000000001a44076050125825900e736c501f859c50fe728c0000000000000000000000000f97d276203408a410d430b5dada7870ae1e45c9

-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x1a44076050125825900e736c501f859c50fE728c
Arg [1] : _delegate (address): 0x0f97D276203408a410d430b5dada7870AE1E45C9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a44076050125825900e736c501f859c50fe728c
Arg [1] : 0000000000000000000000000f97d276203408a410d430b5dada7870ae1e45c9


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.