ETH Price: $3,125.04 (+2.40%)
 

Overview

Max Total Supply

0 XENS

Holders

432

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
25 XENS
0xe31cef396369e41aef773fcbdce351b59e7cd205
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
XENStake

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion
File 1 of 38 : XENStake.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.10;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@faircrypto/xen-crypto/contracts/XENCrypto.sol";
import "@faircrypto/xen-crypto/contracts/interfaces/IBurnableToken.sol";
import "@faircrypto/magic-numbers/contracts/MagicNumbers.sol";
import "operator-filter-registry/src/DefaultOperatorFilterer.sol";
import "./libs/ERC2771Context.sol";
import "./interfaces/IERC2771.sol";
import "./libs/StakeInfo.sol";
import "./libs/StakeMetadata.sol";
import "./libs/Array.sol";
import "./interfaces/IXENStake.sol";
import "./interfaces/IXENStakeProxying.sol";
/*
\\ // ||||||||||| |\ || A CRYPTOCURRENCY FOR THE MASSES
\\ // || |\\ ||
\\ // || ||\\ || PRINCIPLES OF XEN:
\\// || || \\ || - No pre-mint; starts with zero supply
XX |||||||| || \\ || - No admin keys
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 38 : StakeSVG.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.10;
import "@openzeppelin/contracts/utils/Strings.sol";
import "./DateTime.sol";
import "./FormattedStrings.sol";
/*
@dev Library to create SVG image for XENFT metadata
@dependency depends on DataTime.sol and StringData.sol libraries
*/
library StakeSVG {
// Type to encode all data params for SVG image generation
struct SvgParams {
string symbol;
address xenAddress;
uint256 tokenId;
uint256 term;
uint256 maturityTs;
uint256 amount;
uint256 apy;
uint256 rarityScore;
uint256 rarityBits;
}
// Type to encode SVG gradient stop color on HSL color scale
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 38 : StakeMetadata.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.10;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "./StakeInfo.sol";
import "./DateTime.sol";
import "./FormattedStrings.sol";
import "./StakeSVG.sol";
/**
@dev Library contains methods to generate on-chain NFT metadata
*/
library StakeMetadata {
using DateTime for uint256;
using StakeInfo for uint256;
using Strings for uint256;
// PRIVATE HELPERS
// The following pure methods returning arrays are workaround to use array constants,
// not yet available in Solidity
/**
@dev private helper to generate SVG gradients
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 38 : StakeInfo.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.10;
// mapping: NFT tokenId => StakeInfo (used in tokenURI generation + other contracts)
// StakeInfo encoded as:
// term (uint16)
// | maturityTs (uint64)
// | amount (uint128) TODO: storing here vs. separately as full uint256 ???
// | apy (uint16)
// | rarityScore (uint16)
// | rarityBits (uint16):
// [15] tokenIdIsPrime
// [14] tokenIdIsFib
// [14] blockIdIsPrime
// [13] blockIdIsFib
// [0-13] ...
library StakeInfo {
/**
@dev helper to convert Bool to U256 type and make compiler happy
*/
// TODO: remove if not needed ???
function toU256(bool x) internal pure returns (uint256 r) {
assembly {
r := x
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 38 : FormattedStrings.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.10;
library FormattedStrings {
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
Base on OpenZeppelin `toString` method from `String` library
*/
function toFormattedString(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++;
temp /= 10;
}
uint256 pos;
uint256 comas = digits / 3;
digits = digits + (digits % 3 == 0 ? comas - 1 : comas);
bytes memory buffer = new bytes(digits);
while (value != 0) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 38 : ERC2771Context.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) (metatx/ERC2771Context.sol)
pragma solidity ^0.8.10;
import "@openzeppelin/contracts/utils/Context.sol";
/**
* @dev Context variant with ERC2771 support.
*/
abstract contract ERC2771Context is Context {
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
// one-time settable var
address internal _trustedForwarder;
/// @custom:oz-upgrades-unsafe-allow constructor
constructor(address trustedForwarder) {
_trustedForwarder = trustedForwarder;
}
function isTrustedForwarder(address forwarder) public view virtual returns (bool) {
return forwarder == _trustedForwarder;
}
function _msgSender() internal view virtual override returns (address sender) {
if (isTrustedForwarder(msg.sender)) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 38 : DateTime.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.10;
import "@openzeppelin/contracts/utils/Strings.sol";
import "./BokkyPooBahsDateTimeLibrary.sol";
/*
@dev Library to convert epoch timestamp to a human-readable Date-Time string
@dependency uses BokkyPooBahsDateTimeLibrary.sol library internally
*/
library DateTime {
using Strings for uint256;
bytes public constant MONTHS = bytes("JanFebMarAprMayJunJulAugSepOctNovDec");
/**
* @dev returns month as short (3-letter) string
*/
function monthAsString(uint256 idx) internal pure returns (string memory) {
require(idx > 0, "bad idx");
bytes memory str = new bytes(3);
uint256 offset = (idx - 1) * 3;
str[0] = bytes1(MONTHS[offset]);
str[1] = bytes1(MONTHS[offset + 1]);
str[2] = bytes1(MONTHS[offset + 2]);
return string(str);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 38 : BokkyPooBahsDateTimeLibrary.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.10;
// ----------------------------------------------------------------------------
// BokkyPooBah's DateTime Library v1.01
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit | Range | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year | 1970 ... 2345 |
// month | 1 ... 12 |
// day | 1 ... 31 |
// hour | 0 ... 23 |
// minute | 0 ... 59 |
// second | 0 ... 59 |
// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 38 : Array.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.10;
library Array {
function idx(uint256[] memory arr, uint256 item) internal pure returns (uint256 i) {
for (i = 1; i <= arr.length; i++) {
if (arr[i - 1] == item) {
return i;
}
}
i = 0;
}
function addItem(uint256[] storage arr, uint256 item) internal {
if (idx(arr, item) == 0) {
arr.push(item);
}
}
function removeItem(uint256[] storage arr, uint256 item) internal {
uint256 i = idx(arr, item);
if (i > 0) {
arr[i - 1] = arr[arr.length - 1];
arr.pop();
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 38 : IXENStakeProxying.sol
1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IXENStakeProxying {
function callStake(uint256 amount, uint256 term) external;
function callTransfer(address to) external;
function callWithdraw() external;
function powerDown() external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 38 : IXENStake.sol
1
2
3
4
5
6
7
8
9
10
11
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IXENStake {
event CreateStake(address indexed user, uint256 indexed tokenId, uint256 amount, uint256 term);
event EndStake(address indexed user, uint256 indexed tokenId);
function createStake(uint256 amount, uint256 term) external returns (uint256);
function endStake(uint256 tokenId) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 38 : IERC2771.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IERC2771 {
function isTrustedForwarder(address forwarder) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 38 : OperatorFilterer.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.13;
import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
/**
* @title OperatorFilterer
* @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
* registrant's entries in the OperatorFilterRegistry.
* @dev This smart contract is meant to be inherited by token contracts so they can use the following:
* - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
* - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
*/
abstract contract OperatorFilterer {
error OperatorNotAllowed(address operator);
IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);
constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
// If an inheriting token contract is deployed to a network without the registry deployed, the modifier
// will not revert, but the contract will need to be registered with the registry once it is deployed in
// order for the modifier to filter addresses.
if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
if (subscribe) {
OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 38 : IOperatorFilterRegistry.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.13;
interface IOperatorFilterRegistry {
function isOperatorAllowed(address registrant, address operator) external view returns (bool);
function register(address registrant) external;
function registerAndSubscribe(address registrant, address subscription) external;
function registerAndCopyEntries(address registrant, address registrantToCopy) external;
function unregister(address addr) external;
function updateOperator(address registrant, address operator, bool filtered) external;
function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
function subscribe(address registrant, address registrantToSubscribe) external;
function unsubscribe(address registrant, bool copyExistingEntries) external;
function subscriptionOf(address addr) external returns (address registrant);
function subscribers(address registrant) external returns (address[] memory);
function subscriberAt(address registrant, uint256 index) external returns (address);
function copyEntriesOf(address registrant, address registrantToCopy) external;
function isOperatorFiltered(address registrant, address operator) external returns (bool);
function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
function filteredOperators(address addr) external returns (address[] memory);
function filteredCodeHashes(address addr) external returns (bytes32[] memory);
function filteredOperatorAt(address registrant, uint256 index) external returns (address);
function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 38 : DefaultOperatorFilterer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {OperatorFilterer} from "./OperatorFilterer.sol";
/**
* @title DefaultOperatorFilterer
* @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
*/
abstract contract DefaultOperatorFilterer is OperatorFilterer {
address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 38 : ABDKMath64x64.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: BSD-4-Clause
/*
* ABDK Math 64.64 Smart Contract Library. Copyright © 2019 by ABDK Consulting.
* Author: Mikhail Vladimirov <mikhail.vladimirov@gmail.com>
*/
pragma solidity ^0.8.0;
/**
* Smart contract library of mathematical functions operating with signed
* 64.64-bit fixed point numbers. Signed 64.64-bit fixed point number is
* basically a simple fraction whose numerator is signed 128-bit integer and
* denominator is 2^64. As long as denominator is always the same, there is no
* need to store it, thus in Solidity signed 64.64-bit fixed point numbers are
* represented by int128 type holding only the numerator.
*/
library ABDKMath64x64 {
/*
* Minimum value signed 64.64-bit fixed point number may have.
*/
int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;
/*
* Maximum value signed 64.64-bit fixed point number may have.
*/
int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

File 21 of 38 : Base64.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/Base64.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides a set of functions to operate with Base64 strings.
*
* _Available since v4.5._
*/
library Base64 {
/**
* @dev Base64 Encoding/Decoding Table
*/
string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* @dev Converts a `bytes` to its Bytes64 `string` representation.
*/
function encode(bytes memory data) internal pure returns (string memory) {
/**
* Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
* https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
*/
if (data.length == 0) return "";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

File 23 of 38 : IERC721Metadata.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/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 38 : IERC721Receiver.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/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 38 : IERC721.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/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 38 : ERC721.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/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

File 30 of 38 : IERC2981.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 38 : IERC165.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 38 : IStakingToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IStakingToken {
event Staked(address indexed user, uint256 amount, uint256 term);
event Withdrawn(address indexed user, uint256 amount, uint256 reward);
function stake(uint256 amount, uint256 term) external;
function withdraw() external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 33 of 38 : IRankedMintingToken.sol
1
2
3
4
5
6
7
8
9
10
11
12
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IRankedMintingToken {
event RankClaimed(address indexed user, uint256 term, uint256 rank);
event MintClaimed(address indexed user, uint256 rewardAmount);
function claimRank(uint256 term) external;
function claimMintReward() external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 34 of 38 : IBurnableToken.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IBurnableToken {
function burn(address user, uint256 amount) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 35 of 38 : IBurnRedeemable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
interface IBurnRedeemable {
event Redeemed(
address indexed user,
address indexed xenContract,
address indexed tokenContract,
uint256 xenAmount,
uint256 tokenAmount
);
function onTokenBurned(address user, uint256 amount) external;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 36 of 38 : XENCrypto.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.10;
import "./Math.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "abdk-libraries-solidity/ABDKMath64x64.sol";
import "./interfaces/IStakingToken.sol";
import "./interfaces/IRankedMintingToken.sol";
import "./interfaces/IBurnableToken.sol";
import "./interfaces/IBurnRedeemable.sol";
contract XENCrypto is Context, IRankedMintingToken, IStakingToken, IBurnableToken, ERC20("XEN Crypto", "XEN") {
using Math for uint256;
using ABDKMath64x64 for int128;
using ABDKMath64x64 for uint256;
// INTERNAL TYPE TO DESCRIBE A XEN MINT INFO
struct MintInfo {
address user;
uint256 term;
uint256 maturityTs;
uint256 rank;
uint256 amplifier;
uint256 eaaRate;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 37 of 38 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
import "abdk-libraries-solidity/ABDKMath64x64.sol";
library Math {
function min(uint256 a, uint256 b) external pure returns (uint256) {
if (a > b) return b;
return a;
}
function max(uint256 a, uint256 b) external pure returns (uint256) {
if (a > b) return a;
return b;
}
function logX64(uint256 x) external pure returns (int128) {
return ABDKMath64x64.log_2(ABDKMath64x64.fromUInt(x));
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 38 of 38 : MagicNumbers.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.10;
/*
\\ // ||||||||||| |\ || A CRYPTOCURRENCY FOR THE MASSES
\\ // || |\\ ||
\\ // || ||\\ || PRINCIPLES OF XEN:
\\// || || \\ || - No pre-mint; starts with zero supply
XX |||||||| || \\ || - No admin keys
//\\ || || \\ || - Immutable contract
// \\ || || \\||
// \\ || || \\|
// \\ ||||||||||| || \| Copyright (C) FairCrypto Foundation 2022-2023
*/
library MagicNumbers {
uint256 constant VERSION = 1;
string public constant AUTHORS = "@MrJackLevin @lbelyaev faircrypto.org";
// There's 370 fibs that fit in uint256 number
uint256 constant MAX_UINT256_FIB_IDX = 370;
// Max fib number that fits into uint256 size
uint256 constant MAX_UINT256_FIB = 94611056096305838013295371573764256526437182762229865607320618320601813254535;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 20
},
"evmVersion": "london",
"libraries": {
"/contracts/libs/StakeInfo.sol": {
"StakeInfo": "0x3c9241461E11817FFc6994af3d467F056f487b67"
},
"/contracts/libs/StakeMetadata.sol": {
"StakeMetadata": "0x4c4CF206465AbFE5cECb3b581fa1b508Ec514692"
},
"@faircrypto/magic-numbers/contracts/MagicNumbers.sol": {
"MagicNumbers": "0xfC0eC2f733Cf35863178fa0DF759c6CE8C38ee7b"
}
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"xenCrypto_","type":"address"},{"internalType":"address","name":"forwarder_","type":"address"},{"internalType":"address","name":"royaltyReceiver_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"term","type":"uint256"}],"name":"CreateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"EndStake","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":[],"name":"AUTHORS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLACKOUT_TERM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_BP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"name":"addForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"term","type":"uint256"}],"name":"callStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"callTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"term","type":"uint256"}],"name":"createStake","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"endStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"powerDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"tokenIdCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xenCrypto","outputs":[{"internalType":"contract XENCrypto","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61010060405260016007553480156200001757600080fd5b5060405162003c2b38038062003c2b8339810160408190526200003a91620002ba565b604080518082018252600981526858454e205374616b6560b81b6020808301919091528251808401909352600483526358454e5360e01b908301529083733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001d35780156200012157604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200010257600080fd5b505af115801562000117573d6000803e3d6000fd5b50505050620001d3565b6001600160a01b03821615620001725760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e7565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001b957600080fd5b505af1158015620001ce573d6000803e3d6000fd5b505050505b5050600080546001600160a01b0319166001600160a01b03929092169190911790556001620002038382620003a9565b506002620002128282620003a9565b5050506001600160a01b0383166200025e5760405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b604482015260640160405180910390fd5b3060a0523360c0526001600160a01b038116156200027d57806200027f565b335b6001600160a01b0390811660e0529290921660805250620004759050565b80516001600160a01b0381168114620002b557600080fd5b919050565b600080600060608486031215620002d057600080fd5b620002db846200029d565b9250620002eb602085016200029d565b9150620002fb604085016200029d565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200032f57607f821691505b6020821081036200035057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a457600081815260208120601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000304565b620003dd81620003d684546200031a565b8462000356565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161372f620004fc600039600061082701526000818161035f01526109fb01526000818161087501528181610ba20152818161125001526113b701526000818161033b0152818161090401528181610f95015281816112c40152818161140e015281816114d601528181611fd4015261275b015261372f6000f3fe608060405234801561001057600080fd5b506004361061019b5760003560e01c80636352211e116100ea5780636352211e1461031057806370a082311461032357806371141a58146103365780638da5cb5b1461035d578063928dd2a71461038357806395d89b411461038b57806398bdf6f5146103935780639dc29fac1461039c578063a126ad1e146103af578063a22cb465146103b7578063b88d4fde146103ca578063ba3ec741146103dd578063c87b56dd146103e5578063d7fa023d146103f8578063dad901be1461040b578063e985e9c514610413578063eec990f21461042657600080fd5b806301ffc9a7146101a0578063044db8ba146101c857806306fdde03146101df578063081812fc146101f4578063095ea7b3146102145780630cbe28d61461022957806319cba6b41461023c57806323b872dd146102515780632a55205a146102645780632ce8faa41461028557806341f434341461029857806342842e0e146102ad5780634e533572146102c0578063572b6c05146102e05780635c41d2fe146102f357806361a52a3614610306575b600080fd5b6101b36101ae366004612e41565b610439565b60405190151581526020015b60405180910390f35b6101d16101f481565b6040519081526020016101bf565b6101e761049a565b6040516101bf9190612eb5565b610207610202366004612ec8565b61052c565b6040516101bf9190612ee1565b610227610222366004612f11565b610553565b005b610227610237366004612ec8565b61056c565b610244610779565b6040516101bf9190612f3b565b61022761025f366004612f7f565b6107fa565b610277610272366004612fbb565b610825565b6040516101bf929190612fdd565b610227610293366004612fbb565b61086a565b6102076daaeb6d7670e522a718067333cd4e81565b6102276102bb366004612f7f565b6109b7565b6101d16102ce366004612ec8565b60086020526000908152604090205481565b6101b36102ee366004612ff6565b6109dc565b610227610301366004612ff6565b6109f0565b6101d16201518081565b61020761031e366004612ec8565b610adc565b6101d1610331366004612ff6565b610b11565b6102077f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000610207565b610227610b97565b6101e7610be3565b6101d160075481565b6102276103aa366004612f11565b610bf2565b6101d1610ee7565b6102276103c536600461301f565b610ef8565b6102276103d83660046130c3565b610f0c565b6101e7610f39565b6101e76103f3366004612ec8565b610f55565b6101d1610406366004612fbb565b6110f3565b610227611245565b6101b361042136600461316d565b61137e565b610227610434366004612ff6565b6113ac565b60006001600160e01b0319821663543746b160e01b148061046a57506001600160e01b0319821663152a902d60e11b145b8061048557506001600160e01b0319821663572b6c0560e01b145b8061049457506104948261158c565b92915050565b6060600180546104a990613197565b80601f01602080910402602001604051908101604052809291908181526020018280546104d590613197565b80156105225780601f106104f757610100808354040283529160200191610522565b820191906000526020600020905b81548152906001019060200180831161050557829003601f168201915b5050505050905090565b6000610537826115dc565b506000908152600560205260409020546001600160a01b031690565b8161055d81611604565b61056783836116b4565b505050565b600081116105ba5760405162461bcd60e51b815260206004820152601660248201527516115391950e88125b1b1959d85b081d1bdad95b925960521b60448201526064015b60405180910390fd5b6105c26117d6565b6001600160a01b03166105d482610adc565b6001600160a01b0316146106235760405162461bcd60e51b81526020600482015260166024820152752c22a7232a1d1024b731b7b93932b1ba1037bbb732b960511b60448201526064016105b1565b60008181526008602052604080822054905163125fb94760e11b81526004810191909152733c9241461e11817ffc6994af3d467f056f487b67906324bf728e90602401602060405180830381865af4158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906131d1565b90508042116106f65760405162461bcd60e51b815260206004820152601b60248201527a16115391950e8813585d1d5c9a5d1e481b9bdd081c995858da1959602a1b60448201526064016105b1565b6106ff826117e5565b61072e826009600061070f6117d6565b6001600160a01b03168152602081019190915260400160002090611a2f565b61073782611b14565b816107406117d6565b6001600160a01b03167f984fff6f629d4293c703ca7d5e13e29fd80eedd0c8e8a04e5772bfa8c40a64a960405160405180910390a35050565b6060600960006107876117d6565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561052257602002820191906000526020600020905b8154815260200190600101908083116107dd575050505050905090565b826001600160a01b03811633146108145761081433611604565b61081f848484611bb1565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000060006127106108576101f485613200565b610861919061322d565b90509250929050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108b25760405162461bcd60e51b81526004016105b190613241565b604051602481018390526044810182905260009060640160408051601f198184030181529181526020820180516001600160e01b03166307b0472f60e41b179052519091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169061093090849061328e565b6000604051808303816000865af19150503d806000811461096d576040519150601f19603f3d011682016040523d82523d6000602084013e610972565b606091505b505090508061081f5760405162461bcd60e51b81526020600482015260116024820152701cdd185ad94818d85b1b0819985a5b1959607a1b60448201526064016105b1565b826001600160a01b03811633146109d1576109d133611604565b61081f848484611be3565b6000546001600160a01b0391821691161490565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a615760405162461bcd60e51b81526020600482015260166024820152752c22a7232a1d103737ba1030b7103232b83637bcb2b960511b60448201526064016105b1565b6000546001600160a01b031615610aba5760405162461bcd60e51b815260206004820152601f60248201527f58454e46543a20466f7277617264657220697320616c7265616479207365740060448201526064016105b1565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260408120546001600160a01b0316806104945760405162461bcd60e51b81526004016105b1906132aa565b60006001600160a01b038216610b7b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105b1565b506001600160a01b031660009081526004602052604090205490565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bdf5760405162461bcd60e51b81526004016105b190613241565b6000ff5b6060600280546104a990613197565b610bfa6117d6565b6040516301ffc9a760e01b815263543746b160e01b60048201526001600160a01b0391909116906301ffc9a790602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b91906132dc565b610cc35760405162461bcd60e51b8152602060048201526024808201527f58454e4654206275726e3a206e6f74206120737570706f7274656420636f6e746044820152631c9858dd60e21b60648201526084016105b1565b6001600160a01b038216610d235760405162461bcd60e51b815260206004820152602160248201527f58454e4654206275726e3a20696c6c6567616c206f776e6572206164647265736044820152607360f81b60648201526084016105b1565b60008111610d715760405162461bcd60e51b815260206004820152601b60248201527a161153919508189d5c9b8e881a5b1b1959d85b081d1bdad95b9259602a1b60448201526064016105b1565b610d82610d7c6117d6565b82611bfe565b610dda5760405162461bcd60e51b8152602060048201526024808201527f58454e4654206275726e3a206e6f7420616e20617070726f766564206f70657260448201526330ba37b960e11b60648201526084016105b1565b816001600160a01b0316610ded82610adc565b6001600160a01b031614610e515760405162461bcd60e51b815260206004820152602560248201527f58454e4654206275726e3a2075736572206973206e6f7420746f6b656e49642060448201526437bbb732b960d91b60648201526084016105b1565b6001600160a01b0382166000908152600960205260409020610e739082611a2f565b610e7c81611b14565b610e846117d6565b6001600160a01b031663543746b183836040518363ffffffff1660e01b8152600401610eb1929190612fdd565b600060405180830381600087803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b505050505050565b610ef5620151806007613200565b81565b81610f0281611604565b6105678383611c5d565b836001600160a01b0381163314610f2657610f2633611604565b610f3285858585611c6f565b5050505050565b6040518060600160405280602581526020016136d56025913981565b600081815260086020526040812054606091610f7084611ca8565b60405163a37ea54960e01b815260048101869052602481018490526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604482015261102790734c4cf206465abfe5cecb3b581fa1b508ec5146929063a37ea54990606401600060405180830381865af4158015610ffa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102291908101906132f9565b611da8565b60405163682ee63560e11b815260048101859052734c4cf206465abfe5cecb3b581fa1b508ec5146929063d05dcc6a90602401600060405180830381865af4158015611077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261109f91908101906132f9565b6040516020016110b19392919061336f565b60405160208183030381529060405290506110cb81611da8565b6040516020016110db919061348a565b60405160208183030381529060405292505050919050565b600080831161113c5760405162461bcd60e51b815260206004820152601560248201527416115391950e88125b1b1959d85b08185b5bdd5b9d605a1b60448201526064016105b1565b600082116111825760405162461bcd60e51b815260206004820152601360248201527258454e46543a20496c6c6567616c207465726d60681b60448201526064016105b1565b61118f8383600754611efa565b6111c0600754600960006111a16117d6565b6001600160a01b0316815260208101919091526040016000209061215c565b6111d36111cb6117d6565b6007546121d4565b506007805490819060006111e6836134cf565b9190505550806111f46117d6565b6001600160a01b03167f7cc860bef2fa56b3d46227731e60b3b6ce0af9627bfdfbeca273f9ea5dae8a188585604051611237929190918252602082015260400190565b60405180910390a392915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461128d5760405162461bcd60e51b81526004016105b190613241565b60408051600481526024810182526020810180516001600160e01b0316633ccfd60b60e01b17905290516000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906112f090849061328e565b6000604051808303816000865af19150503d806000811461132d576040519150601f19603f3d011682016040523d82523d6000602084013e611332565b606091505b505090508061137a5760405162461bcd60e51b81526020600482015260146024820152731dda5d1a191c985dc818d85b1b0819985a5b195960621b60448201526064016105b1565b5050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113f45760405162461bcd60e51b81526004016105b190613241565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611443903090600401612ee1565b602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906131d1565b90506000828260405160240161149b929190612fdd565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052519091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169061150290849061328e565b6000604051808303816000865af19150503d806000811461153f576040519150601f19603f3d011682016040523d82523d6000602084013e611544565b606091505b505090508061081f5760405162461bcd60e51b81526020600482015260146024820152731d1c985b9cd9995c8818d85b1b0819985a5b195960621b60448201526064016105b1565b60006001600160e01b031982166380ac58cd60e01b14806115bd57506001600160e01b03198216635b5e139f60e01b145b8061049457506301ffc9a760e01b6001600160e01b0319831614610494565b6115e5816121ee565b6116015760405162461bcd60e51b81526004016105b1906132aa565b50565b6daaeb6d7670e522a718067333cd4e3b1561160157604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906132dc565b6116015780604051633b79c77360e21b81526004016105b19190612ee1565b60006116bf82610adc565b9050806001600160a01b0316836001600160a01b03160361172c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105b1565b806001600160a01b031661173e6117d6565b6001600160a01b0316148061175a575061175a816104216117d6565b6117cc5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105b1565b610567838361220b565b60006117e0612279565b905090565b60006117ef61229b565b6040805160048152602481019091526020810180516001600160e01b0316636d6c80df60e11b17905290915060006118256117d6565b6040516024016118359190612ee1565b60408051601f19818403018152918152602080830180516001600160e01b03908116637764c87960e11b17909152825160048152602481018452808301805190921663928dd2a760e01b17909152825180830189905283518082038401815281850185528051908401208851898501206001600160f81b03196060808501919091526001600160601b03193090911b166061840152607583018290526095808401919091528551808403909101815260b59092019094528051908301208651949550909390918291600091829182918a0182865af19050806119595760405162461bcd60e51b815260206004820152601e60248201527f58454e46543a204572726f72207768696c65207769746864726177696e67000060448201526064016105b1565b6000808751602089016000865af19050806119b65760405162461bcd60e51b815260206004820152601f60248201527f58454e46543a204572726f72207768696c65207472616e7366657272696e670060448201526064016105b1565b6000808651602088016000865af1905080611a135760405162461bcd60e51b815260206004820181905260248201527f58454e46543a204572726f72207768696c6520706f776572696e6720646f776e60448201526064016105b1565b5050506000958652505060086020525050604082209190915550565b6000611a8a83805480602002602001604051908101604052809291908181526020018280548015611a7f57602002820191906000526020600020905b815481526020019060010190808311611a6b575b5050505050836122fc565b905080156105675782548390611aa2906001906134e8565b81548110611ab257611ab26134fb565b906000526020600020015483600183611acb91906134e8565b81548110611adb57611adb6134fb565b906000526020600020018190555082805480611af957611af9613511565b60019003818190600052602060002001600090559055505050565b6000611b1f82610adc565b9050611b2d8160008461234d565b611b3860008361220b565b6001600160a01b0381166000908152600460205260408120805460019290611b619084906134e8565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416906000805160206136b5833981519152908390a461137a81600084612478565b611bbc610d7c6117d6565b611bd85760405162461bcd60e51b81526004016105b190613527565b6105678383836124bc565b61056783838360405180602001604052806000815250610f0c565b600080611c0a83610adc565b9050806001600160a01b0316846001600160a01b03161480611c315750611c31818561137e565b80611c555750836001600160a01b0316611c4a8461052c565b6001600160a01b0316145b949350505050565b61137a611c686117d6565b8383612657565b611c80611c7a6117d6565b83611bfe565b611c9c5760405162461bcd60e51b81526004016105b190613527565b61081f84848484612721565b606081600003611ccf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cf95780611ce3816134cf565b9150611cf29050600a8361322d565b9150611cd3565b6000816001600160401b03811115611d1357611d13613056565b6040519080825280601f01601f191660200182016040528015611d3d576020820181803683370190505b5090505b8415611c5557611d526001836134e8565b9150611d5f600a86613575565b611d6a906030613589565b60f81b818381518110611d7f57611d7f6134fb565b60200101906001600160f81b031916908160001a905350611da1600a8661322d565b9450611d41565b60608151600003611dc757505060408051602081019091526000815290565b60006040518060600160405280604081526020016136756040913990506000600384516002611df69190613589565b611e00919061322d565b611e0b906004613200565b6001600160401b03811115611e2257611e22613056565b6040519080825280601f01601f191660200182016040528015611e4c576020820181803683370190505b509050600182016020820185865187015b80821015611eb8576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611e5d565b5050600386510660018114611ed45760028114611ee757611eef565b603d6001830353603d6002830353611eef565b603d60018303535b509195945050505050565b6000611f0461229b565b604051602481018690526044810185905290915060009060640160408051601f19818403018152918152602080830180516001600160e01b0316630b3a3ea960e21b17905281519081018690529192506000918291829101604051602081830303815290604052805190602001209050808551602087016000f592506001600160a01b038316611fd25760405162461bcd60e51b815260206004820152601960248201527858454e46543a204572726f72206372656174696e672056535560381b60448201526064016105b1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd6120096117d6565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201529086166024820152604481018b90526064016020604051808303816000875af115801561205e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208291906132dc565b6120da5760405162461bcd60e51b8152602060048201526024808201527f58454e46543a204572726f72207472616e7366657272696e672058454e20746f6044820152632056535560e01b60648201526084016105b1565b6000808551602087016000875af19150816121345760405162461bcd60e51b815260206004820152601a60248201527958454e46543a204572726f72207768696c65207374616b696e6760301b60448201526064016105b1565b61214083878a8a612754565b6000968752600860205260409096209590955550505050505050565b6121b5828054806020026020016040519081016040528092919081815260200182805480156121aa57602002820191906000526020600020905b815481526020019060010190808311612196575b5050505050826122fc565b60000361137a5781546001810183556000928352602090922090910155565b61137a8282604051806020016040528060008152506128ba565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061224082610adc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612284336109dc565b15612296575060131936013560601c90565b503390565b60408051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b60208201526001600160601b03193060601b1660348201526e5af43d82803e903d91602b57fd5bf360881b604882015281516037818303018152605790910190915290565b60015b825181116123445781836123146001846134e8565b81518110612324576123246134fb565b60200260200101510315610494578061233c816134cf565b9150506122ff565b50600092915050565b6001600160a01b038316156105675760008181526008602052604080822054905163125fb94760e11b81526004810191909152733c9241461e11817ffc6994af3d467f056f487b67906324bf728e90602401602060405180830381865af41580156123bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e091906131d1565b905060004282116123fa576123f582426134e8565b612404565b61240442836134e8565b9050612414620151806007613200565b8111610f325760405162461bcd60e51b815260206004820152602d60248201527f58454e46543a207472616e736665722070726f6869626974656420696e20626c60448201526c1858dadbdd5d081c195c9a5bd9609a1b60648201526084016105b1565b6001600160a01b038316600090815260096020526040902061249a9082611a2f565b6001600160a01b0382166000908152600960205260409020610567908261215c565b826001600160a01b03166124cf82610adc565b6001600160a01b0316146125335760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105b1565b6001600160a01b0382166125955760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105b1565b6125a083838361234d565b6125ab60008261220b565b6001600160a01b03831660009081526004602052604081208054600192906125d49084906134e8565b90915550506001600160a01b0382166000908152600460205260408120805460019290612602908490613589565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206136b583398151915291a4610567838383612478565b816001600160a01b0316836001600160a01b0316036126b45760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105b1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61272c8484846124bc565b612738848484846128ed565b61081f5760405162461bcd60e51b81526004016105b19061359c565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da7ad23886040518263ffffffff1660e01b81526004016127a59190612ee1565b608060405180830381865afa1580156127c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e691906135ee565b9350509250506000806127f8886129f5565b9092509050733c9241461e11817ffc6994af3d467f056f487b6763814226dd878661282b670de0b6b3a76400008c61322d565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606481018690526084810185905260a4810184905260c401602060405180830381865af4158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad91906131d1565b9998505050505050505050565b6128c48383612cf7565b6128d160008484846128ed565b6105675760405162461bcd60e51b81526004016105b19061359c565b60006001600160a01b0384163b156129ea57836001600160a01b031663150b7a026129166117d6565b8786866040518563ffffffff1660e01b81526004016129389493929190613624565b6020604051808303816000875af1925050508015612973575060408051601f3d908101601f1916820190925261297091810190613657565b60015b6129d0573d8080156129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b5080516000036129c85760405162461bcd60e51b81526004016105b19061359c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c55565b506001949350505050565b60405163109c0d2560e21b8152600481018290526000908190819073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b90634270349490602401602060405180830381865af4158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7091906132dc565b604051634a0e40a160e11b81526004810186905290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b9063941c814290602401602060405180830381865af4158015612ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aea91906132dc565b60405163109c0d2560e21b815243600482015290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b90634270349490602401602060405180830381865af4158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906132dc565b604051634a0e40a160e11b815243600482015290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b9063941c814290602401602060405180830381865af4158015612bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bdc91906132dc565b905083612bea576000612bee565b6101f45b612bfc9061ffff1687613589565b955081612c0a576000612c0e565b6103e85b612c1c9061ffff1687613589565b955082612c2a576000612c2e565b6113885b612c3c9061ffff1687613589565b955080612c4a576000612c4e565b6127105b612c5c9061ffff1687613589565b60405163395e488160e01b81528515156004820152841515602482015283151560448201528215156064820152909650733c9241461e11817ffc6994af3d467f056f487b679063395e488190608401602060405180830381865af4158015612cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cec91906131d1565b945050505050915091565b6001600160a01b038216612d4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105b1565b612d56816121ee565b15612da25760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016105b1565b612dae6000838361234d565b6001600160a01b0382166000908152600460205260408120805460019290612dd7908490613589565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206136b5833981519152908290a461137a60008383612478565b6001600160e01b03198116811461160157600080fd5b600060208284031215612e5357600080fd5b8135612e5e81612e2b565b9392505050565b60005b83811015612e80578181015183820152602001612e68565b50506000910152565b60008151808452612ea1816020860160208601612e65565b601f01601f19169290920160200192915050565b602081526000612e5e6020830184612e89565b600060208284031215612eda57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612f0c57600080fd5b919050565b60008060408385031215612f2457600080fd5b612f2d83612ef5565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7357835183529284019291840191600101612f57565b50909695505050505050565b600080600060608486031215612f9457600080fd5b612f9d84612ef5565b9250612fab60208501612ef5565b9150604084013590509250925092565b60008060408385031215612fce57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60006020828403121561300857600080fd5b612e5e82612ef5565b801515811461160157600080fd5b6000806040838503121561303257600080fd5b61303b83612ef5565b9150602083013561304b81613011565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561309457613094613056565b604052919050565b60006001600160401b038211156130b5576130b5613056565b50601f01601f191660200190565b600080600080608085870312156130d957600080fd5b6130e285612ef5565b93506130f060208601612ef5565b92506040850135915060608501356001600160401b0381111561311257600080fd5b8501601f8101871361312357600080fd5b80356131366131318261309c565b61306c565b81815288602083850101111561314b57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561318057600080fd5b61318983612ef5565b915061086160208401612ef5565b600181811c908216806131ab57607f821691505b6020821081036131cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156131e357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610494576104946131ea565b634e487b7160e01b600052601260045260246000fd5b60008261323c5761323c613217565b500490565b60208082526017908201527616115388141c9bde1e4e881d5b985d5d1a1bdc9a5e9959604a1b604082015260600190565b60008151613284818560208601612e65565b9290920192915050565b600082516132a0818460208701612e65565b9190910192915050565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b6000602082840312156132ee57600080fd5b8151612e5e81613011565b60006020828403121561330b57600080fd5b81516001600160401b0381111561332157600080fd5b8201601f8101841361333257600080fd5b80516133406131318261309c565b81815285602083850101111561335557600080fd5b613366826020830160208601612e65565b95945050505050565b607b60f81b815273226e616d65223a202258454e205374616b65202360601b600182015283516000906133a9816015850160208901612e65565b61088b60f21b60159184019182018190527f226465736372697074696f6e223a202258454e46543a2058454e2043727970746017830152711bc8141c9bdbd98813d98814dd185ad9488b60721b6037830152691134b6b0b3b2911d101160b11b60498301527919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b6053830152855161344481606d850160208a01612e65565b606d9201918201526d01130ba3a3934b13aba32b9911d160951b606f820152613480613473607d830186613272565b607d60f81b815260010190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134c281601d850160208701612e65565b91909101601d0192915050565b6000600182016134e1576134e16131ea565b5060010190565b81810381811115610494576104946131ea565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008261358457613584613217565b500690565b80820180821115610494576104946131ea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000806000806080858703121561360457600080fd5b505082516020840151604085015160609095015191969095509092509050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061348090830184612e89565b60006020828403121561366957600080fd5b8151612e5e81612e2b56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef404d724a61636b4c6576696e20406c62656c79616576206661697263727970746f2e6f7267a26469706673582212203001331f9d71c48cb2acfaef9456cc6404a1aa561f86d62bedf86f25363376c464736f6c6343000811003300000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000003903b9cfa1680ed9663ecec7d3412305bebe326f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061019b5760003560e01c80636352211e116100ea5780636352211e1461031057806370a082311461032357806371141a58146103365780638da5cb5b1461035d578063928dd2a71461038357806395d89b411461038b57806398bdf6f5146103935780639dc29fac1461039c578063a126ad1e146103af578063a22cb465146103b7578063b88d4fde146103ca578063ba3ec741146103dd578063c87b56dd146103e5578063d7fa023d146103f8578063dad901be1461040b578063e985e9c514610413578063eec990f21461042657600080fd5b806301ffc9a7146101a0578063044db8ba146101c857806306fdde03146101df578063081812fc146101f4578063095ea7b3146102145780630cbe28d61461022957806319cba6b41461023c57806323b872dd146102515780632a55205a146102645780632ce8faa41461028557806341f434341461029857806342842e0e146102ad5780634e533572146102c0578063572b6c05146102e05780635c41d2fe146102f357806361a52a3614610306575b600080fd5b6101b36101ae366004612e41565b610439565b60405190151581526020015b60405180910390f35b6101d16101f481565b6040519081526020016101bf565b6101e761049a565b6040516101bf9190612eb5565b610207610202366004612ec8565b61052c565b6040516101bf9190612ee1565b610227610222366004612f11565b610553565b005b610227610237366004612ec8565b61056c565b610244610779565b6040516101bf9190612f3b565b61022761025f366004612f7f565b6107fa565b610277610272366004612fbb565b610825565b6040516101bf929190612fdd565b610227610293366004612fbb565b61086a565b6102076daaeb6d7670e522a718067333cd4e81565b6102276102bb366004612f7f565b6109b7565b6101d16102ce366004612ec8565b60086020526000908152604090205481565b6101b36102ee366004612ff6565b6109dc565b610227610301366004612ff6565b6109f0565b6101d16201518081565b61020761031e366004612ec8565b610adc565b6101d1610331366004612ff6565b610b11565b6102077f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb881565b7f000000000000000000000000c73fc08c931efe3fce850c09278472e8a81c2e05610207565b610227610b97565b6101e7610be3565b6101d160075481565b6102276103aa366004612f11565b610bf2565b6101d1610ee7565b6102276103c536600461301f565b610ef8565b6102276103d83660046130c3565b610f0c565b6101e7610f39565b6101e76103f3366004612ec8565b610f55565b6101d1610406366004612fbb565b6110f3565b610227611245565b6101b361042136600461316d565b61137e565b610227610434366004612ff6565b6113ac565b60006001600160e01b0319821663543746b160e01b148061046a57506001600160e01b0319821663152a902d60e11b145b8061048557506001600160e01b0319821663572b6c0560e01b145b8061049457506104948261158c565b92915050565b6060600180546104a990613197565b80601f01602080910402602001604051908101604052809291908181526020018280546104d590613197565b80156105225780601f106104f757610100808354040283529160200191610522565b820191906000526020600020905b81548152906001019060200180831161050557829003601f168201915b5050505050905090565b6000610537826115dc565b506000908152600560205260409020546001600160a01b031690565b8161055d81611604565b61056783836116b4565b505050565b600081116105ba5760405162461bcd60e51b815260206004820152601660248201527516115391950e88125b1b1959d85b081d1bdad95b925960521b60448201526064015b60405180910390fd5b6105c26117d6565b6001600160a01b03166105d482610adc565b6001600160a01b0316146106235760405162461bcd60e51b81526020600482015260166024820152752c22a7232a1d1024b731b7b93932b1ba1037bbb732b960511b60448201526064016105b1565b60008181526008602052604080822054905163125fb94760e11b81526004810191909152733c9241461e11817ffc6994af3d467f056f487b67906324bf728e90602401602060405180830381865af4158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a791906131d1565b90508042116106f65760405162461bcd60e51b815260206004820152601b60248201527a16115391950e8813585d1d5c9a5d1e481b9bdd081c995858da1959602a1b60448201526064016105b1565b6106ff826117e5565b61072e826009600061070f6117d6565b6001600160a01b03168152602081019190915260400160002090611a2f565b61073782611b14565b816107406117d6565b6001600160a01b03167f984fff6f629d4293c703ca7d5e13e29fd80eedd0c8e8a04e5772bfa8c40a64a960405160405180910390a35050565b6060600960006107876117d6565b6001600160a01b03166001600160a01b0316815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561052257602002820191906000526020600020905b8154815260200190600101908083116107dd575050505050905090565b826001600160a01b03811633146108145761081433611604565b61081f848484611bb1565b50505050565b7f0000000000000000000000003903b9cfa1680ed9663ecec7d3412305bebe326f60006127106108576101f485613200565b610861919061322d565b90509250929050565b336001600160a01b037f000000000000000000000000feda03b91514d31b435d4e1519fd9e699c29bbfc16146108b25760405162461bcd60e51b81526004016105b190613241565b604051602481018390526044810182905260009060640160408051601f198184030181529181526020820180516001600160e01b03166307b0472f60e41b179052519091506000906001600160a01b037f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8169061093090849061328e565b6000604051808303816000865af19150503d806000811461096d576040519150601f19603f3d011682016040523d82523d6000602084013e610972565b606091505b505090508061081f5760405162461bcd60e51b81526020600482015260116024820152701cdd185ad94818d85b1b0819985a5b1959607a1b60448201526064016105b1565b826001600160a01b03811633146109d1576109d133611604565b61081f848484611be3565b6000546001600160a01b0391821691161490565b336001600160a01b037f000000000000000000000000c73fc08c931efe3fce850c09278472e8a81c2e051614610a615760405162461bcd60e51b81526020600482015260166024820152752c22a7232a1d103737ba1030b7103232b83637bcb2b960511b60448201526064016105b1565b6000546001600160a01b031615610aba5760405162461bcd60e51b815260206004820152601f60248201527f58454e46543a20466f7277617264657220697320616c7265616479207365740060448201526064016105b1565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260408120546001600160a01b0316806104945760405162461bcd60e51b81526004016105b1906132aa565b60006001600160a01b038216610b7b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105b1565b506001600160a01b031660009081526004602052604090205490565b336001600160a01b037f000000000000000000000000feda03b91514d31b435d4e1519fd9e699c29bbfc1614610bdf5760405162461bcd60e51b81526004016105b190613241565b6000ff5b6060600280546104a990613197565b610bfa6117d6565b6040516301ffc9a760e01b815263543746b160e01b60048201526001600160a01b0391909116906301ffc9a790602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b91906132dc565b610cc35760405162461bcd60e51b8152602060048201526024808201527f58454e4654206275726e3a206e6f74206120737570706f7274656420636f6e746044820152631c9858dd60e21b60648201526084016105b1565b6001600160a01b038216610d235760405162461bcd60e51b815260206004820152602160248201527f58454e4654206275726e3a20696c6c6567616c206f776e6572206164647265736044820152607360f81b60648201526084016105b1565b60008111610d715760405162461bcd60e51b815260206004820152601b60248201527a161153919508189d5c9b8e881a5b1b1959d85b081d1bdad95b9259602a1b60448201526064016105b1565b610d82610d7c6117d6565b82611bfe565b610dda5760405162461bcd60e51b8152602060048201526024808201527f58454e4654206275726e3a206e6f7420616e20617070726f766564206f70657260448201526330ba37b960e11b60648201526084016105b1565b816001600160a01b0316610ded82610adc565b6001600160a01b031614610e515760405162461bcd60e51b815260206004820152602560248201527f58454e4654206275726e3a2075736572206973206e6f7420746f6b656e49642060448201526437bbb732b960d91b60648201526084016105b1565b6001600160a01b0382166000908152600960205260409020610e739082611a2f565b610e7c81611b14565b610e846117d6565b6001600160a01b031663543746b183836040518363ffffffff1660e01b8152600401610eb1929190612fdd565b600060405180830381600087803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b505050505050565b610ef5620151806007613200565b81565b81610f0281611604565b6105678383611c5d565b836001600160a01b0381163314610f2657610f2633611604565b610f3285858585611c6f565b5050505050565b6040518060600160405280602581526020016136d56025913981565b600081815260086020526040812054606091610f7084611ca8565b60405163a37ea54960e01b815260048101869052602481018490526001600160a01b037f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb816604482015261102790734c4cf206465abfe5cecb3b581fa1b508ec5146929063a37ea54990606401600060405180830381865af4158015610ffa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261102291908101906132f9565b611da8565b60405163682ee63560e11b815260048101859052734c4cf206465abfe5cecb3b581fa1b508ec5146929063d05dcc6a90602401600060405180830381865af4158015611077573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261109f91908101906132f9565b6040516020016110b19392919061336f565b60405160208183030381529060405290506110cb81611da8565b6040516020016110db919061348a565b60405160208183030381529060405292505050919050565b600080831161113c5760405162461bcd60e51b815260206004820152601560248201527416115391950e88125b1b1959d85b08185b5bdd5b9d605a1b60448201526064016105b1565b600082116111825760405162461bcd60e51b815260206004820152601360248201527258454e46543a20496c6c6567616c207465726d60681b60448201526064016105b1565b61118f8383600754611efa565b6111c0600754600960006111a16117d6565b6001600160a01b0316815260208101919091526040016000209061215c565b6111d36111cb6117d6565b6007546121d4565b506007805490819060006111e6836134cf565b9190505550806111f46117d6565b6001600160a01b03167f7cc860bef2fa56b3d46227731e60b3b6ce0af9627bfdfbeca273f9ea5dae8a188585604051611237929190918252602082015260400190565b60405180910390a392915050565b336001600160a01b037f000000000000000000000000feda03b91514d31b435d4e1519fd9e699c29bbfc161461128d5760405162461bcd60e51b81526004016105b190613241565b60408051600481526024810182526020810180516001600160e01b0316633ccfd60b60e01b17905290516000906001600160a01b037f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb816906112f090849061328e565b6000604051808303816000865af19150503d806000811461132d576040519150601f19603f3d011682016040523d82523d6000602084013e611332565b606091505b505090508061137a5760405162461bcd60e51b81526020600482015260146024820152731dda5d1a191c985dc818d85b1b0819985a5b195960621b60448201526064016105b1565b5050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336001600160a01b037f000000000000000000000000feda03b91514d31b435d4e1519fd9e699c29bbfc16146113f45760405162461bcd60e51b81526004016105b190613241565b6040516370a0823160e01b81526000906001600160a01b037f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb816906370a0823190611443903090600401612ee1565b602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906131d1565b90506000828260405160240161149b929190612fdd565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052519091506000906001600160a01b037f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8169061150290849061328e565b6000604051808303816000865af19150503d806000811461153f576040519150601f19603f3d011682016040523d82523d6000602084013e611544565b606091505b505090508061081f5760405162461bcd60e51b81526020600482015260146024820152731d1c985b9cd9995c8818d85b1b0819985a5b195960621b60448201526064016105b1565b60006001600160e01b031982166380ac58cd60e01b14806115bd57506001600160e01b03198216635b5e139f60e01b145b8061049457506301ffc9a760e01b6001600160e01b0319831614610494565b6115e5816121ee565b6116015760405162461bcd60e51b81526004016105b1906132aa565b50565b6daaeb6d7670e522a718067333cd4e3b1561160157604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611671573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169591906132dc565b6116015780604051633b79c77360e21b81526004016105b19190612ee1565b60006116bf82610adc565b9050806001600160a01b0316836001600160a01b03160361172c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105b1565b806001600160a01b031661173e6117d6565b6001600160a01b0316148061175a575061175a816104216117d6565b6117cc5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105b1565b610567838361220b565b60006117e0612279565b905090565b60006117ef61229b565b6040805160048152602481019091526020810180516001600160e01b0316636d6c80df60e11b17905290915060006118256117d6565b6040516024016118359190612ee1565b60408051601f19818403018152918152602080830180516001600160e01b03908116637764c87960e11b17909152825160048152602481018452808301805190921663928dd2a760e01b17909152825180830189905283518082038401815281850185528051908401208851898501206001600160f81b03196060808501919091526001600160601b03193090911b166061840152607583018290526095808401919091528551808403909101815260b59092019094528051908301208651949550909390918291600091829182918a0182865af19050806119595760405162461bcd60e51b815260206004820152601e60248201527f58454e46543a204572726f72207768696c65207769746864726177696e67000060448201526064016105b1565b6000808751602089016000865af19050806119b65760405162461bcd60e51b815260206004820152601f60248201527f58454e46543a204572726f72207768696c65207472616e7366657272696e670060448201526064016105b1565b6000808651602088016000865af1905080611a135760405162461bcd60e51b815260206004820181905260248201527f58454e46543a204572726f72207768696c6520706f776572696e6720646f776e60448201526064016105b1565b5050506000958652505060086020525050604082209190915550565b6000611a8a83805480602002602001604051908101604052809291908181526020018280548015611a7f57602002820191906000526020600020905b815481526020019060010190808311611a6b575b5050505050836122fc565b905080156105675782548390611aa2906001906134e8565b81548110611ab257611ab26134fb565b906000526020600020015483600183611acb91906134e8565b81548110611adb57611adb6134fb565b906000526020600020018190555082805480611af957611af9613511565b60019003818190600052602060002001600090559055505050565b6000611b1f82610adc565b9050611b2d8160008461234d565b611b3860008361220b565b6001600160a01b0381166000908152600460205260408120805460019290611b619084906134e8565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416906000805160206136b5833981519152908390a461137a81600084612478565b611bbc610d7c6117d6565b611bd85760405162461bcd60e51b81526004016105b190613527565b6105678383836124bc565b61056783838360405180602001604052806000815250610f0c565b600080611c0a83610adc565b9050806001600160a01b0316846001600160a01b03161480611c315750611c31818561137e565b80611c555750836001600160a01b0316611c4a8461052c565b6001600160a01b0316145b949350505050565b61137a611c686117d6565b8383612657565b611c80611c7a6117d6565b83611bfe565b611c9c5760405162461bcd60e51b81526004016105b190613527565b61081f84848484612721565b606081600003611ccf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cf95780611ce3816134cf565b9150611cf29050600a8361322d565b9150611cd3565b6000816001600160401b03811115611d1357611d13613056565b6040519080825280601f01601f191660200182016040528015611d3d576020820181803683370190505b5090505b8415611c5557611d526001836134e8565b9150611d5f600a86613575565b611d6a906030613589565b60f81b818381518110611d7f57611d7f6134fb565b60200101906001600160f81b031916908160001a905350611da1600a8661322d565b9450611d41565b60608151600003611dc757505060408051602081019091526000815290565b60006040518060600160405280604081526020016136756040913990506000600384516002611df69190613589565b611e00919061322d565b611e0b906004613200565b6001600160401b03811115611e2257611e22613056565b6040519080825280601f01601f191660200182016040528015611e4c576020820181803683370190505b509050600182016020820185865187015b80821015611eb8576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611e5d565b5050600386510660018114611ed45760028114611ee757611eef565b603d6001830353603d6002830353611eef565b603d60018303535b509195945050505050565b6000611f0461229b565b604051602481018690526044810185905290915060009060640160408051601f19818403018152918152602080830180516001600160e01b0316630b3a3ea960e21b17905281519081018690529192506000918291829101604051602081830303815290604052805190602001209050808551602087016000f592506001600160a01b038316611fd25760405162461bcd60e51b815260206004820152601960248201527858454e46543a204572726f72206372656174696e672056535560381b60448201526064016105b1565b7f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb86001600160a01b03166323b872dd6120096117d6565b6040516001600160e01b031960e084901b1681526001600160a01b0391821660048201529086166024820152604481018b90526064016020604051808303816000875af115801561205e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208291906132dc565b6120da5760405162461bcd60e51b8152602060048201526024808201527f58454e46543a204572726f72207472616e7366657272696e672058454e20746f6044820152632056535560e01b60648201526084016105b1565b6000808551602087016000875af19150816121345760405162461bcd60e51b815260206004820152601a60248201527958454e46543a204572726f72207768696c65207374616b696e6760301b60448201526064016105b1565b61214083878a8a612754565b6000968752600860205260409096209590955550505050505050565b6121b5828054806020026020016040519081016040528092919081815260200182805480156121aa57602002820191906000526020600020905b815481526020019060010190808311612196575b5050505050826122fc565b60000361137a5781546001810183556000928352602090922090910155565b61137a8282604051806020016040528060008152506128ba565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061224082610adc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612284336109dc565b15612296575060131936013560601c90565b503390565b60408051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b60208201526001600160601b03193060601b1660348201526e5af43d82803e903d91602b57fd5bf360881b604882015281516037818303018152605790910190915290565b60015b825181116123445781836123146001846134e8565b81518110612324576123246134fb565b60200260200101510315610494578061233c816134cf565b9150506122ff565b50600092915050565b6001600160a01b038316156105675760008181526008602052604080822054905163125fb94760e11b81526004810191909152733c9241461e11817ffc6994af3d467f056f487b67906324bf728e90602401602060405180830381865af41580156123bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e091906131d1565b905060004282116123fa576123f582426134e8565b612404565b61240442836134e8565b9050612414620151806007613200565b8111610f325760405162461bcd60e51b815260206004820152602d60248201527f58454e46543a207472616e736665722070726f6869626974656420696e20626c60448201526c1858dadbdd5d081c195c9a5bd9609a1b60648201526084016105b1565b6001600160a01b038316600090815260096020526040902061249a9082611a2f565b6001600160a01b0382166000908152600960205260409020610567908261215c565b826001600160a01b03166124cf82610adc565b6001600160a01b0316146125335760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105b1565b6001600160a01b0382166125955760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105b1565b6125a083838361234d565b6125ab60008261220b565b6001600160a01b03831660009081526004602052604081208054600192906125d49084906134e8565b90915550506001600160a01b0382166000908152600460205260408120805460019290612602908490613589565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206136b583398151915291a4610567838383612478565b816001600160a01b0316836001600160a01b0316036126b45760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b60448201526064016105b1565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61272c8484846124bc565b612738848484846128ed565b61081f5760405162461bcd60e51b81526004016105b19061359c565b60008060007f00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb86001600160a01b0316638da7ad23886040518263ffffffff1660e01b81526004016127a59190612ee1565b608060405180830381865afa1580156127c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e691906135ee565b9350509250506000806127f8886129f5565b9092509050733c9241461e11817ffc6994af3d467f056f487b6763814226dd878661282b670de0b6b3a76400008c61322d565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606481018690526084810185905260a4810184905260c401602060405180830381865af4158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad91906131d1565b9998505050505050505050565b6128c48383612cf7565b6128d160008484846128ed565b6105675760405162461bcd60e51b81526004016105b19061359c565b60006001600160a01b0384163b156129ea57836001600160a01b031663150b7a026129166117d6565b8786866040518563ffffffff1660e01b81526004016129389493929190613624565b6020604051808303816000875af1925050508015612973575060408051601f3d908101601f1916820190925261297091810190613657565b60015b6129d0573d8080156129a1576040519150601f19603f3d011682016040523d82523d6000602084013e6129a6565b606091505b5080516000036129c85760405162461bcd60e51b81526004016105b19061359c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c55565b506001949350505050565b60405163109c0d2560e21b8152600481018290526000908190819073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b90634270349490602401602060405180830381865af4158015612a4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7091906132dc565b604051634a0e40a160e11b81526004810186905290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b9063941c814290602401602060405180830381865af4158015612ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aea91906132dc565b60405163109c0d2560e21b815243600482015290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b90634270349490602401602060405180830381865af4158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906132dc565b604051634a0e40a160e11b815243600482015290915060009073fc0ec2f733cf35863178fa0df759c6ce8c38ee7b9063941c814290602401602060405180830381865af4158015612bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bdc91906132dc565b905083612bea576000612bee565b6101f45b612bfc9061ffff1687613589565b955081612c0a576000612c0e565b6103e85b612c1c9061ffff1687613589565b955082612c2a576000612c2e565b6113885b612c3c9061ffff1687613589565b955080612c4a576000612c4e565b6127105b612c5c9061ffff1687613589565b60405163395e488160e01b81528515156004820152841515602482015283151560448201528215156064820152909650733c9241461e11817ffc6994af3d467f056f487b679063395e488190608401602060405180830381865af4158015612cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cec91906131d1565b945050505050915091565b6001600160a01b038216612d4d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105b1565b612d56816121ee565b15612da25760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b60448201526064016105b1565b612dae6000838361234d565b6001600160a01b0382166000908152600460205260408120805460019290612dd7908490613589565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206136b5833981519152908290a461137a60008383612478565b6001600160e01b03198116811461160157600080fd5b600060208284031215612e5357600080fd5b8135612e5e81612e2b565b9392505050565b60005b83811015612e80578181015183820152602001612e68565b50506000910152565b60008151808452612ea1816020860160208601612e65565b601f01601f19169290920160200192915050565b602081526000612e5e6020830184612e89565b600060208284031215612eda57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612f0c57600080fd5b919050565b60008060408385031215612f2457600080fd5b612f2d83612ef5565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7357835183529284019291840191600101612f57565b50909695505050505050565b600080600060608486031215612f9457600080fd5b612f9d84612ef5565b9250612fab60208501612ef5565b9150604084013590509250925092565b60008060408385031215612fce57600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60006020828403121561300857600080fd5b612e5e82612ef5565b801515811461160157600080fd5b6000806040838503121561303257600080fd5b61303b83612ef5565b9150602083013561304b81613011565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561309457613094613056565b604052919050565b60006001600160401b038211156130b5576130b5613056565b50601f01601f191660200190565b600080600080608085870312156130d957600080fd5b6130e285612ef5565b93506130f060208601612ef5565b92506040850135915060608501356001600160401b0381111561311257600080fd5b8501601f8101871361312357600080fd5b80356131366131318261309c565b61306c565b81815288602083850101111561314b57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561318057600080fd5b61318983612ef5565b915061086160208401612ef5565b600181811c908216806131ab57607f821691505b6020821081036131cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156131e357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610494576104946131ea565b634e487b7160e01b600052601260045260246000fd5b60008261323c5761323c613217565b500490565b60208082526017908201527616115388141c9bde1e4e881d5b985d5d1a1bdc9a5e9959604a1b604082015260600190565b60008151613284818560208601612e65565b9290920192915050565b600082516132a0818460208701612e65565b9190910192915050565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b6000602082840312156132ee57600080fd5b8151612e5e81613011565b60006020828403121561330b57600080fd5b81516001600160401b0381111561332157600080fd5b8201601f8101841361333257600080fd5b80516133406131318261309c565b81815285602083850101111561335557600080fd5b613366826020830160208601612e65565b95945050505050565b607b60f81b815273226e616d65223a202258454e205374616b65202360601b600182015283516000906133a9816015850160208901612e65565b61088b60f21b60159184019182018190527f226465736372697074696f6e223a202258454e46543a2058454e2043727970746017830152711bc8141c9bdbd98813d98814dd185ad9488b60721b6037830152691134b6b0b3b2911d101160b11b60498301527919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b6053830152855161344481606d850160208a01612e65565b606d9201918201526d01130ba3a3934b13aba32b9911d160951b606f820152613480613473607d830186613272565b607d60f81b815260010190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516134c281601d850160208701612e65565b91909101601d0192915050565b6000600182016134e1576134e16131ea565b5060010190565b81810381811115610494576104946131ea565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008261358457613584613217565b500690565b80820180821115610494576104946131ea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000806000806080858703121561360457600080fd5b505082516020840151604085015160609095015191969095509092509050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061348090830184612e89565b60006020828403121561366957600080fd5b8151612e5e81612e2b56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef404d724a61636b4c6576696e20406c62656c79616576206661697263727970746f2e6f7267a26469706673582212203001331f9d71c48cb2acfaef9456cc6404a1aa561f86d62bedf86f25363376c464736f6c63430008110033

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

00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000003903b9cfa1680ed9663ecec7d3412305bebe326f

-----Decoded View---------------
Arg [0] : xenCrypto_ (address): 0x06450dEe7FD2Fb8E39061434BAbCFC05599a6Fb8
Arg [1] : forwarder_ (address): 0x0000000000000000000000000000000000000000
Arg [2] : royaltyReceiver_ (address): 0x3903b9Cfa1680ed9663eCec7d3412305bEBE326f

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000003903b9cfa1680ed9663ecec7d3412305bebe326f


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.