ETH Price: $2,788.46 (+3.88%)

Contract

0xdFfc4E6E471eB0d1CDDEc9B6CF957EaB05D35cc5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
Age
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
Age
From
To
218448682025-02-14 13:02:238 days ago1739538143
0xdFfc4E6E...B05D35cc5
0 ETH
218433992025-02-14 8:05:478 days ago1739520347
0xdFfc4E6E...B05D35cc5
0 ETH
205873912024-08-22 23:20:35184 days ago1724368835
0xdFfc4E6E...B05D35cc5
0 ETH
199707112024-05-28 20:19:59270 days ago1716927599
0xdFfc4E6E...B05D35cc5
0 ETH
198339142024-05-09 17:15:23289 days ago1715274923
0xdFfc4E6E...B05D35cc5
0 ETH
194967032024-03-23 10:27:59336 days ago1711189679
0xdFfc4E6E...B05D35cc5
0 ETH
189075892023-12-31 19:37:35419 days ago1704051455
0xdFfc4E6E...B05D35cc5
0 ETH
189075892023-12-31 19:37:35419 days ago1704051455
0xdFfc4E6E...B05D35cc5
0 ETH
189075732023-12-31 19:34:11419 days ago1704051251
0xdFfc4E6E...B05D35cc5
0 ETH
180418062023-09-01 12:49:11540 days ago1693572551
0xdFfc4E6E...B05D35cc5
0 ETH
176180522023-07-04 4:01:23600 days ago1688443283
0xdFfc4E6E...B05D35cc5
0 ETH
170626382023-04-16 23:20:11678 days ago1681687211
0xdFfc4E6E...B05D35cc5
0 ETH
170436462023-04-14 6:25:23680 days ago1681453523
0xdFfc4E6E...B05D35cc5
0 ETH
167709172023-03-06 17:52:35719 days ago1678125155
0xdFfc4E6E...B05D35cc5
0 ETH
166570482023-02-18 17:38:11735 days ago1676741891
0xdFfc4E6E...B05D35cc5
0 ETH
166477482023-02-17 10:08:59736 days ago1676628539
0xdFfc4E6E...B05D35cc5
0 ETH
166467912023-02-17 6:55:47736 days ago1676616947
0xdFfc4E6E...B05D35cc5
0 ETH
166467912023-02-17 6:55:47736 days ago1676616947
0xdFfc4E6E...B05D35cc5
0 ETH
166467912023-02-17 6:55:47736 days ago1676616947
0xdFfc4E6E...B05D35cc5
0 ETH
166381842023-02-16 2:02:23738 days ago1676512943
0xdFfc4E6E...B05D35cc5
0 ETH
166349242023-02-15 15:05:59738 days ago1676473559
0xdFfc4E6E...B05D35cc5
0 ETH
166317822023-02-15 4:32:59739 days ago1676435579
0xdFfc4E6E...B05D35cc5
0 ETH
166172022023-02-13 3:38:35741 days ago1676259515
0xdFfc4E6E...B05D35cc5
0 ETH
166172022023-02-13 3:38:35741 days ago1676259515
0xdFfc4E6E...B05D35cc5
0 ETH
165929682023-02-09 18:25:11744 days ago1675967111
0xdFfc4E6E...B05D35cc5
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SHNJidai

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 37 : SHNJidai.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.4;
import "@chocolate-factory/contracts/token/ERC721/presets/TwoStage.sol";
contract SHNJidai is TwoStage {
function initialize(
bytes32 whitelistMerkleTreeRoot_,
address royaltiesRecipient_,
uint256 royaltiesValue_,
address[] memory shareholders,
uint256[] memory shares
) public initializerERC721A initializer {
__ERC721A_init("SHOUNEN", "SHN");
__Ownable_init();
__AdminManager_init_unchained();
__Supply_init_unchained(5555);
__AdminMint_init_unchained();
__Whitelist_init_unchained();
__BalanceLimit_init_unchained();
__UriManager_init_unchained(
"https://ipfs.io/ipfs/QmSqBvu4AMtxMg5TYrzxHdqVXJD2dsGq6bkLJJJS7sTxvR/",
".json"
);
__CustomPaymentSplitter_init(shareholders, shares);
__Royalties_init_unchained(royaltiesRecipient_, royaltiesValue_);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 37 : AdminManager.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.4;
contract AdminManager {
mapping(address => bool) internal _admins;
constructor() {
_admins[msg.sender] = true;
_admins[address(this)] = true;
}
function setAdminPermissions(address account_, bool enable_)
external
onlyAdmin
{
_admins[account_] = enable_;
}
function isAdmin(address account_) public view returns (bool) {
return _admins[account_];
}
modifier onlyAdmin() {
require(isAdmin(msg.sender), "Not an admin");
_;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 37 : AdminManagerUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
contract AdminManagerUpgradable is Initializable {
mapping(address => bool) private _admins;
function __AdminManager_init() internal onlyInitializing {
__AdminManager_init_unchained();
}
function __AdminManager_init_unchained() internal onlyInitializing {
_admins[msg.sender] = true;
}
function setAdminPermissions(address account_, bool enable_)
external
onlyAdmin
{
_admins[account_] = enable_;
}
function isAdmin(address account_) public view returns (bool) {
return _admins[account_];
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 37 : AdminMintUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
abstract contract AdminMintUpgradable is Initializable, AdminManagerUpgradable {
function __AdminMint_init() internal onlyInitializing {
__AdminManager_init_unchained();
__AdminMint_init_unchained();
}
function __AdminMint_init_unchained() internal onlyInitializing {}
function adminMint(
address[] calldata accounts_,
uint256[] calldata amounts_
) external onlyAdmin {
uint256 accountsLength = accounts_.length;
require(accountsLength == amounts_.length, "Admin mint: bad request");
for (uint256 i; i < accountsLength; i++) {
_adminMint(accounts_[i], amounts_[i]);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 37 : BalanceLimit.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.4;
import "../admin-manager/AdminManager.sol";
import "./BalanceLimitStorage.sol";
contract BalanceLimit is AdminManager {
using BalanceLimitStorage for BalanceLimitStorage.Data;
mapping(uint8 => BalanceLimitStorage.Data) internal _balanceLimits;
function _increaseBalance(
uint8 stageId_,
address account_,
uint256 amount_
) internal {
_balanceLimits[stageId_].increaseBalance(account_, amount_);
}
function currentBalance(uint8 stageId_, address account_)
external
view
returns (uint256)
{
return _balanceLimits[stageId_].balances[account_];
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 37 : BalanceLimitStorage.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.4;
library BalanceLimitStorage {
struct Data {
uint256 limit;
mapping(address => uint256) balances;
}
function increaseBalance(
Data storage data_,
address account_,
uint256 amount_
) internal {
require(
data_.balances[account_] + amount_ <= data_.limit,
"Exceeds limit"
);
data_.balances[account_] += amount_;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 37 : BalanceLimitUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
import "./BalanceLimitStorage.sol";
contract BalanceLimitUpgradable is Initializable, AdminManagerUpgradable {
using BalanceLimitStorage for BalanceLimitStorage.Data;
mapping(uint8 => BalanceLimitStorage.Data) internal _balanceLimits;
function __BalanceLimit_init() internal onlyInitializing {
__AdminManager_init_unchained();
__BalanceLimit_init_unchained();
}
function __BalanceLimit_init_unchained() internal onlyInitializing {}
function _increaseBalance(
uint8 stageId_,
address account_,
uint256 amount_
) internal {
_balanceLimits[stageId_].increaseBalance(account_, amount_);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 37 : CustomPaymentSplitterUpgradeable.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.4;
import "@openzeppelin/contracts-upgradeable/finance/PaymentSplitterUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
contract CustomPaymentSplitterUpgradeable is PaymentSplitterUpgradeable {
uint256 public payeesLength;
function __CustomPaymentSplitter_init(
address[] memory shareholders_,
uint256[] memory shares_
) internal onlyInitializing {
__PaymentSplitter_init(shareholders_, shares_);
payeesLength = shareholders_.length;
}
function releaseAll() external {
for (uint256 i; i < payeesLength; ) {
address toPay = payee(i);
release(payable(toPay));
unchecked {
i++;
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 37 : PriceUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
import "../balance-limit/BalanceLimit.sol";
contract PriceUpgradable is Initializable, AdminManagerUpgradable {
mapping(uint8 => uint256) private _price;
function __Price_init() internal onlyInitializing {
__AdminManager_init_unchained();
__Price_init_unchained();
}
function __Price_init_unchained() internal onlyInitializing {}
function setPrice(uint8 stage_, uint256 value_) public onlyAdmin {
_price[stage_] = value_;
}
function price(uint8 stage_) public view returns (uint256) {
return _price[stage_];
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 37 : IERC2981Royalties.sol
1
2
3
4
5
6
7
8
9
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IERC2981Royalties {
function royaltyInfo(uint256 tokenId_, uint256 value_)
external
view
returns (address receiver, uint256 royaltyAmount);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 37 : RoyaltiesUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
import "./IERC2981Royalties.sol";
contract RoyaltiesUpgradable is
Initializable,
ERC165Upgradeable,
IERC2981Royalties,
AdminManagerUpgradable
{
struct RoyaltyInfo {
address recipient;
uint24 amount;
}
RoyaltyInfo private _royalties;
uint256 constant maxValue = 10000;
event RoyaltiesSet(address recipient, uint256 amount);
function __Royalties_init(address recipient_, uint256 amount_)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 37 : SupplyUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
abstract contract SupplyUpgradable is Initializable, AdminManagerUpgradable {
uint256 internal _maxSupply;
function __Supply_init(uint256 maxSupply_) internal onlyInitializing {
__AdminManager_init_unchained();
__Supply_init_unchained(maxSupply_);
}
function __Supply_init_unchained(uint256 maxSupply_)
internal
onlyInitializing
{
_maxSupply = maxSupply_;
}
function setMaxSupply(uint256 maxSupply_) external onlyAdmin {
_maxSupply = maxSupply_;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 37 : TwoStage.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "erc721a-upgradeable/contracts/extensions/ERC721AQueryableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@divergencetech/ethier/contracts/thirdparty/opensea/OpenSeaGasFreeListing.sol";
import "../../../supply/SupplyUpgradable.sol";
import "../../../admin-mint/AdminMintUpgradable.sol";
import "../../../whitelist/WhitelistUpgradable.sol";
import "../../../balance-limit/BalanceLimitUpgradable.sol";
import "../../../uri-manager/UriManagerUpgradable.sol";
import "../../../royalties/RoyaltiesUpgradable.sol";
import "../../../price/PriceUpgradable.sol";
import "../../../payments/CustomPaymentSplitterUpgradeable.sol";
contract TwoStage is
Initializable,
ERC721AQueryableUpgradeable,
OwnableUpgradeable,
SupplyUpgradable,
AdminMintUpgradable,
WhitelistUpgradable,
BalanceLimitUpgradable,
UriManagerUpgradable,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 37 : UriManagerUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
contract UriManagerUpgradable is Initializable, AdminManagerUpgradable {
using StringsUpgradeable for uint256;
string internal _prefix;
string internal _suffix;
function prefix() public view returns (string memory) {
return _prefix;
}
function suffix() public view returns (string memory) {
return _suffix;
}
function __UriManager_init(string memory prefix_, string memory suffix_)
internal
onlyInitializing
{
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 37 : WhitelistStorage.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.4;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
library WhitelistStorage {
struct Data {
bytes32 merkleTreeRoot;
mapping(address => bool) accounts;
}
function isWhitelisted(
Data storage data_,
address account_,
bytes32[] calldata proof_
) internal view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(account_));
return
MerkleProof.verify(proof_, data_.merkleTreeRoot, leaf) || data_.accounts[account_];
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 37 : WhitelistUpgradable.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.4;
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../admin-manager/AdminManagerUpgradable.sol";
import "./WhitelistStorage.sol";
contract WhitelistUpgradable is Initializable, AdminManagerUpgradable {
using WhitelistStorage for WhitelistStorage.Data;
mapping(uint8 => WhitelistStorage.Data) internal _whitelists;
function __Whitelist_init() internal onlyInitializing {
__AdminManager_init_unchained();
__Whitelist_init_unchained();
}
function __Whitelist_init_unchained() internal onlyInitializing {}
function updateMerkleTreeRoot(uint8 stageId_, bytes32 merkleTreeRoot_)
public
onlyAdmin
{
_whitelists[stageId_].merkleTreeRoot = merkleTreeRoot_;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 37 : OpenSeaGasFreeListing.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
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
// Inspired by BaseOpenSea by Simon Fremaux (@dievardump) but without the need
// to pass specific addresses depending on deployment network.
// https://gist.github.com/dievardump/483eb43bc6ed30b14f01e01842e3339b/
import "./ProxyRegistry.sol";
/// @notice Library to achieve gas-free listings on OpenSea.
library OpenSeaGasFreeListing {
/**
@notice Returns whether the operator is an OpenSea proxy for the owner, thus
allowing it to list without the token owner paying gas.
@dev ERC{721,1155}.isApprovedForAll should be overriden to also check if
this function returns true.
*/
function isApprovedForAll(address owner, address operator)
internal
view
returns (bool)
{
address proxy = proxyFor(owner);
return proxy != address(0) && proxy == operator;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 37 : ProxyRegistry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
/// @notice A minimal interface describing OpenSea's Wyvern proxy registry.
contract ProxyRegistry {
mapping(address => OwnableDelegateProxy) public proxies;
}
/**
@dev This pattern of using an empty contract is cargo-culted directly from
OpenSea's example code. TODO: it's likely that the above mapping can be changed
to address => address without affecting anything, but further investigation is
needed (i.e. is there a subtle reason that OpenSea released it like this?).
*/
// solhint-disable-next-line no-empty-blocks
contract OwnableDelegateProxy {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 20 of 37 : PaymentSplitterUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol)
pragma solidity ^0.8.0;
import "../token/ERC20/utils/SafeERC20Upgradeable.sol";
import "../utils/AddressUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @title PaymentSplitter
* @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
* that the Ether will be split in this way, since it is handled transparently by the contract.
*
* The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
* account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
* an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the
* time of contract deployment and can't be updated thereafter.
*
* `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
* accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
* function.
*
* NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
* tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 37 : Initializable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 37 : draft-IERC20PermitUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20PermitUpgradeable {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 24 of 37 : SafeERC20Upgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20Upgradeable.sol";
import "../extensions/draft-IERC20PermitUpgradeable.sol";
import "../../../utils/AddressUpgradeable.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 SafeERC20Upgradeable {
using AddressUpgradeable for address;
function safeTransfer(
IERC20Upgradeable token,
address to,
uint256 value
) internal {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 26 of 37 : ContextUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @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 ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 28 of 37 : IERC165Upgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 37 : StringsUpgradeable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 37 : MerkleProof.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 37 : ERC721A__Initializable.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;
/**
* @dev This is a base contract to aid in writing upgradeable diamond facet contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
import {ERC721A__InitializableStorage} from './ERC721A__InitializableStorage.sol';
abstract contract ERC721A__Initializable {
using ERC721A__InitializableStorage for ERC721A__InitializableStorage.Layout;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializerERC721A() {
// If the contract is initializing we ignore whether _initialized is set in order to support multiple
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 37 : ERC721A__InitializableStorage.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;
/**
* @dev This is a base storage for the initialization function for upgradeable diamond facet contracts
**/
library ERC721A__InitializableStorage {
struct Layout {
/*
* Indicates that the contract has been initialized.
*/
bool _initialized;
/*
* Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.initializable.facet');
function layout() internal pure returns (Layout storage l) {
bytes32 slot = STORAGE_SLOT;
assembly {
l.slot := slot
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 37 : ERC721AStorage.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;
library ERC721AStorage {
// Reference type for token approval.
struct TokenApprovalRef {
address value;
}
struct Layout {
// =============================================================
// STORAGE
// =============================================================
// The next token ID to be minted.
uint256 _currentIndex;
// The number of tokens burned.
uint256 _burnCounter;
// Token name
string _name;
// Token symbol
string _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned.
// See {_packedOwnershipOf} implementation for details.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 37 : ERC721AUpgradeable.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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721AUpgradeable.sol';
import {ERC721AStorage} from './ERC721AStorage.sol';
import './ERC721A__Initializable.sol';
/**
* @dev Interface of ERC721 token receiver.
*/
interface ERC721A__IERC721ReceiverUpgradeable {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC721A
*
* @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 37 : ERC721AQueryableUpgradeable.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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721AQueryableUpgradeable.sol';
import '../ERC721AUpgradeable.sol';
import '../ERC721A__Initializable.sol';
/**
* @title ERC721AQueryable.
*
* @dev ERC721A subclass with convenience query functions.
*/
abstract contract ERC721AQueryableUpgradeable is
ERC721A__Initializable,
ERC721AUpgradeable,
IERC721AQueryableUpgradeable
{
function __ERC721AQueryable_init() internal onlyInitializingERC721A {
__ERC721AQueryable_init_unchained();
}
function __ERC721AQueryable_init_unchained() internal onlyInitializingERC721A {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 37 : IERC721AQueryableUpgradeable.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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import '../IERC721AUpgradeable.sol';
/**
* @dev Interface of ERC721AQueryable.
*/
interface IERC721AQueryableUpgradeable is IERC721AUpgradeable {
/**
* Invalid query range (`start` >= `stop`).
*/
error InvalidQueryRange();
/**
* @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
*
* If the `tokenId` is out of bounds:
*
* - `addr = address(0)`
* - `startTimestamp = 0`
* - `burned = false`
* - `extraData = 0`
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 37 : IERC721AUpgradeable.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
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
* @dev Interface of ERC721A.
*/
interface IERC721AUpgradeable {
/**
* The caller must own the token or be an approved operator.
*/
error ApprovalCallerNotOwnerNorApproved();
/**
* The token does not exist.
*/
error ApprovalQueryForNonexistentToken();
/**
* The caller cannot approve to their own address.
*/
error ApproveToCaller();
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Upgradeable","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"address[]","name":"accounts_","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"}],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"address","name":"account_","type":"address"}],"name":"currentBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"whitelistMerkleTreeRoot_","type":"bytes32"},{"internalType":"address","name":"royaltiesRecipient_","type":"address"},{"internalType":"uint256","name":"royaltiesValue_","type":"uint256"},{"internalType":"address[]","name":"shareholders","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"address","name":"account_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"}],"name":"merkleTreeRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payeesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stage_","type":"uint8"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"token","type":"address"}],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"address","name":"account_","type":"address"}],"name":"remainingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"address[]","name":"accounts_","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bool","name":"enable_","type":"bool"}],"name":"setAdminPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix_","type":"string"}],"name":"setPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"stage_","type":"uint8"},{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum TwoStage.Stage","name":"stage_","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"suffix_","type":"string"}],"name":"setSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage","outputs":[{"internalType":"enum TwoStage.Stage","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"suffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Upgradeable","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"uint256","name":"limit_","type":"uint256"}],"name":"updateBalanceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"stageId_","type":"uint8"},{"internalType":"bytes32","name":"merkleTreeRoot_","type":"bytes32"}],"name":"updateMerkleTreeRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b506149f4806100206000396000f3fe6080604052600436106103b15760003560e01c80638b83209b116101e7578063c45ac0501161010d578063d79779b2116100a0578063e919ecad1161006f578063e919ecad14610c25578063e985e9c514610c3c578063f2fde38b14610c5c578063f7073c3a14610c7c57600080fd5b8063d79779b214610b6c578063da19480914610ba3578063e33b7de314610bc3578063e4ab4bb914610bd957600080fd5b8063ce3cd997116100dc578063ce3cd99714610aed578063ce7c2ac214610b0d578063d2cab05614610b44578063d5abeb0114610b5757600080fd5b8063c45ac05014610a6d578063c519cd1c14610a8d578063c87b56dd14610aad578063cb3afdb614610acd57600080fd5b8063a3f8eace11610185578063b7fafcd711610154578063b7fafcd7146109c7578063b88d4fde146109f8578063c040e6b814610a18578063c23dc68f14610a4057600080fd5b8063a3f8eace14610925578063a49340cc14610945578063ad0127f014610965578063b1ba72d61461099657600080fd5b806395d89b41116101c157806395d89b41146108995780639852595c146108ae57806399a2557a146108e5578063a22cb4651461090557600080fd5b80638b83209b1461083b5780638c7ea24b1461085b5780638da5cb5b1461087b57600080fd5b806342842e0e116102d75780636dba11631161026a57806375d5ae9f1161023957806375d5ae9f146107b957806375dadb32146107d95780638462151c146107ee57806385cb593b1461081b57600080fd5b80636dba1163146107445780636f8b44b01461076457806370a0823114610784578063715018a6146107a457600080fd5b80635be7fde8116102a65780635be7fde8146106cf5780635ee54e23146106e45780636352211e146107045780636a00670b1461072457600080fd5b806342842e0e1461064257806348b7504414610662578063580fc80a146106825780635bbb2177146106a257600080fd5b806323b872dd1161034f5780632db115441161031e5780632db11544146105b25780632f59f741146105c55780633a98ef39146105e5578063406072a9146105fb57600080fd5b806323b872dd14610513578063240ff27f1461053357806324d7806c146105535780632a55205a1461057357600080fd5b8063095ea7b31161038b578063095ea7b31461048e57806318160ddd146104b057806319165587146104d357806321a588de146104f357600080fd5b806301ffc9a7146103ff57806306fdde0314610434578063081812fc1461045657600080fd5b366103fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561040b57600080fd5b5061041f61041a36600461419e565b610c91565b60405190151581526020015b60405180910390f35b34801561044057600080fd5b50610449610cb1565b60405161042b919061461d565b34801561046257600080fd5b5061047661047136600461428f565b610d4c565b6040516001600160a01b03909116815260200161042b565b34801561049a57600080fd5b506104ae6104a9366004613f92565b610d99565b005b3480156104bc57600080fd5b506104c5610e47565b60405190815260200161042b565b3480156104df57600080fd5b506104ae6104ee366004613e16565b610e67565b3480156104ff57600080fd5b506104ae61050e3660046143b2565b610f6a565b34801561051f57600080fd5b506104ae61052e366004613e6a565b611029565b34801561053f57600080fd5b506104ae61054e366004613f65565b611219565b34801561055f57600080fd5b5061041f61056e366004613e16565b611269565b34801561057f57600080fd5b5061059361058e366004614308565b611287565b604080516001600160a01b03909316835260208301919091520161042b565b6104ae6105c036600461428f565b6112dd565b3480156105d157600080fd5b506104ae6105e03660046143b2565b611399565b3480156105f157600080fd5b506101f5546104c5565b34801561060757600080fd5b506104c56106163660046141d6565b6001600160a01b0391821660009081526101fb6020908152604080832093909416825291909152205490565b34801561064e57600080fd5b506104ae61065d366004613e6a565b611448565b34801561066e57600080fd5b506104ae61067d3660046141d6565b611468565b34801561068e57600080fd5b506104ae61069d366004613e16565b61158b565b3480156106ae57600080fd5b506106c26106bd366004614059565b6115b9565b60405161042b919061457b565b3480156106db57600080fd5b506104ae6116ae565b3480156106f057600080fd5b506104ae6106ff3660046143e9565b6116de565b34801561071057600080fd5b5061047661071f36600461428f565b61171a565b34801561073057600080fd5b506104ae61073f3660046143e9565b611725565b34801561075057600080fd5b506104c561075f366004614343565b611761565b34801561077057600080fd5b506104ae61077f36600461428f565b6117a6565b34801561079057600080fd5b506104c561079f366004613e16565b6117d0565b3480156107b057600080fd5b506104ae611838565b3480156107c557600080fd5b506104ae6107d4366004614223565b61184c565b3480156107e557600080fd5b5061044961187e565b3480156107fa57600080fd5b5061080e610809366004613e16565b61188e565b60405161042b91906145bd565b34801561082757600080fd5b506104ae610836366004614223565b6119b9565b34801561084757600080fd5b5061047661085636600461428f565b6119eb565b34801561086757600080fd5b506104ae610876366004613f92565b611a2a565b34801561088757600080fd5b506033546001600160a01b0316610476565b3480156108a557600080fd5b50610449611a59565b3480156108ba57600080fd5b506104c56108c9366004613e16565b6001600160a01b031660009081526101f8602052604090205490565b3480156108f157600080fd5b5061080e610900366004613fbd565b611a71565b34801561091157600080fd5b506104ae610920366004613f65565b611c15565b34801561093157600080fd5b506104c5610940366004613e16565b611cbc565b34801561095157600080fd5b506104ae610960366004613ff1565b611cff565b34801561097157600080fd5b506104c5610980366004614329565b60ff16600090815261012d602052604090205490565b3480156109a257600080fd5b506104c56109b1366004614329565b60ff16600090815261015e602052604090205490565b3480156109d357600080fd5b506104c56109e2366004614329565b60ff1660009081526101c3602052604090205490565b348015610a0457600080fd5b506104ae610a13366004613eaa565b611df5565b348015610a2457600080fd5b5061025954610a339060ff1681565b60405161042b91906145f5565b348015610a4c57600080fd5b50610a60610a5b36600461428f565b611e39565b60405161042b9190614786565b348015610a7957600080fd5b506104c5610a883660046141d6565b611ec6565b348015610a9957600080fd5b506104ae610aa83660046143e9565b611fa2565b348015610ab957600080fd5b50610449610ac836600461428f565b611fde565b348015610ad957600080fd5b5061041f610ae836600461435e565b61200f565b348015610af957600080fd5b506104ae610b08366004614204565b612037565b348015610b1957600080fd5b506104c5610b28366004613e16565b6001600160a01b031660009081526101f7602052604090205490565b6104ae610b523660046142bf565b612092565b348015610b6357600080fd5b5060c9546104c5565b348015610b7857600080fd5b506104c5610b87366004613e16565b6001600160a01b031660009081526101fa602052604090205490565b348015610baf57600080fd5b506104ae610bbe3660046140b4565b61219e565b348015610bcf57600080fd5b506101f6546104c5565b348015610be557600080fd5b506104c5610bf4366004614343565b60ff8216600090815261015e602090815260408083206001600160a01b038516845260010190915290205492915050565b348015610c3157600080fd5b506104c56102275481565b348015610c4857600080fd5b5061041f610c57366004613e32565b6124bb565b348015610c6857600080fd5b506104ae610c77366004613e16565b6124d7565b348015610c8857600080fd5b5061044961254d565b6000610c9c8261255d565b80610cab5750610cab82612592565b92915050565b6060610cbb6125e0565b6002018054610cc990614875565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590614875565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b6000610d5782612604565b610d74576040516333d1c03960e21b815260040160405180910390fd5b610d7c6125e0565b60009283526006016020525060409020546001600160a01b031690565b6000610da48261171a565b9050336001600160a01b03821614610ddd57610dc081336124bb565b610ddd576040516367d9dca160e11b815260040160405180910390fd5b82610de66125e0565b6000848152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551849286811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60006001610e536125e0565b60010154610e5f6125e0565b540303919050565b6001600160a01b03811660009081526101f76020526040902054610ea65760405162461bcd60e51b8152600401610e9d90614684565b60405180910390fd5b6000610eb182611cbc565b905080610ed05760405162461bcd60e51b8152600401610e9d906146ca565b6001600160a01b03821660009081526101f8602052604081208054839290610ef99084906147e7565b92505081905550806101f66000828254610f1391906147e7565b90915550610f239050828261264d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a15050565b610f7333611269565b610f8f5760405162461bcd60e51b8152600401610e9d90614715565b60005b818110156110235760ff8416600090815261012d6020526040812060019190820190858585818110610fd457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fe99190613e16565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061101b816148b0565b915050610f92565b50505050565b600061103482612766565b9050836001600160a01b0316816001600160a01b0316146110675760405162a1148160e81b815260040160405180910390fd5b600080611073846127f5565b9150915061109881876110833390565b6001600160a01b039081169116811491141790565b6110c3576110a686336124bb565b6110c357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166110ea57604051633a954ecd60e21b815260040160405180910390fd5b80156110f557600082555b6110fd6125e0565b6001600160a01b03871660009081526005919091016020526040902080546000190190556111296125e0565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b176111606125e0565b60008681526004919091016020526040902055600160e11b83166111cf576001840161118a6125e0565b600082815260049190910160205260409020546111cd576111a96125e0565b5481146111cd57836111b96125e0565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61122233611269565b61123e5760405162461bcd60e51b8152600401610e9d90614715565b6001600160a01b03919091166000908152609760205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526097602052604090205460ff1690565b60408051808201909152610191546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906112c99086614813565b6112d391906147ff565b9150509250929050565b60026102595460ff16600281111561130557634e487b7160e01b600052602160045260246000fd5b146113525760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f7420656e61626c65640000000000000000006044820152606401610e9d565b600261135f81338461281d565b611369338361283b565b6113956113868260ff1660009081526101c3602052604090205490565b6113909084614813565b6128d4565b5050565b6113a233611269565b6113be5760405162461bcd60e51b8152600401610e9d90614715565b60005b818110156110235760ff8416600090815261012d602052604081206001019084848481811061140057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114159190613e16565b6001600160a01b031681526020810191909152604001600020805460ff1916905580611440816148b0565b9150506113c1565b61146383838360405180602001604052806000815250611df5565b505050565b6001600160a01b03811660009081526101f7602052604090205461149e5760405162461bcd60e51b8152600401610e9d90614684565b60006114aa8383611ec6565b9050806114c95760405162461bcd60e51b8152600401610e9d906146ca565b6001600160a01b0380841660009081526101fb60209081526040808320938616835292905290812080548392906115019084906147e7565b90915550506001600160a01b03831660009081526101fa60205260408120805483929061152f9084906147e7565b909155506115409050838383612956565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60005b610227548110156113955760006115a4826119eb565b90506115b08382611468565b5060010161158e565b6060816000816001600160401b038111156115e457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561163657816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816116025790505b50905060005b8281146116a55761167286868381811061166657634e487b7160e01b600052603260045260246000fd5b90506020020135611e39565b82828151811061169257634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161163c565b50949350505050565b60005b610227548110156116db5760006116c7826119eb565b90506116d281610e67565b506001016116b1565b50565b6116e733611269565b6117035760405162461bcd60e51b8152600401610e9d90614715565b60ff909116600090815261012d6020526040902055565b6000610cab82612766565b61172e33611269565b61174a5760405162461bcd60e51b8152600401610e9d90614715565b60ff90911660009081526101c36020526040902055565b60ff8216600081815261015e602081815260408084206001600160a01b03871685526001810183529084205494845291905254909161179f91614832565b9392505050565b6117af33611269565b6117cb5760405162461bcd60e51b8152600401610e9d90614715565b60c955565b60006001600160a01b0382166117f9576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b036118096125e0565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6118406129a8565b61184a6000612a02565b565b61185533611269565b6118715760405162461bcd60e51b8152600401610e9d90614715565b6114636101608383613c3b565b606061015f8054610cc990614875565b6060600080600061189e856117d0565b90506000816001600160401b038111156118c857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118f1578160200160208202803683370190505b50905061191e60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146119ad5761193181612a54565b9150816040015115611942576119a5565b81516001600160a01b03161561195757815194505b876001600160a01b0316856001600160a01b031614156119a5578083878060010198508151811061199857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611921565b50909695505050505050565b6119c233611269565b6119de5760405162461bcd60e51b8152600401610e9d90614715565b61146361015f8383613c3b565b60006101f98281548110611a0f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b611a3333611269565b611a4f5760405162461bcd60e51b8152600401610e9d90614715565b6113958282612a9b565b6060611a636125e0565b6003018054610cc990614875565b6060818310611a9357604051631960ccad60e11b815260040160405180910390fd5b600080611a9e612b63565b90506001851015611aae57600194505b80841115611aba578093505b6000611ac5876117d0565b905084861015611ae45785850381811015611ade578091505b50611ae8565b5060005b6000816001600160401b03811115611b1057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b39578160200160208202803683370190505b50905081611b4c57935061179f92505050565b6000611b5788611e39565b905060008160400151611b68575080515b885b888114158015611b7a5750848714155b15611c0457611b8881612a54565b9250826040015115611b9957611bfc565b82516001600160a01b031615611bae57825191505b8a6001600160a01b0316826001600160a01b03161415611bfc5780848880600101995081518110611bef57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611b6a565b505050928352509095945050505050565b6001600160a01b038216331415611c3f5760405163b06307db60e01b815260040160405180910390fd5b80611c486125e0565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611cc96101f65490565b611cd390476147e7565b905061179f8382611cfa866001600160a01b031660009081526101f8602052604090205490565b612b73565b611d0833611269565b611d245760405162461bcd60e51b8152600401610e9d90614715565b82818114611d745760405162461bcd60e51b815260206004820152601760248201527f41646d696e206d696e743a2062616420726571756573740000000000000000006044820152606401610e9d565b60005b8181101561121157611de3868683818110611da257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611db79190613e16565b858584818110611dd757634e487b7160e01b600052603260045260246000fd5b90506020020135612bb3565b80611ded816148b0565b915050611d77565b611e00848484611029565b6001600160a01b0383163b1561102357611e1c84848484612bbd565b611023576040516368d2bf6b60e11b815260040160405180910390fd5b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526001831080611e975750611e93612b63565b8310155b15611ea25792915050565b611eab83612a54565b9050806040015115611ebd5792915050565b61179f83612cb1565b6001600160a01b03821660009081526101fa602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a082319060240160206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5991906142a7565b611f6391906147e7565b6001600160a01b0380861660009081526101fb6020908152604080832093881683529290522054909150611f9a9084908390612b73565b949350505050565b611fab33611269565b611fc75760405162461bcd60e51b8152600401610e9d90614715565b60ff909116600090815261015e6020526040902055565b6060611fe982612604565b61200657604051630a14c4b560e41b815260040160405180910390fd5b610cab82612ce6565b60ff8416600090815261012d6020526040812061202e90858585612d1f565b95945050505050565b61204033611269565b61205c5760405162461bcd60e51b8152600401610e9d90614715565b610259805482919060ff1916600183600281111561208a57634e487b7160e01b600052602160045260246000fd5b021790555050565b60013383836120a38484848461200f565b6120e15760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610e9d565b60016102595460ff16600281111561210957634e487b7160e01b600052602160045260246000fd5b146121565760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206e6f7420656e61626c65640000000000006044820152606401610e9d565b600161216381338a61281d565b61216d338961283b565b61219461218a8260ff1660009081526101c3602052604090205490565b611390908a614813565b5050505050505050565b60008051602061499f83398151915254610100900460ff166121d35760008051602061499f8339815191525460ff16156121d7565b303b155b6122495760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610e9d565b60008051602061499f83398151915254610100900460ff161580156122855760008051602061499f833981519152805461ffff19166101011790555b600054610100900460ff16158080156122a55750600054600160ff909116105b806122bf5750303b1580156122bf575060005460ff166001145b6123225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610e9d565b6000805460ff191660011790558015612345576000805461ff0019166101001790555b6123896040518060400160405280600781526020016629a427aaa722a760c91b8152506040518060400160405280600381526020016229a42760e91b815250612dca565b612391612e08565b612399612e37565b6123a46115b3612e7a565b6123ac612ea1565b6123b4612ea1565b6123bc612ea1565b6123fb60405180608001604052806044815260200161495b6044913960405180604001604052806005815260200164173539b7b760d91b815250612ec8565b6124058484612f18565b61240f8686612f51565b61241a6001886116de565b61242760015b6001611fa2565b6124316002612420565b61244460015b666a94d74f430000611725565b61244e6002612437565b8015612494576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50801561121157505060008051602061499f833981519152805461ff001916905550505050565b60006124c78383612f78565b8061179f575061179f8383612fb5565b6124df6129a8565b6001600160a01b0381166125445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e9d565b6116db81612a02565b60606101608054610cc990614875565b60006001600160e01b0319821663152a902d60e11b1480610cab57506301ffc9a760e01b6001600160e01b0319831614610cab565b60006301ffc9a760e01b6001600160e01b0319831614806125c357506380ac58cd60e01b6001600160e01b03198316145b80610cab5750506001600160e01b031916635b5e139f60e01b1490565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b60008160011115801561261e575061261a6125e0565b5482105b8015610cab5750600160e01b6126326125e0565b60008481526004919091016020526040902054161592915050565b8047101561269d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e9d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146126ea576040519150601f19603f3d011682016040523d82523d6000602084013e6126ef565b606091505b50509050806114635760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e9d565b600081806001116127dc576127796125e0565b548110156127dc57600061278b6125e0565b600083815260049190910160205260409020549050600160e01b81166127da575b8061179f576127b96125e0565b600019909201600081815260049390930160205260409092205490506127ac565b505b604051636f96cda160e11b815260040160405180910390fd5b60008060006128026125e0565b60009485526006016020525050604090912080549092909150565b60ff8316600090815261015e60205260409020611463908383612ff4565b8060c9548161284861308e565b61285291906147e7565b11156128915760405162461bcd60e51b815260206004820152600e60248201526d4578636565647320737570706c7960901b6044820152606401610e9d565b3233146128ca5760405162461bcd60e51b81526020600482015260076024820152664e6f20626f747360c81b6044820152606401610e9d565b611463838361309d565b803410156129155760405162461bcd60e51b815260206004820152600e60248201526d141c9a58d94e881a5b9d985b1a5960921b6044820152606401610e9d565b60006129218234614832565b9050801561139557604051339082156108fc029083906000818181858888f19350505050158015611463573d6000803e3d6000fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114639084906130b7565b6033546001600160a01b0316331461184a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e9d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152610cab612a836125e0565b60008481526004919091016020526040902054613189565b612710811115612aed5760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965733a2076616c756520697320746f6f2068696768000000006044820152606401610e9d565b6040805180820182526001600160a01b03841680825262ffffff8416602092830181905261019180546001600160b81b0319168317600160a01b90920291909117905582519081529081018390527f908669f35f6fb3977a956ba70597841fe541d1e8491ca3c025161e258d3bfdb69101610f5e565b6000612b6d6125e0565b54919050565b6101f5546001600160a01b03841660009081526101f7602052604081205490918391612b9f9086614813565b612ba991906147ff565b611f9a9190614832565b611395828261283b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612bf2903390899088908890600401614548565b602060405180830381600087803b158015612c0c57600080fd5b505af1925050508015612c3c575060408051601f3d908101601f19168201909252612c39918101906141ba565b60015b612c97573d808015612c6a576040519150601f19603f3d011682016040523d82523d6000602084013e612c6f565b606091505b508051612c8f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f9a565b604080516080810182526000808252602082018190529181018290526060810191909152610cab612ce183612766565b613189565b606061015f612cf4836131d0565b610160604051602001612d0993929190614520565b6040516020818303038152906040529050919050565b6040516bffffffffffffffffffffffff19606085901b1660208201526000908190603401604051602081830303815290604052805190602001209050612d9b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050895491508490506132e9565b80612dc057506001600160a01b038516600090815260018701602052604090205460ff165b9695505050505050565b60008051602061499f83398151915254610100900460ff16612dfe5760405162461bcd60e51b8152600401610e9d90614630565b61139582826132ff565b600054610100900460ff16612e2f5760405162461bcd60e51b8152600401610e9d9061473b565b61184a613382565b600054610100900460ff16612e5e5760405162461bcd60e51b8152600401610e9d9061473b565b336000908152609760205260409020805460ff19166001179055565b600054610100900460ff166117cb5760405162461bcd60e51b8152600401610e9d9061473b565b600054610100900460ff1661184a5760405162461bcd60e51b8152600401610e9d9061473b565b600054610100900460ff16612eef5760405162461bcd60e51b8152600401610e9d9061473b565b8151612f039061015f906020850190613cbf565b50805161146390610160906020840190613cbf565b600054610100900460ff16612f3f5760405162461bcd60e51b8152600401610e9d9061473b565b612f4982826133b2565b505161022755565b600054610100900460ff16611a4f5760405162461bcd60e51b8152600401610e9d9061473b565b6000612f826125e0565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b600080612fc1846133e3565b90506001600160a01b03811615801590611f9a5750826001600160a01b0316816001600160a01b03161491505092915050565b82546001600160a01b038316600090815260018501602052604090205461301c9083906147e7565b111561305a5760405162461bcd60e51b815260206004820152600d60248201526c115e18d959591cc81b1a5b5a5d609a1b6044820152606401610e9d565b6001600160a01b0382166000908152600184016020526040812080548392906130849084906147e7565b9091555050505050565b6000613098610e47565b905090565b611395828260405180602001604052806000815250613549565b600061310c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135c69092919063ffffffff16565b805190915015611463578080602001905181019061312a9190614098565b6114635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e9d565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6060816131f45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561321e5780613208816148b0565b91506132179050600a836147ff565b91506131f8565b6000816001600160401b0381111561324657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613270576020820181803683370190505b5090505b8415611f9a57613285600183614832565b9150613292600a866148cb565b61329d9060306147e7565b60f81b8183815181106132c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506132e2600a866147ff565b9450613274565b6000826132f685846135d5565b14949350505050565b60008051602061499f83398151915254610100900460ff166133335760405162461bcd60e51b8152600401610e9d90614630565b8161333c6125e0565b6002019080519060200190613352929190613cbf565b508061335c6125e0565b6003019080519060200190613372929190613cbf565b50600161337d6125e0565b555050565b600054610100900460ff166133a95760405162461bcd60e51b8152600401610e9d9061473b565b61184a33612a02565b600054610100900460ff166133d95760405162461bcd60e51b8152600401610e9d9061473b565b6113958282613630565b600080468060018114613418576089811461343457600481146134505762013881811461346c576105398114613488576134a0565b73a5409ec958c83c3f309868babaca7c86dcb077c192506134a0565b7358807bad0b376efc12f5ad86aac70e78ed67deae92506134a0565b73f57b2c51ded3a29e6891aba85459d600256cf31792506134a0565b73ff7ca10af37178bdd056628ef42fd7f799fac77c92506134a0565b73e1a2bbc877b29adbc56d2659dbcb0ae14ee6207192505b506001600160a01b03821615806134b75750806089145b806134c457508062013881145b156134d0575092915050565b60405163c455279160e01b81526001600160a01b03858116600483015283169063c45527919060240160206040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a91906141e8565b613553838361378a565b6001600160a01b0383163b1561146357600061356d6125e0565b5490508281035b6135876000868380600101945086612bbd565b6135a4576040516368d2bf6b60e11b815260040160405180910390fd5b81811061357457816135b46125e0565b54146135bf57600080fd5b5050505050565b6060611f9a84846000856138be565b600081815b8451811015613628576136148286838151811061360757634e487b7160e01b600052603260045260246000fd5b60200260200101516139ef565b915080613620816148b0565b9150506135da565b509392505050565b600054610100900460ff166136575760405162461bcd60e51b8152600401610e9d9061473b565b80518251146136c35760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b6064820152608401610e9d565b60008251116137145760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610e9d565b60005b82518110156114635761377883828151811061374357634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061376b57634e487b7160e01b600052603260045260246000fd5b6020026020010151613a1e565b80613782816148b0565b915050613717565b60006137946125e0565b549050816137b55760405163b562e8dd60e01b815260040160405180910390fd5b6801000000000000000182026137c96125e0565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176138046125e0565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461388e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613856565b50816138ac57604051622e076360e81b815260040160405180910390fd5b806138b56125e0565b55506114639050565b60608247101561391f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e9d565b6001600160a01b0385163b6139765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9d565b600080866001600160a01b031685876040516139929190614504565b60006040518083038185875af1925050503d80600081146139cf576040519150601f19603f3d011682016040523d82523d6000602084013e6139d4565b606091505b50915091506139e4828286613c02565b979650505050505050565b6000818310613a0b57600082815260208490526040902061179f565b600083815260208390526040902061179f565b6001600160a01b038216613a895760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401610e9d565b60008111613ad95760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610e9d565b6001600160a01b03821660009081526101f7602052604090205415613b545760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401610e9d565b6101f98054600181019091557f29eba5f30ca2030a69ed2d7f74871c83bbc526b071320256f127653c7dfff4e90180546001600160a01b0319166001600160a01b03841690811790915560009081526101f7602052604090208190556101f554613bbf9082906147e7565b6101f555604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac9101610f5e565b60608315613c1157508161179f565b825115613c215782518084602001fd5b8160405162461bcd60e51b8152600401610e9d919061461d565b828054613c4790614875565b90600052602060002090601f016020900481019282613c695760008555613caf565b82601f10613c825782800160ff19823516178555613caf565b82800160010185558215613caf579182015b82811115613caf578235825591602001919060010190613c94565b50613cbb929150613d33565b5090565b828054613ccb90614875565b90600052602060002090601f016020900481019282613ced5760008555613caf565b82601f10613d0657805160ff1916838001178555613caf565b82800160010185558215613caf579182015b82811115613caf578251825591602001919060010190613d18565b5b80821115613cbb5760008155600101613d34565b60008083601f840112613d59578182fd5b5081356001600160401b03811115613d6f578182fd5b6020830191508360208260051b8501011115613d8a57600080fd5b9250929050565b600082601f830112613da1578081fd5b81356020613db6613db1836147c4565b614794565b80838252828201915082860187848660051b8901011115613dd5578586fd5b855b85811015613df357813584529284019290840190600101613dd7565b5090979650505050505050565b803560ff81168114613e1157600080fd5b919050565b600060208284031215613e27578081fd5b813561179f81614921565b60008060408385031215613e44578081fd5b8235613e4f81614921565b91506020830135613e5f81614921565b809150509250929050565b600080600060608486031215613e7e578081fd5b8335613e8981614921565b92506020840135613e9981614921565b929592945050506040919091013590565b60008060008060808587031215613ebf578182fd5b8435613eca81614921565b9350602085810135613edb81614921565b93506040860135925060608601356001600160401b0380821115613efd578384fd5b818801915088601f830112613f10578384fd5b813581811115613f2257613f2261490b565b613f34601f8201601f19168501614794565b91508082528984828501011115613f49578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215613f77578182fd5b8235613f8281614921565b91506020830135613e5f81614936565b60008060408385031215613fa4578182fd5b8235613faf81614921565b946020939093013593505050565b600080600060608486031215613fd1578081fd5b8335613fdc81614921565b95602085013595506040909401359392505050565b60008060008060408587031215614006578182fd5b84356001600160401b038082111561401c578384fd5b61402888838901613d48565b90965094506020870135915080821115614040578384fd5b5061404d87828801613d48565b95989497509550505050565b6000806020838503121561406b578182fd5b82356001600160401b03811115614080578283fd5b61408c85828601613d48565b90969095509350505050565b6000602082840312156140a9578081fd5b815161179f81614936565b600080600080600060a086880312156140cb578283fd5b853594506020808701356140de81614921565b94506040870135935060608701356001600160401b0380821115614100578384fd5b818901915089601f830112614113578384fd5b8135614121613db1826147c4565b8082825285820191508585018d878560051b8801011115614140578788fd5b8795505b8386101561416b57803561415781614921565b835260019590950194918601918601614144565b50965050506080890135925080831115614183578384fd5b505061419188828901613d91565b9150509295509295909350565b6000602082840312156141af578081fd5b813561179f81614944565b6000602082840312156141cb578081fd5b815161179f81614944565b60008060408385031215613e44578182fd5b6000602082840312156141f9578081fd5b815161179f81614921565b600060208284031215614215578081fd5b81356003811061179f578182fd5b60008060208385031215614235578182fd5b82356001600160401b038082111561424b578384fd5b818501915085601f83011261425e578384fd5b81358181111561426c578485fd5b86602082850101111561427d578485fd5b60209290920196919550909350505050565b6000602082840312156142a0578081fd5b5035919050565b6000602082840312156142b8578081fd5b5051919050565b6000806000604084860312156142d3578081fd5b8335925060208401356001600160401b038111156142ef578182fd5b6142fb86828701613d48565b9497909650939450505050565b6000806040838503121561431a578182fd5b50508035926020909101359150565b60006020828403121561433a578081fd5b61179f82613e00565b60008060408385031215614355578182fd5b613e4f83613e00565b60008060008060608587031215614373578182fd5b61437c85613e00565b9350602085013561438c81614921565b925060408501356001600160401b038111156143a6578283fd5b61404d87828801613d48565b6000806000604084860312156143c6578081fd5b6143cf84613e00565b925060208401356001600160401b038111156142ef578182fd5b600080604083850312156143fb578182fd5b613faf83613e00565b6000815180845261441c816020860160208601614849565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061444a57607f831692505b602080841082141561446a57634e487b7160e01b86526022600452602486fd5b81801561447e576001811461448f576144bc565b60ff198616895284890196506144bc565b60008881526020902060005b868110156144b45781548b82015290850190830161449b565b505084890196505b50505050505092915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b60008251614516818460208701614849565b9190910192915050565b600061452c8286614430565b845161453c818360208901614849565b6139e481830186614430565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc090830184614404565b6020808252825182820181905260009190848201906040850190845b818110156119ad576145aa8385516144c8565b9284019260809290920191600101614597565b6020808252825182820181905260009190848201906040850190845b818110156119ad578351835292840192918401916001016145d9565b602081016003831061461757634e487b7160e01b600052602160045260246000fd5b91905290565b60208152600061179f6020830184614404565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252600c908201526b2737ba1030b71030b236b4b760a11b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60808101610cab82846144c8565b604051601f8201601f191681016001600160401b03811182821017156147bc576147bc61490b565b604052919050565b60006001600160401b038211156147dd576147dd61490b565b5060051b60200190565b600082198211156147fa576147fa6148df565b500190565b60008261480e5761480e6148f5565b500490565b600081600019048311821515161561482d5761482d6148df565b500290565b600082821015614844576148446148df565b500390565b60005b8381101561486457818101518382015260200161484c565b838111156110235750506000910152565b600181811c9082168061488957607f821691505b602082108114156148aa57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148c4576148c46148df565b5060010190565b6000826148da576148da6148f5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116db57600080fd5b80151581146116db57600080fd5b6001600160e01b0319811681146116db57600080fdfe68747470733a2f2f697066732e696f2f697066732f516d537142767534414d74784d67355459727a7848647156584a44326473477136626b4c4a4a4a533773547876522fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa26469706673582212201ba13f2976c9496379f4c994a1dd63c63c84cc3a0b7412aca6703d9c8f54c47864736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103b15760003560e01c80638b83209b116101e7578063c45ac0501161010d578063d79779b2116100a0578063e919ecad1161006f578063e919ecad14610c25578063e985e9c514610c3c578063f2fde38b14610c5c578063f7073c3a14610c7c57600080fd5b8063d79779b214610b6c578063da19480914610ba3578063e33b7de314610bc3578063e4ab4bb914610bd957600080fd5b8063ce3cd997116100dc578063ce3cd99714610aed578063ce7c2ac214610b0d578063d2cab05614610b44578063d5abeb0114610b5757600080fd5b8063c45ac05014610a6d578063c519cd1c14610a8d578063c87b56dd14610aad578063cb3afdb614610acd57600080fd5b8063a3f8eace11610185578063b7fafcd711610154578063b7fafcd7146109c7578063b88d4fde146109f8578063c040e6b814610a18578063c23dc68f14610a4057600080fd5b8063a3f8eace14610925578063a49340cc14610945578063ad0127f014610965578063b1ba72d61461099657600080fd5b806395d89b41116101c157806395d89b41146108995780639852595c146108ae57806399a2557a146108e5578063a22cb4651461090557600080fd5b80638b83209b1461083b5780638c7ea24b1461085b5780638da5cb5b1461087b57600080fd5b806342842e0e116102d75780636dba11631161026a57806375d5ae9f1161023957806375d5ae9f146107b957806375dadb32146107d95780638462151c146107ee57806385cb593b1461081b57600080fd5b80636dba1163146107445780636f8b44b01461076457806370a0823114610784578063715018a6146107a457600080fd5b80635be7fde8116102a65780635be7fde8146106cf5780635ee54e23146106e45780636352211e146107045780636a00670b1461072457600080fd5b806342842e0e1461064257806348b7504414610662578063580fc80a146106825780635bbb2177146106a257600080fd5b806323b872dd1161034f5780632db115441161031e5780632db11544146105b25780632f59f741146105c55780633a98ef39146105e5578063406072a9146105fb57600080fd5b806323b872dd14610513578063240ff27f1461053357806324d7806c146105535780632a55205a1461057357600080fd5b8063095ea7b31161038b578063095ea7b31461048e57806318160ddd146104b057806319165587146104d357806321a588de146104f357600080fd5b806301ffc9a7146103ff57806306fdde0314610434578063081812fc1461045657600080fd5b366103fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561040b57600080fd5b5061041f61041a36600461419e565b610c91565b60405190151581526020015b60405180910390f35b34801561044057600080fd5b50610449610cb1565b60405161042b919061461d565b34801561046257600080fd5b5061047661047136600461428f565b610d4c565b6040516001600160a01b03909116815260200161042b565b34801561049a57600080fd5b506104ae6104a9366004613f92565b610d99565b005b3480156104bc57600080fd5b506104c5610e47565b60405190815260200161042b565b3480156104df57600080fd5b506104ae6104ee366004613e16565b610e67565b3480156104ff57600080fd5b506104ae61050e3660046143b2565b610f6a565b34801561051f57600080fd5b506104ae61052e366004613e6a565b611029565b34801561053f57600080fd5b506104ae61054e366004613f65565b611219565b34801561055f57600080fd5b5061041f61056e366004613e16565b611269565b34801561057f57600080fd5b5061059361058e366004614308565b611287565b604080516001600160a01b03909316835260208301919091520161042b565b6104ae6105c036600461428f565b6112dd565b3480156105d157600080fd5b506104ae6105e03660046143b2565b611399565b3480156105f157600080fd5b506101f5546104c5565b34801561060757600080fd5b506104c56106163660046141d6565b6001600160a01b0391821660009081526101fb6020908152604080832093909416825291909152205490565b34801561064e57600080fd5b506104ae61065d366004613e6a565b611448565b34801561066e57600080fd5b506104ae61067d3660046141d6565b611468565b34801561068e57600080fd5b506104ae61069d366004613e16565b61158b565b3480156106ae57600080fd5b506106c26106bd366004614059565b6115b9565b60405161042b919061457b565b3480156106db57600080fd5b506104ae6116ae565b3480156106f057600080fd5b506104ae6106ff3660046143e9565b6116de565b34801561071057600080fd5b5061047661071f36600461428f565b61171a565b34801561073057600080fd5b506104ae61073f3660046143e9565b611725565b34801561075057600080fd5b506104c561075f366004614343565b611761565b34801561077057600080fd5b506104ae61077f36600461428f565b6117a6565b34801561079057600080fd5b506104c561079f366004613e16565b6117d0565b3480156107b057600080fd5b506104ae611838565b3480156107c557600080fd5b506104ae6107d4366004614223565b61184c565b3480156107e557600080fd5b5061044961187e565b3480156107fa57600080fd5b5061080e610809366004613e16565b61188e565b60405161042b91906145bd565b34801561082757600080fd5b506104ae610836366004614223565b6119b9565b34801561084757600080fd5b5061047661085636600461428f565b6119eb565b34801561086757600080fd5b506104ae610876366004613f92565b611a2a565b34801561088757600080fd5b506033546001600160a01b0316610476565b3480156108a557600080fd5b50610449611a59565b3480156108ba57600080fd5b506104c56108c9366004613e16565b6001600160a01b031660009081526101f8602052604090205490565b3480156108f157600080fd5b5061080e610900366004613fbd565b611a71565b34801561091157600080fd5b506104ae610920366004613f65565b611c15565b34801561093157600080fd5b506104c5610940366004613e16565b611cbc565b34801561095157600080fd5b506104ae610960366004613ff1565b611cff565b34801561097157600080fd5b506104c5610980366004614329565b60ff16600090815261012d602052604090205490565b3480156109a257600080fd5b506104c56109b1366004614329565b60ff16600090815261015e602052604090205490565b3480156109d357600080fd5b506104c56109e2366004614329565b60ff1660009081526101c3602052604090205490565b348015610a0457600080fd5b506104ae610a13366004613eaa565b611df5565b348015610a2457600080fd5b5061025954610a339060ff1681565b60405161042b91906145f5565b348015610a4c57600080fd5b50610a60610a5b36600461428f565b611e39565b60405161042b9190614786565b348015610a7957600080fd5b506104c5610a883660046141d6565b611ec6565b348015610a9957600080fd5b506104ae610aa83660046143e9565b611fa2565b348015610ab957600080fd5b50610449610ac836600461428f565b611fde565b348015610ad957600080fd5b5061041f610ae836600461435e565b61200f565b348015610af957600080fd5b506104ae610b08366004614204565b612037565b348015610b1957600080fd5b506104c5610b28366004613e16565b6001600160a01b031660009081526101f7602052604090205490565b6104ae610b523660046142bf565b612092565b348015610b6357600080fd5b5060c9546104c5565b348015610b7857600080fd5b506104c5610b87366004613e16565b6001600160a01b031660009081526101fa602052604090205490565b348015610baf57600080fd5b506104ae610bbe3660046140b4565b61219e565b348015610bcf57600080fd5b506101f6546104c5565b348015610be557600080fd5b506104c5610bf4366004614343565b60ff8216600090815261015e602090815260408083206001600160a01b038516845260010190915290205492915050565b348015610c3157600080fd5b506104c56102275481565b348015610c4857600080fd5b5061041f610c57366004613e32565b6124bb565b348015610c6857600080fd5b506104ae610c77366004613e16565b6124d7565b348015610c8857600080fd5b5061044961254d565b6000610c9c8261255d565b80610cab5750610cab82612592565b92915050565b6060610cbb6125e0565b6002018054610cc990614875565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf590614875565b8015610d425780601f10610d1757610100808354040283529160200191610d42565b820191906000526020600020905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b6000610d5782612604565b610d74576040516333d1c03960e21b815260040160405180910390fd5b610d7c6125e0565b60009283526006016020525060409020546001600160a01b031690565b6000610da48261171a565b9050336001600160a01b03821614610ddd57610dc081336124bb565b610ddd576040516367d9dca160e11b815260040160405180910390fd5b82610de66125e0565b6000848152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551849286811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60006001610e536125e0565b60010154610e5f6125e0565b540303919050565b6001600160a01b03811660009081526101f76020526040902054610ea65760405162461bcd60e51b8152600401610e9d90614684565b60405180910390fd5b6000610eb182611cbc565b905080610ed05760405162461bcd60e51b8152600401610e9d906146ca565b6001600160a01b03821660009081526101f8602052604081208054839290610ef99084906147e7565b92505081905550806101f66000828254610f1391906147e7565b90915550610f239050828261264d565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a15050565b610f7333611269565b610f8f5760405162461bcd60e51b8152600401610e9d90614715565b60005b818110156110235760ff8416600090815261012d6020526040812060019190820190858585818110610fd457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fe99190613e16565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061101b816148b0565b915050610f92565b50505050565b600061103482612766565b9050836001600160a01b0316816001600160a01b0316146110675760405162a1148160e81b815260040160405180910390fd5b600080611073846127f5565b9150915061109881876110833390565b6001600160a01b039081169116811491141790565b6110c3576110a686336124bb565b6110c357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166110ea57604051633a954ecd60e21b815260040160405180910390fd5b80156110f557600082555b6110fd6125e0565b6001600160a01b03871660009081526005919091016020526040902080546000190190556111296125e0565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b176111606125e0565b60008681526004919091016020526040902055600160e11b83166111cf576001840161118a6125e0565b600082815260049190910160205260409020546111cd576111a96125e0565b5481146111cd57836111b96125e0565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b61122233611269565b61123e5760405162461bcd60e51b8152600401610e9d90614715565b6001600160a01b03919091166000908152609760205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526097602052604090205460ff1690565b60408051808201909152610191546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906112c99086614813565b6112d391906147ff565b9150509250929050565b60026102595460ff16600281111561130557634e487b7160e01b600052602160045260246000fd5b146113525760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206e6f7420656e61626c65640000000000000000006044820152606401610e9d565b600261135f81338461281d565b611369338361283b565b6113956113868260ff1660009081526101c3602052604090205490565b6113909084614813565b6128d4565b5050565b6113a233611269565b6113be5760405162461bcd60e51b8152600401610e9d90614715565b60005b818110156110235760ff8416600090815261012d602052604081206001019084848481811061140057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906114159190613e16565b6001600160a01b031681526020810191909152604001600020805460ff1916905580611440816148b0565b9150506113c1565b61146383838360405180602001604052806000815250611df5565b505050565b6001600160a01b03811660009081526101f7602052604090205461149e5760405162461bcd60e51b8152600401610e9d90614684565b60006114aa8383611ec6565b9050806114c95760405162461bcd60e51b8152600401610e9d906146ca565b6001600160a01b0380841660009081526101fb60209081526040808320938616835292905290812080548392906115019084906147e7565b90915550506001600160a01b03831660009081526101fa60205260408120805483929061152f9084906147e7565b909155506115409050838383612956565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b60005b610227548110156113955760006115a4826119eb565b90506115b08382611468565b5060010161158e565b6060816000816001600160401b038111156115e457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561163657816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816116025790505b50905060005b8281146116a55761167286868381811061166657634e487b7160e01b600052603260045260246000fd5b90506020020135611e39565b82828151811061169257634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161163c565b50949350505050565b60005b610227548110156116db5760006116c7826119eb565b90506116d281610e67565b506001016116b1565b50565b6116e733611269565b6117035760405162461bcd60e51b8152600401610e9d90614715565b60ff909116600090815261012d6020526040902055565b6000610cab82612766565b61172e33611269565b61174a5760405162461bcd60e51b8152600401610e9d90614715565b60ff90911660009081526101c36020526040902055565b60ff8216600081815261015e602081815260408084206001600160a01b03871685526001810183529084205494845291905254909161179f91614832565b9392505050565b6117af33611269565b6117cb5760405162461bcd60e51b8152600401610e9d90614715565b60c955565b60006001600160a01b0382166117f9576040516323d3ad8160e21b815260040160405180910390fd5b6001600160401b036118096125e0565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6118406129a8565b61184a6000612a02565b565b61185533611269565b6118715760405162461bcd60e51b8152600401610e9d90614715565b6114636101608383613c3b565b606061015f8054610cc990614875565b6060600080600061189e856117d0565b90506000816001600160401b038111156118c857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118f1578160200160208202803683370190505b50905061191e60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146119ad5761193181612a54565b9150816040015115611942576119a5565b81516001600160a01b03161561195757815194505b876001600160a01b0316856001600160a01b031614156119a5578083878060010198508151811061199857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611921565b50909695505050505050565b6119c233611269565b6119de5760405162461bcd60e51b8152600401610e9d90614715565b61146361015f8383613c3b565b60006101f98281548110611a0f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b611a3333611269565b611a4f5760405162461bcd60e51b8152600401610e9d90614715565b6113958282612a9b565b6060611a636125e0565b6003018054610cc990614875565b6060818310611a9357604051631960ccad60e11b815260040160405180910390fd5b600080611a9e612b63565b90506001851015611aae57600194505b80841115611aba578093505b6000611ac5876117d0565b905084861015611ae45785850381811015611ade578091505b50611ae8565b5060005b6000816001600160401b03811115611b1057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b39578160200160208202803683370190505b50905081611b4c57935061179f92505050565b6000611b5788611e39565b905060008160400151611b68575080515b885b888114158015611b7a5750848714155b15611c0457611b8881612a54565b9250826040015115611b9957611bfc565b82516001600160a01b031615611bae57825191505b8a6001600160a01b0316826001600160a01b03161415611bfc5780848880600101995081518110611bef57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611b6a565b505050928352509095945050505050565b6001600160a01b038216331415611c3f5760405163b06307db60e01b815260040160405180910390fd5b80611c486125e0565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611cc96101f65490565b611cd390476147e7565b905061179f8382611cfa866001600160a01b031660009081526101f8602052604090205490565b612b73565b611d0833611269565b611d245760405162461bcd60e51b8152600401610e9d90614715565b82818114611d745760405162461bcd60e51b815260206004820152601760248201527f41646d696e206d696e743a2062616420726571756573740000000000000000006044820152606401610e9d565b60005b8181101561121157611de3868683818110611da257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611db79190613e16565b858584818110611dd757634e487b7160e01b600052603260045260246000fd5b90506020020135612bb3565b80611ded816148b0565b915050611d77565b611e00848484611029565b6001600160a01b0383163b1561102357611e1c84848484612bbd565b611023576040516368d2bf6b60e11b815260040160405180910390fd5b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526001831080611e975750611e93612b63565b8310155b15611ea25792915050565b611eab83612a54565b9050806040015115611ebd5792915050565b61179f83612cb1565b6001600160a01b03821660009081526101fa602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a082319060240160206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5991906142a7565b611f6391906147e7565b6001600160a01b0380861660009081526101fb6020908152604080832093881683529290522054909150611f9a9084908390612b73565b949350505050565b611fab33611269565b611fc75760405162461bcd60e51b8152600401610e9d90614715565b60ff909116600090815261015e6020526040902055565b6060611fe982612604565b61200657604051630a14c4b560e41b815260040160405180910390fd5b610cab82612ce6565b60ff8416600090815261012d6020526040812061202e90858585612d1f565b95945050505050565b61204033611269565b61205c5760405162461bcd60e51b8152600401610e9d90614715565b610259805482919060ff1916600183600281111561208a57634e487b7160e01b600052602160045260246000fd5b021790555050565b60013383836120a38484848461200f565b6120e15760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610e9d565b60016102595460ff16600281111561210957634e487b7160e01b600052602160045260246000fd5b146121565760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206e6f7420656e61626c65640000000000006044820152606401610e9d565b600161216381338a61281d565b61216d338961283b565b61219461218a8260ff1660009081526101c3602052604090205490565b611390908a614813565b5050505050505050565b60008051602061499f83398151915254610100900460ff166121d35760008051602061499f8339815191525460ff16156121d7565b303b155b6122495760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a65640000000000000000006064820152608401610e9d565b60008051602061499f83398151915254610100900460ff161580156122855760008051602061499f833981519152805461ffff19166101011790555b600054610100900460ff16158080156122a55750600054600160ff909116105b806122bf5750303b1580156122bf575060005460ff166001145b6123225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610e9d565b6000805460ff191660011790558015612345576000805461ff0019166101001790555b6123896040518060400160405280600781526020016629a427aaa722a760c91b8152506040518060400160405280600381526020016229a42760e91b815250612dca565b612391612e08565b612399612e37565b6123a46115b3612e7a565b6123ac612ea1565b6123b4612ea1565b6123bc612ea1565b6123fb60405180608001604052806044815260200161495b6044913960405180604001604052806005815260200164173539b7b760d91b815250612ec8565b6124058484612f18565b61240f8686612f51565b61241a6001886116de565b61242760015b6001611fa2565b6124316002612420565b61244460015b666a94d74f430000611725565b61244e6002612437565b8015612494576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50801561121157505060008051602061499f833981519152805461ff001916905550505050565b60006124c78383612f78565b8061179f575061179f8383612fb5565b6124df6129a8565b6001600160a01b0381166125445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e9d565b6116db81612a02565b60606101608054610cc990614875565b60006001600160e01b0319821663152a902d60e11b1480610cab57506301ffc9a760e01b6001600160e01b0319831614610cab565b60006301ffc9a760e01b6001600160e01b0319831614806125c357506380ac58cd60e01b6001600160e01b03198316145b80610cab5750506001600160e01b031916635b5e139f60e01b1490565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b60008160011115801561261e575061261a6125e0565b5482105b8015610cab5750600160e01b6126326125e0565b60008481526004919091016020526040902054161592915050565b8047101561269d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610e9d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146126ea576040519150601f19603f3d011682016040523d82523d6000602084013e6126ef565b606091505b50509050806114635760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610e9d565b600081806001116127dc576127796125e0565b548110156127dc57600061278b6125e0565b600083815260049190910160205260409020549050600160e01b81166127da575b8061179f576127b96125e0565b600019909201600081815260049390930160205260409092205490506127ac565b505b604051636f96cda160e11b815260040160405180910390fd5b60008060006128026125e0565b60009485526006016020525050604090912080549092909150565b60ff8316600090815261015e60205260409020611463908383612ff4565b8060c9548161284861308e565b61285291906147e7565b11156128915760405162461bcd60e51b815260206004820152600e60248201526d4578636565647320737570706c7960901b6044820152606401610e9d565b3233146128ca5760405162461bcd60e51b81526020600482015260076024820152664e6f20626f747360c81b6044820152606401610e9d565b611463838361309d565b803410156129155760405162461bcd60e51b815260206004820152600e60248201526d141c9a58d94e881a5b9d985b1a5960921b6044820152606401610e9d565b60006129218234614832565b9050801561139557604051339082156108fc029083906000818181858888f19350505050158015611463573d6000803e3d6000fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114639084906130b7565b6033546001600160a01b0316331461184a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e9d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152610cab612a836125e0565b60008481526004919091016020526040902054613189565b612710811115612aed5760405162461bcd60e51b815260206004820152601c60248201527f526f79616c746965733a2076616c756520697320746f6f2068696768000000006044820152606401610e9d565b6040805180820182526001600160a01b03841680825262ffffff8416602092830181905261019180546001600160b81b0319168317600160a01b90920291909117905582519081529081018390527f908669f35f6fb3977a956ba70597841fe541d1e8491ca3c025161e258d3bfdb69101610f5e565b6000612b6d6125e0565b54919050565b6101f5546001600160a01b03841660009081526101f7602052604081205490918391612b9f9086614813565b612ba991906147ff565b611f9a9190614832565b611395828261283b565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612bf2903390899088908890600401614548565b602060405180830381600087803b158015612c0c57600080fd5b505af1925050508015612c3c575060408051601f3d908101601f19168201909252612c39918101906141ba565b60015b612c97573d808015612c6a576040519150601f19603f3d011682016040523d82523d6000602084013e612c6f565b606091505b508051612c8f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f9a565b604080516080810182526000808252602082018190529181018290526060810191909152610cab612ce183612766565b613189565b606061015f612cf4836131d0565b610160604051602001612d0993929190614520565b6040516020818303038152906040529050919050565b6040516bffffffffffffffffffffffff19606085901b1660208201526000908190603401604051602081830303815290604052805190602001209050612d9b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050895491508490506132e9565b80612dc057506001600160a01b038516600090815260018701602052604090205460ff165b9695505050505050565b60008051602061499f83398151915254610100900460ff16612dfe5760405162461bcd60e51b8152600401610e9d90614630565b61139582826132ff565b600054610100900460ff16612e2f5760405162461bcd60e51b8152600401610e9d9061473b565b61184a613382565b600054610100900460ff16612e5e5760405162461bcd60e51b8152600401610e9d9061473b565b336000908152609760205260409020805460ff19166001179055565b600054610100900460ff166117cb5760405162461bcd60e51b8152600401610e9d9061473b565b600054610100900460ff1661184a5760405162461bcd60e51b8152600401610e9d9061473b565b600054610100900460ff16612eef5760405162461bcd60e51b8152600401610e9d9061473b565b8151612f039061015f906020850190613cbf565b50805161146390610160906020840190613cbf565b600054610100900460ff16612f3f5760405162461bcd60e51b8152600401610e9d9061473b565b612f4982826133b2565b505161022755565b600054610100900460ff16611a4f5760405162461bcd60e51b8152600401610e9d9061473b565b6000612f826125e0565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b600080612fc1846133e3565b90506001600160a01b03811615801590611f9a5750826001600160a01b0316816001600160a01b03161491505092915050565b82546001600160a01b038316600090815260018501602052604090205461301c9083906147e7565b111561305a5760405162461bcd60e51b815260206004820152600d60248201526c115e18d959591cc81b1a5b5a5d609a1b6044820152606401610e9d565b6001600160a01b0382166000908152600184016020526040812080548392906130849084906147e7565b9091555050505050565b6000613098610e47565b905090565b611395828260405180602001604052806000815250613549565b600061310c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166135c69092919063ffffffff16565b805190915015611463578080602001905181019061312a9190614098565b6114635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e9d565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6060816131f45750506040805180820190915260018152600360fc1b602082015290565b8160005b811561321e5780613208816148b0565b91506132179050600a836147ff565b91506131f8565b6000816001600160401b0381111561324657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613270576020820181803683370190505b5090505b8415611f9a57613285600183614832565b9150613292600a866148cb565b61329d9060306147e7565b60f81b8183815181106132c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506132e2600a866147ff565b9450613274565b6000826132f685846135d5565b14949350505050565b60008051602061499f83398151915254610100900460ff166133335760405162461bcd60e51b8152600401610e9d90614630565b8161333c6125e0565b6002019080519060200190613352929190613cbf565b508061335c6125e0565b6003019080519060200190613372929190613cbf565b50600161337d6125e0565b555050565b600054610100900460ff166133a95760405162461bcd60e51b8152600401610e9d9061473b565b61184a33612a02565b600054610100900460ff166133d95760405162461bcd60e51b8152600401610e9d9061473b565b6113958282613630565b600080468060018114613418576089811461343457600481146134505762013881811461346c576105398114613488576134a0565b73a5409ec958c83c3f309868babaca7c86dcb077c192506134a0565b7358807bad0b376efc12f5ad86aac70e78ed67deae92506134a0565b73f57b2c51ded3a29e6891aba85459d600256cf31792506134a0565b73ff7ca10af37178bdd056628ef42fd7f799fac77c92506134a0565b73e1a2bbc877b29adbc56d2659dbcb0ae14ee6207192505b506001600160a01b03821615806134b75750806089145b806134c457508062013881145b156134d0575092915050565b60405163c455279160e01b81526001600160a01b03858116600483015283169063c45527919060240160206040518083038186803b15801561351157600080fd5b505afa158015613525573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a91906141e8565b613553838361378a565b6001600160a01b0383163b1561146357600061356d6125e0565b5490508281035b6135876000868380600101945086612bbd565b6135a4576040516368d2bf6b60e11b815260040160405180910390fd5b81811061357457816135b46125e0565b54146135bf57600080fd5b5050505050565b6060611f9a84846000856138be565b600081815b8451811015613628576136148286838151811061360757634e487b7160e01b600052603260045260246000fd5b60200260200101516139ef565b915080613620816148b0565b9150506135da565b509392505050565b600054610100900460ff166136575760405162461bcd60e51b8152600401610e9d9061473b565b80518251146136c35760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b6064820152608401610e9d565b60008251116137145760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610e9d565b60005b82518110156114635761377883828151811061374357634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811061376b57634e487b7160e01b600052603260045260246000fd5b6020026020010151613a1e565b80613782816148b0565b915050613717565b60006137946125e0565b549050816137b55760405163b562e8dd60e01b815260040160405180910390fd5b6801000000000000000182026137c96125e0565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b17176138046125e0565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461388e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101613856565b50816138ac57604051622e076360e81b815260040160405180910390fd5b806138b56125e0565b55506114639050565b60608247101561391f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e9d565b6001600160a01b0385163b6139765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e9d565b600080866001600160a01b031685876040516139929190614504565b60006040518083038185875af1925050503d80600081146139cf576040519150601f19603f3d011682016040523d82523d6000602084013e6139d4565b606091505b50915091506139e4828286613c02565b979650505050505050565b6000818310613a0b57600082815260208490526040902061179f565b600083815260208390526040902061179f565b6001600160a01b038216613a895760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401610e9d565b60008111613ad95760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610e9d565b6001600160a01b03821660009081526101f7602052604090205415613b545760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401610e9d565b6101f98054600181019091557f29eba5f30ca2030a69ed2d7f74871c83bbc526b071320256f127653c7dfff4e90180546001600160a01b0319166001600160a01b03841690811790915560009081526101f7602052604090208190556101f554613bbf9082906147e7565b6101f555604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac9101610f5e565b60608315613c1157508161179f565b825115613c215782518084602001fd5b8160405162461bcd60e51b8152600401610e9d919061461d565b828054613c4790614875565b90600052602060002090601f016020900481019282613c695760008555613caf565b82601f10613c825782800160ff19823516178555613caf565b82800160010185558215613caf579182015b82811115613caf578235825591602001919060010190613c94565b50613cbb929150613d33565b5090565b828054613ccb90614875565b90600052602060002090601f016020900481019282613ced5760008555613caf565b82601f10613d0657805160ff1916838001178555613caf565b82800160010185558215613caf579182015b82811115613caf578251825591602001919060010190613d18565b5b80821115613cbb5760008155600101613d34565b60008083601f840112613d59578182fd5b5081356001600160401b03811115613d6f578182fd5b6020830191508360208260051b8501011115613d8a57600080fd5b9250929050565b600082601f830112613da1578081fd5b81356020613db6613db1836147c4565b614794565b80838252828201915082860187848660051b8901011115613dd5578586fd5b855b85811015613df357813584529284019290840190600101613dd7565b5090979650505050505050565b803560ff81168114613e1157600080fd5b919050565b600060208284031215613e27578081fd5b813561179f81614921565b60008060408385031215613e44578081fd5b8235613e4f81614921565b91506020830135613e5f81614921565b809150509250929050565b600080600060608486031215613e7e578081fd5b8335613e8981614921565b92506020840135613e9981614921565b929592945050506040919091013590565b60008060008060808587031215613ebf578182fd5b8435613eca81614921565b9350602085810135613edb81614921565b93506040860135925060608601356001600160401b0380821115613efd578384fd5b818801915088601f830112613f10578384fd5b813581811115613f2257613f2261490b565b613f34601f8201601f19168501614794565b91508082528984828501011115613f49578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215613f77578182fd5b8235613f8281614921565b91506020830135613e5f81614936565b60008060408385031215613fa4578182fd5b8235613faf81614921565b946020939093013593505050565b600080600060608486031215613fd1578081fd5b8335613fdc81614921565b95602085013595506040909401359392505050565b60008060008060408587031215614006578182fd5b84356001600160401b038082111561401c578384fd5b61402888838901613d48565b90965094506020870135915080821115614040578384fd5b5061404d87828801613d48565b95989497509550505050565b6000806020838503121561406b578182fd5b82356001600160401b03811115614080578283fd5b61408c85828601613d48565b90969095509350505050565b6000602082840312156140a9578081fd5b815161179f81614936565b600080600080600060a086880312156140cb578283fd5b853594506020808701356140de81614921565b94506040870135935060608701356001600160401b0380821115614100578384fd5b818901915089601f830112614113578384fd5b8135614121613db1826147c4565b8082825285820191508585018d878560051b8801011115614140578788fd5b8795505b8386101561416b57803561415781614921565b835260019590950194918601918601614144565b50965050506080890135925080831115614183578384fd5b505061419188828901613d91565b9150509295509295909350565b6000602082840312156141af578081fd5b813561179f81614944565b6000602082840312156141cb578081fd5b815161179f81614944565b60008060408385031215613e44578182fd5b6000602082840312156141f9578081fd5b815161179f81614921565b600060208284031215614215578081fd5b81356003811061179f578182fd5b60008060208385031215614235578182fd5b82356001600160401b038082111561424b578384fd5b818501915085601f83011261425e578384fd5b81358181111561426c578485fd5b86602082850101111561427d578485fd5b60209290920196919550909350505050565b6000602082840312156142a0578081fd5b5035919050565b6000602082840312156142b8578081fd5b5051919050565b6000806000604084860312156142d3578081fd5b8335925060208401356001600160401b038111156142ef578182fd5b6142fb86828701613d48565b9497909650939450505050565b6000806040838503121561431a578182fd5b50508035926020909101359150565b60006020828403121561433a578081fd5b61179f82613e00565b60008060408385031215614355578182fd5b613e4f83613e00565b60008060008060608587031215614373578182fd5b61437c85613e00565b9350602085013561438c81614921565b925060408501356001600160401b038111156143a6578283fd5b61404d87828801613d48565b6000806000604084860312156143c6578081fd5b6143cf84613e00565b925060208401356001600160401b038111156142ef578182fd5b600080604083850312156143fb578182fd5b613faf83613e00565b6000815180845261441c816020860160208601614849565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061444a57607f831692505b602080841082141561446a57634e487b7160e01b86526022600452602486fd5b81801561447e576001811461448f576144bc565b60ff198616895284890196506144bc565b60008881526020902060005b868110156144b45781548b82015290850190830161449b565b505084890196505b50505050505092915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b60008251614516818460208701614849565b9190910192915050565b600061452c8286614430565b845161453c818360208901614849565b6139e481830186614430565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612dc090830184614404565b6020808252825182820181905260009190848201906040850190845b818110156119ad576145aa8385516144c8565b9284019260809290920191600101614597565b6020808252825182820181905260009190848201906040850190845b818110156119ad578351835292840192918401916001016145d9565b602081016003831061461757634e487b7160e01b600052602160045260246000fd5b91905290565b60208152600061179f6020830184614404565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252600c908201526b2737ba1030b71030b236b4b760a11b604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60808101610cab82846144c8565b604051601f8201601f191681016001600160401b03811182821017156147bc576147bc61490b565b604052919050565b60006001600160401b038211156147dd576147dd61490b565b5060051b60200190565b600082198211156147fa576147fa6148df565b500190565b60008261480e5761480e6148f5565b500490565b600081600019048311821515161561482d5761482d6148df565b500290565b600082821015614844576148446148df565b500390565b60005b8381101561486457818101518382015260200161484c565b838111156110235750506000910152565b600181811c9082168061488957607f821691505b602082108114156148aa57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148c4576148c46148df565b5060010190565b6000826148da576148da6148f5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116db57600080fd5b80151581146116db57600080fd5b6001600160e01b0319811681146116db57600080fdfe68747470733a2f2f697066732e696f2f697066732f516d537142767534414d74784d67355459727a7848647156584a44326473477136626b4c4a4a4a533773547876522fee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa26469706673582212201ba13f2976c9496379f4c994a1dd63c63c84cc3a0b7412aca6703d9c8f54c47864736f6c63430008040033

Block Age Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Age Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Age Amount
View All Withdrawals

Transaction Hash Block Age Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.