ETH Price: $2,727.24 (+0.71%)

Token

LayerZero (ZRO)
 

Overview

Max Total Supply

940,121,962.027158 ZRO

Holders

11,684 ( -0.017%)
Created with Highcharts 10.2.1

Market

Price

$2.94 @ 0.001078 ETH (+1.46%)

Onchain Market Cap

$2,763,958,568.36

Circulating Supply Market Cap

$327,142,574.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
1.09265734 ZRO

Value
$3.21 ( ~0.00117701415491107 Eth) [0.0000%]
0xf9b205640ab5a45762b3e3a2a29ce0b56d941533
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

LayerZero is a technology that enables applications to move data across blockchains, uniquely supporting censorship-resistant messages and permissionless development through immutable smart contracts.

Market

Volume (24H):$37,593,736.00
Market Capitalization:$327,142,574.00
Circulating Supply:111,152,854.00 ZRO
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Binance
ZRO-USDT$2.93
0.0010742 Eth
$6,301,447.00
2,151,624.330 ZRO
18.3083%
2
BTCC
ZRO-USDT$2.93
0.0010742 Eth
$3,786,625.00
1,293,143.340 ZRO
11.0034%
3
MEXC
ZRO-USDT$2.94
0.0010781 Eth
$3,174,139.00
1,078,542.050 ZRO
9.1774%
4
Bybit
ZRO-USDT$2.93
0.0010748 Eth
$2,562,458.00
874,705.560 ZRO
7.4429%
5
Websea
ZRO-USDT$2.94
0.0010770 Eth
$2,142,626.00
0.000 ZRO
0.0000%
6
LBank
ZRO-USDT$2.93
0.0010743 Eth
$1,629,527.00
556,511.410 ZRO
4.7354%
7
Bit2Me
ZRO-USDT$2.94
0.0010773 Eth
$1,547,767.00
528,895.140 ZRO
4.5004%
8
Gate.io
ZRO-USDT$2.93
0.0010746 Eth
$1,531,530.00
523,258.820 ZRO
4.4524%
9
OKX
ZRO-USDT$2.93
0.0010742 Eth
$1,292,211.00
441,281.830 ZRO
3.7549%
10
WhiteBIT
ZRO-USDT$2.92
0.0010698 Eth
$1,216,539.00
416,890.820 ZRO
3.5473%
11
BitMart
ZRO-USDT$2.93
0.0010742 Eth
$916,544.00
312,976.400 ZRO
2.6631%
12
Hotcoin
ZRO-USDT$2.93
0.0010745 Eth
$740,543.00
252,847.170 ZRO
2.1515%
13
CoinW
ZRO-USDT$2.93
0.0010756 Eth
$708,533.00
241,481.320 ZRO
2.0548%
14
Bitget
ZRO-USDT$2.93
0.0010742 Eth
$704,911.00
240,624.020 ZRO
2.0475%
15
Ourbit
ZRO-USDT$2.93
0.0010745 Eth
$645,543.00
220,548.330 ZRO
1.8767%
16
XT.COM
ZRO-USDT$2.93
0.0010746 Eth
$632,002.00
215,798.760 ZRO
1.8362%
17
HTX
ZRO-USDT$2.93
0.0010766 Eth
$624,382.00
213,017.702 ZRO
1.8126%
18
BTSE
ZRO-USDT$2.94
0.0010785 Eth
$605,049.00
205,664.532 ZRO
1.7500%
19
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$2.93
0.0010751 Eth
$552,961.00
188,260.487 0X6985884C4392D348587B19CB9EAAF157F13271CD
1.6019%
20
Biconomy.com
ZRO-USDT$2.95
0.0010795 Eth
$505,056.00
172,457.660 ZRO
1.4675%
21
Aerodrome SlipStream
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.93
0.0010756 Eth
$453,749.00
154,323.201 0X6985884C4392D348587B19CB9EAAF157F13271CD
1.3131%
22
Bitunix
ZRO-USDT$2.93
0.0010760 Eth
$437,824.00
149,126.790 ZRO
1.2689%
23
OrangeX
ZRO-USDT$2.93
0.0010739 Eth
$437,754.00
149,468.300 ZRO
1.2718%
24
Coinbase Exchange
ZRO-USD$2.93
0.0010736 Eth
$337,895.00
115,401.280 ZRO
0.9820%
25
KuCoin
ZRO-USDT$2.93
0.0010745 Eth
$315,204.00
107,625.440 ZRO
0.9158%
26
Binance
ZRO-TRY$2.94
0.0010775 Eth
$271,102.00
92,710.540 ZRO
0.7889%
27
CoinTR
ZRO-TRY$2.92
0.0010718 Eth
$178,597.00
60,967.520 ZRO
0.5188%
28
Uniswap V3 (Ethereum)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$2.95
0.0010820 Eth
$173,568.00
59,096.107 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.5029%
29
Binance
ZRO-USDC$2.93
0.0010752 Eth
$166,812.00
56,958.720 ZRO
0.4847%
30
GroveX
ZRO-USDT$2.94
0.0010777 Eth
$149,540.00
50,878.866 ZRO
0.4329%
31
AscendEX (BitMax)
ZRO-USDT$2.93
0.0010735 Eth
$141,807.00
48,456.700 ZRO
0.4123%
32
BingX
ZRO-USDT$2.93
0.0010749 Eth
$125,996.00
43,016.966 ZRO
0.3660%
33
Binance
ZRO-BTC$2.93
0.0010762 Eth
$125,510.00
42,688.240 ZRO
0.3632%
34
Phemex
ZRO-USDT$2.94
0.0010781 Eth
$125,007.00
42,519.090 ZRO
0.3618%
35
BVOX
ZRO-USDT$2.94
0.0010769 Eth
$124,730.00
42,553.250 ZRO
0.3621%
36
PointPay
ZRO-USDT$2.93
0.0010747 Eth
$98,033.00
33,494.018 ZRO
0.2850%
37
Hibt
ZRO-USDT$2.94
0.0010786 Eth
$97,924.00
33,442.582 ZRO
0.2846%
38
SushiSwap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.93
0.0010758 Eth
$96,645.00
32,909.475 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.2800%
39
DeGate
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48$2.93
0.0010753 Eth
$77,012.00
26,376.732 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.2244%
40
Tapbit
ZRO-USDT$2.93
0.0010738 Eth
$74,611.00
25,461.920 ZRO
0.2167%
41
Uniswap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.93
0.0010750 Eth
$69,719.00
23,740.289 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.2020%
42
Bybit
ZRO-USDC$2.94
0.0010794 Eth
$66,959.00
22,890.220 ZRO
0.1948%
43
Binance
ZRO-FDUSD$2.92
0.0010723 Eth
$64,443.00
21,992.900 ZRO
0.1871%
44
CoinTR
ZRO-USDT$2.93
0.0010749 Eth
$49,953.00
17,071.840 ZRO
0.1453%
45
LFJ V2.2 (Avalanche)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XB31F66AA3C1E785363F0875A1B74E27B85FD66C7$2.91
0.0010668 Eth
$45,625.00
15,534.679 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.1322%
46
BtcTurk | Kripto
ZRO-TRY$2.94
0.0010789 Eth
$41,688.00
14,175.680 ZRO
0.1206%
47
THENA FUSION
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C$2.93
0.0010763 Eth
$38,996.00
13,569.661 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.1155%
48
Bitvavo
ZRO-EUR$2.93
0.0010752 Eth
$35,912.00
12,251.890 ZRO
0.1043%
49
Maverick Protocol V2 (Base)
0X4200000000000000000000000000000000000006-0X6985884C4392D348587B19CB9EAAF157F13271CD$2.94
0.0010781 Eth
$32,736.00
11.997 0X4200000000000000000000000000000000000006
0.0001%
50
BloFin
ZRO-USDT$2.92
0.0010715 Eth
$30,873.00
10,544.080 ZRO
0.0897%
51
Paribu
ZRO-TRY$2.96
0.0010852 Eth
$23,332.00
7,875.918 ZRO
0.0670%
52
Crypto.com Exchange
ZRO-USD$2.95
0.0010806 Eth
$23,280.00
7,904.500 ZRO
0.0673%
53
BtcTurk | Kripto
ZRO-USDT$2.93
0.0010745 Eth
$20,705.00
7,069.480 ZRO
0.0602%
54
Uniswap V3 (Optimism)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.94
0.0010789 Eth
$18,033.82
6,148.598 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0523%
55
PancakeSwap V3 (BSC)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C$2.93
0.0010767 Eth
$17,243.95
5,882.435 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0501%
56
Uniswap V3 (Optimism)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X94B008AA00579C1307B0EF2C499AD98A8CE58E58$2.90
0.0010643 Eth
$15,860.03
5,475.278 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0466%
57
OKX
ZRO-USDC$2.94
0.0010789 Eth
$15,627.80
5,331.679 ZRO
0.0454%
58
Bit2Me
ZRO-USDC$2.94
0.0010785 Eth
$15,316.88
5,225.045 ZRO
0.0445%
59
LATOKEN
ZRO-USDT$2.95
0.0010817 Eth
$14,076.10
4,774.604 ZRO
0.0406%
60
Uniswap V3 (Polygon)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X0D500B1D8E8EF31E21C99D1DB9A6444D3ADF1270$2.95
0.0010837 Eth
$13,182.07
4,509.024 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0384%
61
Bitrue
ZRO-USDT$2.93
0.0010745 Eth
$12,852.93
4,385.269 ZRO
0.0373%
62
Kraken
ZRO-USD$2.93
0.0010751 Eth
$12,010.78
4,097.844 ZRO
0.0349%
63
Bitlo
ZRO-USDT$2.93
0.0010761 Eth
$10,117.58
3,455.680 ZRO
0.0294%
64
Bitfinex
ZRO-USDT$2.93
0.0010747 Eth
$7,099.03
2,422.897 ZRO
0.0206%
65
CoinEx
ZRO-USDT$2.93
0.0010748 Eth
$7,057.32
2,413.392 ZRO
0.0205%
66
PancakeSwap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.95
0.0010809 Eth
$6,810.35
2,318.484 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0197%
67
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XFD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB9$2.93
0.0010734 Eth
$5,990.36
2,045.680 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0174%
68
Niza Global
ZRO-USD$2.93
0.0010747 Eth
$5,877.03
2,868.491 ZRO
0.0244%
69
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XAF88D065E77C8CC2239327C5EDB3A432268E5831$2.93
0.0010756 Eth
$5,557.26
1,899.285 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0162%
70
Solidly V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.94
0.0010773 Eth
$5,481.02
1,866.085 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0159%
71
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X912CE59144191C1204E64559FE8253A0E49E6548$2.91
0.0010670 Eth
$5,306.77
1,792.256 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0153%
72
Bitfinex
ZRO-USD$2.94
0.0010787 Eth
$4,645.30
1,579.603 ZRO
0.0134%
73
Uniswap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X833589FCD6EDB6E08F4C7C32D4F71B54BDA02913$2.93
0.0010755 Eth
$4,585.40
1,564.007 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0133%
74
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X82AF49447D8A07E3BD95BD0D56F35241523FBAB1$2.91
0.0010682 Eth
$4,426.62
1,502.077 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0128%
75
VALR
ZRO-USDT$2.96
0.0010847 Eth
$4,326.61
1,496.440 ZRO
0.0127%
76
Kanga
ZRO-USDT$2.94
0.0010791 Eth
$3,276.85
0.000 ZRO
0.0000%
77
Bitlo
ZRO-TRY$2.94
0.0010783 Eth
$3,084.68
1,051.370 ZRO
0.0089%
78
Nami.Exchange
ZRO-VNST$2.93
0.0010749 Eth
$2,787.11
950.852 ZRO
0.0081%
79
WEEX
ZRO-USDT$2.94
0.0010784 Eth
$2,722.57
930.500 ZRO
0.0079%
80
Nami.Exchange
ZRO-USDT$2.93
0.0010752 Eth
$2,702.15
921.310 ZRO
0.0078%
81
Uniswap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.93
0.0010745 Eth
$2,432.51
830.200 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0071%
82
Backpack Exchange
ZRO-USDC$2.96
0.0010846 Eth
$1,958.44
665.100 ZRO
0.0057%
83
Uniswap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XB0FFA8000886E57F86DD5264B9582B2AD87B2B91$2.93
0.0010745 Eth
$1,926.05
662.380 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0056%
84
Crypto.com Exchange
ZRO-USDT$2.90
0.0010632 Eth
$1,152.32
397.600 ZRO
0.0034%
85
Uniswap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.93
0.0010751 Eth
$1,021.19
351.431 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0030%
86
NovaDAX
ZRO-BRL$2.91
0.0010663 Eth
$918.04
315.400 ZRO
0.0027%
87
Uniswap V4 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X0B3E328455C4059EEB9E3F84B5543F74E24E7E1B$2.96
0.0010832 Eth
$807.82
272.082 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0023%
88
EXMO
ZRO-USDT$2.96
0.0010863 Eth
$661.45
223.376 ZRO
0.0019%
89
Kraken
ZRO-EUR$2.94
0.0010801 Eth
$549.37
186.573 ZRO
0.0016%
90
LFJ V2.2 (Arbitrum)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XAF88D065E77C8CC2239327C5EDB3A432268E5831$2.95
0.0010815 Eth
$529.34
180.940 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0015%
91
WEEX
ZRO-USDC$2.95
0.0010807 Eth
$524.88
179.200 ZRO
0.0015%
92
Niza Global
ZRO-EUR$2.94
0.0010797 Eth
$266.69
130.601 ZRO
0.0011%
93
SushiSwap V3 (Base)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X4200000000000000000000000000000000000006$2.94
0.0010763 Eth
$254.18
86.430 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0007%
94
Bitkub
ZRO-THB$2.94
0.0010773 Eth
$211.90
72.051 ZRO
0.0006%
95
Uniswap V3 (Arbitrum One)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XAF88D065E77C8CC2239327C5EDB3A432268E5831$2.93
0.0010756 Eth
$76.35
26.520 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0002%
96
SquadSwap V2
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XBB4CDB9CBD36B01BD1CBAEBF2DE08D9173BC095C$2.92
0.0010708 Eth
$60.21
20.862 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0002%
97
Gate.io
ZRO-TRY$2.97
0.0010880 Eth
$35.96
12.317 ZRO
0.0001%
98
Uniswap V3 (Polygon)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0XC2132D05D31C914A87C6611C10748AEB04B58E8F$2.95
0.0010793 Eth
$27.07
9.272 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0001%
99
WOO X
ZRO-USDT$2.93
0.0010759 Eth
$24.27
8.270 ZRO
0.0001%
100
Uniswap V3 (Polygon)
0X6985884C4392D348587B19CB9EAAF157F13271CD-0X7CEB23FD6BC0ADD59E62AC25578270CFF1B9F619$2.96
0.0010833 Eth
$15.62
5.317 0X6985884C4392D348587B19CB9EAAF157F13271CD
0.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
LayerZeroToken

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 77777 runs

Other Settings:
paris EvmVersion
File 1 of 39 : LayerZeroToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.22;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { OFT } from "@layerzerolabs/lz-evm-oapp-v2/contracts/oft/OFT.sol";
contract LayerZeroToken is OFT {
constructor(
string memory _name,
string memory _symbol,
address _lzEndpoint,
address _delegate
) OFT(_name, _symbol, _lzEndpoint, _delegate) Ownable(_delegate) {
_mint(0x3437F6F7BD47D75780981d0B5A0Ce9a038f19ed3, 1_000_000_000 * 10 ** 18);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

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

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

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

File 10 of 39 : 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 11 of 39 : 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 12 of 39 : 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 13 of 39 : 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 14 of 39 : 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 15 of 39 : 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 16 of 39 : 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 17 of 39 : 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 18 of 39 : 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 19 of 39 : 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 20 of 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : 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 39 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 39 : draft-IERC6093.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 33 of 39 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @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 value of tokens in existence.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 35 of 39 : IERC20Permit.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @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 36 of 39 : SafeERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../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 An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 39 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 39 of 39 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_delegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidDelegate","type":"error"},{"inputs":[],"name":"InvalidEndpointCall","type":"error"},{"inputs":[],"name":"InvalidLocalDecimals","type":"error"},{"inputs":[{"internalType":"bytes","name":"options","type":"bytes"}],"name":"InvalidOptions","type":"error"},{"inputs":[],"name":"LzTokenUnavailable","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"NoPeer","type":"error"},{"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"NotEnoughNative","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"OnlyEndpoint","type":"error"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"OnlyPeer","type":"error"},{"inputs":[],"name":"OnlySelf","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"name":"SimulationResult","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"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":"amountReceivedLD","type":"uint256"}],"name":"OFTReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"guid","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"dstEid","type":"uint32"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"name":"OFTSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"peer","type":"bytes32"}],"name":"PeerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"preCrimeAddress","type":"address"}],"name":"PreCrimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEND_AND_CALL","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"}],"name":"allowInitializePath","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"uint16","name":"_msgType","type":"uint16"},{"internalType":"bytes","name":"_extraOptions","type":"bytes"}],"name":"combineOptions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpointV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"}],"name":"enforcedOptions","outputs":[{"internalType":"bytes","name":"enforcedOption","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"address","name":"_sender","type":"address"}],"name":"isComposeMsgSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"isPeer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"origin","type":"tuple"},{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"internalType":"struct InboundPacket[]","name":"_packets","type":"tuple[]"}],"name":"lzReceiveAndRevert","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"srcEid","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"internalType":"struct Origin","name":"_origin","type":"tuple"},{"internalType":"bytes32","name":"_guid","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"lzReceiveSimulate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"msgInspector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"nextNonce","outputs":[{"internalType":"uint64","name":"nonce","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oApp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oAppVersion","outputs":[{"internalType":"uint64","name":"senderVersion","type":"uint64"},{"internalType":"uint64","name":"receiverVersion","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"oftVersion","outputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"uint64","name":"version","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"eid","type":"uint32"}],"name":"peers","outputs":[{"internalType":"bytes32","name":"peer","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preCrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"}],"name":"quoteOFT","outputs":[{"components":[{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"uint256","name":"maxAmountLD","type":"uint256"}],"internalType":"struct OFTLimit","name":"oftLimit","type":"tuple"},{"components":[{"internalType":"int256","name":"feeAmountLD","type":"int256"},{"internalType":"string","name":"description","type":"string"}],"internalType":"struct OFTFeeDetail[]","name":"oftFeeDetails","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"internalType":"bool","name":"_payInLzToken","type":"bool"}],"name":"quoteSend","outputs":[{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"msgFee","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"dstEid","type":"uint32"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"uint256","name":"minAmountLD","type":"uint256"},{"internalType":"bytes","name":"extraOptions","type":"bytes"},{"internalType":"bytes","name":"composeMsg","type":"bytes"},{"internalType":"bytes","name":"oftCmd","type":"bytes"}],"internalType":"struct SendParam","name":"_sendParam","type":"tuple"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"_fee","type":"tuple"},{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"send","outputs":[{"components":[{"internalType":"bytes32","name":"guid","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"components":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"lzTokenFee","type":"uint256"}],"internalType":"struct MessagingFee","name":"fee","type":"tuple"}],"internalType":"struct MessagingReceipt","name":"msgReceipt","type":"tuple"},{"components":[{"internalType":"uint256","name":"amountSentLD","type":"uint256"},{"internalType":"uint256","name":"amountReceivedLD","type":"uint256"}],"internalType":"struct OFTReceipt","name":"oftReceipt","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"uint16","name":"msgType","type":"uint16"},{"internalType":"bytes","name":"options","type":"bytes"}],"internalType":"struct EnforcedOptionParam[]","name":"_enforcedOptions","type":"tuple[]"}],"name":"setEnforcedOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_msgInspector","type":"address"}],"name":"setMsgInspector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"bytes32","name":"_peer","type":"bytes32"}],"name":"setPeer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_preCrime","type":"address"}],"name":"setPreCrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b506040516200420b3803806200420b833981016040819052620000349162000476565b83838383838360128484818181818d6001600160a01b0381166200007357604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200007e81620001cb565b506001600160a01b038083166080528116620000ad57604051632d618d8160e21b815260040160405180910390fd5b60805160405163ca5eb5e160e01b81526001600160a01b0383811660048301529091169063ca5eb5e190602401600060405180830381600087803b158015620000f557600080fd5b505af11580156200010a573d6000803e3d6000fd5b5050505050505050620001226200021b60201b60201c565b60ff168360ff16101562000149576040516301e9714b60e41b815260040160405180910390fd5b620001566006846200051b565b6200016390600a6200063a565b60a05250600891506200017990508382620006e3565b506009620001888282620006e3565b50505050505050620001c1733437f6f7bd47d75780981d0b5a0ce9a038f19ed36b033b2e3c9fd0803ce80000006200022060201b60201c565b50505050620007c5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b6001600160a01b0382166200024c5760405163ec442f0560e01b8152600060048201526024016200006a565b6200025a600083836200025e565b5050565b6001600160a01b0383166200028d578060076000828254620002819190620007af565b90915550620003019050565b6001600160a01b03831660009081526005602052604090205481811015620002e25760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016200006a565b6001600160a01b03841660009081526005602052604090209082900390555b6001600160a01b0382166200031f576007805482900390556200033e565b6001600160a01b03821660009081526005602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200038491815260200190565b60405180910390a3505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620003b957600080fd5b81516001600160401b0380821115620003d657620003d662000391565b604051601f8301601f19908116603f0116810190828211818310171562000401576200040162000391565b81604052838152602092508660208588010111156200041f57600080fd5b600091505b8382101562000443578582018301518183018401529082019062000424565b6000602085830101528094505050505092915050565b80516001600160a01b03811681146200047157600080fd5b919050565b600080600080608085870312156200048d57600080fd5b84516001600160401b0380821115620004a557600080fd5b620004b388838901620003a7565b95506020870151915080821115620004ca57600080fd5b50620004d987828801620003a7565b935050620004ea6040860162000459565b9150620004fa6060860162000459565b905092959194509250565b634e487b7160e01b600052601160045260246000fd5b60ff828116828216039081111562000537576200053762000505565b92915050565b600181815b808511156200057e57816000190482111562000562576200056262000505565b808516156200057057918102915b93841c939080029062000542565b509250929050565b600082620005975750600162000537565b81620005a65750600062000537565b8160018114620005bf5760028114620005ca57620005ea565b600191505062000537565b60ff841115620005de57620005de62000505565b50506001821b62000537565b5060208310610133831016604e8410600b84101617156200060f575081810a62000537565b6200061b83836200053d565b806000190482111562000632576200063262000505565b029392505050565b60006200064b60ff84168362000586565b9392505050565b600181811c908216806200066757607f821691505b6020821081036200068857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006de576000816000526020600020601f850160051c81016020861015620006b95750805b601f850160051c820191505b81811015620006da57828155600101620006c5565b5050505b505050565b81516001600160401b03811115620006ff57620006ff62000391565b620007178162000710845462000652565b846200068e565b602080601f8311600181146200074f5760008415620007365750858301515b600019600386901b1c1916600185901b178555620006da565b600085815260208120601f198616915b8281101562000780578886015182559484019460019091019084016200075f565b50858210156200079f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000537576200053762000505565b60805160a0516139da62000831600039600081816106ed01528181611f7a01528181611fef015261226101526000818161059101528181610a770152818161124501528181611580015281816119ef01528181611d49015281816123b901526124b201526139da6000f3fe6080604052600436106102d15760003560e01c80637d25a05e11610179578063bb0b6a53116100d6578063d045a0dc1161008a578063f2fde38b11610064578063f2fde38b146108b7578063fc0c546a14610515578063ff7bd03d146108d757600080fd5b8063d045a0dc14610831578063d424388514610844578063dd62ed3e1461086457600080fd5b8063bd815db0116100bb578063bd815db0146107dd578063c7c7f5b3146107f0578063ca5eb5e11461081157600080fd5b8063bb0b6a5314610790578063bc70b354146107bd57600080fd5b8063963efcaa1161012d578063a9059cbb11610112578063a9059cbb14610723578063b731ea0a14610743578063b98bd0701461077057600080fd5b8063963efcaa146106db5780639f68b9641461070f57600080fd5b8063857749b01161015e578063857749b0146106875780638da5cb5b1461069b57806395d89b41146106c657600080fd5b80637d25a05e1461062b57806382413eac1461066757600080fd5b806323b872dd116102325780635535d461116101e65780636fc1b31e116101c05780636fc1b31e146105b357806370a08231146105d3578063715018a61461061657600080fd5b80635535d461146105285780635a0dfe4d146105485780635e280f111461057f57600080fd5b80633400288b116102175780633400288b146104c85780633b6f743b146104e857806352ae28791461051557600080fd5b806323b872dd14610486578063313ce567146104a657600080fd5b8063134d4f251161028957806317442b701161026e57806317442b701461043057806318160ddd146104525780631f5e13341461047157600080fd5b8063134d4f25146103c7578063156a0d0f146103ef57600080fd5b80630d35b415116102ba5780630d35b41514610331578063111ecdad1461036057806313137d65146103b257600080fd5b806306fdde03146102d6578063095ea7b314610301575b600080fd5b3480156102e257600080fd5b506102eb6108f7565b6040516102f8919061284f565b60405180910390f35b34801561030d57600080fd5b5061032161031c366004612884565b610989565b60405190151581526020016102f8565b34801561033d57600080fd5b5061035161034c3660046128c8565b6109a3565b6040516102f8939291906128fd565b34801561036c57600080fd5b5060045461038d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6103c56103c0366004612a0f565b610a75565b005b3480156103d357600080fd5b506103dc600281565b60405161ffff90911681526020016102f8565b3480156103fb57600080fd5b50604080517f02e49c2c00000000000000000000000000000000000000000000000000000000815260016020820152016102f8565b34801561043c57600080fd5b50604080516001815260026020820152016102f8565b34801561045e57600080fd5b506007545b6040519081526020016102f8565b34801561047d57600080fd5b506103dc600181565b34801561049257600080fd5b506103216104a1366004612aaf565b610b74565b3480156104b257600080fd5b5060125b60405160ff90911681526020016102f8565b3480156104d457600080fd5b506103c56104e3366004612b09565b610b9a565b3480156104f457600080fd5b50610508610503366004612b33565b610bb0565b6040516102f89190612b85565b34801561052157600080fd5b503061038d565b34801561053457600080fd5b506102eb610543366004612bae565b610c17565b34801561055457600080fd5b50610321610563366004612b09565b63ffffffff919091166000908152600160205260409020541490565b34801561058b57600080fd5b5061038d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105bf57600080fd5b506103c56105ce366004612be1565b610cbc565b3480156105df57600080fd5b506104636105ee366004612be1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b34801561062257600080fd5b506103c5610d3e565b34801561063757600080fd5b5061064e610646366004612b09565b600092915050565b60405167ffffffffffffffff90911681526020016102f8565b34801561067357600080fd5b50610321610682366004612bfe565b610d52565b34801561069357600080fd5b5060066104b6565b3480156106a757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661038d565b3480156106d257600080fd5b506102eb610d74565b3480156106e757600080fd5b506104637f000000000000000000000000000000000000000000000000000000000000000081565b34801561071b57600080fd5b506000610321565b34801561072f57600080fd5b5061032161073e366004612884565b610d83565b34801561074f57600080fd5b5060025461038d9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561077c57600080fd5b506103c561078b366004612caa565b610d91565b34801561079c57600080fd5b506104636107ab366004612cec565b60016020526000908152604090205481565b3480156107c957600080fd5b506102eb6107d8366004612d07565b610da3565b6103c56107eb366004612caa565b610f2f565b6108036107fe366004612d68565b6110fd565b6040516102f8929190612df4565b34801561081d57600080fd5b506103c561082c366004612be1565b6111f8565b6103c561083f366004612a0f565b6112a4565b34801561085057600080fd5b506103c561085f366004612be1565b6112ec565b34801561087057600080fd5b5061046361087f366004612e47565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205490565b3480156108c357600080fd5b506103c56108d2366004612be1565b611367565b3480156108e357600080fd5b506103216108f2366004612e75565b6113cb565b60606008805461090690612e91565b80601f016020809104026020016040519081016040528092919081815260200182805461093290612e91565b801561097f5780601f106109545761010080835404028352916020019161097f565b820191906000526020600020905b81548152906001019060200180831161096257829003601f168201915b5050505050905090565b600033610997818585611401565b60019150505b92915050565b604080518082019091526000808252602082015260606109d6604051806040016040528060008152602001600081525090565b604080518082018252600080825267ffffffffffffffff602080840182905284518381529081019094529195509182610a32565b604080518082019091526000815260606020820152815260200190600190039081610a0a5790505b509350600080610a57604089013560608a0135610a5260208c018c612cec565b611413565b60408051808201909152918252602082015296989597505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610aeb576040517f91ac5e4f0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b60208701803590610b0590610b00908a612cec565b611470565b14610b5c57610b176020880188612cec565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610ae2565b610b6b878787878787876114c5565b50505050505050565b600033610b8285828561165f565b610b8d85858561172e565b60019150505b9392505050565b610ba26117d9565b610bac828261182c565b5050565b60408051808201909152600080825260208201526000610be060408501356060860135610a526020880188612cec565b915050600080610bf08684611882565b9092509050610c0d610c056020880188612cec565b8383886119d9565b9695505050505050565b600360209081526000928352604080842090915290825290208054610c3b90612e91565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6790612e91565b8015610cb45780601f10610c8957610100808354040283529160200191610cb4565b820191906000526020600020905b815481529060010190602001808311610c9757829003601f168201915b505050505081565b610cc46117d9565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d466117d9565b610d506000611ac7565b565b73ffffffffffffffffffffffffffffffffffffffff811630145b949350505050565b60606009805461090690612e91565b60003361099781858561172e565b610d996117d9565b610bac8282611b3c565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610dd790612e91565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0390612e91565b8015610e505780601f10610e2557610100808354040283529160200191610e50565b820191906000526020600020905b815481529060010190602001808311610e3357829003601f168201915b505050505090508051600003610ea05783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610d6c9350505050565b6000839003610eb0579050610d6c565b60028310610ef957610ec28484611c95565b80610ed08460028188612f0d565b604051602001610ee293929190612f37565b604051602081830303815290604052915050610d6c565b83836040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401610ae2929190612fa8565b60005b818110156110385736838383818110610f4d57610f4d612fbc565b9050602002810190610f5f9190612feb565b9050610f92610f716020830183612cec565b602083013563ffffffff919091166000908152600160205260409020541490565b610f9c5750611030565b3063d045a0dc60c08301358360a0810135610fbb610100830183613029565b610fcc610100890160e08a01612be1565b610fda6101208a018a613029565b6040518963ffffffff1660e01b8152600401610ffc97969594939291906130a4565b6000604051808303818588803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b5050505050505b600101610f32565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110ca9190810190613161565b6040517f8351eea7000000000000000000000000000000000000000000000000000000008152600401610ae2919061284f565b611105612799565b604080518082019091526000808252602082015260008061113c33604089013560608a013561113760208c018c612cec565b611cf0565b9150915060008061114d8984611882565b909250905061117961116260208b018b612cec565b8383611173368d90038d018d613221565b8b611d16565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906111c7908d018d612cec565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6112006117d9565b6040517fca5eb5e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190602401600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b5050505050565b3330146112dd576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6b87878787878787610b5c565b6112f46117d9565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d33565b61136f6117d9565b73ffffffffffffffffffffffffffffffffffffffff81166113bf576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b6113c881611ac7565b50565b60006020820180359060019083906113e39086612cec565b63ffffffff1681526020810191909152604001600020541492915050565b61140e8383836001611e2e565b505050565b60008061141f85611f76565b915081905083811015611468576040517f71c4efed0000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610ae2565b935093915050565b63ffffffff81166000908152600160205260408120548061099d576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610ae2565b60006114d76114d48787611fad565b90565b90506000611503826114f16114ec8a8a611fc5565b611fe8565b6114fe60208d018d612cec565b61201e565b905060288611156115f057600061154061152360608c0160408d01613253565b61153060208d018d612cec565b8461153b8c8c612032565b61207d565b6040517f7cb5901200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690637cb59012906115bc9086908d906000908790600401613270565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff8216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61163660208d018d612cec565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117285781811015611719576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610ae2565b61172884848484036000611e2e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661177e576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff82166117ce576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b61140e8383836120af565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d50576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ae2565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b91015b60405180910390a15050565b60608060006118df85602001356118988661225a565b6118a560a0890189613029565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061228692505050565b90935090506000816118f25760016118f5565b60025b90506119156119076020880188612cec565b826107d860808a018a613029565b60045490935073ffffffffffffffffffffffffffffffffffffffff16156119d057600480546040517f043a78eb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169163043a78eb9161198d9188918891016132af565b602060405180830381865afa1580156119aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ce91906132d4565b505b50509250929050565b60408051808201909152600080825260208201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001611a4989611470565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611a7e9291906132f1565b6040805180830381865afa158015611a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abe91906133c5565b95945050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81811015611c6357611b81838383818110611b5c57611b5c612fbc565b9050602002810190611b6e91906133e1565b611b7c906040810190613029565b611c95565b828282818110611b9357611b93612fbc565b9050602002810190611ba591906133e1565b611bb3906040810190613029565b60036000868686818110611bc957611bc9612fbc565b9050602002810190611bdb91906133e1565b611be9906020810190612cec565b63ffffffff1663ffffffff1681526020019081526020016000206000868686818110611c1757611c17612fbc565b9050602002810190611c2991906133e1565b611c3a906040810190602001613415565b61ffff168152602081019190915260400160002091611c5a919083613480565b50600101611b3f565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674828260405161187692919061359a565b6000611ca46002828486612f0d565b611cad916136d8565b60f01c90506003811461140e5782826040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401610ae2929190612fa8565b600080611cfe858585611413565b9092509050611d0d8683612318565b94509492505050565b611d1e612799565b6000611d2d8460000151612374565b602085015190915015611d4757611d4784602001516123b5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff168152602001611da48c611470565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611de09291906132f1565b60806040518083038185885af1158015611dfe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e239190613720565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416611e7e576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff8316611ece576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526006602090815260408083209387168352929052208290558015611728578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f6891815260200190565b60405180910390a350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000611fa381846137b7565b61099d91906137f2565b6000611fbc6020828486612f0d565b610b9391613809565b6000611fd5602860208486612f0d565b611fde91613845565b60c01c9392505050565b600061099d7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff84166137f2565b600061202a84846124d7565b509092915050565b60606120418260288186612f0d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001612096949392919061388b565b6040516020818303038152906040529050949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166120e75780600760008282546120dc9190613909565b909155506121999050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020548181101561216d576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610ae2565b73ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff82166121c2576007805482900390556121ee565b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161224d91815260200190565b60405180910390a3505050565b600061099d7f0000000000000000000000000000000000000000000000000000000000000000836137b7565b80516060901515806122e75784846040516020016122d392919091825260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602082015260280190565b60405160208183030381529060405261230e565b848433856040516020016122fe949392919061391c565b6040516020818303038152906040525b9150935093915050565b73ffffffffffffffffffffffffffffffffffffffff8216612368576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b610bac826000836120af565b60008134146123b1576040517f9f704120000000000000000000000000000000000000000000000000000000008152346004820152602401610ae2565b5090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124469190613975565b905073ffffffffffffffffffffffffffffffffffffffff8116612495576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bac73ffffffffffffffffffffffffffffffffffffffff8216337f000000000000000000000000000000000000000000000000000000000000000085612533565b73ffffffffffffffffffffffffffffffffffffffff8216612527576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b610bac600083836120af565b6040805173ffffffffffffffffffffffffffffffffffffffff8581166024830152848116604483015260648083018590528351808403909101815260849092019092526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611728918691906000906125d490841683612648565b905080516000141580156125f95750808060200190518101906125f791906132d4565b155b1561140e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610ae2565b6060610b9383836000846000808573ffffffffffffffffffffffffffffffffffffffff16848660405161267b9190613992565b60006040518083038185875af1925050503d80600081146126b8576040519150601f19603f3d011682016040523d82523d6000602084013e6126bd565b606091505b5091509150610c0d8683836060826126dd576126d882612757565b610b93565b8151158015612701575073ffffffffffffffffffffffffffffffffffffffff84163b155b15612750576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610ae2565b5080610b93565b8051156127675780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806060016040528060008019168152602001600067ffffffffffffffff1681526020016127dc604051806040016040528060008152602001600081525090565b905290565b60005b838110156127fc5781810151838201526020016127e4565b50506000910152565b6000815180845261281d8160208601602086016127e1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610b936020830184612805565b73ffffffffffffffffffffffffffffffffffffffff811681146113c857600080fd5b6000806040838503121561289757600080fd5b82356128a281612862565b946020939093013593505050565b600060e082840312156128c257600080fd5b50919050565b6000602082840312156128da57600080fd5b813567ffffffffffffffff8111156128f157600080fd5b610d6c848285016128b0565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b83811015612996578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4001855281518051885283015183880187905261298387890182612805565b9750509382019390820190600101612939565b50508751606088015250505060208501516080850152509050610d6c565b6000606082840312156128c257600080fd5b60008083601f8401126129d857600080fd5b50813567ffffffffffffffff8111156129f057600080fd5b602083019150836020828501011115612a0857600080fd5b9250929050565b600080600080600080600060e0888a031215612a2a57600080fd5b612a3489896129b4565b965060608801359550608088013567ffffffffffffffff80821115612a5857600080fd5b612a648b838c016129c6565b909750955060a08a01359150612a7982612862565b90935060c08901359080821115612a8f57600080fd5b50612a9c8a828b016129c6565b989b979a50959850939692959293505050565b600080600060608486031215612ac457600080fd5b8335612acf81612862565b92506020840135612adf81612862565b929592945050506040919091013590565b803563ffffffff81168114612b0457600080fd5b919050565b60008060408385031215612b1c57600080fd5b6128a283612af0565b80151581146113c857600080fd5b60008060408385031215612b4657600080fd5b823567ffffffffffffffff811115612b5d57600080fd5b612b69858286016128b0565b9250506020830135612b7a81612b25565b809150509250929050565b81518152602080830151908201526040810161099d565b803561ffff81168114612b0457600080fd5b60008060408385031215612bc157600080fd5b612bca83612af0565b9150612bd860208401612b9c565b90509250929050565b600060208284031215612bf357600080fd5b8135610b9381612862565b60008060008060a08587031215612c1457600080fd5b612c1e86866129b4565b9350606085013567ffffffffffffffff811115612c3a57600080fd5b612c46878288016129c6565b9094509250506080850135612c5a81612862565b939692955090935050565b60008083601f840112612c7757600080fd5b50813567ffffffffffffffff811115612c8f57600080fd5b6020830191508360208260051b8501011115612a0857600080fd5b60008060208385031215612cbd57600080fd5b823567ffffffffffffffff811115612cd457600080fd5b612ce085828601612c65565b90969095509350505050565b600060208284031215612cfe57600080fd5b610b9382612af0565b60008060008060608587031215612d1d57600080fd5b612d2685612af0565b9350612d3460208601612b9c565b9250604085013567ffffffffffffffff811115612d5057600080fd5b612d5c878288016129c6565b95989497509550505050565b60008060008385036080811215612d7e57600080fd5b843567ffffffffffffffff811115612d9557600080fd5b612da1878288016128b0565b94505060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082011215612dd457600080fd5b506020840191506060840135612de981612862565b809150509250925092565b600060c0820190508351825267ffffffffffffffff60208501511660208301526040840151612e30604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b93565b60008060408385031215612e5a57600080fd5b8235612e6581612862565b91506020830135612b7a81612862565b600060608284031215612e8757600080fd5b610b9383836129b4565b600181811c90821680612ea557607f821691505b6020821081036128c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008085851115612f1d57600080fd5b83861115612f2a57600080fd5b5050820193919092039150565b60008451612f498184602089016127e1565b8201838582376000930192835250909392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000610d6c602083018486612f5f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261301f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261305e57600080fd5b83018035915067ffffffffffffffff82111561307957600080fd5b602001915036819003821315612a0857600080fd5b67ffffffffffffffff811681146113c857600080fd5b63ffffffff6130b289612af0565b16815260208801356020820152600060408901356130cf8161308e565b67ffffffffffffffff811660408401525087606083015260e060808301526130fb60e083018789612f5f565b73ffffffffffffffffffffffffffffffffffffffff861660a084015282810360c084015261312a818587612f5f565b9a9950505050505050505050565b6040805190810167ffffffffffffffff8111828210171561315b5761315b612ede565b60405290565b60006020828403121561317357600080fd5b815167ffffffffffffffff8082111561318b57600080fd5b818401915084601f83011261319f57600080fd5b8151818111156131b1576131b1612ede565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156131f7576131f7612ede565b8160405282815287602084870101111561321057600080fd5b611e238360208301602088016127e1565b60006040828403121561323357600080fd5b61323b613138565b82358152602083013560208201528091505092915050565b60006020828403121561326557600080fd5b8135610b938161308e565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015261ffff83166040820152608060608201526000610c0d6080830184612805565b6040815260006132c26040830185612805565b8281036020840152611abe8185612805565b6000602082840312156132e657600080fd5b8151610b9381612b25565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a0608084015261332760e0840182612805565b905060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160a08501526133628282612805565b60809690960151151560c085015250505073ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b6000604082840312156133a757600080fd5b6133af613138565b9050815181526020820151602082015292915050565b6000604082840312156133d757600080fd5b610b938383613395565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261301f57600080fd5b60006020828403121561342757600080fd5b610b9382612b9c565b601f82111561140e576000816000526020600020601f850160051c810160208610156134595750805b601f850160051c820191505b8181101561347857828155600101613465565b505050505050565b67ffffffffffffffff83111561349857613498612ede565b6134ac836134a68354612e91565b83613430565b6000601f8411600181146134fe57600085156134c85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561129d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561354d578685013582556020948501946001909201910161352d565b5086821015613588577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082528181018390526000906040808401600586901b8501820187855b888110156136ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18b360301811261361a57600080fd5b8a01606063ffffffff61362c83612af0565b16855261ffff61363d898401612b9c565b1688860152868201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261367657600080fd5b90910187810191903567ffffffffffffffff81111561369457600080fd5b8036038313156136a357600080fd5b81888701526136b58287018285612f5f565b968901969550505091860191506001016135b9565b509098975050505050505050565b7fffff00000000000000000000000000000000000000000000000000000000000081358181169160028510156137185780818660020360031b1b83161692505b505092915050565b60006080828403121561373257600080fd5b6040516060810181811067ffffffffffffffff8211171561375557613755612ede565b60405282518152602083015161376a8161308e565b602082015261377c8460408501613395565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826137ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761099d5761099d613788565b8035602083101561099d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fffffffffffffffff00000000000000000000000000000000000000000000000081358181169160088510156137185760089490940360031b84901b1690921692915050565b7fffffffffffffffff0000000000000000000000000000000000000000000000008560c01b1681527fffffffff000000000000000000000000000000000000000000000000000000008460e01b16600882015282600c820152600082516138f981602c8501602087016127e1565b91909101602c0195945050505050565b8082018082111561099d5761099d613788565b8481527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b166020820152826028820152600082516139658160488501602087016127e1565b9190910160480195945050505050565b60006020828403121561398757600080fd5b8151610b9381612862565b6000825161301f8184602087016127e156fea264697066735822122049625b8c96c485b696da90337192ca1c2ed96358165f15d54e96d693ecd9c16864736f6c63430008160033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000b505939a59a353934ec6f0b060480e177394e15500000000000000000000000000000000000000000000000000000000000000094c617965725a65726f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a524f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102d15760003560e01c80637d25a05e11610179578063bb0b6a53116100d6578063d045a0dc1161008a578063f2fde38b11610064578063f2fde38b146108b7578063fc0c546a14610515578063ff7bd03d146108d757600080fd5b8063d045a0dc14610831578063d424388514610844578063dd62ed3e1461086457600080fd5b8063bd815db0116100bb578063bd815db0146107dd578063c7c7f5b3146107f0578063ca5eb5e11461081157600080fd5b8063bb0b6a5314610790578063bc70b354146107bd57600080fd5b8063963efcaa1161012d578063a9059cbb11610112578063a9059cbb14610723578063b731ea0a14610743578063b98bd0701461077057600080fd5b8063963efcaa146106db5780639f68b9641461070f57600080fd5b8063857749b01161015e578063857749b0146106875780638da5cb5b1461069b57806395d89b41146106c657600080fd5b80637d25a05e1461062b57806382413eac1461066757600080fd5b806323b872dd116102325780635535d461116101e65780636fc1b31e116101c05780636fc1b31e146105b357806370a08231146105d3578063715018a61461061657600080fd5b80635535d461146105285780635a0dfe4d146105485780635e280f111461057f57600080fd5b80633400288b116102175780633400288b146104c85780633b6f743b146104e857806352ae28791461051557600080fd5b806323b872dd14610486578063313ce567146104a657600080fd5b8063134d4f251161028957806317442b701161026e57806317442b701461043057806318160ddd146104525780631f5e13341461047157600080fd5b8063134d4f25146103c7578063156a0d0f146103ef57600080fd5b80630d35b415116102ba5780630d35b41514610331578063111ecdad1461036057806313137d65146103b257600080fd5b806306fdde03146102d6578063095ea7b314610301575b600080fd5b3480156102e257600080fd5b506102eb6108f7565b6040516102f8919061284f565b60405180910390f35b34801561030d57600080fd5b5061032161031c366004612884565b610989565b60405190151581526020016102f8565b34801561033d57600080fd5b5061035161034c3660046128c8565b6109a3565b6040516102f8939291906128fd565b34801561036c57600080fd5b5060045461038d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6103c56103c0366004612a0f565b610a75565b005b3480156103d357600080fd5b506103dc600281565b60405161ffff90911681526020016102f8565b3480156103fb57600080fd5b50604080517f02e49c2c00000000000000000000000000000000000000000000000000000000815260016020820152016102f8565b34801561043c57600080fd5b50604080516001815260026020820152016102f8565b34801561045e57600080fd5b506007545b6040519081526020016102f8565b34801561047d57600080fd5b506103dc600181565b34801561049257600080fd5b506103216104a1366004612aaf565b610b74565b3480156104b257600080fd5b5060125b60405160ff90911681526020016102f8565b3480156104d457600080fd5b506103c56104e3366004612b09565b610b9a565b3480156104f457600080fd5b50610508610503366004612b33565b610bb0565b6040516102f89190612b85565b34801561052157600080fd5b503061038d565b34801561053457600080fd5b506102eb610543366004612bae565b610c17565b34801561055457600080fd5b50610321610563366004612b09565b63ffffffff919091166000908152600160205260409020541490565b34801561058b57600080fd5b5061038d7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c81565b3480156105bf57600080fd5b506103c56105ce366004612be1565b610cbc565b3480156105df57600080fd5b506104636105ee366004612be1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b34801561062257600080fd5b506103c5610d3e565b34801561063757600080fd5b5061064e610646366004612b09565b600092915050565b60405167ffffffffffffffff90911681526020016102f8565b34801561067357600080fd5b50610321610682366004612bfe565b610d52565b34801561069357600080fd5b5060066104b6565b3480156106a757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661038d565b3480156106d257600080fd5b506102eb610d74565b3480156106e757600080fd5b506104637f000000000000000000000000000000000000000000000000000000e8d4a5100081565b34801561071b57600080fd5b506000610321565b34801561072f57600080fd5b5061032161073e366004612884565b610d83565b34801561074f57600080fd5b5060025461038d9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561077c57600080fd5b506103c561078b366004612caa565b610d91565b34801561079c57600080fd5b506104636107ab366004612cec565b60016020526000908152604090205481565b3480156107c957600080fd5b506102eb6107d8366004612d07565b610da3565b6103c56107eb366004612caa565b610f2f565b6108036107fe366004612d68565b6110fd565b6040516102f8929190612df4565b34801561081d57600080fd5b506103c561082c366004612be1565b6111f8565b6103c561083f366004612a0f565b6112a4565b34801561085057600080fd5b506103c561085f366004612be1565b6112ec565b34801561087057600080fd5b5061046361087f366004612e47565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205490565b3480156108c357600080fd5b506103c56108d2366004612be1565b611367565b3480156108e357600080fd5b506103216108f2366004612e75565b6113cb565b60606008805461090690612e91565b80601f016020809104026020016040519081016040528092919081815260200182805461093290612e91565b801561097f5780601f106109545761010080835404028352916020019161097f565b820191906000526020600020905b81548152906001019060200180831161096257829003601f168201915b5050505050905090565b600033610997818585611401565b60019150505b92915050565b604080518082019091526000808252602082015260606109d6604051806040016040528060008152602001600081525090565b604080518082018252600080825267ffffffffffffffff602080840182905284518381529081019094529195509182610a32565b604080518082019091526000815260606020820152815260200190600190039081610a0a5790505b509350600080610a57604089013560608a0135610a5260208c018c612cec565b611413565b60408051808201909152918252602082015296989597505050505050565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff163314610aeb576040517f91ac5e4f0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b60208701803590610b0590610b00908a612cec565b611470565b14610b5c57610b176020880188612cec565b6040517fc26bebcc00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260208801356024820152604401610ae2565b610b6b878787878787876114c5565b50505050505050565b600033610b8285828561165f565b610b8d85858561172e565b60019150505b9392505050565b610ba26117d9565b610bac828261182c565b5050565b60408051808201909152600080825260208201526000610be060408501356060860135610a526020880188612cec565b915050600080610bf08684611882565b9092509050610c0d610c056020880188612cec565b8383886119d9565b9695505050505050565b600360209081526000928352604080842090915290825290208054610c3b90612e91565b80601f0160208091040260200160405190810160405280929190818152602001828054610c6790612e91565b8015610cb45780601f10610c8957610100808354040283529160200191610cb4565b820191906000526020600020905b815481529060010190602001808311610c9757829003601f168201915b505050505081565b610cc46117d9565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906020015b60405180910390a150565b610d466117d9565b610d506000611ac7565b565b73ffffffffffffffffffffffffffffffffffffffff811630145b949350505050565b60606009805461090690612e91565b60003361099781858561172e565b610d996117d9565b610bac8282611b3c565b63ffffffff8416600090815260036020908152604080832061ffff87168452909152812080546060929190610dd790612e91565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0390612e91565b8015610e505780601f10610e2557610100808354040283529160200191610e50565b820191906000526020600020905b815481529060010190602001808311610e3357829003601f168201915b505050505090508051600003610ea05783838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929450610d6c9350505050565b6000839003610eb0579050610d6c565b60028310610ef957610ec28484611c95565b80610ed08460028188612f0d565b604051602001610ee293929190612f37565b604051602081830303815290604052915050610d6c565b83836040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401610ae2929190612fa8565b60005b818110156110385736838383818110610f4d57610f4d612fbc565b9050602002810190610f5f9190612feb565b9050610f92610f716020830183612cec565b602083013563ffffffff919091166000908152600160205260409020541490565b610f9c5750611030565b3063d045a0dc60c08301358360a0810135610fbb610100830183613029565b610fcc610100890160e08a01612be1565b610fda6101208a018a613029565b6040518963ffffffff1660e01b8152600401610ffc97969594939291906130a4565b6000604051808303818588803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b5050505050505b600101610f32565b503373ffffffffffffffffffffffffffffffffffffffff16638e9e70996040518163ffffffff1660e01b8152600401600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526110ca9190810190613161565b6040517f8351eea7000000000000000000000000000000000000000000000000000000008152600401610ae2919061284f565b611105612799565b604080518082019091526000808252602082015260008061113c33604089013560608a013561113760208c018c612cec565b611cf0565b9150915060008061114d8984611882565b909250905061117961116260208b018b612cec565b8383611173368d90038d018d613221565b8b611d16565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906111c7908d018d612cec565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b6112006117d9565b6040517fca5eb5e100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c169063ca5eb5e190602401600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b5050505050565b3330146112dd576040517f14d4a4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6b87878787878787610b5c565b6112f46117d9565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c242776090602001610d33565b61136f6117d9565b73ffffffffffffffffffffffffffffffffffffffff81166113bf576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b6113c881611ac7565b50565b60006020820180359060019083906113e39086612cec565b63ffffffff1681526020810191909152604001600020541492915050565b61140e8383836001611e2e565b505050565b60008061141f85611f76565b915081905083811015611468576040517f71c4efed0000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610ae2565b935093915050565b63ffffffff81166000908152600160205260408120548061099d576040517ff6ff4fb700000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610ae2565b60006114d76114d48787611fad565b90565b90506000611503826114f16114ec8a8a611fc5565b611fe8565b6114fe60208d018d612cec565b61201e565b905060288611156115f057600061154061152360608c0160408d01613253565b61153060208d018d612cec565b8461153b8c8c612032565b61207d565b6040517f7cb5901200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c1690637cb59012906115bc9086908d906000908790600401613270565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff8216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c61163660208d018d612cec565b6040805163ffffffff9092168252602082018690520160405180910390a3505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600660209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117285781811015611719576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024810182905260448101839052606401610ae2565b61172884848484036000611e2e565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661177e576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff82166117ce576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b61140e8383836120af565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d50576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ae2565b63ffffffff8216600081815260016020908152604091829020849055815192835282018390527f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b91015b60405180910390a15050565b60608060006118df85602001356118988661225a565b6118a560a0890189613029565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061228692505050565b90935090506000816118f25760016118f5565b60025b90506119156119076020880188612cec565b826107d860808a018a613029565b60045490935073ffffffffffffffffffffffffffffffffffffffff16156119d057600480546040517f043a78eb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169163043a78eb9161198d9188918891016132af565b602060405180830381865afa1580156119aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ce91906132d4565b505b50509250929050565b60408051808201909152600080825260208201527f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001611a4989611470565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611a7e9291906132f1565b6040805180830381865afa158015611a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abe91906133c5565b95945050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005b81811015611c6357611b81838383818110611b5c57611b5c612fbc565b9050602002810190611b6e91906133e1565b611b7c906040810190613029565b611c95565b828282818110611b9357611b93612fbc565b9050602002810190611ba591906133e1565b611bb3906040810190613029565b60036000868686818110611bc957611bc9612fbc565b9050602002810190611bdb91906133e1565b611be9906020810190612cec565b63ffffffff1663ffffffff1681526020019081526020016000206000868686818110611c1757611c17612fbc565b9050602002810190611c2991906133e1565b611c3a906040810190602001613415565b61ffff168152602081019190915260400160002091611c5a919083613480565b50600101611b3f565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674828260405161187692919061359a565b6000611ca46002828486612f0d565b611cad916136d8565b60f01c90506003811461140e5782826040517f9a6d49cd000000000000000000000000000000000000000000000000000000008152600401610ae2929190612fa8565b600080611cfe858585611413565b9092509050611d0d8683612318565b94509492505050565b611d1e612799565b6000611d2d8460000151612374565b602085015190915015611d4757611d4784602001516123b5565b7f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff168152602001611da48c611470565b81526020018a815260200189815260200160008960200151111515815250866040518463ffffffff1660e01b8152600401611de09291906132f1565b60806040518083038185885af1158015611dfe573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e239190613720565b979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416611e7e576040517fe602df0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff8316611ece576040517f94280d6200000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526006602090815260408083209387168352929052208290558015611728578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611f6891815260200190565b60405180910390a350505050565b60007f000000000000000000000000000000000000000000000000000000e8d4a51000611fa381846137b7565b61099d91906137f2565b6000611fbc6020828486612f0d565b610b9391613809565b6000611fd5602860208486612f0d565b611fde91613845565b60c01c9392505050565b600061099d7f000000000000000000000000000000000000000000000000000000e8d4a5100067ffffffffffffffff84166137f2565b600061202a84846124d7565b509092915050565b60606120418260288186612f0d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929695505050505050565b606084848484604051602001612096949392919061388b565b6040516020818303038152906040529050949350505050565b73ffffffffffffffffffffffffffffffffffffffff83166120e75780600760008282546120dc9190613909565b909155506121999050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020548181101561216d576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024810182905260448101839052606401610ae2565b73ffffffffffffffffffffffffffffffffffffffff841660009081526005602052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff82166121c2576007805482900390556121ee565b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161224d91815260200190565b60405180910390a3505050565b600061099d7f000000000000000000000000000000000000000000000000000000e8d4a51000836137b7565b80516060901515806122e75784846040516020016122d392919091825260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016602082015260280190565b60405160208183030381529060405261230e565b848433856040516020016122fe949392919061391c565b6040516020818303038152906040525b9150935093915050565b73ffffffffffffffffffffffffffffffffffffffff8216612368576040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b610bac826000836120af565b60008134146123b1576040517f9f704120000000000000000000000000000000000000000000000000000000008152346004820152602401610ae2565b5090565b60007f0000000000000000000000001a44076050125825900e736c501f859c50fe728c73ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa158015612422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124469190613975565b905073ffffffffffffffffffffffffffffffffffffffff8116612495576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bac73ffffffffffffffffffffffffffffffffffffffff8216337f0000000000000000000000001a44076050125825900e736c501f859c50fe728c85612533565b73ffffffffffffffffffffffffffffffffffffffff8216612527576040517fec442f0500000000000000000000000000000000000000000000000000000000815260006004820152602401610ae2565b610bac600083836120af565b6040805173ffffffffffffffffffffffffffffffffffffffff8581166024830152848116604483015260648083018590528351808403909101815260849092019092526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611728918691906000906125d490841683612648565b905080516000141580156125f95750808060200190518101906125f791906132d4565b155b1561140e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610ae2565b6060610b9383836000846000808573ffffffffffffffffffffffffffffffffffffffff16848660405161267b9190613992565b60006040518083038185875af1925050503d80600081146126b8576040519150601f19603f3d011682016040523d82523d6000602084013e6126bd565b606091505b5091509150610c0d8683836060826126dd576126d882612757565b610b93565b8151158015612701575073ffffffffffffffffffffffffffffffffffffffff84163b155b15612750576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610ae2565b5080610b93565b8051156127675780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051806060016040528060008019168152602001600067ffffffffffffffff1681526020016127dc604051806040016040528060008152602001600081525090565b905290565b60005b838110156127fc5781810151838201526020016127e4565b50506000910152565b6000815180845261281d8160208601602086016127e1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610b936020830184612805565b73ffffffffffffffffffffffffffffffffffffffff811681146113c857600080fd5b6000806040838503121561289757600080fd5b82356128a281612862565b946020939093013593505050565b600060e082840312156128c257600080fd5b50919050565b6000602082840312156128da57600080fd5b813567ffffffffffffffff8111156128f157600080fd5b610d6c848285016128b0565b8351815260208085015190820152600060a08201604060a0604085015281865180845260c08601915060c08160051b8701019350602080890160005b83811015612996578887037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4001855281518051885283015183880187905261298387890182612805565b9750509382019390820190600101612939565b50508751606088015250505060208501516080850152509050610d6c565b6000606082840312156128c257600080fd5b60008083601f8401126129d857600080fd5b50813567ffffffffffffffff8111156129f057600080fd5b602083019150836020828501011115612a0857600080fd5b9250929050565b600080600080600080600060e0888a031215612a2a57600080fd5b612a3489896129b4565b965060608801359550608088013567ffffffffffffffff80821115612a5857600080fd5b612a648b838c016129c6565b909750955060a08a01359150612a7982612862565b90935060c08901359080821115612a8f57600080fd5b50612a9c8a828b016129c6565b989b979a50959850939692959293505050565b600080600060608486031215612ac457600080fd5b8335612acf81612862565b92506020840135612adf81612862565b929592945050506040919091013590565b803563ffffffff81168114612b0457600080fd5b919050565b60008060408385031215612b1c57600080fd5b6128a283612af0565b80151581146113c857600080fd5b60008060408385031215612b4657600080fd5b823567ffffffffffffffff811115612b5d57600080fd5b612b69858286016128b0565b9250506020830135612b7a81612b25565b809150509250929050565b81518152602080830151908201526040810161099d565b803561ffff81168114612b0457600080fd5b60008060408385031215612bc157600080fd5b612bca83612af0565b9150612bd860208401612b9c565b90509250929050565b600060208284031215612bf357600080fd5b8135610b9381612862565b60008060008060a08587031215612c1457600080fd5b612c1e86866129b4565b9350606085013567ffffffffffffffff811115612c3a57600080fd5b612c46878288016129c6565b9094509250506080850135612c5a81612862565b939692955090935050565b60008083601f840112612c7757600080fd5b50813567ffffffffffffffff811115612c8f57600080fd5b6020830191508360208260051b8501011115612a0857600080fd5b60008060208385031215612cbd57600080fd5b823567ffffffffffffffff811115612cd457600080fd5b612ce085828601612c65565b90969095509350505050565b600060208284031215612cfe57600080fd5b610b9382612af0565b60008060008060608587031215612d1d57600080fd5b612d2685612af0565b9350612d3460208601612b9c565b9250604085013567ffffffffffffffff811115612d5057600080fd5b612d5c878288016129c6565b95989497509550505050565b60008060008385036080811215612d7e57600080fd5b843567ffffffffffffffff811115612d9557600080fd5b612da1878288016128b0565b94505060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082011215612dd457600080fd5b506020840191506060840135612de981612862565b809150509250925092565b600060c0820190508351825267ffffffffffffffff60208501511660208301526040840151612e30604084018280518252602090810151910152565b5082516080830152602083015160a0830152610b93565b60008060408385031215612e5a57600080fd5b8235612e6581612862565b91506020830135612b7a81612862565b600060608284031215612e8757600080fd5b610b9383836129b4565b600181811c90821680612ea557607f821691505b6020821081036128c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008085851115612f1d57600080fd5b83861115612f2a57600080fd5b5050820193919092039150565b60008451612f498184602089016127e1565b8201838582376000930192835250909392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000610d6c602083018486612f5f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261301f57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261305e57600080fd5b83018035915067ffffffffffffffff82111561307957600080fd5b602001915036819003821315612a0857600080fd5b67ffffffffffffffff811681146113c857600080fd5b63ffffffff6130b289612af0565b16815260208801356020820152600060408901356130cf8161308e565b67ffffffffffffffff811660408401525087606083015260e060808301526130fb60e083018789612f5f565b73ffffffffffffffffffffffffffffffffffffffff861660a084015282810360c084015261312a818587612f5f565b9a9950505050505050505050565b6040805190810167ffffffffffffffff8111828210171561315b5761315b612ede565b60405290565b60006020828403121561317357600080fd5b815167ffffffffffffffff8082111561318b57600080fd5b818401915084601f83011261319f57600080fd5b8151818111156131b1576131b1612ede565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156131f7576131f7612ede565b8160405282815287602084870101111561321057600080fd5b611e238360208301602088016127e1565b60006040828403121561323357600080fd5b61323b613138565b82358152602083013560208201528091505092915050565b60006020828403121561326557600080fd5b8135610b938161308e565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015261ffff83166040820152608060608201526000610c0d6080830184612805565b6040815260006132c26040830185612805565b8281036020840152611abe8185612805565b6000602082840312156132e657600080fd5b8151610b9381612b25565b6040815263ffffffff8351166040820152602083015160608201526000604084015160a0608084015261332760e0840182612805565b905060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160a08501526133628282612805565b60809690960151151560c085015250505073ffffffffffffffffffffffffffffffffffffffff9190911660209091015290565b6000604082840312156133a757600080fd5b6133af613138565b9050815181526020820151602082015292915050565b6000604082840312156133d757600080fd5b610b938383613395565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261301f57600080fd5b60006020828403121561342757600080fd5b610b9382612b9c565b601f82111561140e576000816000526020600020601f850160051c810160208610156134595750805b601f850160051c820191505b8181101561347857828155600101613465565b505050505050565b67ffffffffffffffff83111561349857613498612ede565b6134ac836134a68354612e91565b83613430565b6000601f8411600181146134fe57600085156134c85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561129d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561354d578685013582556020948501946001909201910161352d565b5086821015613588577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082528181018390526000906040808401600586901b8501820187855b888110156136ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18b360301811261361a57600080fd5b8a01606063ffffffff61362c83612af0565b16855261ffff61363d898401612b9c565b1688860152868201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe183360301811261367657600080fd5b90910187810191903567ffffffffffffffff81111561369457600080fd5b8036038313156136a357600080fd5b81888701526136b58287018285612f5f565b968901969550505091860191506001016135b9565b509098975050505050505050565b7fffff00000000000000000000000000000000000000000000000000000000000081358181169160028510156137185780818660020360031b1b83161692505b505092915050565b60006080828403121561373257600080fd5b6040516060810181811067ffffffffffffffff8211171561375557613755612ede565b60405282518152602083015161376a8161308e565b602082015261377c8460408501613395565b60408201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826137ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761099d5761099d613788565b8035602083101561099d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7fffffffffffffffff00000000000000000000000000000000000000000000000081358181169160088510156137185760089490940360031b84901b1690921692915050565b7fffffffffffffffff0000000000000000000000000000000000000000000000008560c01b1681527fffffffff000000000000000000000000000000000000000000000000000000008460e01b16600882015282600c820152600082516138f981602c8501602087016127e1565b91909101602c0195945050505050565b8082018082111561099d5761099d613788565b8481527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b166020820152826028820152600082516139658160488501602087016127e1565b9190910160480195945050505050565b60006020828403121561398757600080fd5b8151610b9381612862565b6000825161301f8184602087016127e156fea264697066735822122049625b8c96c485b696da90337192ca1c2ed96358165f15d54e96d693ecd9c16864736f6c63430008160033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000001a44076050125825900e736c501f859c50fe728c000000000000000000000000b505939a59a353934ec6f0b060480e177394e15500000000000000000000000000000000000000000000000000000000000000094c617965725a65726f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a524f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): LayerZero
Arg [1] : _symbol (string): ZRO
Arg [2] : _lzEndpoint (address): 0x1a44076050125825900e736c501f859c50fE728c
Arg [3] : _delegate (address): 0xb505939A59A353934Ec6F0b060480e177394E155

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000001a44076050125825900e736c501f859c50fe728c
Arg [3] : 000000000000000000000000b505939a59a353934ec6f0b060480e177394e155
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4c617965725a65726f0000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5a524f0000000000000000000000000000000000000000000000000000000000


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.