Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 180 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unstake NFT By G... | 16628104 | 502 days ago | IN | 0 ETH | 0.00167255 | ||||
Unstake NFT By G... | 16370431 | 538 days ago | IN | 0 ETH | 0.00187044 | ||||
Unstake NFT By G... | 16370417 | 538 days ago | IN | 0 ETH | 0.00147184 | ||||
Claim Reward | 15607925 | 645 days ago | IN | 0 ETH | 0.00049029 | ||||
Unstake NFT By G... | 15372580 | 681 days ago | IN | 0 ETH | 0.00061026 | ||||
Unstake NFT By G... | 15248773 | 701 days ago | IN | 0 ETH | 0.00031099 | ||||
Claim Reward | 15235533 | 703 days ago | IN | 0 ETH | 0.0012037 | ||||
Stake NFT | 14868586 | 763 days ago | IN | 0 ETH | 0.00254694 | ||||
Stake NFT | 14860083 | 765 days ago | IN | 0 ETH | 0.00139239 | ||||
Stake NFT | 14860051 | 765 days ago | IN | 0 ETH | 0.00176361 | ||||
Stake NFT | 14860024 | 765 days ago | IN | 0 ETH | 0.00322525 | ||||
Claim Reward | 14810035 | 773 days ago | IN | 0 ETH | 0.00153884 | ||||
Claim Reward | 14738654 | 784 days ago | IN | 0 ETH | 0.00134975 | ||||
Stake NFT | 14737890 | 784 days ago | IN | 0 ETH | 0.00388313 | ||||
Claim Reward | 14725752 | 786 days ago | IN | 0 ETH | 0.0038226 | ||||
Stake NFT | 14709292 | 789 days ago | IN | 0 ETH | 0.00182873 | ||||
Stake NFT | 14709292 | 789 days ago | IN | 0 ETH | 0.00644721 | ||||
Claim Reward | 14657391 | 797 days ago | IN | 0 ETH | 0.00544378 | ||||
Stake NFT | 14646234 | 799 days ago | IN | 0 ETH | 0.0021734 | ||||
Stake NFT | 14646224 | 799 days ago | IN | 0 ETH | 0.00291803 | ||||
Stake NFT | 14646222 | 799 days ago | IN | 0 ETH | 0.00273992 | ||||
Stake NFT | 14646216 | 799 days ago | IN | 0 ETH | 0.00352029 | ||||
Stake NFT | 14646207 | 799 days ago | IN | 0 ETH | 0.00314262 | ||||
Stake NFT | 14646204 | 799 days ago | IN | 0 ETH | 0.00270724 | ||||
Stake NFT | 14646200 | 799 days ago | IN | 0 ETH | 0.00216792 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DinoToken
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-08 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // 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/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) 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, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // 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/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: NFT.sol pragma solidity ^0.8.0; // import "@openzeppelin/contracts/finance/PaymentSplitter.sol"; /** * @dev contract module which defines Bekk NFT NFT Collection * and all the interactions it uses */ contract NFToken is ERC1155, Ownable { //@dev Attributes for NFT configuration uint256 internal tokenId; uint256 public cost = 0 ether; uint256 public maxSupply = 5; uint256 public maxMintAmount = 5; string public name = "Dino NFT"; bool public paused; // @dev inner attributes of the contract /** * @dev Create an instance of Bekk NFT contract */ constructor( string memory _baseURI ) ERC1155(_baseURI) { tokenId = 0; } /** * @dev Mint edition to a wallet * @param _to wallet receiving the edition(s). * @param _mintAmount number of editions to mint. */ function mint(address _to, uint256 _mintAmount) public payable { require(!paused, "Sales are paused"); require(_mintAmount <= maxMintAmount, "Max amount exceeded"); require( tokenId + _mintAmount <= maxSupply, "Not enough mintable editions !" ); require( msg.value >= cost * _mintAmount, "Insufficient transaction amount." ); for (uint256 i = 0; i < _mintAmount; i++) { tokenId++; _mint(_to, tokenId, 1, ""); } } /** * @dev change cost of NFT * @param _newCost new cost of each edition */ function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } /** * @dev restrict max mintable amount of edition at a time * @param _newmaxMintAmount new max mintable amount */ function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } /** * @dev restrict max mintable amount of edition at a time * @param _nexMaxSupply new max supply */ function setmaxSupply(uint256 _nexMaxSupply) public onlyOwner { maxSupply = _nexMaxSupply; } /** * @dev set uri * @param _newURI new URI */ function setURI(string memory _newURI) public onlyOwner { _setURI(_newURI); } /** * @dev Disable minting process */ function pause() public onlyOwner { paused = !paused; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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`, 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 be 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // 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: DieHardDinos.sol // DinoPunks Team ~ DinoSphere pragma solidity >=0.8.0; /** * @notice Implements a basic ERC20 staking token with incentive distribution. */ contract DinoToken is ERC20, Ownable { using SafeMath for uint256; struct stakesStruct { mapping(uint256 => uint256[]) tokensByGen; uint256 lastBlockTimeStamp; } struct rewardsMultiplier { uint256 threshold; uint256 multiplier; } struct timelock { address holder; uint256 timelock; } struct nftInstance { uint256 nftType; NFToken erc1155; IERC721Enumerable erc721; } mapping(uint256 => rewardsMultiplier) public rewardsMultipliers; uint256 private _TIMELOCK = 3 days; uint256 internal constant SECONDS_PER_DAY = 86400; uint256 internal constant E721 = 1; uint256 internal constant E1155 = 2; bool public isUnlockedForAll; mapping(uint256 => mapping(address => uint256)) public stakesTimeLock; mapping(address => uint256) internal rewards; mapping(uint256 => uint256) internal rewardRates; mapping(address => stakesStruct) stakes; mapping(address => uint256) nftAddress; uint256 internal nbOfCollections; uint256 public maximumSupply; mapping(uint256 => nftInstance) internal collections; uint256 internal multipleReward; /** * @notice The constructor for the Staking Token. */ constructor( uint256 _supply, address[] memory _generations, uint256[] memory _nftType ) ERC20("DINO", "DINO") { // _mint(msg.sender, _supply); for (uint256 i = 0; i < _generations.length; i++) { addNFTcontract(_nftType[i], _generations[i]); } maximumSupply = _supply; } function addNFTcontract(uint256 _nftType, address _nftAddress) public onlyOwner { nbOfCollections++; nftAddress[_nftAddress] = _nftType; collections[nbOfCollections].nftType = _nftType; if (_nftType == E1155) collections[nbOfCollections].erc1155 = NFToken( payable(_nftAddress) ); else collections[nbOfCollections].erc721 = IERC721Enumerable( payable(_nftAddress) ); } function lockUnlockAll() public onlyOwner{ isUnlockedForAll = !isUnlockedForAll; } /* * @dev Set maximum supply of token * @param _newMaxSupply new maximum supply of token */ function setMaxSupply(uint256 _newMaxSupply) public onlyOwner { maximumSupply = _newMaxSupply; } function mint(uint256 _amount) public onlyOwner { _mint(msg.sender, _amount); } /* * @dev unlock user and allow him to mint * @param _holder holders address * @param _genNumber NFT collection number */ function unlockUser(address _holder, uint256 _genNumber) public onlyOwner { require( stakesTimeLock[_genNumber][_holder] > 0, "No Timelock on This User" ); stakesTimeLock[_genNumber][_holder] = block.timestamp - _TIMELOCK * 2; } /* * @dev set timelock for unstaking * @param _timelock number of days */ function setTimeLock(uint256 _timelock) public onlyOwner { _TIMELOCK = _timelock * SECONDS_PER_DAY; } /* * @dev get rewards multipliers for current account, * multipliers depend on the number of NFTs held and the number of collections * @param _holder holder address */ function getRewardsMultiplier(address _holder) internal view returns (uint256) { uint256 multiplier = 100; uint256 nbGens = 0; for (uint256 i = 0; i < nbOfCollections; i++) { if ( stakes[_holder].tokensByGen[i + 1].length > rewardsMultipliers[i + 1].threshold ) multiplier += rewardsMultipliers[i + 1].multiplier; if (stakes[_holder].tokensByGen[i + 1].length != 0) nbGens++; } if (nbGens > 1) multiplier += nbGens * multipleReward; return multiplier; } /* * @dev set rewards multipliers for a generation, * a threshold can be set for an additional multiplier bonus * @param _genNumber NFT collection generation * @param _threshold threshold for bonus multiplier * @param _multiplier bonus value */ function setRewardsMultiplier( uint256 _genNumber, uint256 _threshold, uint256 _multiplier ) public onlyOwner { require(_multiplier > 0, "Value Cannot be 0"); require(_threshold > 0, "Value Cannot be 0"); rewardsMultipliers[_genNumber] = rewardsMultiplier( _threshold, _multiplier ); } /* * @dev set rewards multipliers for holding multiple generations * @param _multiplier bonus value */ function setMultipleGenReward(uint256 _multiplier) public onlyOwner { require(_multiplier > 0, "Value Cannot be 0"); multipleReward = _multiplier; } function getUserLastTimeStamp(address _stakeholder) public view returns (uint256) { return stakes[_stakeholder].lastBlockTimeStamp; } /* * @dev set reward rate for each generation * @param _genNumber NFT collection generation * @param _rate reward rate */ function setRewardRate(uint256 _genNumber, uint256 _rate) public onlyOwner { require(_rate > 0, "Value Cannot be 0"); require( collections[_genNumber].nftType > 0, "Generation Does Not Exist" ); rewardRates[_genNumber] = _rate; } /* * @dev Get number of NFTs held by holder for current generation * @param _genNumber NFT collection generation * @param _holder holder address */ function getNFTBalance(uint256 _genNumber, address _holder) public view returns (uint256) { uint256 nftBalance = 0; if (collections[_genNumber].nftType == E721) nftBalance += collections[_genNumber].erc721.balanceOf(_holder); else if (collections[_genNumber].nftType == E1155) for ( uint256 i = 1; i <= collections[_genNumber].erc1155.maxSupply(); i++ ) { nftBalance += collections[_genNumber].erc1155.balanceOf( _holder, i ); } return nftBalance; } /* * @dev get staked tokens for a set generation for a holder * @param _genNumber NFT collection generation * @param _holder holder address */ function getStakedTokens(uint256 _genNumber, address _holder) public view returns (uint256[] memory tokens) { return stakes[_holder].tokensByGen[_genNumber]; } /* * @dev update holder balance of NFTs * @param _genNumber NFT collection generation * @param _staker holder address * @param _tokenIds tokens staked by current address */ function updateBalance( address _staker, uint256[] memory _tokenIds, uint256 _genNumber ) internal { uint256 stakingPoolSize = stakes[_staker] .tokensByGen[_genNumber] .length; uint256 tokenSize = stakingPoolSize + _tokenIds.length; uint256[] memory tokens = new uint256[](tokenSize); for (uint256 i = 0; i < stakingPoolSize; i++) tokens[i] = stakes[_staker].tokensByGen[_genNumber][i]; uint256 j = 0; for (uint256 i = stakingPoolSize; i < tokenSize; i++) { tokens[i] = _tokenIds[j]; j++; } stakes[_staker].tokensByGen[_genNumber] = tokens; stakes[_staker].lastBlockTimeStamp = block.timestamp; } /** * @notice A method for a stakeholder to create a stake. */ function stakeNFT(uint256 _genNumber, uint256[] memory _tokenIds) public // isNFTHolder(_genNumber) { uint256[] memory _amount = new uint256[](_tokenIds.length); bytes memory _data = ""; if (collections[_genNumber].nftType == E1155) { for (uint256 i = 0; i < _tokenIds.length; i++) _amount[i] = 1; collections[_genNumber].erc1155.safeBatchTransferFrom( msg.sender, address(this), _tokenIds, _amount, _data ); } else if (collections[_genNumber].nftType == E721) { for (uint256 i = 0; i < _tokenIds.length; i++) collections[_genNumber].erc721.safeTransferFrom( msg.sender, address(this), _tokenIds[i] ); } updateBalance(msg.sender, _tokenIds, _genNumber); } /** * @notice A method for a stakeholder to remove all stake. */ function unstakeAll() public { for (uint256 i = 1; i <= nbOfCollections; i++) { if (stakes[msg.sender].tokensByGen[i].length > 0) unstakeNFTByGen(i); } } /** * @notice A method for a stakeholder to remove a stake. * @param _genNumber generation number */ function unstakeNFTByGen(uint256 _genNumber) public { if ( stakesTimeLock[_genNumber][msg.sender] == 0 && isUnlockedForAll == false ) { stakesTimeLock[_genNumber][msg.sender] = block.timestamp + _TIMELOCK; } else { if (isUnlockedForAll == false) require( stakesTimeLock[_genNumber][msg.sender] <= block.timestamp, "Unstaking is Currently Locked, Please Wait For Unlock and Try Again" ); if (collections[_genNumber].nftType == E1155) { bytes memory _data = ""; uint256[] memory _amount = new uint256[]( stakes[msg.sender].tokensByGen[_genNumber].length ); for ( uint256 j = 0; j < stakes[msg.sender].tokensByGen[_genNumber].length; j++ ) _amount[j] = 1; collections[_genNumber].erc1155.safeBatchTransferFrom( address(this), msg.sender, stakes[msg.sender].tokensByGen[_genNumber], _amount, _data ); } else { for ( uint256 i = 0; i < stakes[msg.sender].tokensByGen[_genNumber].length; i++ ) collections[_genNumber].erc721.transferFrom( address(this), msg.sender, stakes[msg.sender].tokensByGen[_genNumber][i] ); } delete stakes[msg.sender].tokensByGen[_genNumber]; delete stakesTimeLock[_genNumber][msg.sender]; } } /** * @notice A method to allow a stakeholder to check his rewards. * @param _stakeholder The stakeholder to check rewards for. */ function rewardOf(address _stakeholder) public view returns (uint256) { return rewards[_stakeholder]; } /** * @notice A simple method that calculates the rewards for each stakeholder. * @param _stakeholder The stakeholder to calculate rewards for. */ function calculateReward(address _stakeholder) public view returns (uint256) { uint256 reward = 0; for (uint256 i = 0; i < nbOfCollections; i++) { if (stakesTimeLock[i + 1][_stakeholder] == 0) reward += stakes[_stakeholder].tokensByGen[i + 1].length * rewardRates[i + 1]; } uint256 lastDiffClaim = block.timestamp - stakes[_stakeholder].lastBlockTimeStamp; return ((reward * getRewardsMultiplier(_stakeholder) * lastDiffClaim) / SECONDS_PER_DAY) / 100; } /** * @notice A method to allow a stakeholder to withdraw his rewards. */ function claimReward(address _stakeHolder) public { uint256 reward = calculateReward(_stakeHolder); // rewards[msg.sender] = 0; require(reward + totalSupply() <= maximumSupply, "Max supply reached"); require(reward > 0, "No reward to claim"); stakes[_stakeHolder].lastBlockTimeStamp = block.timestamp; _mint(_stakeHolder, reward); rewards[_stakeHolder] += reward; } /** * @notice burn tokens */ function burn(address _wallet, uint256 _amount) public onlyOwner { _burn(_wallet, _amount); } function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } function onERC721Received( address, address, uint256, bytes memory ) public virtual returns (bytes4) { return this.onERC721Received.selector; } /** * @dev withdraw balance to owner of the smart contract */ function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"address[]","name":"_generations","type":"address[]"},{"internalType":"uint256[]","name":"_nftType","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_nftType","type":"uint256"},{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"addNFTcontract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"}],"name":"calculateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeHolder","type":"address"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"getNFTBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"},{"internalType":"address","name":"_holder","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"}],"name":"getUserLastTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isUnlockedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockUnlockAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maximumSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeholder","type":"address"}],"name":"rewardOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsMultipliers","outputs":[{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setMultipleGenReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"name":"setRewardsMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timelock","type":"uint256"}],"name":"setTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"stakesTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_genNumber","type":"uint256"}],"name":"unlockUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genNumber","type":"uint256"}],"name":"unstakeNFTByGen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526203f4806007553480156200001857600080fd5b50604051620030e8380380620030e88339810160408190526200003b9162000416565b60408051808201825260048082526344494e4f60e01b6020808401828152855180870190965292855284015281519192916200007a916003916200028e565b508051620000909060049060208401906200028e565b505050620000ad620000a76200012560201b60201c565b62000129565b60005b8251811015620001195762000104828281518110620000d357620000d3620004ff565b6020026020010151848381518110620000f057620000f0620004ff565b60200260200101516200017b60201b60201c565b80620001108162000515565b915050620000b0565b505050600f556200057c565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001da5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600e8054906000620001ec8362000515565b90915550506001600160a01b0381166000908152600d60209081526040808320859055600e5483526010909152902082905560028214156200025b57600e54600090815260106020526040902060010180546001600160a01b0383166001600160a01b03199091161790555050565b600e54600090815260106020526040902060020180546001600160a01b0383166001600160a01b03199091161790555050565b8280546200029c906200053f565b90600052602060002090601f016020900481019282620002c057600085556200030b565b82601f10620002db57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030b578251825591602001919060010190620002ee565b50620003199291506200031d565b5090565b5b808211156200031957600081556001016200031e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000375576200037562000334565b604052919050565b60006001600160401b0382111562000399576200039962000334565b5060051b60200190565b600082601f830112620003b557600080fd5b81516020620003ce620003c8836200037d565b6200034a565b82815260059290921b84018101918181019086841115620003ee57600080fd5b8286015b848110156200040b5780518352918301918301620003f2565b509695505050505050565b6000806000606084860312156200042c57600080fd5b8351602080860151919450906001600160401b03808211156200044e57600080fd5b818701915087601f8301126200046357600080fd5b815162000474620003c8826200037d565b81815260059190911b8301840190848101908a8311156200049457600080fd5b938501935b82851015620004cb5784516001600160a01b0381168114620004bb5760008081fd5b8252938501939085019062000499565b60408a01519097509450505080831115620004e557600080fd5b5050620004f586828701620003a3565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053857634e487b7160e01b600052601160045260246000fd5b5060010190565b600181811c908216806200055457607f821691505b602082108114156200057657634e487b7160e01b600052602260045260246000fd5b50919050565b612b5c806200058c6000396000f3fe6080604052600436106102465760003560e01c80636b0df3d211610139578063a9059cbb116100b6578063d82e39621161007a578063d82e3962146106f9578063dd62ed3e14610719578063e9b600d61461075f578063f23a6e61146107a8578063f2fde38b146107d4578063ff00f999146107f457600080fd5b8063a9059cbb14610658578063b16605dd14610678578063bc197c811461068d578063bdf890e5146106b9578063d279c191146106d957600080fd5b80638da5cb5b116100fd5780638da5cb5b146105bb57806395d89b41146105e35780639dc29fac146105f8578063a0712d6814610618578063a457c2d71461063857600080fd5b80636b0df3d2146105035780636f8b44b01461052357806370a0823114610543578063715018a61461057957806387c42c411461058e57600080fd5b80633297e5d0116101c75780633ccfd60b1161018b5780633ccfd60b1461048157806347cb7baa1461048957806358d19052146104a35780635bcb318a146104c35780636113bf82146104e357600080fd5b80633297e5d0146103d35780633462e0a8146103f357806335322f371461041357806339509351146104285780633c3395ef1461044857600080fd5b8063150b7a021161020e578063150b7a021461030857806318160ddd1461034c5780631d62ebd91461036157806323b872dd14610397578063313ce567146103b757600080fd5b80630480e58b1461024b578063053d2b071461027457806306fdde0314610296578063095ea7b3146102b85780631143c208146102e8575b600080fd5b34801561025757600080fd5b50610261600f5481565b6040519081526020015b60405180910390f35b34801561028057600080fd5b5061029461028f3660046123f9565b61082c565b005b3480156102a257600080fd5b506102ab61090d565b60405161026b9190612470565b3480156102c457600080fd5b506102d86102d33660046123f9565b61099f565b604051901515815260200161026b565b3480156102f457600080fd5b50610294610303366004612483565b6109b7565b34801561031457600080fd5b50610333610323366004612566565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161026b565b34801561035857600080fd5b50600254610261565b34801561036d57600080fd5b5061026161037c3660046125ce565b6001600160a01b03166000908152600a602052604090205490565b3480156103a357600080fd5b506102d86103b23660046125e9565b610a4f565b3480156103c357600080fd5b506040516012815260200161026b565b3480156103df57600080fd5b506102946103ee366004612625565b610a73565b3480156103ff57600080fd5b5061029461040e36600461263e565b610e1b565b34801561041f57600080fd5b50610294610ed2565b34801561043457600080fd5b506102d86104433660046123f9565b610f19565b34801561045457600080fd5b506102616104633660046125ce565b6001600160a01b03166000908152600c602052604090206001015490565b610294610f58565b34801561049557600080fd5b506008546102d89060ff1681565b3480156104af57600080fd5b506102946104be366004612625565b610ff3565b3480156104cf57600080fd5b506102946104de366004612625565b611042565b3480156104ef57600080fd5b506102946104fe3660046126e0565b61107f565b34801561050f57600080fd5b5061029461051e366004612727565b6112a2565b34801561052f57600080fd5b5061029461053e366004612625565b61137c565b34801561054f57600080fd5b5061026161055e3660046125ce565b6001600160a01b031660009081526020819052604090205490565b34801561058557600080fd5b506102946113ab565b34801561059a57600080fd5b506105ae6105a9366004612727565b6113e1565b60405161026b919061278e565b3480156105c757600080fd5b506005546040516001600160a01b03909116815260200161026b565b3480156105ef57600080fd5b506102ab611456565b34801561060457600080fd5b506102946106133660046123f9565b611465565b34801561062457600080fd5b50610294610633366004612625565b611499565b34801561064457600080fd5b506102d86106533660046123f9565b6114cd565b34801561066457600080fd5b506102d86106733660046123f9565b61155f565b34801561068457600080fd5b5061029461156d565b34801561069957600080fd5b506103336106a83660046127a1565b63bc197c8160e01b95945050505050565b3480156106c557600080fd5b506102616106d4366004612727565b6115ab565b3480156106e557600080fd5b506102946106f43660046125ce565b6117c5565b34801561070557600080fd5b506102616107143660046125ce565b6118ca565b34801561072557600080fd5b5061026161073436600461284b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561076b57600080fd5b5061079361077a366004612625565b6006602052600090815260409020805460019091015482565b6040805192835260208301919091520161026b565b3480156107b457600080fd5b506103336107c3366004612875565b63f23a6e6160e01b95945050505050565b3480156107e057600080fd5b506102946107ef3660046125ce565b6119fb565b34801561080057600080fd5b5061026161080f366004612727565b600960209081526000928352604080842090915290825290205481565b6005546001600160a01b0316331461085f5760405162461bcd60e51b8152600401610856906128da565b60405180910390fd5b60008181526009602090815260408083206001600160a01b03861684529091529020546108ce5760405162461bcd60e51b815260206004820152601860248201527f4e6f2054696d656c6f636b206f6e2054686973205573657200000000000000006044820152606401610856565b6007546108dc906002612925565b6108e69042612944565b60009182526009602090815260408084206001600160a01b03909516845293905291902055565b60606003805461091c9061295b565b80601f01602080910402602001604051908101604052809291908181526020018280546109489061295b565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b5050505050905090565b6000336109ad818585611a93565b5060019392505050565b6005546001600160a01b031633146109e15760405162461bcd60e51b8152600401610856906128da565b60008111610a015760405162461bcd60e51b815260040161085690612996565b60008211610a215760405162461bcd60e51b815260040161085690612996565b6040805180820182529283526020808401928352600094855260069052909220905181559051600190910155565b600033610a5d858285611bb8565b610a68858585611c44565b506001949350505050565b6000818152600960209081526040808320338452909152902054158015610a9d575060085460ff16155b15610acc57600754610aaf90426129c1565b600082815260096020908152604080832033845290915290205550565b60085460ff16610b71576000818152600960209081526040808320338452909152902054421015610b715760405162461bcd60e51b815260206004820152604360248201527f556e7374616b696e672069732043757272656e746c79204c6f636b65642c205060448201527f6c65617365205761697420466f7220556e6c6f636b20616e642054727920416760648201526230b4b760e91b608482015260a401610856565b60008181526010602052604090205460021415610cdd5760408051602080820183526000808352338152600c82528381208582529091529182205490919067ffffffffffffffff811115610bc757610bc76124af565b604051908082528060200260200182016040528015610bf0578160200160208202803683370190505b50905060005b336000908152600c60209081526040808320878452909152902054811015610c49576001828281518110610c2c57610c2c6129d9565b602090810291909101015280610c41816129ef565b915050610bf6565b5060008381526010602090815260408083206001015433808552600c8452828520888652909352928190209051631759616b60e11b81526001600160a01b0390931692632eb2c2d692610ca492309287908990600401612a0a565b600060405180830381600087803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b505050505050610dda565b60005b336000908152600c60209081526040808320858452909152902054811015610dd85760008281526010602090815260408083206002015433808552600c8452828520878652909352922080546001600160a01b03909316926323b872dd923092909186908110610d5257610d526129d9565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b505050508080610dd0906129ef565b915050610ce0565b505b336000908152600c602090815260408083208484529091528120610dfd9161235f565b60008181526009602090815260408083203384529091528120555b50565b6005546001600160a01b03163314610e455760405162461bcd60e51b8152600401610856906128da565b60008111610e655760405162461bcd60e51b815260040161085690612996565b600082815260106020526040902054610ec05760405162461bcd60e51b815260206004820152601960248201527f47656e65726174696f6e20446f6573204e6f74204578697374000000000000006044820152606401610856565b6000918252600b602052604090912055565b60015b600e548111610e1857336000908152600c6020908152604080832084845290915290205415610f0757610f0781610a73565b80610f11816129ef565b915050610ed5565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109ad9082908690610f539087906129c1565b611a93565b6005546001600160a01b03163314610f825760405162461bcd60e51b8152600401610856906128da565b6000610f966005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610fe0576040519150601f19603f3d011682016040523d82523d6000602084013e610fe5565b606091505b5050905080610e1857600080fd5b6005546001600160a01b0316331461101d5760405162461bcd60e51b8152600401610856906128da565b6000811161103d5760405162461bcd60e51b815260040161085690612996565b601155565b6005546001600160a01b0316331461106c5760405162461bcd60e51b8152600401610856906128da565b6110796201518082612925565b60075550565b6000815167ffffffffffffffff81111561109b5761109b6124af565b6040519080825280602002602001820160405280156110c4578160200160208202803683370190505b50604080516020808201835260008083528781526010909152919091205491925090600214156111ab5760005b835181101561112b57600183828151811061110e5761110e6129d9565b602090810291909101015280611123816129ef565b9150506110f1565b5060008481526010602052604090819020600101549051631759616b60e11b81526001600160a01b0390911690632eb2c2d6906111749033903090889088908890600401612a99565b600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b50505050611291565b600084815260106020526040902054600114156112915760005b835181101561128f5760008581526010602052604090206002015484516001600160a01b03909116906342842e0e903390309088908690811061120a5761120a6129d9565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561126457600080fd5b505af1158015611278573d6000803e3d6000fd5b505050508080611287906129ef565b9150506111c5565b505b61129c338486611e12565b50505050565b6005546001600160a01b031633146112cc5760405162461bcd60e51b8152600401610856906128da565b600e80549060006112dc836129ef565b90915550506001600160a01b0381166000908152600d60209081526040808320859055600e54835260109091529020829055600282141561134a57600e54600090815260106020526040902060010180546001600160a01b0383166001600160a01b03199091161790555050565b600e54600090815260106020526040902060020180546001600160a01b0319166001600160a01b0383161790555b5050565b6005546001600160a01b031633146113a65760405162461bcd60e51b8152600401610856906128da565b600f55565b6005546001600160a01b031633146113d55760405162461bcd60e51b8152600401610856906128da565b6113df6000611fc7565b565b6001600160a01b0381166000908152600c6020908152604080832085845282529182902080548351818402810184019094528084526060939283018282801561144957602002820191906000526020600020905b815481526020019060010190808311611435575b5050505050905092915050565b60606004805461091c9061295b565b6005546001600160a01b0316331461148f5760405162461bcd60e51b8152600401610856906128da565b6113788282612019565b6005546001600160a01b031633146114c35760405162461bcd60e51b8152600401610856906128da565b610e18338261215f565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156115525760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610856565b610a688286868403611a93565b6000336109ad818585611c44565b6005546001600160a01b031633146115975760405162461bcd60e51b8152600401610856906128da565b6008805460ff19811660ff90911615179055565b60008281526010602052604081205481906001141561166257600084815260106020526040908190206002015490516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b15801561161957600080fd5b505afa15801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190612aeb565b61165b90826129c1565b90506117be565b600084815260106020526040902054600214156117be5760015b60008581526010602090815260409182902060010154825163d5abeb0160e01b815292516001600160a01b039091169263d5abeb01926004808301939192829003018186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190612aeb565b81116117bc5760008581526010602052604090819020600101549051627eeac760e11b81526001600160a01b038681166004830152602482018490529091169062fdd58e9060440160206040518083038186803b15801561176657600080fd5b505afa15801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e9190612aeb565b6117a890836129c1565b9150806117b4816129ef565b91505061167c565b505b9392505050565b60006117d0826118ca565b9050600f546117de60025490565b6117e890836129c1565b111561182b5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610856565b600081116118705760405162461bcd60e51b81526020600482015260126024820152714e6f2072657761726420746f20636c61696d60701b6044820152606401610856565b6001600160a01b0382166000908152600c6020526040902042600190910155611899828261215f565b6001600160a01b0382166000908152600a6020526040812080548392906118c19084906129c1565b90915550505050565b600080805b600e5481101561199257600960006118e88360016129c1565b8152602080820192909252604090810160009081206001600160a01b038816825290925290205461198057600b60006119228360016129c1565b815260208082019290925260409081016000908120546001600160a01b0388168252600c909352908120906119588460016129c1565b81526020810191909152604001600020546119739190612925565b61197d90836129c1565b91505b8061198a816129ef565b9150506118cf565b506001600160a01b0383166000908152600c60205260408120600101546119b99042612944565b9050606462015180826119cb8761223e565b6119d59086612925565b6119df9190612925565b6119e99190612b04565b6119f39190612b04565b949350505050565b6005546001600160a01b03163314611a255760405162461bcd60e51b8152600401610856906128da565b6001600160a01b038116611a8a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610856565b610e1881611fc7565b6001600160a01b038316611af55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610856565b6001600160a01b038216611b565760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610856565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461129c5781811015611c375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610856565b61129c8484848403611a93565b6001600160a01b038316611ca85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610856565b6001600160a01b038216611d0a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610856565b6001600160a01b03831660009081526020819052604090205481811015611d825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610856565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611db99084906129c1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e0591815260200190565b60405180910390a361129c565b6001600160a01b0383166000908152600c602090815260408083208484529091528120548351909190611e4590836129c1565b905060008167ffffffffffffffff811115611e6257611e626124af565b604051908082528060200260200182016040528015611e8b578160200160208202803683370190505b50905060005b83811015611f08576001600160a01b0387166000908152600c602090815260408083208884529091529020805482908110611ece57611ece6129d9565b9060005260206000200154828281518110611eeb57611eeb6129d9565b602090810291909101015280611f00816129ef565b915050611e91565b506000835b83811015611f6c57868281518110611f2757611f276129d9565b6020026020010151838281518110611f4157611f416129d9565b602090810291909101015281611f56816129ef565b9250508080611f64906129ef565b915050611f0d565b506001600160a01b0387166000908152600c6020908152604080832088845282529091208351611f9e9285019061237d565b5050506001600160a01b039094166000908152600c602052604090204260019091015550505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610856565b6001600160a01b038216600090815260208190526040902054818110156120ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610856565b6001600160a01b038316600090815260208190526040812083830390556002805484929061211c908490612944565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611bab565b6001600160a01b0382166121b55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610856565b80600260008282546121c791906129c1565b90915550506001600160a01b038216600090815260208190526040812080548392906121f49084906129c1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000606481805b600e54811015612334576006600061225e8360016129c1565b815260208082019290925260409081016000908120546001600160a01b0389168252600c909352908120906122948460016129c1565b815260208101919091526040016000205411156122da57600660006122ba8360016129c1565b815260200190815260200160002060010154836122d791906129c1565b92505b6001600160a01b0385166000908152600c60205260408120906122fe8360016129c1565b815260208101919091526040016000205415612322578161231e816129ef565b9250505b8061232c816129ef565b915050612245565b5060018111156123585760115461234b9082612925565b61235590836129c1565b91505b5092915050565b5080546000825590600052602060002090810190610e1891906123c8565b8280548282559060005260206000209081019282156123b8579160200282015b828111156123b857825182559160200191906001019061239d565b506123c49291506123c8565b5090565b5b808211156123c457600081556001016123c9565b80356001600160a01b03811681146123f457600080fd5b919050565b6000806040838503121561240c57600080fd5b612415836123dd565b946020939093013593505050565b6000815180845260005b818110156124495760208185018101518683018201520161242d565b8181111561245b576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006117be6020830184612423565b60008060006060848603121561249857600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156124ee576124ee6124af565b604052919050565b600082601f83011261250757600080fd5b813567ffffffffffffffff811115612521576125216124af565b612534601f8201601f19166020016124c5565b81815284602083860101111561254957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561257c57600080fd5b612585856123dd565b9350612593602086016123dd565b925060408501359150606085013567ffffffffffffffff8111156125b657600080fd5b6125c2878288016124f6565b91505092959194509250565b6000602082840312156125e057600080fd5b6117be826123dd565b6000806000606084860312156125fe57600080fd5b612607846123dd565b9250612615602085016123dd565b9150604084013590509250925092565b60006020828403121561263757600080fd5b5035919050565b6000806040838503121561265157600080fd5b50508035926020909101359150565b600082601f83011261267157600080fd5b8135602067ffffffffffffffff82111561268d5761268d6124af565b8160051b61269c8282016124c5565b92835284810182019282810190878511156126b657600080fd5b83870192505b848310156126d5578235825291830191908301906126bc565b979650505050505050565b600080604083850312156126f357600080fd5b82359150602083013567ffffffffffffffff81111561271157600080fd5b61271d85828601612660565b9150509250929050565b6000806040838503121561273a57600080fd5b8235915061274a602084016123dd565b90509250929050565b600081518084526020808501945080840160005b8381101561278357815187529582019590820190600101612767565b509495945050505050565b6020815260006117be6020830184612753565b600080600080600060a086880312156127b957600080fd5b6127c2866123dd565b94506127d0602087016123dd565b9350604086013567ffffffffffffffff808211156127ed57600080fd5b6127f989838a01612660565b9450606088013591508082111561280f57600080fd5b61281b89838a01612660565b9350608088013591508082111561283157600080fd5b5061283e888289016124f6565b9150509295509295909350565b6000806040838503121561285e57600080fd5b612867836123dd565b915061274a602084016123dd565b600080600080600060a0868803121561288d57600080fd5b612896866123dd565b94506128a4602087016123dd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156128ce57600080fd5b61283e888289016124f6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561293f5761293f61290f565b500290565b6000828210156129565761295661290f565b500390565b600181811c9082168061296f57607f821691505b6020821081141561299057634e487b7160e01b600052602260045260246000fd5b50919050565b602080825260119082015270056616c75652043616e6e6f74206265203607c1b604082015260600190565b600082198211156129d4576129d461290f565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a0357612a0361290f565b5060010190565b6001600160a01b038681168252851660208083019190915260a060408301819052855490830181905260008681528281209092909160c085019190845b81811015612a6357845484526001948501949383019301612a47565b5050508381036060850152612a788187612753565b9150508281036080840152612a8d8185612423565b98975050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612ac590830186612753565b8281036060840152612ad78186612753565b90508281036080840152612a8d8185612423565b600060208284031215612afd57600080fd5b5051919050565b600082612b2157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220ce037b0db4bd7cc29d30e0c55858c5795b23dfdef373dfd0fe195b10de7f98fb64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000085868f9c6ed1b890201be811ceb5035b91deea5a0000000000000000000000002f2e698ee366b358cb04fe61a618018bf6d98b20000000000000000000000000c7dff8fae84e3ef27013c424198b136cdf1ed4ca0000000000000000000000000251c4512b3fdb41710c4931bbb781c7da89279d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106102465760003560e01c80636b0df3d211610139578063a9059cbb116100b6578063d82e39621161007a578063d82e3962146106f9578063dd62ed3e14610719578063e9b600d61461075f578063f23a6e61146107a8578063f2fde38b146107d4578063ff00f999146107f457600080fd5b8063a9059cbb14610658578063b16605dd14610678578063bc197c811461068d578063bdf890e5146106b9578063d279c191146106d957600080fd5b80638da5cb5b116100fd5780638da5cb5b146105bb57806395d89b41146105e35780639dc29fac146105f8578063a0712d6814610618578063a457c2d71461063857600080fd5b80636b0df3d2146105035780636f8b44b01461052357806370a0823114610543578063715018a61461057957806387c42c411461058e57600080fd5b80633297e5d0116101c75780633ccfd60b1161018b5780633ccfd60b1461048157806347cb7baa1461048957806358d19052146104a35780635bcb318a146104c35780636113bf82146104e357600080fd5b80633297e5d0146103d35780633462e0a8146103f357806335322f371461041357806339509351146104285780633c3395ef1461044857600080fd5b8063150b7a021161020e578063150b7a021461030857806318160ddd1461034c5780631d62ebd91461036157806323b872dd14610397578063313ce567146103b757600080fd5b80630480e58b1461024b578063053d2b071461027457806306fdde0314610296578063095ea7b3146102b85780631143c208146102e8575b600080fd5b34801561025757600080fd5b50610261600f5481565b6040519081526020015b60405180910390f35b34801561028057600080fd5b5061029461028f3660046123f9565b61082c565b005b3480156102a257600080fd5b506102ab61090d565b60405161026b9190612470565b3480156102c457600080fd5b506102d86102d33660046123f9565b61099f565b604051901515815260200161026b565b3480156102f457600080fd5b50610294610303366004612483565b6109b7565b34801561031457600080fd5b50610333610323366004612566565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161026b565b34801561035857600080fd5b50600254610261565b34801561036d57600080fd5b5061026161037c3660046125ce565b6001600160a01b03166000908152600a602052604090205490565b3480156103a357600080fd5b506102d86103b23660046125e9565b610a4f565b3480156103c357600080fd5b506040516012815260200161026b565b3480156103df57600080fd5b506102946103ee366004612625565b610a73565b3480156103ff57600080fd5b5061029461040e36600461263e565b610e1b565b34801561041f57600080fd5b50610294610ed2565b34801561043457600080fd5b506102d86104433660046123f9565b610f19565b34801561045457600080fd5b506102616104633660046125ce565b6001600160a01b03166000908152600c602052604090206001015490565b610294610f58565b34801561049557600080fd5b506008546102d89060ff1681565b3480156104af57600080fd5b506102946104be366004612625565b610ff3565b3480156104cf57600080fd5b506102946104de366004612625565b611042565b3480156104ef57600080fd5b506102946104fe3660046126e0565b61107f565b34801561050f57600080fd5b5061029461051e366004612727565b6112a2565b34801561052f57600080fd5b5061029461053e366004612625565b61137c565b34801561054f57600080fd5b5061026161055e3660046125ce565b6001600160a01b031660009081526020819052604090205490565b34801561058557600080fd5b506102946113ab565b34801561059a57600080fd5b506105ae6105a9366004612727565b6113e1565b60405161026b919061278e565b3480156105c757600080fd5b506005546040516001600160a01b03909116815260200161026b565b3480156105ef57600080fd5b506102ab611456565b34801561060457600080fd5b506102946106133660046123f9565b611465565b34801561062457600080fd5b50610294610633366004612625565b611499565b34801561064457600080fd5b506102d86106533660046123f9565b6114cd565b34801561066457600080fd5b506102d86106733660046123f9565b61155f565b34801561068457600080fd5b5061029461156d565b34801561069957600080fd5b506103336106a83660046127a1565b63bc197c8160e01b95945050505050565b3480156106c557600080fd5b506102616106d4366004612727565b6115ab565b3480156106e557600080fd5b506102946106f43660046125ce565b6117c5565b34801561070557600080fd5b506102616107143660046125ce565b6118ca565b34801561072557600080fd5b5061026161073436600461284b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561076b57600080fd5b5061079361077a366004612625565b6006602052600090815260409020805460019091015482565b6040805192835260208301919091520161026b565b3480156107b457600080fd5b506103336107c3366004612875565b63f23a6e6160e01b95945050505050565b3480156107e057600080fd5b506102946107ef3660046125ce565b6119fb565b34801561080057600080fd5b5061026161080f366004612727565b600960209081526000928352604080842090915290825290205481565b6005546001600160a01b0316331461085f5760405162461bcd60e51b8152600401610856906128da565b60405180910390fd5b60008181526009602090815260408083206001600160a01b03861684529091529020546108ce5760405162461bcd60e51b815260206004820152601860248201527f4e6f2054696d656c6f636b206f6e2054686973205573657200000000000000006044820152606401610856565b6007546108dc906002612925565b6108e69042612944565b60009182526009602090815260408084206001600160a01b03909516845293905291902055565b60606003805461091c9061295b565b80601f01602080910402602001604051908101604052809291908181526020018280546109489061295b565b80156109955780601f1061096a57610100808354040283529160200191610995565b820191906000526020600020905b81548152906001019060200180831161097857829003601f168201915b5050505050905090565b6000336109ad818585611a93565b5060019392505050565b6005546001600160a01b031633146109e15760405162461bcd60e51b8152600401610856906128da565b60008111610a015760405162461bcd60e51b815260040161085690612996565b60008211610a215760405162461bcd60e51b815260040161085690612996565b6040805180820182529283526020808401928352600094855260069052909220905181559051600190910155565b600033610a5d858285611bb8565b610a68858585611c44565b506001949350505050565b6000818152600960209081526040808320338452909152902054158015610a9d575060085460ff16155b15610acc57600754610aaf90426129c1565b600082815260096020908152604080832033845290915290205550565b60085460ff16610b71576000818152600960209081526040808320338452909152902054421015610b715760405162461bcd60e51b815260206004820152604360248201527f556e7374616b696e672069732043757272656e746c79204c6f636b65642c205060448201527f6c65617365205761697420466f7220556e6c6f636b20616e642054727920416760648201526230b4b760e91b608482015260a401610856565b60008181526010602052604090205460021415610cdd5760408051602080820183526000808352338152600c82528381208582529091529182205490919067ffffffffffffffff811115610bc757610bc76124af565b604051908082528060200260200182016040528015610bf0578160200160208202803683370190505b50905060005b336000908152600c60209081526040808320878452909152902054811015610c49576001828281518110610c2c57610c2c6129d9565b602090810291909101015280610c41816129ef565b915050610bf6565b5060008381526010602090815260408083206001015433808552600c8452828520888652909352928190209051631759616b60e11b81526001600160a01b0390931692632eb2c2d692610ca492309287908990600401612a0a565b600060405180830381600087803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b505050505050610dda565b60005b336000908152600c60209081526040808320858452909152902054811015610dd85760008281526010602090815260408083206002015433808552600c8452828520878652909352922080546001600160a01b03909316926323b872dd923092909186908110610d5257610d526129d9565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b505050508080610dd0906129ef565b915050610ce0565b505b336000908152600c602090815260408083208484529091528120610dfd9161235f565b60008181526009602090815260408083203384529091528120555b50565b6005546001600160a01b03163314610e455760405162461bcd60e51b8152600401610856906128da565b60008111610e655760405162461bcd60e51b815260040161085690612996565b600082815260106020526040902054610ec05760405162461bcd60e51b815260206004820152601960248201527f47656e65726174696f6e20446f6573204e6f74204578697374000000000000006044820152606401610856565b6000918252600b602052604090912055565b60015b600e548111610e1857336000908152600c6020908152604080832084845290915290205415610f0757610f0781610a73565b80610f11816129ef565b915050610ed5565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906109ad9082908690610f539087906129c1565b611a93565b6005546001600160a01b03163314610f825760405162461bcd60e51b8152600401610856906128da565b6000610f966005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610fe0576040519150601f19603f3d011682016040523d82523d6000602084013e610fe5565b606091505b5050905080610e1857600080fd5b6005546001600160a01b0316331461101d5760405162461bcd60e51b8152600401610856906128da565b6000811161103d5760405162461bcd60e51b815260040161085690612996565b601155565b6005546001600160a01b0316331461106c5760405162461bcd60e51b8152600401610856906128da565b6110796201518082612925565b60075550565b6000815167ffffffffffffffff81111561109b5761109b6124af565b6040519080825280602002602001820160405280156110c4578160200160208202803683370190505b50604080516020808201835260008083528781526010909152919091205491925090600214156111ab5760005b835181101561112b57600183828151811061110e5761110e6129d9565b602090810291909101015280611123816129ef565b9150506110f1565b5060008481526010602052604090819020600101549051631759616b60e11b81526001600160a01b0390911690632eb2c2d6906111749033903090889088908890600401612a99565b600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b50505050611291565b600084815260106020526040902054600114156112915760005b835181101561128f5760008581526010602052604090206002015484516001600160a01b03909116906342842e0e903390309088908690811061120a5761120a6129d9565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561126457600080fd5b505af1158015611278573d6000803e3d6000fd5b505050508080611287906129ef565b9150506111c5565b505b61129c338486611e12565b50505050565b6005546001600160a01b031633146112cc5760405162461bcd60e51b8152600401610856906128da565b600e80549060006112dc836129ef565b90915550506001600160a01b0381166000908152600d60209081526040808320859055600e54835260109091529020829055600282141561134a57600e54600090815260106020526040902060010180546001600160a01b0383166001600160a01b03199091161790555050565b600e54600090815260106020526040902060020180546001600160a01b0319166001600160a01b0383161790555b5050565b6005546001600160a01b031633146113a65760405162461bcd60e51b8152600401610856906128da565b600f55565b6005546001600160a01b031633146113d55760405162461bcd60e51b8152600401610856906128da565b6113df6000611fc7565b565b6001600160a01b0381166000908152600c6020908152604080832085845282529182902080548351818402810184019094528084526060939283018282801561144957602002820191906000526020600020905b815481526020019060010190808311611435575b5050505050905092915050565b60606004805461091c9061295b565b6005546001600160a01b0316331461148f5760405162461bcd60e51b8152600401610856906128da565b6113788282612019565b6005546001600160a01b031633146114c35760405162461bcd60e51b8152600401610856906128da565b610e18338261215f565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156115525760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610856565b610a688286868403611a93565b6000336109ad818585611c44565b6005546001600160a01b031633146115975760405162461bcd60e51b8152600401610856906128da565b6008805460ff19811660ff90911615179055565b60008281526010602052604081205481906001141561166257600084815260106020526040908190206002015490516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b15801561161957600080fd5b505afa15801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190612aeb565b61165b90826129c1565b90506117be565b600084815260106020526040902054600214156117be5760015b60008581526010602090815260409182902060010154825163d5abeb0160e01b815292516001600160a01b039091169263d5abeb01926004808301939192829003018186803b1580156116ce57600080fd5b505afa1580156116e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117069190612aeb565b81116117bc5760008581526010602052604090819020600101549051627eeac760e11b81526001600160a01b038681166004830152602482018490529091169062fdd58e9060440160206040518083038186803b15801561176657600080fd5b505afa15801561177a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179e9190612aeb565b6117a890836129c1565b9150806117b4816129ef565b91505061167c565b505b9392505050565b60006117d0826118ca565b9050600f546117de60025490565b6117e890836129c1565b111561182b5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610856565b600081116118705760405162461bcd60e51b81526020600482015260126024820152714e6f2072657761726420746f20636c61696d60701b6044820152606401610856565b6001600160a01b0382166000908152600c6020526040902042600190910155611899828261215f565b6001600160a01b0382166000908152600a6020526040812080548392906118c19084906129c1565b90915550505050565b600080805b600e5481101561199257600960006118e88360016129c1565b8152602080820192909252604090810160009081206001600160a01b038816825290925290205461198057600b60006119228360016129c1565b815260208082019290925260409081016000908120546001600160a01b0388168252600c909352908120906119588460016129c1565b81526020810191909152604001600020546119739190612925565b61197d90836129c1565b91505b8061198a816129ef565b9150506118cf565b506001600160a01b0383166000908152600c60205260408120600101546119b99042612944565b9050606462015180826119cb8761223e565b6119d59086612925565b6119df9190612925565b6119e99190612b04565b6119f39190612b04565b949350505050565b6005546001600160a01b03163314611a255760405162461bcd60e51b8152600401610856906128da565b6001600160a01b038116611a8a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610856565b610e1881611fc7565b6001600160a01b038316611af55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610856565b6001600160a01b038216611b565760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610856565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461129c5781811015611c375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610856565b61129c8484848403611a93565b6001600160a01b038316611ca85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610856565b6001600160a01b038216611d0a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610856565b6001600160a01b03831660009081526020819052604090205481811015611d825760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610856565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611db99084906129c1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e0591815260200190565b60405180910390a361129c565b6001600160a01b0383166000908152600c602090815260408083208484529091528120548351909190611e4590836129c1565b905060008167ffffffffffffffff811115611e6257611e626124af565b604051908082528060200260200182016040528015611e8b578160200160208202803683370190505b50905060005b83811015611f08576001600160a01b0387166000908152600c602090815260408083208884529091529020805482908110611ece57611ece6129d9565b9060005260206000200154828281518110611eeb57611eeb6129d9565b602090810291909101015280611f00816129ef565b915050611e91565b506000835b83811015611f6c57868281518110611f2757611f276129d9565b6020026020010151838281518110611f4157611f416129d9565b602090810291909101015281611f56816129ef565b9250508080611f64906129ef565b915050611f0d565b506001600160a01b0387166000908152600c6020908152604080832088845282529091208351611f9e9285019061237d565b5050506001600160a01b039094166000908152600c602052604090204260019091015550505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166120795760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610856565b6001600160a01b038216600090815260208190526040902054818110156120ed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610856565b6001600160a01b038316600090815260208190526040812083830390556002805484929061211c908490612944565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611bab565b6001600160a01b0382166121b55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610856565b80600260008282546121c791906129c1565b90915550506001600160a01b038216600090815260208190526040812080548392906121f49084906129c1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000606481805b600e54811015612334576006600061225e8360016129c1565b815260208082019290925260409081016000908120546001600160a01b0389168252600c909352908120906122948460016129c1565b815260208101919091526040016000205411156122da57600660006122ba8360016129c1565b815260200190815260200160002060010154836122d791906129c1565b92505b6001600160a01b0385166000908152600c60205260408120906122fe8360016129c1565b815260208101919091526040016000205415612322578161231e816129ef565b9250505b8061232c816129ef565b915050612245565b5060018111156123585760115461234b9082612925565b61235590836129c1565b91505b5092915050565b5080546000825590600052602060002090810190610e1891906123c8565b8280548282559060005260206000209081019282156123b8579160200282015b828111156123b857825182559160200191906001019061239d565b506123c49291506123c8565b5090565b5b808211156123c457600081556001016123c9565b80356001600160a01b03811681146123f457600080fd5b919050565b6000806040838503121561240c57600080fd5b612415836123dd565b946020939093013593505050565b6000815180845260005b818110156124495760208185018101518683018201520161242d565b8181111561245b576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006117be6020830184612423565b60008060006060848603121561249857600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156124ee576124ee6124af565b604052919050565b600082601f83011261250757600080fd5b813567ffffffffffffffff811115612521576125216124af565b612534601f8201601f19166020016124c5565b81815284602083860101111561254957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561257c57600080fd5b612585856123dd565b9350612593602086016123dd565b925060408501359150606085013567ffffffffffffffff8111156125b657600080fd5b6125c2878288016124f6565b91505092959194509250565b6000602082840312156125e057600080fd5b6117be826123dd565b6000806000606084860312156125fe57600080fd5b612607846123dd565b9250612615602085016123dd565b9150604084013590509250925092565b60006020828403121561263757600080fd5b5035919050565b6000806040838503121561265157600080fd5b50508035926020909101359150565b600082601f83011261267157600080fd5b8135602067ffffffffffffffff82111561268d5761268d6124af565b8160051b61269c8282016124c5565b92835284810182019282810190878511156126b657600080fd5b83870192505b848310156126d5578235825291830191908301906126bc565b979650505050505050565b600080604083850312156126f357600080fd5b82359150602083013567ffffffffffffffff81111561271157600080fd5b61271d85828601612660565b9150509250929050565b6000806040838503121561273a57600080fd5b8235915061274a602084016123dd565b90509250929050565b600081518084526020808501945080840160005b8381101561278357815187529582019590820190600101612767565b509495945050505050565b6020815260006117be6020830184612753565b600080600080600060a086880312156127b957600080fd5b6127c2866123dd565b94506127d0602087016123dd565b9350604086013567ffffffffffffffff808211156127ed57600080fd5b6127f989838a01612660565b9450606088013591508082111561280f57600080fd5b61281b89838a01612660565b9350608088013591508082111561283157600080fd5b5061283e888289016124f6565b9150509295509295909350565b6000806040838503121561285e57600080fd5b612867836123dd565b915061274a602084016123dd565b600080600080600060a0868803121561288d57600080fd5b612896866123dd565b94506128a4602087016123dd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156128ce57600080fd5b61283e888289016124f6565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561293f5761293f61290f565b500290565b6000828210156129565761295661290f565b500390565b600181811c9082168061296f57607f821691505b6020821081141561299057634e487b7160e01b600052602260045260246000fd5b50919050565b602080825260119082015270056616c75652043616e6e6f74206265203607c1b604082015260600190565b600082198211156129d4576129d461290f565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612a0357612a0361290f565b5060010190565b6001600160a01b038681168252851660208083019190915260a060408301819052855490830181905260008681528281209092909160c085019190845b81811015612a6357845484526001948501949383019301612a47565b5050508381036060850152612a788187612753565b9150508281036080840152612a8d8185612423565b98975050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090612ac590830186612753565b8281036060840152612ad78186612753565b90508281036080840152612a8d8185612423565b600060208284031215612afd57600080fd5b5051919050565b600082612b2157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220ce037b0db4bd7cc29d30e0c55858c5795b23dfdef373dfd0fe195b10de7f98fb64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000085868f9c6ed1b890201be811ceb5035b91deea5a0000000000000000000000002f2e698ee366b358cb04fe61a618018bf6d98b20000000000000000000000000c7dff8fae84e3ef27013c424198b136cdf1ed4ca0000000000000000000000000251c4512b3fdb41710c4931bbb781c7da89279d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : _supply (uint256): 0
Arg [1] : _generations (address[]): 0x85868F9C6eD1B890201BE811CEB5035B91dEea5a,0x2F2e698Ee366b358cB04fE61A618018bF6d98B20,0xc7DfF8faE84E3eF27013c424198b136Cdf1ED4cA,0x0251C4512b3FDB41710C4931BBb781c7Da89279D
Arg [2] : _nftType (uint256[]): 1,2,2,2
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [4] : 00000000000000000000000085868f9c6ed1b890201be811ceb5035b91deea5a
Arg [5] : 0000000000000000000000002f2e698ee366b358cb04fe61a618018bf6d98b20
Arg [6] : 000000000000000000000000c7dff8fae84e3ef27013c424198b136cdf1ed4ca
Arg [7] : 0000000000000000000000000251c4512b3fdb41710c4931bbb781c7da89279d
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
69114:14154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70223:28;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;70223:28:0;;;;;;;;71918:286;;;;;;;;;;-1:-1:-1;71918:286:0;;;;;:::i;:::-;;:::i;:::-;;15156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17507:201::-;;;;;;;;;;-1:-1:-1;17507:201:0;;;;;:::i;:::-;;:::i;:::-;;;1500:14:1;;1493:22;1475:41;;1463:2;1448:18;17507:201:0;1335:187:1;73540:384:0;;;;;;;;;;-1:-1:-1;73540:384:0;;;;;:::i;:::-;;:::i;82825:198::-;;;;;;;;;;-1:-1:-1;82825:198:0;;;;;:::i;:::-;-1:-1:-1;;;82825:198:0;;;;;;;;;;-1:-1:-1;;;;;;3499:33:1;;;3481:52;;3469:2;3454:18;82825:198:0;3337:202:1;16276:108:0;;;;;;;;;;-1:-1:-1;16364:12:0;;16276:108;;80696:117;;;;;;;;;;-1:-1:-1;80696:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;80784:21:0;80757:7;80784:21;;;:7;:21;;;;;;;80696:117;18288:295;;;;;;;;;;-1:-1:-1;18288:295:0;;;;;:::i;:::-;;:::i;16118:93::-;;;;;;;;;;-1:-1:-1;16118:93:0;;16201:2;4210:36:1;;4198:2;4183:18;16118:93:0;4068:184:1;78630:1904:0;;;;;;;;;;-1:-1:-1;78630:1904:0;;;;;:::i;:::-;;:::i;74575:296::-;;;;;;;;;;-1:-1:-1;74575:296:0;;;;;:::i;:::-;;:::i;78292:206::-;;;;;;;;;;;;;:::i;18992:240::-;;;;;;;;;;-1:-1:-1;18992:240:0;;;;;:::i;:::-;;:::i;74237:179::-;;;;;;;;;;-1:-1:-1;74237:179:0;;;;;:::i;:::-;-1:-1:-1;;;;;74369:20:0;74337:7;74369:20;;;:6;:20;;;;;:39;;;;74237:179;83110:155;;;:::i;69872:28::-;;;;;;;;;;-1:-1:-1;69872:28:0;;;;;;;;74058:171;;;;;;;;;;-1:-1:-1;74058:171:0;;;;;:::i;:::-;;:::i;72309:115::-;;;;;;;;;;-1:-1:-1;72309:115:0;;;;;:::i;:::-;;:::i;77229:973::-;;;;;;;;;;-1:-1:-1;77229:973:0;;;;;:::i;:::-;;:::i;70794:527::-;;;;;;;;;;-1:-1:-1;70794:527:0;;;;;:::i;:::-;;:::i;71548:110::-;;;;;;;;;;-1:-1:-1;71548:110:0;;;;;:::i;:::-;;:::i;16447:127::-;;;;;;;;;;-1:-1:-1;16447:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;16548:18:0;16521:7;16548:18;;;;;;;;;;;;16447:127;27664:103;;;;;;;;;;;;;:::i;75937:205::-;;;;;;;;;;-1:-1:-1;75937:205:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27013:87::-;;;;;;;;;;-1:-1:-1;27086:6:0;;27013:87;;-1:-1:-1;;;;;27086:6:0;;;6944:51:1;;6932:2;6917:18;27013:87:0;6798:203:1;15375:104:0;;;;;;;;;;;;;:::i;82230:107::-;;;;;;;;;;-1:-1:-1;82230:107:0;;;;;:::i;:::-;;:::i;71666:93::-;;;;;;;;;;-1:-1:-1;71666:93:0;;;;;:::i;:::-;;:::i;19735:438::-;;;;;;;;;;-1:-1:-1;19735:438:0;;;;;:::i;:::-;;:::i;16780:193::-;;;;;;;;;;-1:-1:-1;16780:193:0;;;;;:::i;:::-;;:::i;71329:96::-;;;;;;;;;;;;;:::i;82571:246::-;;;;;;;;;;-1:-1:-1;82571:246:0;;;;;:::i;:::-;-1:-1:-1;;;82571:246:0;;;;;;;;75056:701;;;;;;;;;;-1:-1:-1;75056:701:0;;;;;:::i;:::-;;:::i;81743:433::-;;;;;;;;;;-1:-1:-1;81743:433:0;;;;;:::i;:::-;;:::i;80991:653::-;;;;;;;;;;-1:-1:-1;80991:653:0;;;;;:::i;:::-;;:::i;17036:151::-;;;;;;;;;;-1:-1:-1;17036:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;17152:18:0;;;17125:7;17152:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17036:151;69622:63;;;;;;;;;;-1:-1:-1;69622:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;8393:25:1;;;8449:2;8434:18;;8427:34;;;;8366:18;69622:63:0;8219:248:1;82345:218:0;;;;;;;;;;-1:-1:-1;82345:218:0;;;;;:::i;:::-;-1:-1:-1;;;82345:218:0;;;;;;;;27922:201;;;;;;;;;;-1:-1:-1;27922:201:0;;;;;:::i;:::-;;:::i;69909:69::-;;;;;;;;;;-1:-1:-1;69909:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;71918:286;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;;;;;;;;;72063:1:::1;72025:26:::0;;;:14:::1;:26;::::0;;;;;;;-1:-1:-1;;;;;72025:35:0;::::1;::::0;;;;;;;;72003:113:::1;;;::::0;-1:-1:-1;;;72003:113:0;;9646:2:1;72003:113:0::1;::::0;::::1;9628:21:1::0;9685:2;9665:18;;;9658:30;9724:26;9704:18;;;9697:54;9768:18;;72003:113:0::1;9444:348:1::0;72003:113:0::1;72183:9;::::0;:13:::1;::::0;72195:1:::1;72183:13;:::i;:::-;72165:31;::::0;:15:::1;:31;:::i;:::-;72127:26;::::0;;;:14:::1;:26;::::0;;;;;;;-1:-1:-1;;;;;72127:35:0;;::::1;::::0;;;;;;;;:69;71918:286::o;15156:100::-;15210:13;15243:5;15236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15156:100;:::o;17507:201::-;17590:4;12876:10;17646:32;12876:10;17662:7;17671:6;17646:8;:32::i;:::-;-1:-1:-1;17696:4:0;;17507:201;-1:-1:-1;;;17507:201:0:o;73540:384::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;73715:1:::1;73701:11;:15;73693:45;;;;-1:-1:-1::0;;;73693:45:0::1;;;;;;;:::i;:::-;73770:1;73757:10;:14;73749:44;;;;-1:-1:-1::0;;;73749:44:0::1;;;;;;;:::i;:::-;73837:79;::::0;;;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;73804:30:0;;;:18:::1;:30:::0;;;;;:112;;;;;;::::1;::::0;;::::1;::::0;73540:384::o;18288:295::-;18419:4;12876:10;18477:38;18493:4;12876:10;18508:6;18477:15;:38::i;:::-;18526:27;18536:4;18542:2;18546:6;18526:9;:27::i;:::-;-1:-1:-1;18571:4:0;;18288:295;-1:-1:-1;;;;18288:295:0:o;78630:1904::-;78711:26;;;;:14;:26;;;;;;;;78738:10;78711:38;;;;;;;;:43;:85;;;;-1:-1:-1;78771:16:0;;;;:25;78711:85;78693:1834;;;78916:9;;78881:44;;:15;:44;:::i;:::-;78823:26;;;;:14;:26;;;;;;;;78850:10;78823:38;;;;;;;:102;78630:1904;:::o;78693:1834::-;78962:16;;;;78958:246;;79036:26;;;;:14;:26;;;;;;;;79063:10;79036:38;;;;;;;;79078:15;-1:-1:-1;79036:57:0;79006:198;;;;-1:-1:-1;;;79006:198:0;;11298:2:1;79006:198:0;;;11280:21:1;11337:2;11317:18;;;11310:30;11376:34;11356:18;;;11349:62;11447:34;11427:18;;;11420:62;-1:-1:-1;;;11498:19:1;;;11491:34;11542:19;;79006:198:0;11096:471:1;79006:198:0;79225:23;;;;:11;:23;;;;;:31;69864:1;79225:40;79221:1171;;;79286:23;;;;;;;;;:18;:23;;;79398:10;79391:18;;:6;:18;;;;;:42;;;;;;;;;:49;79286:23;;:18;79355:104;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79355:104:0;;79328:131;;79505:9;79478:176;79552:10;79545:18;;;;:6;:18;;;;;;;;:42;;;;;;;;:49;79541:53;;79478:176;;;79653:1;79640:7;79648:1;79640:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;79617:3;;;;:::i;:::-;;;;79478:176;;;-1:-1:-1;79673:23:0;;;;:11;:23;;;;;;;;:31;;;79785:10;79818:18;;;:6;:18;;;;;:42;;;;;;;;;;79673:264;;-1:-1:-1;;;79673:264:0;;-1:-1:-1;;;;;79673:31:0;;;;:53;;:264;;79757:4;;79883:7;;79913:5;;79673:264;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79267:686;;79221:1171;;;80005:9;79978:398;80052:10;80045:18;;;;:6;:18;;;;;;;;:42;;;;;;;;:49;80041:53;;79978:398;;;80161:23;;;;:11;:23;;;;;;;;:30;;;80271:10;80308:18;;;:6;:18;;;;;:42;;;;;;;;:45;;-1:-1:-1;;;;;80161:30:0;;;;:43;;80239:4;;80271:10;;80351:1;;80308:45;;;;;;:::i;:::-;;;;;;;;;;;80161:215;;-1:-1:-1;;;;;;80161:215:0;;;;;;;-1:-1:-1;;;;;13297:15:1;;;80161:215:0;;;13279:34:1;13349:15;;;;13329:18;;;13322:43;13381:18;;;13374:34;13214:18;;80161:215:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80117:3;;;;;:::i;:::-;;;;79978:398;;;;79221:1171;80420:10;80413:18;;;;:6;:18;;;;;;;;:42;;;;;;;;80406:49;;;:::i;:::-;80477:26;;;;:14;:26;;;;;;;;80504:10;80477:38;;;;;;;80470:45;78693:1834;78630:1904;:::o;74575:296::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;74677:1:::1;74669:5;:9;74661:39;;;;-1:-1:-1::0;;;74661:39:0::1;;;;;;;:::i;:::-;74767:1;74733:23:::0;;;:11:::1;:23;::::0;;;;:31;74711:110:::1;;;::::0;-1:-1:-1;;;74711:110:0;;13621:2:1;74711:110:0::1;::::0;::::1;13603:21:1::0;13660:2;13640:18;;;13633:30;13699:27;13679:18;;;13672:55;13744:18;;74711:110:0::1;13419:349:1::0;74711:110:0::1;74832:23;::::0;;;:11:::1;:23;::::0;;;;;:31;74575:296::o;78292:206::-;78349:1;78332:159;78357:15;;78352:1;:20;78332:159;;78405:10;78441:1;78398:18;;;:6;:18;;;;;;;;:33;;;;;;;;:40;:44;78394:85;;78461:18;78477:1;78461:15;:18::i;:::-;78374:3;;;;:::i;:::-;;;;78332:159;;18992:240;12876:10;19080:4;19161:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;19161:27:0;;;;;;;;;;19080:4;;12876:10;19136:66;;12876:10;;19161:27;;:40;;19191:10;;19161:40;:::i;:::-;19136:8;:66::i;83110:155::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;83167:7:::1;83188;27086:6:::0;;-1:-1:-1;;;;;27086:6:0;;27013:87;83188:7:::1;-1:-1:-1::0;;;;;83180:21:0::1;83209;83180:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83166:69;;;83254:2;83246:11;;;::::0;::::1;74058:171:::0;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;74159:1:::1;74145:11;:15;74137:45;;;;-1:-1:-1::0;;;74137:45:0::1;;;;;;;:::i;:::-;74193:14;:28:::0;74058:171::o;72309:115::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;72389:27:::1;69777:5;72389:9:::0;:27:::1;:::i;:::-;72377:9;:39:::0;-1:-1:-1;72309:115:0:o;77229:973::-;77359:24;77400:9;:16;77386:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77386:31:0;-1:-1:-1;77428:23:0;;;;;;;;;:18;:23;;;77468;;;:11;:23;;;;;;;:31;77359:58;;-1:-1:-1;77428:23:0;69864:1;77468:40;77464:670;;;77530:9;77525:61;77549:9;:16;77545:1;:20;77525:61;;;77585:1;77572:7;77580:1;77572:10;;;;;;;;:::i;:::-;;;;;;;;;;:14;77567:3;;;;:::i;:::-;;;;77525:61;;;-1:-1:-1;77603:23:0;;;;:11;:23;;;;;;;:31;;;:207;;-1:-1:-1;;;77603:207:0;;-1:-1:-1;;;;;77603:31:0;;;;:53;;:207;;77675:10;;77712:4;;77736:9;;77764:7;;77790:5;;77603:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77464:670;;;77832:23;;;;:11;:23;;;;;:31;69822:1;77832:39;77828:306;;;77893:9;77888:234;77912:9;:16;77908:1;:20;77888:234;;;77952:23;;;;:11;:23;;;;;:30;;;78091:12;;-1:-1:-1;;;;;77952:30:0;;;;:47;;78022:10;;78063:4;;78091:9;;78101:1;;78091:12;;;;;;:::i;:::-;;;;;;;;;;;77952:170;;-1:-1:-1;;;;;;77952:170:0;;;;;;;-1:-1:-1;;;;;13297:15:1;;;77952:170:0;;;13279:34:1;13349:15;;;;13329:18;;;13322:43;13381:18;;;13374:34;13214:18;;77952:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77930:3;;;;;:::i;:::-;;;;77888:234;;;;77828:306;78146:48;78160:10;78172:9;78183:10;78146:13;:48::i;:::-;77348:854;;77229:973;;:::o;70794:527::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;70908:15:::1;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;70936:23:0;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;:34;;;70993:15:::1;::::0;70981:28;;:11:::1;:28:::0;;;;;:47;;;69864:1:::1;71043:17:::0;::::1;71039:274;;;71087:15;::::0;71075:28:::1;::::0;;;:11:::1;:28;::::0;;;;:36:::1;;:100:::0;;-1:-1:-1;;;;;71075:100:0;::::1;-1:-1:-1::0;;;;;;71075:100:0;;::::1;;::::0;;70794:527;;:::o;71039:274::-:1;71216:15;::::0;71204:28:::1;::::0;;;:11:::1;:28;::::0;;;;:35:::1;;:109:::0;;-1:-1:-1;;;;;;71204:109:0::1;-1:-1:-1::0;;;;;71204:109:0;::::1;;::::0;;71039:274:::1;70794:527:::0;;:::o;71548:110::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;71621:13:::1;:29:::0;71548:110::o;27664:103::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;27729:30:::1;27756:1;27729:18;:30::i;:::-;27664:103::o:0;75937:205::-;-1:-1:-1;;;;;76095:15:0;;;;;;:6;:15;;;;;;;;:39;;;;;;;;;76088:46;;;;;;;;;;;;;;;;;76047:23;;76088:46;;;76095:39;76088:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75937:205;;;;:::o;15375:104::-;15431:13;15464:7;15457:14;;;;;:::i;82230:107::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;82306:23:::1;82312:7;82321;82306:5;:23::i;71666:93::-:0;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;71725:26:::1;71731:10;71743:7;71725:5;:26::i;19735:438::-:0;12876:10;19828:4;19911:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;19911:27:0;;;;;;;;;;19828:4;;12876:10;19957:35;;;;19949:85;;;;-1:-1:-1;;;19949:85:0;;15017:2:1;19949:85:0;;;14999:21:1;15056:2;15036:18;;;15029:30;15095:34;15075:18;;;15068:62;-1:-1:-1;;;15146:18:1;;;15139:35;15191:19;;19949:85:0;14815:401:1;19949:85:0;20070:60;20079:5;20086:7;20114:15;20095:16;:34;20070:8;:60::i;16780:193::-;16859:4;12876:10;16915:28;12876:10;16932:2;16936:6;16915:9;:28::i;71329:96::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;71401:16:::1;::::0;;-1:-1:-1;;71381:36:0;::::1;71401:16;::::0;;::::1;71400:17;71381:36;::::0;;71329:96::o;75056:701::-;75164:7;75226:23;;;:11;:23;;;;;:31;75164:7;;69822:1;75226:39;75222:500;;;75294:23;;;;:11;:23;;;;;;;:30;;;:49;;-1:-1:-1;;;75294:49:0;;-1:-1:-1;;;;;6962:32:1;;;75294:49:0;;;6944:51:1;75294:30:0;;;;:40;;6917:18:1;;75294:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75280:63;;;;:::i;:::-;;;75222:500;;;75363:23;;;;:11;:23;;;;;:31;69864:1;75363:40;75359:363;;;75453:1;75418:304;75478:23;;;;:11;:23;;;;;;;;;:31;;;:43;;-1:-1:-1;;;75478:43:0;;;;-1:-1:-1;;;;;75478:31:0;;;;:41;;:43;;;;;:23;;:43;;;;;:31;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75473:1;:48;75418:304;;75592:23;;;;:11;:23;;;;;;;:31;;;:114;;-1:-1:-1;;;75592:114:0;;-1:-1:-1;;;;;15602:32:1;;;75592:114:0;;;15584:51:1;15651:18;;;15644:34;;;75592:31:0;;;;:41;;15557:18:1;;75592:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75578:128;;;;:::i;:::-;;-1:-1:-1;75540:3:0;;;;:::i;:::-;;;;75418:304;;;;75359:363;75739:10;75056:701;-1:-1:-1;;;75056:701:0:o;81743:433::-;81804:14;81821:29;81837:12;81821:15;:29::i;:::-;81804:46;;81932:13;;81915;16364:12;;;16276:108;81915:13;81906:22;;:6;:22;:::i;:::-;:39;;81898:70;;;;-1:-1:-1;;;81898:70:0;;15891:2:1;81898:70:0;;;15873:21:1;15930:2;15910:18;;;15903:30;-1:-1:-1;;;15949:18:1;;;15942:48;16007:18;;81898:70:0;15689:342:1;81898:70:0;81996:1;81987:6;:10;81979:41;;;;-1:-1:-1;;;81979:41:0;;16238:2:1;81979:41:0;;;16220:21:1;16277:2;16257:18;;;16250:30;-1:-1:-1;;;16296:18:1;;;16289:48;16354:18;;81979:41:0;16036:342:1;81979:41:0;-1:-1:-1;;;;;82031:20:0;;;;;;:6;:20;;;;;82073:15;82031:39;;;;:57;82099:27;82038:12;82119:6;82099:5;:27::i;:::-;-1:-1:-1;;;;;82137:21:0;;;;;;:7;:21;;;;;:31;;82162:6;;82137:21;:31;;82162:6;;82137:31;:::i;:::-;;;;-1:-1:-1;;;;81743:433:0:o;80991:653::-;81086:7;;;81140:255;81164:15;;81160:1;:19;81140:255;;;81205:14;:21;81220:5;:1;81224;81220:5;:::i;:::-;81205:21;;;;;;;;;;;;;;-1:-1:-1;81205:21:0;;;-1:-1:-1;;;;;81205:35:0;;;;;;;;;;81201:182;;81365:11;:18;81377:5;:1;81381;81377:5;:::i;:::-;81365:18;;;;;;;;;;;;;;-1:-1:-1;81365:18:0;;;;-1:-1:-1;;;;;81295:20:0;;;;:6;:20;;;;;;;81328:5;:1;81332;81328:5;:::i;:::-;81295:39;;;;;;;;;;;-1:-1:-1;81295:39:0;:46;:88;;;;:::i;:::-;81264:119;;;;:::i;:::-;;;81201:182;81181:3;;;;:::i;:::-;;;;81140:255;;;-1:-1:-1;;;;;;81462:20:0;;81407:21;81462:20;;;:6;:20;;;;;:39;;;81431:70;;:15;:70;:::i;:::-;81407:94;;81633:3;69777:5;81580:13;81543:34;81564:12;81543:20;:34::i;:::-;81534:43;;:6;:43;:::i;:::-;:59;;;;:::i;:::-;81533:96;;;;:::i;:::-;81532:104;;;;:::i;:::-;81512:124;80991:653;-1:-1:-1;;;;80991:653:0:o;27922:201::-;27086:6;;-1:-1:-1;;;;;27086:6:0;12876:10;27233:23;27225:68;;;;-1:-1:-1;;;27225:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28011:22:0;::::1;28003:73;;;::::0;-1:-1:-1;;;28003:73:0;;16807:2:1;28003:73:0::1;::::0;::::1;16789:21:1::0;16846:2;16826:18;;;16819:30;16885:34;16865:18;;;16858:62;-1:-1:-1;;;16936:18:1;;;16929:36;16982:19;;28003:73:0::1;16605:402:1::0;28003:73:0::1;28087:28;28106:8;28087:18;:28::i;23371:380::-:0;-1:-1:-1;;;;;23507:19:0;;23499:68;;;;-1:-1:-1;;;23499:68:0;;17214:2:1;23499:68:0;;;17196:21:1;17253:2;17233:18;;;17226:30;17292:34;17272:18;;;17265:62;-1:-1:-1;;;17343:18:1;;;17336:34;17387:19;;23499:68:0;17012:400:1;23499:68:0;-1:-1:-1;;;;;23586:21:0;;23578:68;;;;-1:-1:-1;;;23578:68:0;;17619:2:1;23578:68:0;;;17601:21:1;17658:2;17638:18;;;17631:30;17697:34;17677:18;;;17670:62;-1:-1:-1;;;17748:18:1;;;17741:32;17790:19;;23578:68:0;17417:398:1;23578:68:0;-1:-1:-1;;;;;23659:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23711:32;;160:25:1;;;23711:32:0;;133:18:1;23711:32:0;;;;;;;;23371:380;;;:::o;24038:453::-;-1:-1:-1;;;;;17152:18:0;;;24173:24;17152:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;24240:37:0;;24236:248;;24322:6;24302:16;:26;;24294:68;;;;-1:-1:-1;;;24294:68:0;;18022:2:1;24294:68:0;;;18004:21:1;18061:2;18041:18;;;18034:30;18100:31;18080:18;;;18073:59;18149:18;;24294:68:0;17820:353:1;24294:68:0;24406:51;24415:5;24422:7;24450:6;24431:16;:25;24406:8;:51::i;20652:671::-;-1:-1:-1;;;;;20783:18:0;;20775:68;;;;-1:-1:-1;;;20775:68:0;;18380:2:1;20775:68:0;;;18362:21:1;18419:2;18399:18;;;18392:30;18458:34;18438:18;;;18431:62;-1:-1:-1;;;18509:18:1;;;18502:35;18554:19;;20775:68:0;18178:401:1;20775:68:0;-1:-1:-1;;;;;20862:16:0;;20854:64;;;;-1:-1:-1;;;20854:64:0;;18786:2:1;20854:64:0;;;18768:21:1;18825:2;18805:18;;;18798:30;18864:34;18844:18;;;18837:62;-1:-1:-1;;;18915:18:1;;;18908:33;18958:19;;20854:64:0;18584:399:1;20854:64:0;-1:-1:-1;;;;;21004:15:0;;20982:19;21004:15;;;;;;;;;;;21038:21;;;;21030:72;;;;-1:-1:-1;;;21030:72:0;;19190:2:1;21030:72:0;;;19172:21:1;19229:2;19209:18;;;19202:30;19268:34;19248:18;;;19241:62;-1:-1:-1;;;19319:18:1;;;19312:36;19365:19;;21030:72:0;18988:402:1;21030:72:0;-1:-1:-1;;;;;21138:15:0;;;:9;:15;;;;;;;;;;;21156:20;;;21138:38;;21198:13;;;;;;;;:23;;21170:6;;21138:9;21198:23;;21170:6;;21198:23;:::i;:::-;;;;;;;;21254:2;-1:-1:-1;;;;;21239:26:0;21248:4;-1:-1:-1;;;;;21239:26:0;;21258:6;21239:26;;;;160:25:1;;148:2;133:18;;14:177;21239:26:0;;;;;;;;21278:37;22342:591;76358:783;-1:-1:-1;;;;;76526:15:0;;76500:23;76526:15;;;:6;:15;;;;;;;;:53;;;;;;;;:74;76649:16;;76526:74;;76500:23;76631:34;;76526:74;76631:34;:::i;:::-;76611:54;;76676:23;76716:9;76702:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76702:24:0;;76676:50;;76742:9;76737:113;76761:15;76757:1;:19;76737:113;;;-1:-1:-1;;;;;76808:15:0;;;;;;:6;:15;;;;;;;;:39;;;;;;;;:42;;76848:1;;76808:42;;;;;;:::i;:::-;;;;;;;;;76796:6;76803:1;76796:9;;;;;;;;:::i;:::-;;;;;;;;;;:54;76778:3;;;;:::i;:::-;;;;76737:113;;;-1:-1:-1;76863:9:0;76904:15;76887:123;76925:9;76921:1;:13;76887:123;;;76968:9;76978:1;76968:12;;;;;;;;:::i;:::-;;;;;;;76956:6;76963:1;76956:9;;;;;;;;:::i;:::-;;;;;;;;;;:24;76995:3;;;;:::i;:::-;;;;76936;;;;;:::i;:::-;;;;76887:123;;;-1:-1:-1;;;;;;77022:15:0;;;;;;:6;:15;;;;;;;;:39;;;;;;;;:48;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;77081:15:0;;;;;;;:6;:15;;;;;77118;77081:34;;;;:52;-1:-1:-1;;;;76358:783:0:o;28283:191::-;28376:6;;;-1:-1:-1;;;;;28393:17:0;;;-1:-1:-1;;;;;;28393:17:0;;;;;;;28426:40;;28376:6;;;28393:17;28376:6;;28426:40;;28357:16;;28426:40;28346:128;28283:191;:::o;22342:591::-;-1:-1:-1;;;;;22426:21:0;;22418:67;;;;-1:-1:-1;;;22418:67:0;;19597:2:1;22418:67:0;;;19579:21:1;19636:2;19616:18;;;19609:30;19675:34;19655:18;;;19648:62;-1:-1:-1;;;19726:18:1;;;19719:31;19767:19;;22418:67:0;19395:397:1;22418:67:0;-1:-1:-1;;;;;22585:18:0;;22560:22;22585:18;;;;;;;;;;;22622:24;;;;22614:71;;;;-1:-1:-1;;;22614:71:0;;19999:2:1;22614:71:0;;;19981:21:1;20038:2;20018:18;;;20011:30;20077:34;20057:18;;;20050:62;-1:-1:-1;;;20128:18:1;;;20121:32;20170:19;;22614:71:0;19797:398:1;22614:71:0;-1:-1:-1;;;;;22721:18:0;;:9;:18;;;;;;;;;;22742:23;;;22721:44;;22787:12;:22;;22759:6;;22721:9;22787:22;;22759:6;;22787:22;:::i;:::-;;;;-1:-1:-1;;22827:37:0;;160:25:1;;;22853:1:0;;-1:-1:-1;;;;;22827:37:0;;;;;148:2:1;133:18;22827:37:0;14:177:1;21610:399:0;-1:-1:-1;;;;;21694:21:0;;21686:65;;;;-1:-1:-1;;;21686:65:0;;20402:2:1;21686:65:0;;;20384:21:1;20441:2;20421:18;;;20414:30;20480:33;20460:18;;;20453:61;20531:18;;21686:65:0;20200:355:1;21686:65:0;21842:6;21826:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;21859:18:0;;:9;:18;;;;;;;;;;:28;;21881:6;;21859:9;:28;;21881:6;;21859:28;:::i;:::-;;;;-1:-1:-1;;21903:37:0;;160:25:1;;;-1:-1:-1;;;;;21903:37:0;;;21920:1;;21903:37;;148:2:1;133:18;21903:37:0;;;;;;;70794:527;;:::o;72629:617::-;72726:7;72772:3;72726:7;;72815:332;72839:15;;72835:1;:19;72815:332;;;72959:18;:25;72978:5;:1;72982;72978:5;:::i;:::-;72959:25;;;;;;;;;;;;;;-1:-1:-1;72959:25:0;;;:35;-1:-1:-1;;;;;72898:15:0;;;;:6;:15;;;;;;;72926:5;:1;72930;72926:5;:::i;:::-;72898:34;;;;;;;;;;;-1:-1:-1;72898:34:0;:41;:96;72876:184;;;73024:18;:25;73043:5;:1;73047;73043:5;:::i;:::-;73024:25;;;;;;;;;;;:36;;;73010:50;;;;;:::i;:::-;;;72876:184;-1:-1:-1;;;;;73079:15:0;;;;;;:6;:15;;;;;;73107:5;:1;73111;73107:5;:::i;:::-;73079:34;;;;;;;;;;;-1:-1:-1;73079:34:0;:41;:46;73075:60;;73127:8;;;;:::i;:::-;;;;73075:60;72856:3;;;;:::i;:::-;;;;72815:332;;;;73170:1;73161:6;:10;73157:53;;;73196:14;;73187:23;;:6;:23;:::i;:::-;73173:37;;;;:::i;:::-;;;73157:53;-1:-1:-1;73228:10:0;72629:617;-1:-1:-1;;72629:617:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:173:1;264:20;;-1:-1:-1;;;;;313:31:1;;303:42;;293:70;;359:1;356;349:12;293:70;196:173;;;:::o;374:254::-;442:6;450;503:2;491:9;482:7;478:23;474:32;471:52;;;519:1;516;509:12;471:52;542:29;561:9;542:29;:::i;:::-;532:39;618:2;603:18;;;;590:32;;-1:-1:-1;;;374:254:1:o;633:472::-;675:3;713:5;707:12;740:6;735:3;728:19;765:1;775:162;789:6;786:1;783:13;775:162;;;851:4;907:13;;;903:22;;897:29;879:11;;;875:20;;868:59;804:12;775:162;;;955:6;952:1;949:13;946:87;;;1021:1;1014:4;1005:6;1000:3;996:16;992:27;985:38;946:87;-1:-1:-1;1087:2:1;1066:15;-1:-1:-1;;1062:29:1;1053:39;;;;1094:4;1049:50;;633:472;-1:-1:-1;;633:472:1:o;1110:220::-;1259:2;1248:9;1241:21;1222:4;1279:45;1320:2;1309:9;1305:18;1297:6;1279:45;:::i;1527:316::-;1604:6;1612;1620;1673:2;1661:9;1652:7;1648:23;1644:32;1641:52;;;1689:1;1686;1679:12;1641:52;-1:-1:-1;;1712:23:1;;;1782:2;1767:18;;1754:32;;-1:-1:-1;1833:2:1;1818:18;;;1805:32;;1527:316;-1:-1:-1;1527:316:1:o;1848:127::-;1909:10;1904:3;1900:20;1897:1;1890:31;1940:4;1937:1;1930:15;1964:4;1961:1;1954:15;1980:275;2051:2;2045:9;2116:2;2097:13;;-1:-1:-1;;2093:27:1;2081:40;;2151:18;2136:34;;2172:22;;;2133:62;2130:88;;;2198:18;;:::i;:::-;2234:2;2227:22;1980:275;;-1:-1:-1;1980:275:1:o;2260:530::-;2302:5;2355:3;2348:4;2340:6;2336:17;2332:27;2322:55;;2373:1;2370;2363:12;2322:55;2409:6;2396:20;2435:18;2431:2;2428:26;2425:52;;;2457:18;;:::i;:::-;2501:55;2544:2;2525:13;;-1:-1:-1;;2521:27:1;2550:4;2517:38;2501:55;:::i;:::-;2581:2;2572:7;2565:19;2627:3;2620:4;2615:2;2607:6;2603:15;2599:26;2596:35;2593:55;;;2644:1;2641;2634:12;2593:55;2709:2;2702:4;2694:6;2690:17;2683:4;2674:7;2670:18;2657:55;2757:1;2732:16;;;2750:4;2728:27;2721:38;;;;2736:7;2260:530;-1:-1:-1;;;2260:530:1:o;2795:537::-;2890:6;2898;2906;2914;2967:3;2955:9;2946:7;2942:23;2938:33;2935:53;;;2984:1;2981;2974:12;2935:53;3007:29;3026:9;3007:29;:::i;:::-;2997:39;;3055:38;3089:2;3078:9;3074:18;3055:38;:::i;:::-;3045:48;;3140:2;3129:9;3125:18;3112:32;3102:42;;3195:2;3184:9;3180:18;3167:32;3222:18;3214:6;3211:30;3208:50;;;3254:1;3251;3244:12;3208:50;3277:49;3318:7;3309:6;3298:9;3294:22;3277:49;:::i;:::-;3267:59;;;2795:537;;;;;;;:::o;3544:186::-;3603:6;3656:2;3644:9;3635:7;3631:23;3627:32;3624:52;;;3672:1;3669;3662:12;3624:52;3695:29;3714:9;3695:29;:::i;3735:328::-;3812:6;3820;3828;3881:2;3869:9;3860:7;3856:23;3852:32;3849:52;;;3897:1;3894;3887:12;3849:52;3920:29;3939:9;3920:29;:::i;:::-;3910:39;;3968:38;4002:2;3991:9;3987:18;3968:38;:::i;:::-;3958:48;;4053:2;4042:9;4038:18;4025:32;4015:42;;3735:328;;;;;:::o;4257:180::-;4316:6;4369:2;4357:9;4348:7;4344:23;4340:32;4337:52;;;4385:1;4382;4375:12;4337:52;-1:-1:-1;4408:23:1;;4257:180;-1:-1:-1;4257:180:1:o;4442:248::-;4510:6;4518;4571:2;4559:9;4550:7;4546:23;4542:32;4539:52;;;4587:1;4584;4577:12;4539:52;-1:-1:-1;;4610:23:1;;;4680:2;4665:18;;;4652:32;;-1:-1:-1;4442:248:1:o;4695:712::-;4749:5;4802:3;4795:4;4787:6;4783:17;4779:27;4769:55;;4820:1;4817;4810:12;4769:55;4856:6;4843:20;4882:4;4905:18;4901:2;4898:26;4895:52;;;4927:18;;:::i;:::-;4973:2;4970:1;4966:10;4996:28;5020:2;5016;5012:11;4996:28;:::i;:::-;5058:15;;;5128;;;5124:24;;;5089:12;;;;5160:15;;;5157:35;;;5188:1;5185;5178:12;5157:35;5224:2;5216:6;5212:15;5201:26;;5236:142;5252:6;5247:3;5244:15;5236:142;;;5318:17;;5306:30;;5269:12;;;;5356;;;;5236:142;;;5396:5;4695:712;-1:-1:-1;;;;;;;4695:712:1:o;5412:416::-;5505:6;5513;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;5618:9;5605:23;5595:33;;5679:2;5668:9;5664:18;5651:32;5706:18;5698:6;5695:30;5692:50;;;5738:1;5735;5728:12;5692:50;5761:61;5814:7;5805:6;5794:9;5790:22;5761:61;:::i;:::-;5751:71;;;5412:416;;;;;:::o;5833:254::-;5901:6;5909;5962:2;5950:9;5941:7;5937:23;5933:32;5930:52;;;5978:1;5975;5968:12;5930:52;6014:9;6001:23;5991:33;;6043:38;6077:2;6066:9;6062:18;6043:38;:::i;:::-;6033:48;;5833:254;;;;;:::o;6092:435::-;6145:3;6183:5;6177:12;6210:6;6205:3;6198:19;6236:4;6265:2;6260:3;6256:12;6249:19;;6302:2;6295:5;6291:14;6323:1;6333:169;6347:6;6344:1;6341:13;6333:169;;;6408:13;;6396:26;;6442:12;;;;6477:15;;;;6369:1;6362:9;6333:169;;;-1:-1:-1;6518:3:1;;6092:435;-1:-1:-1;;;;;6092:435:1:o;6532:261::-;6711:2;6700:9;6693:21;6674:4;6731:56;6783:2;6772:9;6768:18;6760:6;6731:56;:::i;7006:943::-;7160:6;7168;7176;7184;7192;7245:3;7233:9;7224:7;7220:23;7216:33;7213:53;;;7262:1;7259;7252:12;7213:53;7285:29;7304:9;7285:29;:::i;:::-;7275:39;;7333:38;7367:2;7356:9;7352:18;7333:38;:::i;:::-;7323:48;;7422:2;7411:9;7407:18;7394:32;7445:18;7486:2;7478:6;7475:14;7472:34;;;7502:1;7499;7492:12;7472:34;7525:61;7578:7;7569:6;7558:9;7554:22;7525:61;:::i;:::-;7515:71;;7639:2;7628:9;7624:18;7611:32;7595:48;;7668:2;7658:8;7655:16;7652:36;;;7684:1;7681;7674:12;7652:36;7707:63;7762:7;7751:8;7740:9;7736:24;7707:63;:::i;:::-;7697:73;;7823:3;7812:9;7808:19;7795:33;7779:49;;7853:2;7843:8;7840:16;7837:36;;;7869:1;7866;7859:12;7837:36;;7892:51;7935:7;7924:8;7913:9;7909:24;7892:51;:::i;:::-;7882:61;;;7006:943;;;;;;;;:::o;7954:260::-;8022:6;8030;8083:2;8071:9;8062:7;8058:23;8054:32;8051:52;;;8099:1;8096;8089:12;8051:52;8122:29;8141:9;8122:29;:::i;:::-;8112:39;;8170:38;8204:2;8193:9;8189:18;8170:38;:::i;8472:606::-;8576:6;8584;8592;8600;8608;8661:3;8649:9;8640:7;8636:23;8632:33;8629:53;;;8678:1;8675;8668:12;8629:53;8701:29;8720:9;8701:29;:::i;:::-;8691:39;;8749:38;8783:2;8772:9;8768:18;8749:38;:::i;:::-;8739:48;;8834:2;8823:9;8819:18;8806:32;8796:42;;8885:2;8874:9;8870:18;8857:32;8847:42;;8940:3;8929:9;8925:19;8912:33;8968:18;8960:6;8957:30;8954:50;;;9000:1;8997;8990:12;8954:50;9023:49;9064:7;9055:6;9044:9;9040:22;9023:49;:::i;9083:356::-;9285:2;9267:21;;;9304:18;;;9297:30;9363:34;9358:2;9343:18;;9336:62;9430:2;9415:18;;9083:356::o;9797:127::-;9858:10;9853:3;9849:20;9846:1;9839:31;9889:4;9886:1;9879:15;9913:4;9910:1;9903:15;9929:168;9969:7;10035:1;10031;10027:6;10023:14;10020:1;10017:21;10012:1;10005:9;9998:17;9994:45;9991:71;;;10042:18;;:::i;:::-;-1:-1:-1;10082:9:1;;9929:168::o;10102:125::-;10142:4;10170:1;10167;10164:8;10161:34;;;10175:18;;:::i;:::-;-1:-1:-1;10212:9:1;;10102:125::o;10232:380::-;10311:1;10307:12;;;;10354;;;10375:61;;10429:4;10421:6;10417:17;10407:27;;10375:61;10482:2;10474:6;10471:14;10451:18;10448:38;10445:161;;;10528:10;10523:3;10519:20;10516:1;10509:31;10563:4;10560:1;10553:15;10591:4;10588:1;10581:15;10445:161;;10232:380;;;:::o;10617:341::-;10819:2;10801:21;;;10858:2;10838:18;;;10831:30;-1:-1:-1;;;10892:2:1;10877:18;;10870:47;10949:2;10934:18;;10617:341::o;10963:128::-;11003:3;11034:1;11030:6;11027:1;11024:13;11021:39;;;11040:18;;:::i;:::-;-1:-1:-1;11076:9:1;;10963:128::o;11572:127::-;11633:10;11628:3;11624:20;11621:1;11614:31;11664:4;11661:1;11654:15;11688:4;11685:1;11678:15;11704:135;11743:3;-1:-1:-1;;11764:17:1;;11761:43;;;11784:18;;:::i;:::-;-1:-1:-1;11831:1:1;11820:13;;11704:135::o;11844:1190::-;-1:-1:-1;;;;;12280:15:1;;;12262:34;;12353:15;;12315:2;12333:18;;;12326:43;;;;12211:3;12400:2;12385:18;;12378:31;;;12458:13;;12196:19;;;12480:22;;;12163:4;12546:17;;;12586:16;;;12163:4;;12586:16;;12533:3;12518:19;;;12315:2;12163:4;12630:168;12644:6;12641:1;12638:13;12630:168;;;12705:13;;12693:26;;12786:1;12774:14;;;;12739:12;;;;12659:9;12630:168;;;12634:3;;;12843:9;12838:3;12834:19;12829:2;12818:9;12814:18;12807:47;12877:41;12914:3;12906:6;12877:41;:::i;:::-;12863:55;;;12967:9;12959:6;12955:22;12949:3;12938:9;12934:19;12927:51;12995:33;13021:6;13013;12995:33;:::i;:::-;12987:41;11844:1190;-1:-1:-1;;;;;;;;11844:1190:1:o;13983:827::-;-1:-1:-1;;;;;14380:15:1;;;14362:34;;14432:15;;14427:2;14412:18;;14405:43;14342:3;14479:2;14464:18;;14457:31;;;14305:4;;14511:57;;14548:19;;14540:6;14511:57;:::i;:::-;14616:9;14608:6;14604:22;14599:2;14588:9;14584:18;14577:50;14650:44;14687:6;14679;14650:44;:::i;:::-;14636:58;;14743:9;14735:6;14731:22;14725:3;14714:9;14710:19;14703:51;14771:33;14797:6;14789;14771:33;:::i;15221:184::-;15291:6;15344:2;15332:9;15323:7;15319:23;15315:32;15312:52;;;15360:1;15357;15350:12;15312:52;-1:-1:-1;15383:16:1;;15221:184;-1:-1:-1;15221:184:1:o;16383:217::-;16423:1;16449;16439:132;;16493:10;16488:3;16484:20;16481:1;16474:31;16528:4;16525:1;16518:15;16556:4;16553:1;16546:15;16439:132;-1:-1:-1;16585:9:1;;16383:217::o
Swarm Source
ipfs://ce037b0db4bd7cc29d30e0c55858c5795b23dfdef373dfd0fe195b10de7f98fb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.