Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 7 from a total of 7 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Allowlist Mint | 16685617 | 1119 days ago | IN | 0 ETH | 0.00937965 | ||||
| Allowlist Mint | 16685171 | 1119 days ago | IN | 0 ETH | 0.00772548 | ||||
| Set Allowlist Si... | 16649588 | 1124 days ago | IN | 0 ETH | 0.00115519 | ||||
| Allowlist Mint | 16450641 | 1152 days ago | IN | 0 ETH | 0.00401968 | ||||
| Set Allowlist Si... | 16450620 | 1152 days ago | IN | 0 ETH | 0.00087597 | ||||
| Unpause | 16447512 | 1152 days ago | IN | 0 ETH | 0.0003983 | ||||
| Set Allowlist Si... | 16447510 | 1152 days ago | IN | 0 ETH | 0.00067318 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ScoutTesting
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-01-20
*/
// File: contracts/Utils.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <brecht@loopring.org>
library Utils {
bytes internal constant TABLE =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/// @notice Encodes some bytes to the base64 representation
function base64Encode(bytes memory data)
internal
pure
returns (string memory)
{
uint256 len = data.length;
if (len == 0) return "";
// multiply by 4/3 rounded up
uint256 encodedLen = 4 * ((len + 2) / 3);
// Add some extra buffer at the end
bytes memory result = new bytes(encodedLen + 32);
bytes memory table = TABLE;
assembly {
let tablePtr := add(table, 1)
let resultPtr := add(result, 32)
for {
let i := 0
} lt(i, len) {
} {
i := add(i, 3)
let input := and(mload(add(data, i)), 0xffffff)
let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
out := shl(8, out)
out := add(
out,
and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
)
out := shl(8, out)
out := add(
out,
and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
)
out := shl(8, out)
out := add(
out,
and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
)
out := shl(224, out)
mstore(resultPtr, out)
resultPtr := add(resultPtr, 4)
}
switch mod(len, 3)
case 1 {
mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
}
case 2 {
mstore(sub(resultPtr, 1), shl(248, 0x3d))
}
mstore(result, encodedLen)
}
return string(result);
}
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT license
// 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;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function strlen(string memory s) internal pure returns (uint256) {
uint256 len;
uint256 i = 0;
uint256 bytelength = bytes(s).length;
for (len = 0; i < bytelength; len++) {
bytes1 b = bytes(s)[i];
if (b < 0x80) {
i += 1;
} else if (b < 0xE0) {
i += 2;
} else if (b < 0xF0) {
i += 3;
} else if (b < 0xF8) {
i += 4;
} else if (b < 0xFC) {
i += 5;
} else {
i += 6;
}
}
return len;
}
}
// File: contracts/TokenRenderer.sol
pragma solidity ^0.8.4;
interface TokenRenderer {
function getTokenURI(uint256 tokenId, string memory name)
external
view
returns (string memory);
}
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}
// File: @openzeppelin/contracts/utils/Strings.sol
// 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++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// 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;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: contracts/SignedAllowlists.sol
pragma solidity ^0.8.0;
contract SignedAllowlists is Ownable {
using ECDSA for bytes32;
// The key used to sign Allowlist signatures.
// We will check to ensure that the key that signed the signature
// is this one that we expect.
address AllowlistSigningKey = address(0);
// Domain Separator is the EIP-712 defined structure that defines what contract
// and chain these signatures can be used for. This ensures people can't take
// a signature used to mint on one contract and use it for another, or a signature
// from testnet to replay on mainnet.
// It has to be created in the constructor so we can dynamically grab the chainId.
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#definition-of-domainseparator
bytes32 public DOMAIN_SEPARATOR;
// The typehash for the data type specified in the structured data
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale-for-typehash
// This should match whats in the client side Allowlist signing code
// https://github.com/msfeldstein/EIP712-Allowlisting/blob/main/test/signAllowlist.ts#L22
bytes32 public constant MINTER_TYPEHASH =
keccak256("Minter(address wallet)");
constructor(string memory name_) {
// This should match whats in the client side Allowlist signing code
// https://github.com/msfeldstein/EIP712-Allowlisting/blob/main/test/signAllowlist.ts#L12
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
),
// This should match the domain you set in your client side signing.
keccak256(bytes(name_)),
keccak256(bytes("1")),
block.chainid,
address(this)
)
);
}
function setAllowlistSigningAddress(address newSigningKey)
public
onlyOwner
{
AllowlistSigningKey = newSigningKey;
}
modifier requiresAllowlist(bytes calldata signature) {
require(AllowlistSigningKey != address(0), "Allowlist not enabled");
// Verify EIP-712 signature by recreating the data structure
// that we signed on the client side, and then using that to recover
// the address that signed the signature for this data.
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(abi.encode(MINTER_TYPEHASH, msg.sender))
)
);
// Use the recover method to see what address was used to create
// the signature on this data.
// Note that if the digest doesn't exactly match what was signed we'll
// get a random recovered address.
address recoveredAddress = digest.recover(signature);
require(recoveredAddress == AllowlistSigningKey, "Invalid Signature");
_;
}
}
// File: @openzeppelin/contracts/security/Pausable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File: @openzeppelin/contracts/utils/Address.sol
// 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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// 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);
}
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// 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);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @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) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @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);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @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);
}
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
/**
* @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
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: invalid token ID");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
_requireMinted(tokenId);
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_safeTransfer(from, to, tokenId, data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits an {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Reverts if the `tokenId` has not been minted yet.
*/
function _requireMinted(uint256 tokenId) internal view virtual {
require(_exists(tokenId), "ERC721: invalid token ID");
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
/// @solidity memory-safe-assembly
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 Burnable Token
* @dev ERC721 Token that can be burned (destroyed).
*/
abstract contract ERC721Burnable is Context, ERC721 {
/**
* @dev Burns `tokenId`. See {ERC721-_burn}.
*
* Requirements:
*
* - The caller must own `tokenId` or be an approved operator.
*/
function burn(uint256 tokenId) public virtual {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
_burn(tokenId);
}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: contracts/ScoutTesting.sol
pragma solidity ^0.8.4;
// 🔭
contract ScoutTesting is
ERC721,
ERC721Burnable,
ERC721Enumerable,
Pausable,
Ownable,
SignedAllowlists
{
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
TokenRenderer private _getTokenUriAddress;
bool private _isUriAddressFrozen;
uint256 private _minimum;
constructor(string memory name, string memory code, uint256 minimum, TokenRenderer getTokenUriAddress)
ERC721(name, code)
SignedAllowlists(name)
{
_getTokenUriAddress = getTokenUriAddress;
_minimum = minimum;
_pause();
}
// MIN GETTER
// ----------
function getMinimum() public view returns (uint256) {
return _minimum;
}
// PAUSE / UNPAUSE
// ---------------
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
// OPENSEA METADATA
// ----------------
function contractURI() public view returns (string memory) {
bytes
memory json = abi.encodePacked(
'{"name": "',
name(),
'","description": "The ',
name(),
' Badge is awarded to Scouts who have submitted ',
Utils.toString(getMinimum()),
' or more accepted abilities.", "image": "https://www.daylight.xyz/images/opensea-contract-metadata-image.png", "external_link": "https://www.daylight.xyz" }'
);
return
string(
abi.encodePacked(
"data:application/json;base64,",
Utils.base64Encode(json)
)
);
}
// URI
// ---
// This cannot be undone!
function freezeUriAddress() public onlyOwner {
_isUriAddressFrozen = true;
}
modifier whenUriNotFrozen() {
require(!_isUriAddressFrozen, "URI getter is frozen");
_;
}
function setTokenRendererAddress(TokenRenderer newAddress)
public
onlyOwner
whenUriNotFrozen
{
_getTokenUriAddress = newAddress;
}
function tokenURI(uint256 tokenId)
public
view
override
returns (string memory)
{
_requireMinted(tokenId);
return _getTokenUriAddress.getTokenURI(tokenId, name());
}
// MINTING
// -------
function allowlistMint(bytes calldata signature)
public
whenNotPaused
requiresAllowlist(signature)
{
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(msg.sender, tokenId);
}
function safeMint(address to) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
}
// NOT SOULBOUND
// -------------
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override(ERC721, ERC721Enumerable) whenNotPaused {
super._beforeTokenTransfer(from, to, tokenId);
}
// SOLIDITY OVERRIDES
// ------------------
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"code","type":"string"},{"internalType":"uint256","name":"minimum","type":"uint256"},{"internalType":"contract TokenRenderer","name":"getTokenUriAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"allowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeUriAddress","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":[],"name":"getMinimum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","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":"newSigningKey","type":"address"}],"name":"setAllowlistSigningAddress","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":"contract TokenRenderer","name":"newAddress","type":"address"}],"name":"setTokenRendererAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052600b80546001600160a01b03191690553480156200002157600080fd5b5060405162002bfb38038062002bfb8339810160408190526200004491620003c1565b83848481600090805190602001906200005f92919062000264565b5080516200007590600190602084019062000264565b5050600a805460ff19169055506200008d3362000160565b805160208083019190912060408051808201825260018152603160f81b9084015280517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f938101939093528201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f190181529190528051602090910120600c5550600e80546001600160a01b0319166001600160a01b038316179055600f82905562000156620001ba565b50505050620004a9565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001c462000217565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001fa3390565b6040516001600160a01b03909116815260200160405180910390a1565b600a5460ff1615620002625760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b565b828054620002729062000456565b90600052602060002090601f016020900481019282620002965760008555620002e1565b82601f10620002b157805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e1578251825591602001919060010190620002c4565b50620002ef929150620002f3565b5090565b5b80821115620002ef5760008155600101620002f4565b600082601f8301126200031c57600080fd5b81516001600160401b038082111562000339576200033962000493565b604051601f8301601f19908116603f0116810190828211818310171562000364576200036462000493565b816040528381526020925086838588010111156200038157600080fd5b600091505b83821015620003a5578582018301518183018401529082019062000386565b83821115620003b75760008385830101525b9695505050505050565b60008060008060808587031215620003d857600080fd5b84516001600160401b0380821115620003f057600080fd5b620003fe888389016200030a565b955060208701519150808211156200041557600080fd5b5062000424878288016200030a565b60408701516060880151919550935090506001600160a01b03811681146200044b57600080fd5b939692955090935050565b600181811c908216806200046b57607f821691505b602082108114156200048d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61274280620004b96000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063be00df4a116100a2578063e8a3d48511610071578063e8a3d485146103e8578063e985e9c5146103f0578063f2fde38b1461042c578063fa4d280c1461043f57600080fd5b8063be00df4a146103a7578063c87b56dd146103ba578063d924a983146103cd578063e0409786146103d557600080fd5b806395d89b41116100de57806395d89b411461036657806395fc164f1461036e578063a22cb46514610381578063b88d4fde1461039457600080fd5b806370a082311461032d578063715018a6146103405780638456cb59146103485780638da5cb5b1461035057600080fd5b80633f4ba83a116101875780634f6ccce7116101565780634f6ccce7146102f45780635c975abb146103075780636352211e1461031257806363aa673b1461032557600080fd5b80633f4ba83a146102b357806340d097c3146102bb57806342842e0e146102ce57806342966c68146102e157600080fd5b806318160ddd116101c357806318160ddd1461027257806323b872dd146102845780632f745c59146102975780633644e515146102aa57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004612094565b610466565b60405190151581526020015b60405180910390f35b610225610477565b6040516102149190612400565b6102456102403660046121b7565b610509565b6040516001600160a01b039091168152602001610214565b61027061026b366004612068565b610530565b005b6008545b604051908152602001610214565b610270610292366004611f45565b61064b565b6102766102a5366004612068565b61067d565b610276600c5481565b610270610713565b6102706102c9366004611ee8565b610725565b6102706102dc366004611f45565b610756565b6102706102ef3660046121b7565b610771565b6102766103023660046121b7565b6107a2565b600a5460ff16610208565b6102456103203660046121b7565b610835565b600f54610276565b61027661033b366004611ee8565b610895565b61027061091b565b61027061092d565b600a5461010090046001600160a01b0316610245565b61022561093d565b61027061037c3660046120ce565b61094c565b61027061038f366004612035565b610aff565b6102706103a2366004611f86565b610b0a565b6102706103b5366004611ee8565b610b42565b6102256103c83660046121b7565b610b6c565b610270610c02565b6102706103e3366004611ee8565b610c1f565b610225610c9a565b6102086103fe366004611f0c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61027061043a366004611ee8565b610d10565b6102767f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b600061047182610d86565b92915050565b606060008054610486906125b3565b80601f01602080910402602001604051908101604052809291908181526020018280546104b2906125b3565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482610dab565b506000908152600460205260409020546001600160a01b031690565b600061053b82610835565b9050806001600160a01b0316836001600160a01b031614156105ae5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105ca57506105ca81336103fe565b61063c5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105a5565b6106468383610e0a565b505050565b610656335b82610e78565b6106725760405162461bcd60e51b81526004016105a590612465565b610646838383610ef7565b600061068883610895565b82106106ea5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61071b61109e565b6107236110fe565b565b61072d61109e565b6000610738600d5490565b9050610748600d80546001019055565b6107528282611150565b5050565b61064683838360405180602001604052806000815250610b0a565b61077a33610650565b6107965760405162461bcd60e51b81526004016105a590612465565b61079f8161116a565b50565b60006107ad60085490565b82106108105760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a5565b6008828154811061082357610823612675565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104715760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a5565b60006001600160a01b0382166108ff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a5565b506001600160a01b031660009081526003602052604090205490565b61092361109e565b6107236000611211565b61093561109e565b61072361126b565b606060018054610486906125b3565b6109546112a8565b600b54829082906001600160a01b03166109a85760405162461bcd60e51b8152602060048201526015602482015274105b1b1bdddb1a5cdd081b9bdd08195b98589b1959605a1b60448201526064016105a5565b600c54604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602082015233918101919091526000919060600160405160208183030381529060405280519060200120604051602001610a2192919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000610a7d84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506112ee9050565b600b549091506001600160a01b03808316911614610ad15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b60448201526064016105a5565b6000610adc600d5490565b9050610aec600d80546001019055565b610af63382611150565b50505050505050565b610752338383611312565b610b143383610e78565b610b305760405162461bcd60e51b81526004016105a590612465565b610b3c848484846113e1565b50505050565b610b4a61109e565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610b7782610dab565b600e546001600160a01b0316630c6ab5a783610b91610477565b6040518363ffffffff1660e01b8152600401610bae9291906124b3565b60006040518083038186803b158015610bc657600080fd5b505afa158015610bda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104719190810190612140565b610c0a61109e565b600e805460ff60a01b1916600160a01b179055565b610c2761109e565b600e54600160a01b900460ff1615610c785760405162461bcd60e51b81526020600482015260146024820152732aa9249033b2ba3a32b91034b990333937bd32b760611b60448201526064016105a5565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000610ca6610477565b610cae610477565b610cbf610cba600f5490565b611414565b604051602001610cd1939291906121fc565b6040516020818303038152906040529050610ceb81611512565b604051602001610cfb919061237e565b60405160208183030381529060405291505090565b610d1861109e565b6001600160a01b038116610d7d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a5565b61079f81611211565b60006001600160e01b0319821663780e9d6360e01b1480610471575061047182611678565b6000818152600260205260409020546001600160a01b031661079f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e3f82610835565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e8483610835565b9050806001600160a01b0316846001600160a01b03161480610ecb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610eef5750836001600160a01b0316610ee484610509565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f0a82610835565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105a5565b6001600160a01b038216610fd05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a5565b610fdb8383836116c8565b610fe6600082610e0a565b6001600160a01b038316600090815260036020526040812080546001929061100f908490612570565b90915550506001600160a01b038216600090815260036020526040812080546001929061103d908490612525565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b036101009091041633146107235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a5565b6111066116db565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610752828260405180602001604052806000815250611724565b600061117582610835565b9050611183816000846116c8565b61118e600083610e0a565b6001600160a01b03811660009081526003602052604081208054600192906111b7908490612570565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112736112a8565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111333390565b600a5460ff16156107235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105a5565b60008060006112fd8585611757565b9150915061130a8161179d565b509392505050565b816001600160a01b0316836001600160a01b031614156113745760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6113ec848484610ef7565b6113f884848484611958565b610b3c5760405162461bcd60e51b81526004016105a590612413565b6060816114385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611462578061144c816125ee565b915061145b9050600a8361253d565b915061143c565b60008167ffffffffffffffff81111561147d5761147d61268b565b6040519080825280601f01601f1916602001820160405280156114a7576020820181803683370190505b5090505b8415610eef576114bc600183612570565b91506114c9600a86612609565b6114d4906030612525565b60f81b8183815181106114e9576114e9612675565b60200101906001600160f81b031916908160001a90535061150b600a8661253d565b94506114ab565b805160609080611532575050604080516020810190915260008152919050565b60006003611541836002612525565b61154b919061253d565b611556906004612551565b90506000611565826020612525565b67ffffffffffffffff81111561157d5761157d61268b565b6040519080825280601f01601f1916602001820160405280156115a7576020820181803683370190505b50905060006040518060600160405280604081526020016126cd604091399050600181016020830160005b86811015611633576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016115d2565b50600386066001811461164d576002811461165e5761166a565b613d3d60f01b60011983015261166a565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806116a957506001600160e01b03198216635b5e139f60e01b145b8061047157506301ffc9a760e01b6001600160e01b0319831614610471565b6116d06112a8565b610646838383611a65565b600a5460ff166107235760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105a5565b61172e8383611b1d565b61173b6000848484611958565b6106465760405162461bcd60e51b81526004016105a590612413565b60008082516041141561178e5760208301516040840151606085015160001a61178287828585611c6b565b94509450505050611796565b506000905060025b9250929050565b60008160048111156117b1576117b1612649565b14156117ba5750565b60018160048111156117ce576117ce612649565b141561181c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105a5565b600281600481111561183057611830612649565b141561187e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105a5565b600381600481111561189257611892612649565b14156118eb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105a5565b60048160048111156118ff576118ff612649565b141561079f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105a5565b60006001600160a01b0384163b15611a5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061199c9033908990889088906004016123c3565b602060405180830381600087803b1580156119b657600080fd5b505af19250505080156119e6575060408051601f3d908101601f191682019092526119e3918101906120b1565b60015b611a40573d808015611a14576040519150601f19603f3d011682016040523d82523d6000602084013e611a19565b606091505b508051611a385760405162461bcd60e51b81526004016105a590612413565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610eef565b506001949350505050565b6001600160a01b038316611ac057611abb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ae3565b816001600160a01b0316836001600160a01b031614611ae357611ae38382611d58565b6001600160a01b038216611afa5761064681611df5565b826001600160a01b0316826001600160a01b031614610646576106468282611ea4565b6001600160a01b038216611b735760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a5565b6000818152600260205260409020546001600160a01b031615611bd85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a5565b611be4600083836116c8565b6001600160a01b0382166000908152600360205260408120805460019290611c0d908490612525565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ca25750600090506003611d4f565b8460ff16601b14158015611cba57508460ff16601c14155b15611ccb5750600090506004611d4f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d1f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d4857600060019250925050611d4f565b9150600090505b94509492505050565b60006001611d6584610895565b611d6f9190612570565b600083815260076020526040902054909150808214611dc2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611e0790600190612570565b60008381526009602052604081205460088054939450909284908110611e2f57611e2f612675565b906000526020600020015490508060088381548110611e5057611e50612675565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e8857611e8861265f565b6001900381819060005260206000200160009055905550505050565b6000611eaf83610895565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600060208284031215611efa57600080fd5b8135611f05816126a1565b9392505050565b60008060408385031215611f1f57600080fd5b8235611f2a816126a1565b91506020830135611f3a816126a1565b809150509250929050565b600080600060608486031215611f5a57600080fd5b8335611f65816126a1565b92506020840135611f75816126a1565b929592945050506040919091013590565b60008060008060808587031215611f9c57600080fd5b8435611fa7816126a1565b93506020850135611fb7816126a1565b925060408501359150606085013567ffffffffffffffff811115611fda57600080fd5b8501601f81018713611feb57600080fd5b8035611ffe611ff9826124fd565b6124cc565b81815288602083850101111561201357600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561204857600080fd5b8235612053816126a1565b915060208301358015158114611f3a57600080fd5b6000806040838503121561207b57600080fd5b8235612086816126a1565b946020939093013593505050565b6000602082840312156120a657600080fd5b8135611f05816126b6565b6000602082840312156120c357600080fd5b8151611f05816126b6565b600080602083850312156120e157600080fd5b823567ffffffffffffffff808211156120f957600080fd5b818501915085601f83011261210d57600080fd5b81358181111561211c57600080fd5b86602082850101111561212e57600080fd5b60209290920196919550909350505050565b60006020828403121561215257600080fd5b815167ffffffffffffffff81111561216957600080fd5b8201601f8101841361217a57600080fd5b8051612188611ff9826124fd565b81815285602083850101111561219d57600080fd5b6121ae826020830160208601612587565b95945050505050565b6000602082840312156121c957600080fd5b5035919050565b600081518084526121e8816020860160208601612587565b601f01601f19169290920160200192915050565b693d913730b6b2911d101160b11b8152835160009061222281600a850160208901612587565b7501116113232b9b1b934b83a34b7b7111d10112a3432960551b600a918401918201528451612258816020808501908901612587565b8082019150507f204261646765206973206177617264656420746f2053636f7574732077686f2060208201526e03430bb329039bab136b4ba3a32b21608d1b604082015283516122af81604f840160208801612587565b7f206f72206d6f7265206163636570746564206162696c69746965732e222c2022604f92909101918201527f696d616765223a202268747470733a2f2f7777772e6461796c696768742e7879606f8201527f7a2f696d616765732f6f70656e7365612d636f6e74726163742d6d6574616461608f8201527f74612d696d6167652e706e67222c202265787465726e616c5f6c696e6b223a2060af8201527f2268747470733a2f2f7777772e6461796c696768742e78797a22207d0000000060cf82015260eb0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516123b681601d850160208701612587565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f6908301846121d0565b9695505050505050565b602081526000611f0560208301846121d0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b828152604060208201526000610eef60408301846121d0565b604051601f8201601f1916810167ffffffffffffffff811182821017156124f5576124f561268b565b604052919050565b600067ffffffffffffffff8211156125175761251761268b565b50601f01601f191660200190565b600082198211156125385761253861261d565b500190565b60008261254c5761254c612633565b500490565b600081600019048311821515161561256b5761256b61261d565b500290565b6000828210156125825761258261261d565b500390565b60005b838110156125a257818101518382015260200161258a565b83811115610b3c5750506000910152565b600181811c908216806125c757607f821691505b602082108114156125e857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126025761260261261d565b5060010190565b60008261261857612618612633565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079f57600080fd5b6001600160e01b03198116811461079f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bceed2de32b5ed49ac9b10f16c5be2eafd1ce24394974a11c600c06f9c8c0bdd64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000d2097b758439c178dede00c0b4eb4f8e401e360f000000000000000000000000000000000000000000000000000000000000000c52616e6b3a20437265616d790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000552414e4b43000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063be00df4a116100a2578063e8a3d48511610071578063e8a3d485146103e8578063e985e9c5146103f0578063f2fde38b1461042c578063fa4d280c1461043f57600080fd5b8063be00df4a146103a7578063c87b56dd146103ba578063d924a983146103cd578063e0409786146103d557600080fd5b806395d89b41116100de57806395d89b411461036657806395fc164f1461036e578063a22cb46514610381578063b88d4fde1461039457600080fd5b806370a082311461032d578063715018a6146103405780638456cb59146103485780638da5cb5b1461035057600080fd5b80633f4ba83a116101875780634f6ccce7116101565780634f6ccce7146102f45780635c975abb146103075780636352211e1461031257806363aa673b1461032557600080fd5b80633f4ba83a146102b357806340d097c3146102bb57806342842e0e146102ce57806342966c68146102e157600080fd5b806318160ddd116101c357806318160ddd1461027257806323b872dd146102845780632f745c59146102975780633644e515146102aa57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004612094565b610466565b60405190151581526020015b60405180910390f35b610225610477565b6040516102149190612400565b6102456102403660046121b7565b610509565b6040516001600160a01b039091168152602001610214565b61027061026b366004612068565b610530565b005b6008545b604051908152602001610214565b610270610292366004611f45565b61064b565b6102766102a5366004612068565b61067d565b610276600c5481565b610270610713565b6102706102c9366004611ee8565b610725565b6102706102dc366004611f45565b610756565b6102706102ef3660046121b7565b610771565b6102766103023660046121b7565b6107a2565b600a5460ff16610208565b6102456103203660046121b7565b610835565b600f54610276565b61027661033b366004611ee8565b610895565b61027061091b565b61027061092d565b600a5461010090046001600160a01b0316610245565b61022561093d565b61027061037c3660046120ce565b61094c565b61027061038f366004612035565b610aff565b6102706103a2366004611f86565b610b0a565b6102706103b5366004611ee8565b610b42565b6102256103c83660046121b7565b610b6c565b610270610c02565b6102706103e3366004611ee8565b610c1f565b610225610c9a565b6102086103fe366004611f0c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61027061043a366004611ee8565b610d10565b6102767f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b600061047182610d86565b92915050565b606060008054610486906125b3565b80601f01602080910402602001604051908101604052809291908181526020018280546104b2906125b3565b80156104ff5780601f106104d4576101008083540402835291602001916104ff565b820191906000526020600020905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b600061051482610dab565b506000908152600460205260409020546001600160a01b031690565b600061053b82610835565b9050806001600160a01b0316836001600160a01b031614156105ae5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105ca57506105ca81336103fe565b61063c5760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016105a5565b6106468383610e0a565b505050565b610656335b82610e78565b6106725760405162461bcd60e51b81526004016105a590612465565b610646838383610ef7565b600061068883610895565b82106106ea5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105a5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61071b61109e565b6107236110fe565b565b61072d61109e565b6000610738600d5490565b9050610748600d80546001019055565b6107528282611150565b5050565b61064683838360405180602001604052806000815250610b0a565b61077a33610650565b6107965760405162461bcd60e51b81526004016105a590612465565b61079f8161116a565b50565b60006107ad60085490565b82106108105760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105a5565b6008828154811061082357610823612675565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806104715760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a5565b60006001600160a01b0382166108ff5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105a5565b506001600160a01b031660009081526003602052604090205490565b61092361109e565b6107236000611211565b61093561109e565b61072361126b565b606060018054610486906125b3565b6109546112a8565b600b54829082906001600160a01b03166109a85760405162461bcd60e51b8152602060048201526015602482015274105b1b1bdddb1a5cdd081b9bdd08195b98589b1959605a1b60448201526064016105a5565b600c54604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602082015233918101919091526000919060600160405160208183030381529060405280519060200120604051602001610a2192919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000610a7d84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506112ee9050565b600b549091506001600160a01b03808316911614610ad15760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b60448201526064016105a5565b6000610adc600d5490565b9050610aec600d80546001019055565b610af63382611150565b50505050505050565b610752338383611312565b610b143383610e78565b610b305760405162461bcd60e51b81526004016105a590612465565b610b3c848484846113e1565b50505050565b610b4a61109e565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610b7782610dab565b600e546001600160a01b0316630c6ab5a783610b91610477565b6040518363ffffffff1660e01b8152600401610bae9291906124b3565b60006040518083038186803b158015610bc657600080fd5b505afa158015610bda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104719190810190612140565b610c0a61109e565b600e805460ff60a01b1916600160a01b179055565b610c2761109e565b600e54600160a01b900460ff1615610c785760405162461bcd60e51b81526020600482015260146024820152732aa9249033b2ba3a32b91034b990333937bd32b760611b60448201526064016105a5565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606000610ca6610477565b610cae610477565b610cbf610cba600f5490565b611414565b604051602001610cd1939291906121fc565b6040516020818303038152906040529050610ceb81611512565b604051602001610cfb919061237e565b60405160208183030381529060405291505090565b610d1861109e565b6001600160a01b038116610d7d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a5565b61079f81611211565b60006001600160e01b0319821663780e9d6360e01b1480610471575061047182611678565b6000818152600260205260409020546001600160a01b031661079f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105a5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e3f82610835565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e8483610835565b9050806001600160a01b0316846001600160a01b03161480610ecb57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610eef5750836001600160a01b0316610ee484610509565b6001600160a01b0316145b949350505050565b826001600160a01b0316610f0a82610835565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105a5565b6001600160a01b038216610fd05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105a5565b610fdb8383836116c8565b610fe6600082610e0a565b6001600160a01b038316600090815260036020526040812080546001929061100f908490612570565b90915550506001600160a01b038216600090815260036020526040812080546001929061103d908490612525565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a546001600160a01b036101009091041633146107235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a5565b6111066116db565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b610752828260405180602001604052806000815250611724565b600061117582610835565b9050611183816000846116c8565b61118e600083610e0a565b6001600160a01b03811660009081526003602052604081208054600192906111b7908490612570565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112736112a8565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111333390565b600a5460ff16156107235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105a5565b60008060006112fd8585611757565b9150915061130a8161179d565b509392505050565b816001600160a01b0316836001600160a01b031614156113745760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105a5565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6113ec848484610ef7565b6113f884848484611958565b610b3c5760405162461bcd60e51b81526004016105a590612413565b6060816114385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611462578061144c816125ee565b915061145b9050600a8361253d565b915061143c565b60008167ffffffffffffffff81111561147d5761147d61268b565b6040519080825280601f01601f1916602001820160405280156114a7576020820181803683370190505b5090505b8415610eef576114bc600183612570565b91506114c9600a86612609565b6114d4906030612525565b60f81b8183815181106114e9576114e9612675565b60200101906001600160f81b031916908160001a90535061150b600a8661253d565b94506114ab565b805160609080611532575050604080516020810190915260008152919050565b60006003611541836002612525565b61154b919061253d565b611556906004612551565b90506000611565826020612525565b67ffffffffffffffff81111561157d5761157d61268b565b6040519080825280601f01601f1916602001820160405280156115a7576020820181803683370190505b50905060006040518060600160405280604081526020016126cd604091399050600181016020830160005b86811015611633576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016115d2565b50600386066001811461164d576002811461165e5761166a565b613d3d60f01b60011983015261166a565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806116a957506001600160e01b03198216635b5e139f60e01b145b8061047157506301ffc9a760e01b6001600160e01b0319831614610471565b6116d06112a8565b610646838383611a65565b600a5460ff166107235760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105a5565b61172e8383611b1d565b61173b6000848484611958565b6106465760405162461bcd60e51b81526004016105a590612413565b60008082516041141561178e5760208301516040840151606085015160001a61178287828585611c6b565b94509450505050611796565b506000905060025b9250929050565b60008160048111156117b1576117b1612649565b14156117ba5750565b60018160048111156117ce576117ce612649565b141561181c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105a5565b600281600481111561183057611830612649565b141561187e5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105a5565b600381600481111561189257611892612649565b14156118eb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105a5565b60048160048111156118ff576118ff612649565b141561079f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105a5565b60006001600160a01b0384163b15611a5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061199c9033908990889088906004016123c3565b602060405180830381600087803b1580156119b657600080fd5b505af19250505080156119e6575060408051601f3d908101601f191682019092526119e3918101906120b1565b60015b611a40573d808015611a14576040519150601f19603f3d011682016040523d82523d6000602084013e611a19565b606091505b508051611a385760405162461bcd60e51b81526004016105a590612413565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610eef565b506001949350505050565b6001600160a01b038316611ac057611abb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611ae3565b816001600160a01b0316836001600160a01b031614611ae357611ae38382611d58565b6001600160a01b038216611afa5761064681611df5565b826001600160a01b0316826001600160a01b031614610646576106468282611ea4565b6001600160a01b038216611b735760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105a5565b6000818152600260205260409020546001600160a01b031615611bd85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105a5565b611be4600083836116c8565b6001600160a01b0382166000908152600360205260408120805460019290611c0d908490612525565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ca25750600090506003611d4f565b8460ff16601b14158015611cba57508460ff16601c14155b15611ccb5750600090506004611d4f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611d1f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d4857600060019250925050611d4f565b9150600090505b94509492505050565b60006001611d6584610895565b611d6f9190612570565b600083815260076020526040902054909150808214611dc2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611e0790600190612570565b60008381526009602052604081205460088054939450909284908110611e2f57611e2f612675565b906000526020600020015490508060088381548110611e5057611e50612675565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e8857611e8861265f565b6001900381819060005260206000200160009055905550505050565b6000611eaf83610895565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600060208284031215611efa57600080fd5b8135611f05816126a1565b9392505050565b60008060408385031215611f1f57600080fd5b8235611f2a816126a1565b91506020830135611f3a816126a1565b809150509250929050565b600080600060608486031215611f5a57600080fd5b8335611f65816126a1565b92506020840135611f75816126a1565b929592945050506040919091013590565b60008060008060808587031215611f9c57600080fd5b8435611fa7816126a1565b93506020850135611fb7816126a1565b925060408501359150606085013567ffffffffffffffff811115611fda57600080fd5b8501601f81018713611feb57600080fd5b8035611ffe611ff9826124fd565b6124cc565b81815288602083850101111561201357600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561204857600080fd5b8235612053816126a1565b915060208301358015158114611f3a57600080fd5b6000806040838503121561207b57600080fd5b8235612086816126a1565b946020939093013593505050565b6000602082840312156120a657600080fd5b8135611f05816126b6565b6000602082840312156120c357600080fd5b8151611f05816126b6565b600080602083850312156120e157600080fd5b823567ffffffffffffffff808211156120f957600080fd5b818501915085601f83011261210d57600080fd5b81358181111561211c57600080fd5b86602082850101111561212e57600080fd5b60209290920196919550909350505050565b60006020828403121561215257600080fd5b815167ffffffffffffffff81111561216957600080fd5b8201601f8101841361217a57600080fd5b8051612188611ff9826124fd565b81815285602083850101111561219d57600080fd5b6121ae826020830160208601612587565b95945050505050565b6000602082840312156121c957600080fd5b5035919050565b600081518084526121e8816020860160208601612587565b601f01601f19169290920160200192915050565b693d913730b6b2911d101160b11b8152835160009061222281600a850160208901612587565b7501116113232b9b1b934b83a34b7b7111d10112a3432960551b600a918401918201528451612258816020808501908901612587565b8082019150507f204261646765206973206177617264656420746f2053636f7574732077686f2060208201526e03430bb329039bab136b4ba3a32b21608d1b604082015283516122af81604f840160208801612587565b7f206f72206d6f7265206163636570746564206162696c69746965732e222c2022604f92909101918201527f696d616765223a202268747470733a2f2f7777772e6461796c696768742e7879606f8201527f7a2f696d616765732f6f70656e7365612d636f6e74726163742d6d6574616461608f8201527f74612d696d6167652e706e67222c202265787465726e616c5f6c696e6b223a2060af8201527f2268747470733a2f2f7777772e6461796c696768742e78797a22207d0000000060cf82015260eb0195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516123b681601d850160208701612587565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123f6908301846121d0565b9695505050505050565b602081526000611f0560208301846121d0565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b828152604060208201526000610eef60408301846121d0565b604051601f8201601f1916810167ffffffffffffffff811182821017156124f5576124f561268b565b604052919050565b600067ffffffffffffffff8211156125175761251761268b565b50601f01601f191660200190565b600082198211156125385761253861261d565b500190565b60008261254c5761254c612633565b500490565b600081600019048311821515161561256b5761256b61261d565b500290565b6000828210156125825761258261261d565b500390565b60005b838110156125a257818101518382015260200161258a565b83811115610b3c5750506000910152565b600181811c908216806125c757607f821691505b602082108114156125e857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156126025761260261261d565b5060010190565b60008261261857612618612633565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461079f57600080fd5b6001600160e01b03198116811461079f57600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bceed2de32b5ed49ac9b10f16c5be2eafd1ce24394974a11c600c06f9c8c0bdd64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005000000000000000000000000d2097b758439c178dede00c0b4eb4f8e401e360f000000000000000000000000000000000000000000000000000000000000000c52616e6b3a20437265616d790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000552414e4b43000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Rank: Creamy
Arg [1] : code (string): RANKC
Arg [2] : minimum (uint256): 5
Arg [3] : getTokenUriAddress (address): 0xD2097b758439c178DEDE00C0B4eb4f8e401e360F
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 000000000000000000000000d2097b758439c178dede00c0b4eb4f8e401e360f
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 52616e6b3a20437265616d790000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 52414e4b43000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67183:3524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70492:212;;;;;;:::i;:::-;;:::i;:::-;;;8877:14:1;;8870:22;8852:41;;8840:2;8825:18;70492:212:0;;;;;;;;46884:100;;;:::i;:::-;;;;;;;:::i;48397:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8175:32:1;;;8157:51;;8145:2;8130:18;48397:171:0;8011:203:1;47914:417:0;;;;;;:::i;:::-;;:::i;:::-;;61578:113;61666:10;:17;61578:113;;;9050:25:1;;;9038:2;9023:18;61578:113:0;8904:177:1;49097:336:0;;;;;;:::i;:::-;;:::i;61246:256::-;;;;;;:::i;:::-;;:::i;21263:31::-;;;;;;68067:65;;;:::i;69965:180::-;;;;;;:::i;:::-;;:::i;49504:185::-;;;;;;:::i;:::-;;:::i;59677:243::-;;;;;;:::i;:::-;;:::i;61768:233::-;;;;;;:::i;:::-;;:::i;25248:86::-;25319:7;;;;25248:86;;46595:222;;;;;;:::i;:::-;;:::i;67854:84::-;67922:8;;67854:84;;46326:207;;;;;;:::i;:::-;;:::i;19604:103::-;;;:::i;67998:61::-;;;:::i;18956:87::-;19029:6;;;;;-1:-1:-1;;;;;19029:6:0;18956:87;;47053:104;;;:::i;69685:272::-;;;;;;:::i;:::-;;:::i;48640:155::-;;;;;;:::i;:::-;;:::i;49760:323::-;;;;;;:::i;:::-;;:::i;22433:153::-;;;;;;:::i;:::-;;:::i;69412:231::-;;;;;;:::i;:::-;;:::i;69010:90::-;;;:::i;69228:176::-;;;;;;:::i;:::-;;:::i;68192:753::-;;;:::i;48866:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;48987:25:0;;;48963:4;48987:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;48866:164;19862:201;;;;;;:::i;:::-;;:::i;21636:86::-;;21687:35;21636:86;;70492:212;70631:4;70660:36;70684:11;70660:23;:36::i;:::-;70653:43;70492:212;-1:-1:-1;;70492:212:0:o;46884:100::-;46938:13;46971:5;46964:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46884:100;:::o;48397:171::-;48473:7;48493:23;48508:7;48493:14;:23::i;:::-;-1:-1:-1;48536:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48536:24:0;;48397:171::o;47914:417::-;47995:13;48011:23;48026:7;48011:14;:23::i;:::-;47995:39;;48059:5;-1:-1:-1;;;;;48053:11:0;:2;-1:-1:-1;;;;;48053:11:0;;;48045:57;;;;-1:-1:-1;;;48045:57:0;;18128:2:1;48045:57:0;;;18110:21:1;18167:2;18147:18;;;18140:30;18206:34;18186:18;;;18179:62;-1:-1:-1;;;18257:18:1;;;18250:31;18298:19;;48045:57:0;;;;;;;;;17587:10;-1:-1:-1;;;;;48137:21:0;;;;:62;;-1:-1:-1;48162:37:0;48179:5;17587:10;48866:164;:::i;48162:37::-;48115:174;;;;-1:-1:-1;;;48115:174:0;;16276:2:1;48115:174:0;;;16258:21:1;16315:2;16295:18;;;16288:30;16354:34;16334:18;;;16327:62;16425:32;16405:18;;;16398:60;16475:19;;48115:174:0;16074:426:1;48115:174:0;48302:21;48311:2;48315:7;48302:8;:21::i;:::-;47984:347;47914:417;;:::o;49097:336::-;49292:41;17587:10;49311:12;49325:7;49292:18;:41::i;:::-;49284:100;;;;-1:-1:-1;;;49284:100:0;;;;;;;:::i;:::-;49397:28;49407:4;49413:2;49417:7;49397:9;:28::i;61246:256::-;61343:7;61379:23;61396:5;61379:16;:23::i;:::-;61371:5;:31;61363:87;;;;-1:-1:-1;;;61363:87:0;;11256:2:1;61363:87:0;;;11238:21:1;11295:2;11275:18;;;11268:30;11334:34;11314:18;;;11307:62;-1:-1:-1;;;11385:18:1;;;11378:41;11436:19;;61363:87:0;11054:407:1;61363:87:0;-1:-1:-1;;;;;;61468:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;61246:256::o;68067:65::-;18842:13;:11;:13::i;:::-;68114:10:::1;:8;:10::i;:::-;68067:65::o:0;69965:180::-;18842:13;:11;:13::i;:::-;70023:15:::1;70041:25;:15;4857:14:::0;;4765:114;70041:25:::1;70023:43;;70077:27;:15;4976:19:::0;;4994:1;4976:19;;;4887:127;70077:27:::1;70115:22;70125:2;70129:7;70115:9;:22::i;:::-;70012:133;69965:180:::0;:::o;49504:185::-;49642:39;49659:4;49665:2;49669:7;49642:39;;;;;;;;;;;;:16;:39::i;59677:243::-;59795:41;17587:10;59814:12;17507:98;59795:41;59787:100;;;;-1:-1:-1;;;59787:100:0;;;;;;;:::i;:::-;59898:14;59904:7;59898:5;:14::i;:::-;59677:243;:::o;61768:233::-;61843:7;61879:30;61666:10;:17;;61578:113;61879:30;61871:5;:38;61863:95;;;;-1:-1:-1;;;61863:95:0;;18530:2:1;61863:95:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:42;18711:19;;61863:95:0;18328:408:1;61863:95:0;61976:10;61987:5;61976:17;;;;;;;;:::i;:::-;;;;;;;;;61969:24;;61768:233;;;:::o;46595:222::-;46667:7;46703:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46703:16:0;46738:19;46730:56;;;;-1:-1:-1;;;46730:56:0;;17775:2:1;46730:56:0;;;17757:21:1;17814:2;17794:18;;;17787:30;-1:-1:-1;;;17833:18:1;;;17826:54;17897:18;;46730:56:0;17573:348:1;46326:207:0;46398:7;-1:-1:-1;;;;;46426:19:0;;46418:73;;;;-1:-1:-1;;;46418:73:0;;15463:2:1;46418:73:0;;;15445:21:1;15502:2;15482:18;;;15475:30;15541:34;15521:18;;;15514:62;-1:-1:-1;;;15592:18:1;;;15585:39;15641:19;;46418:73:0;15261:405:1;46418:73:0;-1:-1:-1;;;;;;46509:16:0;;;;;:9;:16;;;;;;;46326:207::o;19604:103::-;18842:13;:11;:13::i;:::-;19669:30:::1;19696:1;19669:18;:30::i;67998:61::-:0;18842:13;:11;:13::i;:::-;68043:8:::1;:6;:8::i;47053:104::-:0;47109:13;47142:7;47135:14;;;;;:::i;69685:272::-;24853:19;:17;:19::i;:::-;22666::::1;::::0;69800:9;;;;-1:-1:-1;;;;;22666:19:0::1;22658:67;;;::::0;-1:-1:-1;;;22658:67:0;;14016:2:1;22658:67:0::1;::::0;::::1;13998:21:1::0;14055:2;14035:18;;;14028:30;-1:-1:-1;;;14074:18:1;;;14067:51;14135:18;;22658:67:0::1;13814:345:1::0;22658:67:0::1;23054:16;::::0;23099:39:::1;::::0;;21687:35:::1;23099:39;::::0;::::1;9260:25:1::0;23127:10:0::1;9301:18:1::0;;;9294:60;;;;22949:14:0::1;::::0;23054:16;9233:18:1;;23099:39:0::1;;;;;;;;;;;;23089:50;;;;;;22990:164;;;;;;;;-1:-1:-1::0;;;5600:27:1;;5652:1;5643:11;;5636:27;;;;5688:2;5679:12;;5672:28;5725:2;5716:12;;5342:392;22990:164:0::1;;;;;;;;;;;;;22966:199;;;;;;22949:216;;23414:24;23441:25;23456:9;;23441:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23441:6:0;;:25;-1:-1:-1;;23441:14:0::1;:25:::0;-1:-1:-1;23441:25:0:i:1;:::-;23507:19;::::0;23414:52;;-1:-1:-1;;;;;;23487:39:0;;::::1;23507:19:::0;::::1;23487:39;23479:69;;;::::0;-1:-1:-1;;;23479:69:0;;17068:2:1;23479:69:0::1;::::0;::::1;17050:21:1::0;17107:2;17087:18;;;17080:30;-1:-1:-1;;;17126:18:1;;;17119:47;17183:18;;23479:69:0::1;16866:341:1::0;23479:69:0::1;69827:15:::2;69845:25;:15;4857:14:::0;;4765:114;69845:25:::2;69827:43;;69881:27;:15;4976:19:::0;;4994:1;4976:19;;;4887:127;69881:27:::2;69919:30;69929:10;69941:7;69919:9;:30::i;:::-;69816:141;22647:921:::1;;24883:1;;69685:272:::0;;:::o;48640:155::-;48735:52;17587:10;48768:8;48778;48735:18;:52::i;49760:323::-;49934:41;17587:10;49967:7;49934:18;:41::i;:::-;49926:100;;;;-1:-1:-1;;;49926:100:0;;;;;;;:::i;:::-;50037:38;50051:4;50057:2;50061:7;50070:4;50037:13;:38::i;:::-;49760:323;;;;:::o;22433:153::-;18842:13;:11;:13::i;:::-;22543:19:::1;:35:::0;;-1:-1:-1;;;;;;22543:35:0::1;-1:-1:-1::0;;;;;22543:35:0;;;::::1;::::0;;;::::1;::::0;;22433:153::o;69412:231::-;69513:13;69544:23;69559:7;69544:14;:23::i;:::-;69587:19;;-1:-1:-1;;;;;69587:19:0;:31;69619:7;69628:6;:4;:6::i;:::-;69587:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69587:48:0;;;;;;;;;;;;:::i;69010:90::-;18842:13;:11;:13::i;:::-;69066:19:::1;:26:::0;;-1:-1:-1;;;;69066:26:0::1;-1:-1:-1::0;;;69066:26:0::1;::::0;;69010:90::o;69228:176::-;18842:13;:11;:13::i;:::-;69156:19:::1;::::0;-1:-1:-1;;;69156:19:0;::::1;;;69155:20;69147:53;;;::::0;-1:-1:-1;;;69147:53:0;;14769:2:1;69147:53:0::1;::::0;::::1;14751:21:1::0;14808:2;14788:18;;;14781:30;-1:-1:-1;;;14827:18:1;;;14820:50;14887:18;;69147:53:0::1;14567:344:1::0;69147:53:0::1;69364:19:::2;:32:::0;;-1:-1:-1;;;;;;69364:32:0::2;-1:-1:-1::0;;;;;69364:32:0;;;::::2;::::0;;;::::2;::::0;;69228:176::o;68192:753::-;68236:13;68262:30;68357:6;:4;:6::i;:::-;68421;:4;:6::i;:::-;68510:28;68525:12;67922:8;;;67854:84;68525:12;68510:14;:28::i;:::-;68295:433;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68262:466;;68879:24;68898:4;68879:18;:24::i;:::-;68786:136;;;;;;;;:::i;:::-;;;;;;;;;;;;;68741:196;;;68192:753;:::o;19862:201::-;18842:13;:11;:13::i;:::-;-1:-1:-1;;;;;19951:22:0;::::1;19943:73;;;::::0;-1:-1:-1;;;19943:73:0;;12087:2:1;19943:73:0::1;::::0;::::1;12069:21:1::0;12126:2;12106:18;;;12099:30;12165:34;12145:18;;;12138:62;-1:-1:-1;;;12216:18:1;;;12209:36;12262:19;;19943:73:0::1;11885:402:1::0;19943:73:0::1;20027:28;20046:8;20027:18;:28::i;60938:224::-:0;61040:4;-1:-1:-1;;;;;;61064:50:0;;-1:-1:-1;;;61064:50:0;;:90;;;61118:36;61142:11;61118:23;:36::i;56372:135::-;51655:4;51679:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51679:16:0;56446:53;;;;-1:-1:-1;;;56446:53:0;;17775:2:1;56446:53:0;;;17757:21:1;17814:2;17794:18;;;17787:30;-1:-1:-1;;;17833:18:1;;;17826:54;17897:18;;56446:53:0;17573:348:1;55651:174:0;55726:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;55726:29:0;-1:-1:-1;;;;;55726:29:0;;;;;;;;:24;;55780:23;55726:24;55780:14;:23::i;:::-;-1:-1:-1;;;;;55771:46:0;;;;;;;;;;;55651:174;;:::o;51884:264::-;51977:4;51994:13;52010:23;52025:7;52010:14;:23::i;:::-;51994:39;;52063:5;-1:-1:-1;;;;;52052:16:0;:7;-1:-1:-1;;;;;52052:16:0;;:52;;;-1:-1:-1;;;;;;48987:25:0;;;48963:4;48987:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;52072:32;52052:87;;;;52132:7;-1:-1:-1;;;;;52108:31:0;:20;52120:7;52108:11;:20::i;:::-;-1:-1:-1;;;;;52108:31:0;;52052:87;52044:96;51884:264;-1:-1:-1;;;;51884:264:0:o;54907:625::-;55066:4;-1:-1:-1;;;;;55039:31:0;:23;55054:7;55039:14;:23::i;:::-;-1:-1:-1;;;;;55039:31:0;;55031:81;;;;-1:-1:-1;;;55031:81:0;;12494:2:1;55031:81:0;;;12476:21:1;12533:2;12513:18;;;12506:30;12572:34;12552:18;;;12545:62;-1:-1:-1;;;12623:18:1;;;12616:35;12668:19;;55031:81:0;12292:401:1;55031:81:0;-1:-1:-1;;;;;55131:16:0;;55123:65;;;;-1:-1:-1;;;55123:65:0;;13257:2:1;55123:65:0;;;13239:21:1;13296:2;13276:18;;;13269:30;13335:34;13315:18;;;13308:62;-1:-1:-1;;;13386:18:1;;;13379:34;13430:19;;55123:65:0;13055:400:1;55123:65:0;55201:39;55222:4;55228:2;55232:7;55201:20;:39::i;:::-;55305:29;55322:1;55326:7;55305:8;:29::i;:::-;-1:-1:-1;;;;;55347:15:0;;;;;;:9;:15;;;;;:20;;55366:1;;55347:15;:20;;55366:1;;55347:20;:::i;:::-;;;;-1:-1:-1;;;;;;;55378:13:0;;;;;;:9;:13;;;;;:18;;55395:1;;55378:13;:18;;55395:1;;55378:18;:::i;:::-;;;;-1:-1:-1;;55407:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;55407:21:0;-1:-1:-1;;;;;55407:21:0;;;;;;;;;55446:27;;55407:16;;55446:27;;;;;;;47984:347;47914:417;;:::o;19121:132::-;19029:6;;-1:-1:-1;;;;;19029:6:0;;;;;17587:10;19185:23;19177:68;;;;-1:-1:-1;;;19177:68:0;;17414:2:1;19177:68:0;;;17396:21:1;;;17433:18;;;17426:30;17492:34;17472:18;;;17465:62;17544:18;;19177:68:0;17212:356:1;26103:120:0;25112:16;:14;:16::i;:::-;26162:7:::1;:15:::0;;-1:-1:-1;;26162:15:0::1;::::0;;26193:22:::1;17587:10:::0;26202:12:::1;26193:22;::::0;-1:-1:-1;;;;;8175:32:1;;;8157:51;;8145:2;8130:18;26193:22:0::1;;;;;;;26103:120::o:0;52490:110::-;52566:26;52576:2;52580:7;52566:26;;;;;;;;;;;;:9;:26::i;54150:420::-;54210:13;54226:23;54241:7;54226:14;:23::i;:::-;54210:39;;54262:48;54283:5;54298:1;54302:7;54262:20;:48::i;:::-;54351:29;54368:1;54372:7;54351:8;:29::i;:::-;-1:-1:-1;;;;;54393:16:0;;;;;;:9;:16;;;;;:21;;54413:1;;54393:16;:21;;54413:1;;54393:21;:::i;:::-;;;;-1:-1:-1;;54432:16:0;;;;:7;:16;;;;;;54425:23;;-1:-1:-1;;;;;;54425:23:0;;;54466:36;54440:7;;54432:16;-1:-1:-1;;;;;54466:36:0;;;;;54432:16;;54466:36;70012:133:::1;69965:180:::0;:::o;20223:191::-;20316:6;;;-1:-1:-1;;;;;20333:17:0;;;20316:6;20333:17;;;-1:-1:-1;;;;;;20333:17:0;;;;;;20366:40;;20316:6;;;;;;;;20366:40;;20297:16;;20366:40;20286:128;20223:191;:::o;25844:118::-;24853:19;:17;:19::i;:::-;25904:7:::1;:14:::0;;-1:-1:-1;;25904:14:0::1;25914:4;25904:14;::::0;;25934:20:::1;25941:12;17587:10:::0;;17507:98;25407:108;25319:7;;;;25477:9;25469:38;;;;-1:-1:-1;;;25469:38:0;;15118:2:1;25469:38:0;;;15100:21:1;15157:2;15137:18;;;15130:30;-1:-1:-1;;;15176:18:1;;;15169:46;15232:18;;25469:38:0;14916:340:1;11711:231:0;11789:7;11810:17;11829:18;11851:27;11862:4;11868:9;11851:10;:27::i;:::-;11809:69;;;;11889:18;11901:5;11889:11;:18::i;:::-;-1:-1:-1;11925:9:0;11711:231;-1:-1:-1;;;11711:231:0:o;55968:315::-;56123:8;-1:-1:-1;;;;;56114:17:0;:5;-1:-1:-1;;;;;56114:17:0;;;56106:55;;;;-1:-1:-1;;;56106:55:0;;13662:2:1;56106:55:0;;;13644:21:1;13701:2;13681:18;;;13674:30;13740:27;13720:18;;;13713:55;13785:18;;56106:55:0;13460:349:1;56106:55:0;-1:-1:-1;;;;;56172:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56172:46:0;;;;;;;;;;56234:41;;8852::1;;;56234::0;;8825:18:1;56234:41:0;;;;;;;55968:315;;;:::o;50964:313::-;51120:28;51130:4;51136:2;51140:7;51120:9;:28::i;:::-;51167:47;51190:4;51196:2;51200:7;51209:4;51167:22;:47::i;:::-;51159:110;;;;-1:-1:-1;;;51159:110:0;;;;;;;:::i;2282:723::-;2338:13;2559:10;2555:53;;-1:-1:-1;;2586:10:0;;;;;;;;;;;;-1:-1:-1;;;2586:10:0;;;;;2282:723::o;2555:53::-;2633:5;2618:12;2674:78;2681:9;;2674:78;;2707:8;;;;:::i;:::-;;-1:-1:-1;2730:10:0;;-1:-1:-1;2738:2:0;2730:10;;:::i;:::-;;;2674:78;;;2762:19;2794:6;2784:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2784:17:0;;2762:39;;2812:154;2819:10;;2812:154;;2846:11;2856:1;2846:11;;:::i;:::-;;-1:-1:-1;2915:10:0;2923:2;2915:5;:10;:::i;:::-;2902:24;;:2;:24;:::i;:::-;2889:39;;2872:6;2879;2872:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2872:56:0;;;;;;;;-1:-1:-1;2943:11:0;2952:2;2943:11;;:::i;:::-;;;2812:154;;446:1828;582:11;;537:13;;608:8;604:23;;-1:-1:-1;;618:9:0;;;;;;;;;-1:-1:-1;618:9:0;;;446:1828;-1:-1:-1;446:1828:0:o;604:23::-;679:18;717:1;706:7;:3;712:1;706:7;:::i;:::-;705:13;;;;:::i;:::-;700:19;;:1;:19;:::i;:::-;679:40;-1:-1:-1;777:19:0;809:15;679:40;822:2;809:15;:::i;:::-;799:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;799:26:0;;777:48;;838:18;859:5;;;;;;;;;;;;;;;;;838:26;;928:1;921:5;917:13;973:2;965:6;961:15;1024:1;992:960;1047:3;1044:1;1041:10;992:960;;;1102:1;1145:12;;;;;1139:19;1240:4;1228:2;1224:14;;;;;1206:40;;1200:47;1392:2;1388:14;;;1384:25;;1370:40;;1364:47;1582:1;1578:13;;;1574:24;;1560:39;;1554:46;1763:16;;;;1749:31;;1743:38;1276:1;1272:11;;;1413:4;1360:58;;;1308:129;1462:11;;1550:57;;;1498:128;;;;1651:11;;1739:49;;1687:120;1836:3;1832:13;1865:22;;1935:1;1920:17;;;;1095:9;992:960;;;996:44;1984:1;1979:3;1975:11;2005:1;2000:84;;;;2103:1;2098:82;;;;1968:212;;2000:84;-1:-1:-1;;;;;2033:17:0;;2026:43;2000:84;;2098:82;-1:-1:-1;;;;;2131:17:0;;2124:41;1968:212;-1:-1:-1;;;2196:26:0;;;2203:6;446:1828;-1:-1:-1;;;;446:1828:0:o;45957:305::-;46059:4;-1:-1:-1;;;;;;46096:40:0;;-1:-1:-1;;;46096:40:0;;:105;;-1:-1:-1;;;;;;;46153:48:0;;-1:-1:-1;;;46153:48:0;46096:105;:158;;;-1:-1:-1;;;;;;;;;;37728:40:0;;;46218:36;37619:157;70199:229;24853:19;:17;:19::i;:::-;70375:45:::1;70402:4;70408:2;70412:7;70375:26;:45::i;25592:108::-:0;25319:7;;;;25651:41;;;;-1:-1:-1;;;25651:41:0;;10547:2:1;25651:41:0;;;10529:21:1;10586:2;10566:18;;;10559:30;-1:-1:-1;;;10605:18:1;;;10598:50;10665:18;;25651:41:0;10345:344:1;52827:319:0;52956:18;52962:2;52966:7;52956:5;:18::i;:::-;53007:53;53038:1;53042:2;53046:7;53055:4;53007:22;:53::i;:::-;52985:153;;;;-1:-1:-1;;;52985:153:0;;;;;;;:::i;10162:747::-;10243:7;10252:12;10281:9;:16;10301:2;10281:22;10277:625;;;10625:4;10610:20;;10604:27;10675:4;10660:20;;10654:27;10733:4;10718:20;;10712:27;10320:9;10704:36;10776:25;10787:4;10704:36;10604:27;10654;10776:10;:25::i;:::-;10769:32;;;;;;;;;10277:625;-1:-1:-1;10850:1:0;;-1:-1:-1;10854:35:0;10277:625;10162:747;;;;;:::o;8433:643::-;8511:20;8502:5;:29;;;;;;;;:::i;:::-;;8498:571;;;8433:643;:::o;8498:571::-;8609:29;8600:5;:38;;;;;;;;:::i;:::-;;8596:473;;;8655:34;;-1:-1:-1;;;8655:34:0;;10194:2:1;8655:34:0;;;10176:21:1;10233:2;10213:18;;;10206:30;10272:26;10252:18;;;10245:54;10316:18;;8655:34:0;9992:348:1;8596:473:0;8720:35;8711:5;:44;;;;;;;;:::i;:::-;;8707:362;;;8772:41;;-1:-1:-1;;;8772:41:0;;10896:2:1;8772:41:0;;;10878:21:1;10935:2;10915:18;;;10908:30;10974:33;10954:18;;;10947:61;11025:18;;8772:41:0;10694:355:1;8707:362:0;8844:30;8835:5;:39;;;;;;;;:::i;:::-;;8831:238;;;8891:44;;-1:-1:-1;;;8891:44:0;;14366:2:1;8891:44:0;;;14348:21:1;14405:2;14385:18;;;14378:30;14444:34;14424:18;;;14417:62;-1:-1:-1;;;14495:18:1;;;14488:32;14537:19;;8891:44:0;14164:398:1;8831:238:0;8966:30;8957:5;:39;;;;;;;;:::i;:::-;;8953:116;;;9013:44;;-1:-1:-1;;;9013:44:0;;15873:2:1;9013:44:0;;;15855:21:1;15912:2;15892:18;;;15885:30;15951:34;15931:18;;;15924:62;-1:-1:-1;;;16002:18:1;;;15995:32;16044:19;;9013:44:0;15671:398:1;57071:853:0;57225:4;-1:-1:-1;;;;;57246:13:0;;27758:19;:23;57242:675;;57282:71;;-1:-1:-1;;;57282:71:0;;-1:-1:-1;;;;;57282:36:0;;;;;:71;;17587:10;;57333:4;;57339:7;;57348:4;;57282:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57282:71:0;;;;;;;;-1:-1:-1;;57282:71:0;;;;;;;;;;;;:::i;:::-;;;57278:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57523:13:0;;57519:328;;57566:60;;-1:-1:-1;;;57566:60:0;;;;;;;:::i;57519:328::-;57797:6;57791:13;57782:6;57778:2;57774:15;57767:38;57278:584;-1:-1:-1;;;;;;57404:51:0;-1:-1:-1;;;57404:51:0;;-1:-1:-1;57397:58:0;;57242:675;-1:-1:-1;57901:4:0;57071:853;;;;;;:::o;62614:589::-;-1:-1:-1;;;;;62820:18:0;;62816:187;;62855:40;62887:7;64030:10;:17;;64003:24;;;;:15;:24;;;;;:44;;;64058:24;;;;;;;;;;;;63926:164;62855:40;62816:187;;;62925:2;-1:-1:-1;;;;;62917:10:0;:4;-1:-1:-1;;;;;62917:10:0;;62913:90;;62944:47;62977:4;62983:7;62944:32;:47::i;:::-;-1:-1:-1;;;;;63017:16:0;;63013:183;;63050:45;63087:7;63050:36;:45::i;63013:183::-;63123:4;-1:-1:-1;;;;;63117:10:0;:2;-1:-1:-1;;;;;63117:10:0;;63113:83;;63144:40;63172:2;63176:7;63144:27;:40::i;53482:439::-;-1:-1:-1;;;;;53562:16:0;;53554:61;;;;-1:-1:-1;;;53554:61:0;;16707:2:1;53554:61:0;;;16689:21:1;;;16726:18;;;16719:30;16785:34;16765:18;;;16758:62;16837:18;;53554:61:0;16505:356:1;53554:61:0;51655:4;51679:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51679:16:0;:30;53626:58;;;;-1:-1:-1;;;53626:58:0;;12900:2:1;53626:58:0;;;12882:21:1;12939:2;12919:18;;;12912:30;12978;12958:18;;;12951:58;13026:18;;53626:58:0;12698:352:1;53626:58:0;53697:45;53726:1;53730:2;53734:7;53697:20;:45::i;:::-;-1:-1:-1;;;;;53755:13:0;;;;;;:9;:13;;;;;:18;;53772:1;;53755:13;:18;;53772:1;;53755:18;:::i;:::-;;;;-1:-1:-1;;53784:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53784:21:0;-1:-1:-1;;;;;53784:21:0;;;;;;;;53823:33;;53784:16;;;53823:33;;53784:16;;53823:33;70012:133:::1;69965:180:::0;:::o;13163:1632::-;13294:7;;14228:66;14215:79;;14211:163;;;-1:-1:-1;14327:1:0;;-1:-1:-1;14331:30:0;14311:51;;14211:163;14388:1;:7;;14393:2;14388:7;;:18;;;;;14399:1;:7;;14404:2;14399:7;;14388:18;14384:102;;;-1:-1:-1;14439:1:0;;-1:-1:-1;14443:30:0;14423:51;;14384:102;14600:24;;;14583:14;14600:24;;;;;;;;;9592:25:1;;;9665:4;9653:17;;9633:18;;;9626:45;;;;9687:18;;;9680:34;;;9730:18;;;9723:34;;;14600:24:0;;9564:19:1;;14600:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14600:24:0;;-1:-1:-1;;14600:24:0;;;-1:-1:-1;;;;;;;14639:20:0;;14635:103;;14692:1;14696:29;14676:50;;;;;;;14635:103;14758:6;-1:-1:-1;14766:20:0;;-1:-1:-1;13163:1632:0;;;;;;;;:::o;64717:988::-;64983:22;65033:1;65008:22;65025:4;65008:16;:22::i;:::-;:26;;;;:::i;:::-;65045:18;65066:26;;;:17;:26;;;;;;64983:51;;-1:-1:-1;65199:28:0;;;65195:328;;-1:-1:-1;;;;;65266:18:0;;65244:19;65266:18;;;:12;:18;;;;;;;;:34;;;;;;;;;65317:30;;;;;;:44;;;65434:30;;:17;:30;;;;;:43;;;65195:328;-1:-1:-1;65619:26:0;;;;:17;:26;;;;;;;;65612:33;;;-1:-1:-1;;;;;65663:18:0;;;;;:12;:18;;;;;:34;;;;;;;65656:41;64717:988::o;66000:1079::-;66278:10;:17;66253:22;;66278:21;;66298:1;;66278:21;:::i;:::-;66310:18;66331:24;;;:15;:24;;;;;;66704:10;:26;;66253:46;;-1:-1:-1;66331:24:0;;66253:46;;66704:26;;;;;;:::i;:::-;;;;;;;;;66682:48;;66768:11;66743:10;66754;66743:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;66848:28;;;:15;:28;;;;;;;:41;;;67020:24;;;;;67013:31;67055:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;66071:1008;;;66000:1079;:::o;63504:221::-;63589:14;63606:20;63623:2;63606:16;:20::i;:::-;-1:-1:-1;;;;;63637:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;63682:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;63504:221:0:o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:1;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:1;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:1;1090:18;;;;1077:32;;659:456::o;1120:1016::-;1215:6;1223;1231;1239;1292:3;1280:9;1271:7;1267:23;1263:33;1260:53;;;1309:1;1306;1299:12;1260:53;1348:9;1335:23;1367:31;1392:5;1367:31;:::i;:::-;1417:5;-1:-1:-1;1474:2:1;1459:18;;1446:32;1487:33;1446:32;1487:33;:::i;:::-;1539:7;-1:-1:-1;1593:2:1;1578:18;;1565:32;;-1:-1:-1;1648:2:1;1633:18;;1620:32;1675:18;1664:30;;1661:50;;;1707:1;1704;1697:12;1661:50;1730:22;;1783:4;1775:13;;1771:27;-1:-1:-1;1761:55:1;;1812:1;1809;1802:12;1761:55;1848:2;1835:16;1873:48;1889:31;1917:2;1889:31;:::i;:::-;1873:48;:::i;:::-;1944:2;1937:5;1930:17;1984:7;1979:2;1974;1970;1966:11;1962:20;1959:33;1956:53;;;2005:1;2002;1995:12;1956:53;2060:2;2055;2051;2047:11;2042:2;2035:5;2031:14;2018:45;2104:1;2099:2;2094;2087:5;2083:14;2079:23;2072:34;2125:5;2115:15;;;;;1120:1016;;;;;;;:::o;2141:416::-;2206:6;2214;2267:2;2255:9;2246:7;2242:23;2238:32;2235:52;;;2283:1;2280;2273:12;2235:52;2322:9;2309:23;2341:31;2366:5;2341:31;:::i;:::-;2391:5;-1:-1:-1;2448:2:1;2433:18;;2420:32;2490:15;;2483:23;2471:36;;2461:64;;2521:1;2518;2511:12;2562:315;2630:6;2638;2691:2;2679:9;2670:7;2666:23;2662:32;2659:52;;;2707:1;2704;2697:12;2659:52;2746:9;2733:23;2765:31;2790:5;2765:31;:::i;:::-;2815:5;2867:2;2852:18;;;;2839:32;;-1:-1:-1;;;2562:315:1:o;2882:245::-;2940:6;2993:2;2981:9;2972:7;2968:23;2964:32;2961:52;;;3009:1;3006;2999:12;2961:52;3048:9;3035:23;3067:30;3091:5;3067:30;:::i;3132:249::-;3201:6;3254:2;3242:9;3233:7;3229:23;3225:32;3222:52;;;3270:1;3267;3260:12;3222:52;3302:9;3296:16;3321:30;3345:5;3321:30;:::i;3386:591::-;3456:6;3464;3517:2;3505:9;3496:7;3492:23;3488:32;3485:52;;;3533:1;3530;3523:12;3485:52;3573:9;3560:23;3602:18;3643:2;3635:6;3632:14;3629:34;;;3659:1;3656;3649:12;3629:34;3697:6;3686:9;3682:22;3672:32;;3742:7;3735:4;3731:2;3727:13;3723:27;3713:55;;3764:1;3761;3754:12;3713:55;3804:2;3791:16;3830:2;3822:6;3819:14;3816:34;;;3846:1;3843;3836:12;3816:34;3891:7;3886:2;3877:6;3873:2;3869:15;3865:24;3862:37;3859:57;;;3912:1;3909;3902:12;3859:57;3943:2;3935:11;;;;;3965:6;;-1:-1:-1;3386:591:1;;-1:-1:-1;;;;3386:591:1:o;4255:635::-;4335:6;4388:2;4376:9;4367:7;4363:23;4359:32;4356:52;;;4404:1;4401;4394:12;4356:52;4437:9;4431:16;4470:18;4462:6;4459:30;4456:50;;;4502:1;4499;4492:12;4456:50;4525:22;;4578:4;4570:13;;4566:27;-1:-1:-1;4556:55:1;;4607:1;4604;4597:12;4556:55;4636:2;4630:9;4661:48;4677:31;4705:2;4677:31;:::i;4661:48::-;4732:2;4725:5;4718:17;4772:7;4767:2;4762;4758;4754:11;4750:20;4747:33;4744:53;;;4793:1;4790;4783:12;4744:53;4806:54;4857:2;4852;4845:5;4841:14;4836:2;4832;4828:11;4806:54;:::i;:::-;4879:5;4255:635;-1:-1:-1;;;;;4255:635:1:o;4895:180::-;4954:6;5007:2;4995:9;4986:7;4982:23;4978:32;4975:52;;;5023:1;5020;5013:12;4975:52;-1:-1:-1;5046:23:1;;4895:180;-1:-1:-1;4895:180:1:o;5080:257::-;5121:3;5159:5;5153:12;5186:6;5181:3;5174:19;5202:63;5258:6;5251:4;5246:3;5242:14;5235:4;5228:5;5224:16;5202:63;:::i;:::-;5319:2;5298:15;-1:-1:-1;;5294:29:1;5285:39;;;;5326:4;5281:50;;5080:257;-1:-1:-1;;5080:257:1:o;5739:1814::-;-1:-1:-1;;;6388:45:1;;6456:13;;6370:3;;6478:62;6456:13;6528:2;6519:12;;6512:4;6500:17;;6478:62;:::i;:::-;-1:-1:-1;;;6599:2:1;6559:16;;;6591:11;;;6584:76;6685:13;;6707:65;6685:13;6756:4;6748:13;;;;6729:17;;6707:65;:::i;:::-;6799:8;6795:2;6791:17;6781:27;;;6839:34;6832:4;6828:2;6824:13;6817:57;-1:-1:-1;;;6898:2:1;6894;6890:11;6883:38;6952:6;6946:13;6968:63;7022:8;7017:2;7013;7009:11;7002:4;6994:6;6990:17;6968:63;:::i;:::-;7096:66;7091:2;7050:17;;;;7083:11;;;7076:87;7193:66;7187:3;7179:12;;7172:88;7290:34;7284:3;7276:12;;7269:56;7355:66;7349:3;7341:12;;7334:88;7452:66;7446:3;7438:12;;7431:88;7543:3;7535:12;;5739:1814;-1:-1:-1;;;;;5739:1814:1:o;7558:448::-;7820:31;7815:3;7808:44;7790:3;7881:6;7875:13;7897:62;7952:6;7947:2;7942:3;7938:12;7931:4;7923:6;7919:17;7897:62;:::i;:::-;7979:16;;;;7997:2;7975:25;;7558:448;-1:-1:-1;;7558:448:1:o;8219:488::-;-1:-1:-1;;;;;8488:15:1;;;8470:34;;8540:15;;8535:2;8520:18;;8513:43;8587:2;8572:18;;8565:34;;;8635:3;8630:2;8615:18;;8608:31;;;8413:4;;8656:45;;8681:19;;8673:6;8656:45;:::i;:::-;8648:53;8219:488;-1:-1:-1;;;;;;8219:488:1:o;9768:219::-;9917:2;9906:9;9899:21;9880:4;9937:44;9977:2;9966:9;9962:18;9954:6;9937:44;:::i;11466:414::-;11668:2;11650:21;;;11707:2;11687:18;;;11680:30;11746:34;11741:2;11726:18;;11719:62;-1:-1:-1;;;11812:2:1;11797:18;;11790:48;11870:3;11855:19;;11466:414::o;18741:410::-;18943:2;18925:21;;;18982:2;18962:18;;;18955:30;19021:34;19016:2;19001:18;;18994:62;-1:-1:-1;;;19087:2:1;19072:18;;19065:44;19141:3;19126:19;;18741:410::o;19338:290::-;19515:6;19504:9;19497:25;19558:2;19553;19542:9;19538:18;19531:30;19478:4;19578:44;19618:2;19607:9;19603:18;19595:6;19578:44;:::i;19633:275::-;19704:2;19698:9;19769:2;19750:13;;-1:-1:-1;;19746:27:1;19734:40;;19804:18;19789:34;;19825:22;;;19786:62;19783:88;;;19851:18;;:::i;:::-;19887:2;19880:22;19633:275;;-1:-1:-1;19633:275:1:o;19913:186::-;19961:4;19994:18;19986:6;19983:30;19980:56;;;20016:18;;:::i;:::-;-1:-1:-1;20082:2:1;20061:15;-1:-1:-1;;20057:29:1;20088:4;20053:40;;19913:186::o;20104:128::-;20144:3;20175:1;20171:6;20168:1;20165:13;20162:39;;;20181:18;;:::i;:::-;-1:-1:-1;20217:9:1;;20104:128::o;20237:120::-;20277:1;20303;20293:35;;20308:18;;:::i;:::-;-1:-1:-1;20342:9:1;;20237:120::o;20362:168::-;20402:7;20468:1;20464;20460:6;20456:14;20453:1;20450:21;20445:1;20438:9;20431:17;20427:45;20424:71;;;20475:18;;:::i;:::-;-1:-1:-1;20515:9:1;;20362:168::o;20535:125::-;20575:4;20603:1;20600;20597:8;20594:34;;;20608:18;;:::i;:::-;-1:-1:-1;20645:9:1;;20535:125::o;20665:258::-;20737:1;20747:113;20761:6;20758:1;20755:13;20747:113;;;20837:11;;;20831:18;20818:11;;;20811:39;20783:2;20776:10;20747:113;;;20878:6;20875:1;20872:13;20869:48;;;-1:-1:-1;;20913:1:1;20895:16;;20888:27;20665:258::o;20928:380::-;21007:1;21003:12;;;;21050;;;21071:61;;21125:4;21117:6;21113:17;21103:27;;21071:61;21178:2;21170:6;21167:14;21147:18;21144:38;21141:161;;;21224:10;21219:3;21215:20;21212:1;21205:31;21259:4;21256:1;21249:15;21287:4;21284:1;21277:15;21141:161;;20928:380;;;:::o;21313:135::-;21352:3;-1:-1:-1;;21373:17:1;;21370:43;;;21393:18;;:::i;:::-;-1:-1:-1;21440:1:1;21429:13;;21313:135::o;21453:112::-;21485:1;21511;21501:35;;21516:18;;:::i;:::-;-1:-1:-1;21550:9:1;;21453:112::o;21570:127::-;21631:10;21626:3;21622:20;21619:1;21612:31;21662:4;21659:1;21652:15;21686:4;21683:1;21676:15;21702:127;21763:10;21758:3;21754:20;21751:1;21744:31;21794:4;21791:1;21784:15;21818:4;21815:1;21808:15;21834:127;21895:10;21890:3;21886:20;21883:1;21876:31;21926:4;21923:1;21916:15;21950:4;21947:1;21940:15;21966:127;22027:10;22022:3;22018:20;22015:1;22008:31;22058:4;22055:1;22048:15;22082:4;22079:1;22072:15;22098:127;22159:10;22154:3;22150:20;22147:1;22140:31;22190:4;22187:1;22180:15;22214:4;22211:1;22204:15;22230:127;22291:10;22286:3;22282:20;22279:1;22272:31;22322:4;22319:1;22312:15;22346:4;22343:1;22336:15;22362:131;-1:-1:-1;;;;;22437:31:1;;22427:42;;22417:70;;22483:1;22480;22473:12;22498:131;-1:-1:-1;;;;;;22572:32:1;;22562:43;;22552:71;;22619:1;22616;22609:12
Swarm Source
ipfs://bceed2de32b5ed49ac9b10f16c5be2eafd1ce24394974a11c600c06f9c8c0bdd
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.