Overview
Max Total Supply
13,665,972.621537179759467712 BOO
Holders
86,180 ( 0.013%)
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$17,355,785.23
Circulating Supply Market Cap
$12,595,635.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
328.013250025250051753 BOOValue
$416.58 ( ~660.4521 FTM) [0.0024%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
SpookyToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-04-25 */ // SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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); } /** * @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 guidelines: functions revert instead * of 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 { 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 defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All three 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 * overloaded; * * 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 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: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, 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: * * - `to` 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); } /** * @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"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(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 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 to 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 Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) { return keccak256( abi.encode( typeHash, name, version, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // This version of ERC20Permit is from OpenZeppelin as of commit // https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5171e46c47bd6be781aa92315944ca37126d4a73 /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping (address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") { } /** * @dev See {IERC20Permit-permit}. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override { // solhint-disable-next-line not-rely-on-time require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( _PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline ) ); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract SpookyToken is ERC20Permit, Ownable { constructor() ERC20("SpookyToken", "BOO") ERC20Permit("SpookyToken") { } uint256 constant private _maxTotalSupply = 13666000e18; // 13,666,000 max boos function mint(address _to, uint256 _amount) public onlyOwner { require(totalSupply() + _amount <= _maxTotalSupply, "ERC20: minting more then MaxTotalSupply"); _mint(_to, _amount); _moveDelegates(address(0), _to, _amount); } // Returns maximum total supply of the token function getMaxTotalSupply() external pure returns (uint256) { return _maxTotalSupply; } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol // A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); // A record of states for signing / validating signatures //mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { bool result = super.transferFrom(sender, recipient, amount); // Call parent hook _moveDelegates(sender, recipient, amount); return result; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { bool result = super.transfer(recipient, amount); // Call parent hook _moveDelegates(_msgSender(), recipient, amount); return result; } /** * @param delegator The address to get delegates for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "BOO::delegateBySig: invalid signature"); require(nonce == _useNonce(signatory), "BOO::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "BOO::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "BOO::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BOOs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "BOO::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","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":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","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":[{"internalType":"address","name":"_to","type":"address"},{"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":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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"}]
Contract Creation Code
6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600b81526020016a29b837b7b5bcaa37b5b2b760a91b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600b81526020016a29b837b7b5bcaa37b5b2b760a91b81525060405180604001604052806003815260200162424f4f60e81b8152508160039080519060200190620000cf929190620001e9565b508051620000e5906004906020840190620001e9565b5050825160208085019190912083519184019190912060c082905260e08190524660a0529091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200013a818484620001a9565b60805261010052506000935062000155925050620001e59050565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002f8565b60008383834630604051602001620001c69594939291906200028f565b6040516020818303038152906040528051906020012090509392505050565b3390565b828054620001f790620002bb565b90600052602060002090601f0160209004810192826200021b576000855562000266565b82601f106200023657805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026657825182559160200191906001019062000249565b506200027492915062000278565b5090565b5b8082111562000274576000815560010162000279565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600281046001821680620002d057607f821691505b60208210811415620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516129f0620003486000396000610e53015260006115180152600061155a01526000611539015260006114c6015260006114ef01526129f06000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610387578063e7a324dc1461039a578063f1127ed8146103a2578063f2fde38b146103c3576101c4565b8063b4b5ea571461034e578063c3cda52014610361578063d505accf14610374576101c4565b80638da5cb5b116100d35780638da5cb5b1461031857806395d89b4114610320578063a457c2d714610328578063a9059cbb1461033b576101c4565b8063715018a6146102ea578063782d6fe1146102f25780637ecebe0014610305576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461029c5780635db30bb1146102af5780636fcfff45146102b757806370a08231146102d7576101c4565b8063395093511461025457806340c10f1914610267578063587cde1e1461027c576101c4565b806320606b70116101a257806320606b701461021c57806323b872dd14610224578063313ce567146102375780633644e5151461024c576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610207575b600080fd5b6101d16103d6565b6040516101de919061210e565b60405180910390f35b6101fa6101f5366004611eeb565b610469565b6040516101de9190612000565b61020f610487565b6040516101de919061200b565b61020f61048d565b6101fa610232366004611e47565b6104b1565b61023f6104d4565b6040516101de9190612838565b61020f6104d9565b6101fa610262366004611eeb565b6104e8565b61027a610275366004611eeb565b610549565b005b61028f61028a366004611dfb565b610636565b6040516101de9190611fdf565b61027a6102aa366004611dfb565b610664565b61020f610671565b6102ca6102c5366004611dfb565b610680565b6040516101de9190612811565b61020f6102e5366004611dfb565b610698565b61027a6106c0565b61020f610300366004611eeb565b6107a2565b61020f610313366004611dfb565b610a2f565b61028f610a5d565b6101d1610a79565b6101fa610336366004611eeb565b610a88565b6101fa610349366004611eeb565b610b2a565b61020f61035c366004611dfb565b610b52565b61027a61036f366004611f14565b610be0565b61027a610382366004611e82565b610e15565b61020f610395366004611e15565b610f39565b61020f610f71565b6103b56103b0366004611f6b565b610f95565b6040516101de929190612822565b61027a6103d1366004611dfb565b610fc2565b6060600380546103e59061290a565b80601f01602080910402602001604051908101604052809291908181526020018280546104119061290a565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b505050505090505b90565b600061047d610476611110565b8484611114565b5060015b92915050565b60025490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000806104bf858585611223565b90506104cc8585856112f6565b949350505050565b601290565b60006104e36114c2565b905090565b600061047d6104f5611110565b848460016000610503611110565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918b16815292529020546105449190612846565b611114565b610551611110565b73ffffffffffffffffffffffffffffffffffffffff1661056f610a5d565b73ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60405180910390fd5b6a0b4de3582e7cd659400000816105da610487565b6105e49190612846565b111561061c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906124d5565b6106268282611585565b610632600083836112f6565b5050565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260076020526040902054165b919050565b61066e3382611686565b50565b6a0b4de3582e7cd65940000090565b60096020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6106c8611110565b73ffffffffffffffffffffffffffffffffffffffff166106e6610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614610733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60065460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60004382106107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906123be565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff1680610818576000915050610481565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120849161084a6001856128e5565b63ffffffff908116825260208201929092526040016000205416116108c05773ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081209061089a6001846128e5565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610481565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff16831015610908576000915050610481565b6000806109166001846128e5565b90505b8163ffffffff168163ffffffff1611156109eb576000600261093b84846128e5565b6109459190612886565b61094f90836128e5565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156109bf576020015194506104819350505050565b805163ffffffff168711156109d6578193506109e4565b6109e16001836128e5565b92505b5050610919565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206104819061174d565b60065473ffffffffffffffffffffffffffffffffffffffff1690565b6060600480546103e59061290a565b60008060016000610a97611110565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091881681529252902054905082811015610b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061276f565b610b20610b15611110565b8561054486856128ce565b5060019392505050565b600080610b378484611751565b9050610b4b610b44611110565b85856112f6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff1680610b8a576000610b4b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812090610bbb6001846128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101549392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610c0b6103d6565b80519060200120610c1a611765565b30604051602001610c2e94939291906120bf565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610c7f9493929190612055565b60405160208183030381529060405280519060200120905060008282604051602001610cac929190611fa9565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610ce994939291906120f0565b6020604051602081039080840390855afa158015610d0b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610d83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061241b565b610d8c81611769565b8914610dc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612658565b87421115610dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612712565b610e08818b611686565b505050505b505050505050565b83421115610e4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906122cd565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610e7e8c611769565b89604051602001610e9496959493929190612014565b6040516020818303038152906040528051906020012090506000610eb7826117a8565b90506000610ec7828787876117bb565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612532565b610e088a8a8a611114565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b610fca611110565b73ffffffffffffffffffffffffffffffffffffffff16610fe8610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b73ffffffffffffffffffffffffffffffffffffffff8116611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612213565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316611161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906126b5565b73ffffffffffffffffffffffffffffffffffffffff82166111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612270565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061121690859061200b565b60405180910390a3505050565b600061123084848461192a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208161125e611110565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612569565b6112eb856112e1611110565b61054486856128ce565b506001949350505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156113325750600081115b156114bd5773ffffffffffffffffffffffffffffffffffffffff8316156113fc5773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff16908161138c5760006113dc565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120906113bd6001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006113ea84836128ce565b90506113f886848484611aee565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156114bd5773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff1690816114515760006114a1565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120906114826001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006114af8483612846565b9050610e0d85848484611aee565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561151357507f0000000000000000000000000000000000000000000000000000000000000000610466565b61157e7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611d06565b9050610466565b73ffffffffffffffffffffffffffffffffffffffff82166115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906127cc565b6115de600083836114bd565b80600260008282546115f09190612846565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061162a908490612846565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061167a90859061200b565b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020526040812054909116906116ba84610698565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46117478284836112f6565b50505050565b5490565b600061047d61175e611110565b848461192a565b4690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206117978161174d565b91506117a281611d40565b50919050565b60006104816117b56114c2565b83611d49565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612361565b8360ff16601b148061182c57508360ff16601c145b611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612478565b60006001868686866040516000815260200160405260405161188794939291906120f0565b6020604051602081039080840390855afa1580156118a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061217f565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8316611977576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125fb565b73ffffffffffffffffffffffffffffffffffffffff82166119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906121b6565b6119cf8383836114bd565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611a2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612304565b611a3982826128ce565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152602081905260408082209390935590851681529081208054849290611a7c908490612846565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ae0919061200b565b60405180910390a350505050565b6000611b124360405180606001604052806033815260200161298860339139611d7c565b905060008463ffffffff16118015611b79575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff831691611b5d6001886128e5565b63ffffffff908116825260208201929092526040016000205416145b15611bcf5773ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604081208391611bb06001886128e5565b63ffffffff168152602081019190915260400160002060010155611caf565b60408051808201825263ffffffff8381168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000908152600883528581208a85168252909252939020915182547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691161781559051600191820155611c5690859061285e565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cf7929190612803565b60405180910390a25050505050565b60008383834630604051602001611d21959493929190612086565b6040516020818303038152906040528051906020012090509392505050565b80546001019055565b60008282604051602001611d5e929190611fa9565b60405160208183030381529060405280519060200120905092915050565b6000816401000000008410611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc919061210e565b509192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065f57600080fd5b803560ff8116811461065f57600080fd5b600060208284031215611e0c578081fd5b610b4b82611dc6565b60008060408385031215611e27578081fd5b611e3083611dc6565b9150611e3e60208401611dc6565b90509250929050565b600080600060608486031215611e5b578081fd5b611e6484611dc6565b9250611e7260208501611dc6565b9150604084013590509250925092565b600080600080600080600060e0888a031215611e9c578283fd5b611ea588611dc6565b9650611eb360208901611dc6565b95506040880135945060608801359350611ecf60808901611dea565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611efd578182fd5b611f0683611dc6565b946020939093013593505050565b60008060008060008060c08789031215611f2c578182fd5b611f3587611dc6565b95506020870135945060408701359350611f5160608801611dea565b92506080870135915060a087013590509295509295509295565b60008060408385031215611f7d578182fd5b611f8683611dc6565b9150602083013563ffffffff81168114611f9e578182fd5b809150509250929050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561213a5785810183015185820160400152820161211e565b8181111561214b5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f45524332305065726d69743a206578706972656420646561646c696e65000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f424f4f3a3a6765745072696f72566f7465733a206e6f7420796574206465746560408201527f726d696e65640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964207369676e60408201527f6174757265000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f45524332303a206d696e74696e67206d6f7265207468656e204d6178546f746160408201527f6c537570706c7900000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160408201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a207369676e617475726520657860408201527f7069726564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6000821982111561285957612859612958565b500190565b600063ffffffff80831681851680830382111561287d5761287d612958565b01949350505050565b600063ffffffff808416806128c2577f4e487b710000000000000000000000000000000000000000000000000000000083526012600452602483fd5b92169190910492915050565b6000828210156128e0576128e0612958565b500390565b600063ffffffff8381169083168181101561290257612902612958565b039392505050565b60028104600182168061291e57607f821691505b602082108114156117a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfe424f4f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220bf8270bc64857a15475a63ea95e0795d71707aa052e94063a31e3d1966c1395964736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610387578063e7a324dc1461039a578063f1127ed8146103a2578063f2fde38b146103c3576101c4565b8063b4b5ea571461034e578063c3cda52014610361578063d505accf14610374576101c4565b80638da5cb5b116100d35780638da5cb5b1461031857806395d89b4114610320578063a457c2d714610328578063a9059cbb1461033b576101c4565b8063715018a6146102ea578063782d6fe1146102f25780637ecebe0014610305576101c4565b806339509351116101665780635c19a95c116101405780635c19a95c1461029c5780635db30bb1146102af5780636fcfff45146102b757806370a08231146102d7576101c4565b8063395093511461025457806340c10f1914610267578063587cde1e1461027c576101c4565b806320606b70116101a257806320606b701461021c57806323b872dd14610224578063313ce567146102375780633644e5151461024c576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610207575b600080fd5b6101d16103d6565b6040516101de919061210e565b60405180910390f35b6101fa6101f5366004611eeb565b610469565b6040516101de9190612000565b61020f610487565b6040516101de919061200b565b61020f61048d565b6101fa610232366004611e47565b6104b1565b61023f6104d4565b6040516101de9190612838565b61020f6104d9565b6101fa610262366004611eeb565b6104e8565b61027a610275366004611eeb565b610549565b005b61028f61028a366004611dfb565b610636565b6040516101de9190611fdf565b61027a6102aa366004611dfb565b610664565b61020f610671565b6102ca6102c5366004611dfb565b610680565b6040516101de9190612811565b61020f6102e5366004611dfb565b610698565b61027a6106c0565b61020f610300366004611eeb565b6107a2565b61020f610313366004611dfb565b610a2f565b61028f610a5d565b6101d1610a79565b6101fa610336366004611eeb565b610a88565b6101fa610349366004611eeb565b610b2a565b61020f61035c366004611dfb565b610b52565b61027a61036f366004611f14565b610be0565b61027a610382366004611e82565b610e15565b61020f610395366004611e15565b610f39565b61020f610f71565b6103b56103b0366004611f6b565b610f95565b6040516101de929190612822565b61027a6103d1366004611dfb565b610fc2565b6060600380546103e59061290a565b80601f01602080910402602001604051908101604052809291908181526020018280546104119061290a565b801561045e5780601f106104335761010080835404028352916020019161045e565b820191906000526020600020905b81548152906001019060200180831161044157829003601f168201915b505050505090505b90565b600061047d610476611110565b8484611114565b5060015b92915050565b60025490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000806104bf858585611223565b90506104cc8585856112f6565b949350505050565b601290565b60006104e36114c2565b905090565b600061047d6104f5611110565b848460016000610503611110565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918b16815292529020546105449190612846565b611114565b610551611110565b73ffffffffffffffffffffffffffffffffffffffff1661056f610a5d565b73ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60405180910390fd5b6a0b4de3582e7cd659400000816105da610487565b6105e49190612846565b111561061c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906124d5565b6106268282611585565b610632600083836112f6565b5050565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260076020526040902054165b919050565b61066e3382611686565b50565b6a0b4de3582e7cd65940000090565b60096020526000908152604090205463ffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6106c8611110565b73ffffffffffffffffffffffffffffffffffffffff166106e6610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614610733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b60065460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60004382106107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906123be565b73ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205463ffffffff1680610818576000915050610481565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120849161084a6001856128e5565b63ffffffff908116825260208201929092526040016000205416116108c05773ffffffffffffffffffffffffffffffffffffffff841660009081526008602052604081209061089a6001846128e5565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610481565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832083805290915290205463ffffffff16831015610908576000915050610481565b6000806109166001846128e5565b90505b8163ffffffff168163ffffffff1611156109eb576000600261093b84846128e5565b6109459190612886565b61094f90836128e5565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156109bf576020015194506104819350505050565b805163ffffffff168711156109d6578193506109e4565b6109e16001836128e5565b92505b5050610919565b5073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206104819061174d565b60065473ffffffffffffffffffffffffffffffffffffffff1690565b6060600480546103e59061290a565b60008060016000610a97611110565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091881681529252902054905082811015610b0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061276f565b610b20610b15611110565b8561054486856128ce565b5060019392505050565b600080610b378484611751565b9050610b4b610b44611110565b85856112f6565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081205463ffffffff1680610b8a576000610b4b565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040812090610bbb6001846128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101549392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610c0b6103d6565b80519060200120610c1a611765565b30604051602001610c2e94939291906120bf565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610c7f9493929190612055565b60405160208183030381529060405280519060200120905060008282604051602001610cac929190611fa9565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610ce994939291906120f0565b6020604051602081039080840390855afa158015610d0b573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116610d83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061241b565b610d8c81611769565b8914610dc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612658565b87421115610dfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612712565b610e08818b611686565b505050505b505050505050565b83421115610e4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906122cd565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e7e8c611769565b89604051602001610e9496959493929190612014565b6040516020818303038152906040528051906020012090506000610eb7826117a8565b90506000610ec7828787876117bb565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612532565b610e088a8a8a611114565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b610fca611110565b73ffffffffffffffffffffffffffffffffffffffff16610fe8610a5d565b73ffffffffffffffffffffffffffffffffffffffff1614611035576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125c6565b73ffffffffffffffffffffffffffffffffffffffff8116611082576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612213565b60065460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316611161576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906126b5565b73ffffffffffffffffffffffffffffffffffffffff82166111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612270565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061121690859061200b565b60405180910390a3505050565b600061123084848461192a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602052604081208161125e611110565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612569565b6112eb856112e1611110565b61054486856128ce565b506001949350505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156113325750600081115b156114bd5773ffffffffffffffffffffffffffffffffffffffff8316156113fc5773ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604081205463ffffffff16908161138c5760006113dc565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600860205260408120906113bd6001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006113ea84836128ce565b90506113f886848484611aee565b5050505b73ffffffffffffffffffffffffffffffffffffffff8216156114bd5773ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604081205463ffffffff1690816114515760006114a1565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600860205260408120906114826001856128e5565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006114af8483612846565b9050610e0d85848484611aee565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000fa46141561151357507fcc27ad22677ba285683b6280d1cfe565db67cf51aa7e0df71ee22433e933b000610466565b61157e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fdeb425288668fd63918f02357c65a86ba20c0810c91499198db45a04bb3fafc97fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611d06565b9050610466565b73ffffffffffffffffffffffffffffffffffffffff82166115d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906127cc565b6115de600083836114bd565b80600260008282546115f09190612846565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260408120805483929061162a908490612846565b909155505060405173ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061167a90859061200b565b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260076020526040812054909116906116ba84610698565b73ffffffffffffffffffffffffffffffffffffffff85811660008181526007602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46117478284836112f6565b50505050565b5490565b600061047d61175e611110565b848461192a565b4690565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604081206117978161174d565b91506117a281611d40565b50919050565b60006104816117b56114c2565b83611d49565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611817576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612361565b8360ff16601b148061182c57508360ff16601c145b611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612478565b60006001868686866040516000815260200160405260405161188794939291906120f0565b6020604051602081039080840390855afa1580156118a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611921576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc9061217f565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8316611977576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906125fb565b73ffffffffffffffffffffffffffffffffffffffff82166119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc906121b6565b6119cf8383836114bd565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611a2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc90612304565b611a3982826128ce565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152602081905260408082209390935590851681529081208054849290611a7c908490612846565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ae0919061200b565b60405180910390a350505050565b6000611b124360405180606001604052806033815260200161298860339139611d7c565b905060008463ffffffff16118015611b79575073ffffffffffffffffffffffffffffffffffffffff8516600090815260086020526040812063ffffffff831691611b5d6001886128e5565b63ffffffff908116825260208201929092526040016000205416145b15611bcf5773ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604081208391611bb06001886128e5565b63ffffffff168152602081019190915260400160002060010155611caf565b60408051808201825263ffffffff8381168252602080830186815273ffffffffffffffffffffffffffffffffffffffff8a166000908152600883528581208a85168252909252939020915182547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691161781559051600191820155611c5690859061285e565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff929092169190911790555b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cf7929190612803565b60405180910390a25050505050565b60008383834630604051602001611d21959493929190612086565b6040516020818303038152906040528051906020012090509392505050565b80546001019055565b60008282604051602001611d5e929190611fa9565b60405160208183030381529060405280519060200120905092915050565b6000816401000000008410611dbe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bc919061210e565b509192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065f57600080fd5b803560ff8116811461065f57600080fd5b600060208284031215611e0c578081fd5b610b4b82611dc6565b60008060408385031215611e27578081fd5b611e3083611dc6565b9150611e3e60208401611dc6565b90509250929050565b600080600060608486031215611e5b578081fd5b611e6484611dc6565b9250611e7260208501611dc6565b9150604084013590509250925092565b600080600080600080600060e0888a031215611e9c578283fd5b611ea588611dc6565b9650611eb360208901611dc6565b95506040880135945060608801359350611ecf60808901611dea565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611efd578182fd5b611f0683611dc6565b946020939093013593505050565b60008060008060008060c08789031215611f2c578182fd5b611f3587611dc6565b95506020870135945060408701359350611f5160608801611dea565b92506080870135915060a087013590509295509295509295565b60008060408385031215611f7d578182fd5b611f8683611dc6565b9150602083013563ffffffff81168114611f9e578182fd5b809150509250929050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b9384526020840192909252604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b8181101561213a5785810183015185820160400152820161211e565b8181111561214b5783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201527f6573730000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f45524332305065726d69743a206578706972656420646561646c696e65000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f424f4f3a3a6765745072696f72566f7465733a206e6f7420796574206465746560408201527f726d696e65640000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964207369676e60408201527f6174757265000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60408201527f7565000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f45524332303a206d696e74696e67206d6f7265207468656e204d6178546f746160408201527f6c537570706c7900000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160408201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460408201527f6472657373000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f424f4f3a3a64656c656761746542795369673a20696e76616c6964206e6f6e6360408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460408201527f7265737300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f424f4f3a3a64656c656761746542795369673a207369676e617475726520657860408201527f7069726564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b6000821982111561285957612859612958565b500190565b600063ffffffff80831681851680830382111561287d5761287d612958565b01949350505050565b600063ffffffff808416806128c2577f4e487b710000000000000000000000000000000000000000000000000000000083526012600452602483fd5b92169190910492915050565b6000828210156128e0576128e0612958565b500390565b600063ffffffff8381169083168181101561290257612902612958565b039392505050565b60028104600182168061291e57607f821691505b602082108114156117a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfe424f4f3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220bf8270bc64857a15475a63ea95e0795d71707aa052e94063a31e3d1966c1395964736f6c63430008000033
Deployed Bytecode Sourcemap
31732:9694:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7756:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6709:108::-;;;:::i;:::-;;;;;;;:::i;33392:122::-;;;:::i;34234:299::-;;;;;;:::i;:::-;;:::i;6560:84::-;;;:::i;:::-;;;;;;;:::i;29092:115::-;;;:::i;9238:215::-;;;;;;:::i;:::-;;:::i;31964:257::-;;;;;;:::i;:::-;;:::i;:::-;;34898:149;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35191:104::-;;;;;;:::i;:::-;;:::i;32281:102::-;;;:::i;33270:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6880:127::-;;;;;;:::i;:::-;;:::i;31180:148::-;;;:::i;37730:1252::-;;;;;;:::i;:::-;;:::i;28834:128::-;;;;;;:::i;:::-;;:::i;30529:87::-;;;:::i;5826:95::-;;;:::i;9956:377::-;;;;;;:::i;:::-;;:::i;34541:273::-;;;;;;:::i;:::-;;:::i;37044:255::-;;;;;;:::i;:::-;;:::i;35729:1114::-;;;;;;:::i;:::-;;:::i;27997:771::-;;;;;;:::i;:::-;;:::i;7458:151::-;;;;;;:::i;:::-;;:::i;33608:117::-;;;:::i;33131:70::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;31483:244::-;;;;;;:::i;:::-;;:::i;5616:91::-;5661:13;5694:5;5687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;:::o;7756:169::-;7839:4;7856:39;7865:12;:10;:12::i;:::-;7879:7;7888:6;7856:8;:39::i;:::-;-1:-1:-1;7913:4:0;7756:169;;;;;:::o;6709:108::-;6797:12;;6709:108;:::o;33392:122::-;33434:80;33392:122;:::o;34234:299::-;34346:4;34368:11;34382:45;34401:6;34409:9;34420:6;34382:18;:45::i;:::-;34368:59;;34458:41;34473:6;34481:9;34492:6;34458:14;:41::i;:::-;34519:6;34234:299;-1:-1:-1;;;;34234:299:0:o;6560:84::-;6634:2;6560:84;:::o;29092:115::-;29152:7;29179:20;:18;:20::i;:::-;29172:27;;29092:115;:::o;9238:215::-;9326:4;9343:80;9352:12;:10;:12::i;:::-;9366:7;9412:10;9375:11;:25;9387:12;:10;:12::i;:::-;9375:25;;;;;;;;;;;;;;;;;;-1:-1:-1;9375:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;9343:8;:80::i;31964:257::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31921:11:::1;32060:7;32044:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:42;;32036:94;;;;;;;;;;;;:::i;:::-;32143:19;32149:3;32154:7;32143:5;:19::i;:::-;32173:40;32196:1;32200:3;32205:7;32173:14;:40::i;:::-;31964:257:::0;;:::o;34898:149::-;35018:21;;;;34986:7;35018:21;;;:10;:21;;;;;;;34898:149;;;;:::o;35191:104::-;35255:32;35265:10;35277:9;35255;:32::i;:::-;35191:104;:::o;32281:102::-;31921:11;32281:102;:::o;33270:49::-;;;;;;;;;;;;;;;:::o;6880:127::-;6981:18;;6954:7;6981:18;;;;;;;;;;;;6880:127::o;31180:148::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;31271:6:::1;::::0;31250:40:::1;::::0;31287:1:::1;::::0;31250:40:::1;31271:6;::::0;31250:40:::1;::::0;31287:1;;31250:40:::1;31301:6;:19:::0;;;::::1;::::0;;31180:148::o;37730:1252::-;37838:7;37885:12;37871:11;:26;37863:77;;;;;;;;;;;;:::i;:::-;37975:23;;;37953:19;37975:23;;;:14;:23;;;;;;;;38013:17;38009:58;;38054:1;38047:8;;;;;38009:58;38127:20;;;;;;;:11;:20;;;;;38179:11;;38148:16;38163:1;38148:12;:16;:::i;:::-;38127:38;;;;;;;;;;;;;;;-1:-1:-1;38127:38:0;:48;;:63;38123:147;;38214:20;;;;;;;:11;:20;;;;;;38235:16;38250:1;38235:12;:16;:::i;:::-;38214:38;;;;;;;;;;;;;;;:44;;;38207:51;;;;;38123:147;38331:20;;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;38327:88:0;;;38402:1;38395:8;;;;;38327:88;38427:12;;38469:16;38484:1;38469:12;:16;:::i;:::-;38454:31;;38496:428;38511:5;38503:13;;:5;:13;;;38496:428;;;38533:13;38575:1;38558:13;38566:5;38558;:13;:::i;:::-;38557:19;;;;:::i;:::-;38549:27;;:5;:27;:::i;:::-;38641:20;;;38618;38641;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;38618:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;38533:43;;-1:-1:-1;38688:27:0;;38684:229;;;38743:8;;;;-1:-1:-1;38736:15:0;;-1:-1:-1;;;;38736:15:0;38684:229;38777:12;;:26;;;-1:-1:-1;38773:140:0;;;38832:6;38824:14;;38773:140;;;38887:10;38896:1;38887:6;:10;:::i;:::-;38879:18;;38773:140;38496:428;;;;;-1:-1:-1;38941:20:0;;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;37730:1252:0;;;;:::o;28834:128::-;28930:14;;;28903:7;28930:14;;;:7;:14;;;;;:24;;:22;:24::i;30529:87::-;30602:6;;;;30529:87;:::o;5826:95::-;5873:13;5906:7;5899:14;;;;;:::i;9956:377::-;10049:4;10066:24;10093:11;:25;10105:12;:10;:12::i;:::-;10093:25;;;;;;;;;;;;;;;;;;-1:-1:-1;10093:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10146:35:0;;;;10138:85;;;;;;;;;;;;:::i;:::-;10234:67;10243:12;:10;:12::i;:::-;10257:7;10266:34;10285:15;10266:16;:34;:::i;10234:67::-;-1:-1:-1;10321:4:0;;9956:377;-1:-1:-1;;;9956:377:0:o;34541:273::-;34633:4;34655:11;34669:33;34684:9;34695:6;34669:14;:33::i;:::-;34655:47;;34733;34748:12;:10;:12::i;:::-;34762:9;34773:6;34733:14;:47::i;:::-;34800:6;34541:273;-1:-1:-1;;;34541:273:0:o;37044:255::-;37183:23;;;37136:7;37183:23;;;:14;:23;;;;;;;;37224:16;:67;;37290:1;37224:67;;;37243:20;;;;;;;:11;:20;;;;;;37264:16;37279:1;37264:12;:16;:::i;:::-;37243:38;;;;;;;;;;;;;;;:44;;;37217:74;37044:255;-1:-1:-1;;;37044:255:0:o;35729:1114::-;35848:23;33434:80;35977:6;:4;:6::i;:::-;35961:24;;;;;;36004:12;:10;:12::i;:::-;36043:4;35898:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35874:200;;;;;;35848:226;;36087:18;33654:71;36199:9;36227:5;36251:6;36132:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36108:175;;;;;;36087:196;;36296:14;36401:15;36435:10;36337:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36313:158;;;;;;36296:175;;36484:17;36504:26;36514:6;36522:1;36525;36528;36504:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36504:26:0;;;;;;-1:-1:-1;;36549:23:0;;;36541:73;;;;;;;;;;;;:::i;:::-;36642:20;36652:9;36642;:20::i;:::-;36633:5;:29;36625:75;;;;;;;;;;;;:::i;:::-;36738:6;36719:15;:25;;36711:75;;;;;;;;;;;;:::i;:::-;36804:31;36814:9;36825;36804;:31::i;:::-;36797:38;;;;35729:1114;;;;;;;:::o;27997:771::-;28226:8;28207:15;:27;;28199:69;;;;;;;;;;;;:::i;:::-;28281:18;28355:16;28390:5;28414:7;28440:5;28464:16;28474:5;28464:9;:16::i;:::-;28499:8;28326:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28302:231;;;;;;28281:252;;28546:12;28561:28;28578:10;28561:16;:28::i;:::-;28546:43;;28602:14;28619:28;28633:4;28639:1;28642;28645;28619:13;:28::i;:::-;28602:45;;28676:5;28666:15;;:6;:15;;;28658:58;;;;;;;;;;;;:::i;:::-;28729:31;28738:5;28745:7;28754:5;28729:8;:31::i;7458:151::-;7574:18;;;;7547:7;7574:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7458:151::o;33608:117::-;33654:71;33608:117;:::o;33131:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31483:244::-;30760:12;:10;:12::i;:::-;30749:23;;:7;:5;:7::i;:::-;:23;;;30741:68;;;;;;;;;;;;:::i;:::-;31572:22:::1;::::0;::::1;31564:73;;;;;;;;;;;;:::i;:::-;31674:6;::::0;31653:38:::1;::::0;::::1;::::0;;::::1;::::0;31674:6:::1;::::0;31653:38:::1;::::0;31674:6:::1;::::0;31653:38:::1;31702:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;31483:244::o;599:98::-;679:10;599:98;:::o;13312:346::-;13414:19;;;13406:68;;;;;;;;;;;;:::i;:::-;13493:21;;;13485:68;;;;;;;;;;;;:::i;:::-;13566:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;13618:32;;;;;13596:6;;13618:32;:::i;:::-;;;;;;;;13312:346;;;:::o;8407:422::-;8513:4;8530:36;8540:6;8548:9;8559:6;8530:9;:36::i;:::-;8606:19;;;8579:24;8606:19;;;:11;:19;;;;;8579:24;8626:12;:10;:12::i;:::-;8606:33;;;;;;;;;;;;;;;;8579:60;;8678:6;8658:16;:26;;8650:79;;;;;;;;;;;;:::i;:::-;8740:57;8749:6;8757:12;:10;:12::i;:::-;8771:25;8790:6;8771:16;:25;:::i;8740:57::-;-1:-1:-1;8817:4:0;;8407:422;-1:-1:-1;;;;8407:422:0:o;39435:941::-;39541:6;39531:16;;:6;:16;;;;:30;;;;;39560:1;39551:6;:10;39531:30;39527:842;;;39582:20;;;;39578:382;;39690:22;;;39671:16;39690:22;;;:14;:22;;;;;;;;;39751:13;:60;;39810:1;39751:60;;;39767:19;;;;;;;:11;:19;;;;;;39787:13;39799:1;39787:9;:13;:::i;:::-;39767:34;;;;;;;;;;;;;;;:40;;;39751:60;39731:80;-1:-1:-1;39830:17:0;39850:18;39862:6;39731:80;39850:18;:::i;:::-;39830:38;;39887:57;39904:6;39912:9;39923;39934;39887:16;:57::i;:::-;39578:382;;;;39980:20;;;;39976:382;;40088:22;;;40069:16;40088:22;;;:14;:22;;;;;;;;;40149:13;:60;;40208:1;40149:60;;;40165:19;;;;;;;:11;:19;;;;;;40185:13;40197:1;40185:9;:13;:::i;:::-;40165:34;;;;;;;;;;;;;;;:40;;;40149:60;40129:80;-1:-1:-1;40228:17:0;40248:18;40260:6;40129:80;40248:18;:::i;:::-;40228:38;;40285:57;40302:6;40310:9;40321;40332;40285:16;:57::i;39976:382::-;39435:941;;;:::o;21788:281::-;21841:7;21882:16;21865:13;:33;21861:201;;;-1:-1:-1;21922:24:0;21915:31;;21861:201;21986:64;22008:10;22020:12;22034:15;21986:21;:64::i;:::-;21979:71;;;;11709:338;11793:21;;;11785:65;;;;;;;;;;;;:::i;:::-;11863:49;11892:1;11896:7;11905:6;11863:20;:49::i;:::-;11941:6;11925:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;11958:18:0;;;:9;:18;;;;;;;;;;:28;;11980:6;;11958:9;:28;;11980:6;;11958:28;:::i;:::-;;;;-1:-1:-1;;12002:37:0;;;;;;12019:1;;12002:37;;;;12032:6;;12002:37;:::i;:::-;;;;;;;;11709:338;;:::o;38990:437::-;39107:21;;;;39081:23;39107:21;;;:10;:21;;;;;;;;;;39166:20;39118:9;39166;:20::i;:::-;39241:21;;;;;;;;:10;:21;;;;;;:33;;;;;;;;;;;;;39292:54;;39139:47;;-1:-1:-1;39241:33:0;39292:54;;;;;;39241:21;39292:54;39359:60;39374:15;39391:9;39402:16;39359:14;:60::i;:::-;38990:437;;;;:::o;23961:114::-;24053:14;;23961:114::o;7220:175::-;7306:4;7323:42;7333:12;:10;:12::i;:::-;7347:9;7358:6;7323:9;:42::i;41264:153::-;41374:9;41264:153;:::o;29305:207::-;29426:14;;;29365:15;29426:14;;;:7;:14;;;;;29461:15;29426:14;29461:13;:15::i;:::-;29451:25;;29487:17;:5;:15;:17::i;:::-;29305:207;;;;:::o;23056:167::-;23133:7;23160:55;23182:20;:18;:20::i;:::-;23204:10;23160:21;:55::i;16289:1432::-;16374:7;17299:66;17285:80;;;17277:127;;;;;;;;;;;;:::i;:::-;17423:1;:7;;17428:2;17423:7;:18;;;;17434:1;:7;;17439:2;17434:7;17423:18;17415:65;;;;;;;;;;;;:::i;:::-;17578:14;17595:24;17605:4;17611:1;17614;17617;17595:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17595:24:0;;;;;;-1:-1:-1;;17638:20:0;;;17630:57;;;;;;;;;;;;:::i;:::-;17707:6;16289:1432;-1:-1:-1;;;;;16289:1432:0:o;10823:604::-;10929:20;;;10921:70;;;;;;;;;;;;:::i;:::-;11010:23;;;11002:71;;;;;;;;;;;;:::i;:::-;11086:47;11107:6;11115:9;11126:6;11086:20;:47::i;:::-;11170:17;;;11146:21;11170:17;;;;;;;;;;;11206:23;;;;11198:74;;;;;;;;;;;;:::i;:::-;11303:22;11319:6;11303:13;:22;:::i;:::-;11283:17;;;;:9;:17;;;;;;;;;;;:42;;;;11336:20;;;;;;;;:30;;11360:6;;11283:9;11336:30;;11360:6;;11336:30;:::i;:::-;;;;;;;;11401:9;11384:35;;11393:6;11384:35;;;11412:6;11384:35;;;;;;:::i;:::-;;;;;;;;10823:604;;;;:::o;40384:703::-;40563:18;40584:75;40591:12;40584:75;;;;;;;;;;;;;;;;;:6;:75::i;:::-;40563:96;;40691:1;40676:12;:16;;;:85;;;;-1:-1:-1;40696:22:0;;;;;;;:11;:22;;;;;:65;;;;40719:16;40734:1;40719:12;:16;:::i;:::-;40696:40;;;;;;;;;;;;;;;-1:-1:-1;40696:40:0;:50;;:65;40676:85;40672:339;;;40778:22;;;;;;;:11;:22;;;;;40827:8;;40801:16;40816:1;40801:12;:16;:::i;:::-;40778:40;;;;;;;;;;;;;-1:-1:-1;40778:40:0;:46;;:57;40672:339;;;40907:33;;;;;;;;;;;;;;;;;;;;;40868:22;;;-1:-1:-1;40868:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;;;;;;;;;;-1:-1:-1;40868:72:0;;;;40983:16;;40868:36;;40983:16;:::i;:::-;40955:25;;;;;;;:14;:25;;;;;:44;;;;;;;;;;;;;;;40672:339;41049:9;41028:51;;;41060:8;41070;41028:51;;;;;;;:::i;:::-;;;;;;;;40384:703;;;;;:::o;22077:337::-;22179:7;22259:8;22286:4;22309:7;22335:13;22375:4;22230:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22206:200;;;;;;22199:207;;22077:337;;;;;:::o;24083:127::-;24172:19;;24190:1;24172:19;;;24083:127::o;18640:196::-;18733:7;18799:15;18816:10;18770:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18760:68;;;;;;18753:75;;18640:196;;;;:::o;41095:161::-;41170:6;41208:12;41201:5;41197:9;;41189:32;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41246:1:0;;41095:161;-1:-1:-1;;41095:161:0:o;14:198:1:-;84:20;;144:42;133:54;;123:65;;113:2;;202:1;199;192:12;217:158;285:20;;345:4;334:16;;324:27;;314:2;;365:1;362;355:12;380:198;;492:2;480:9;471:7;467:23;463:32;460:2;;;513:6;505;498:22;460:2;541:31;562:9;541:31;:::i;583:274::-;;;712:2;700:9;691:7;687:23;683:32;680:2;;;733:6;725;718:22;680:2;761:31;782:9;761:31;:::i;:::-;751:41;;811:40;847:2;836:9;832:18;811:40;:::i;:::-;801:50;;670:187;;;;;:::o;862:342::-;;;;1008:2;996:9;987:7;983:23;979:32;976:2;;;1029:6;1021;1014:22;976:2;1057:31;1078:9;1057:31;:::i;:::-;1047:41;;1107:40;1143:2;1132:9;1128:18;1107:40;:::i;:::-;1097:50;;1194:2;1183:9;1179:18;1166:32;1156:42;;966:238;;;;;:::o;1209:622::-;;;;;;;;1421:3;1409:9;1400:7;1396:23;1392:33;1389:2;;;1443:6;1435;1428:22;1389:2;1471:31;1492:9;1471:31;:::i;:::-;1461:41;;1521:40;1557:2;1546:9;1542:18;1521:40;:::i;:::-;1511:50;;1608:2;1597:9;1593:18;1580:32;1570:42;;1659:2;1648:9;1644:18;1631:32;1621:42;;1682:39;1716:3;1705:9;1701:19;1682:39;:::i;:::-;1672:49;;1768:3;1757:9;1753:19;1740:33;1730:43;;1820:3;1809:9;1805:19;1792:33;1782:43;;1379:452;;;;;;;;;;:::o;1836:266::-;;;1965:2;1953:9;1944:7;1940:23;1936:32;1933:2;;;1986:6;1978;1971:22;1933:2;2014:31;2035:9;2014:31;:::i;:::-;2004:41;2092:2;2077:18;;;;2064:32;;-1:-1:-1;;;1923:179:1:o;2107:545::-;;;;;;;2302:3;2290:9;2281:7;2277:23;2273:33;2270:2;;;2324:6;2316;2309:22;2270:2;2352:31;2373:9;2352:31;:::i;:::-;2342:41;;2430:2;2419:9;2415:18;2402:32;2392:42;;2481:2;2470:9;2466:18;2453:32;2443:42;;2504:38;2538:2;2527:9;2523:18;2504:38;:::i;:::-;2494:48;;2589:3;2578:9;2574:19;2561:33;2551:43;;2641:3;2630:9;2626:19;2613:33;2603:43;;2260:392;;;;;;;;:::o;2657:372::-;;;2785:2;2773:9;2764:7;2760:23;2756:32;2753:2;;;2806:6;2798;2791:22;2753:2;2834:31;2855:9;2834:31;:::i;:::-;2824:41;;2915:2;2904:9;2900:18;2887:32;2959:10;2952:5;2948:22;2941:5;2938:33;2928:2;;2990:6;2982;2975:22;2928:2;3018:5;3008:15;;;2743:286;;;;;:::o;3034:444::-;3304:66;3292:79;;3396:1;3387:11;;3380:27;;;;3432:2;3423:12;;3416:28;3469:2;3460:12;;3282:196::o;3483:226::-;3659:42;3647:55;;;;3629:74;;3617:2;3602:18;;3584:125::o;3714:187::-;3879:14;;3872:22;3854:41;;3842:2;3827:18;;3809:92::o;3906:177::-;4052:25;;;4040:2;4025:18;;4007:76::o;4088:614::-;4375:25;;;4419:42;4497:15;;;4492:2;4477:18;;4470:43;4549:15;;;;4544:2;4529:18;;4522:43;4596:2;4581:18;;4574:34;4639:3;4624:19;;4617:35;;;;4683:3;4668:19;;4661:35;4362:3;4347:19;;4329:373::o;4707:440::-;4938:25;;;5011:42;4999:55;;;;4994:2;4979:18;;4972:83;5086:2;5071:18;;5064:34;5129:2;5114:18;;5107:34;4925:3;4910:19;;4892:255::o;5152:512::-;5411:25;;;5467:2;5452:18;;5445:34;;;;5510:2;5495:18;;5488:34;;;;5553:2;5538:18;;5531:34;5614:42;5602:55;5596:3;5581:19;;5574:84;5398:3;5383:19;;5365:299::o;5669:440::-;5900:25;;;5956:2;5941:18;;5934:34;;;;5999:2;5984:18;;5977:34;6059:42;6047:55;6042:2;6027:18;;6020:83;5887:3;5872:19;;5854:255::o;6114:398::-;6341:25;;;6414:4;6402:17;;;;6397:2;6382:18;;6375:45;6451:2;6436:18;;6429:34;6494:2;6479:18;;6472:34;6328:3;6313:19;;6295:217::o;6517:662::-;;6658:2;6687;6676:9;6669:21;6719:6;6713:13;6762:6;6757:2;6746:9;6742:18;6735:34;6787:4;6800:140;6814:6;6811:1;6808:13;6800:140;;;6909:14;;;6905:23;;6899:30;6875:17;;;6894:2;6871:26;6864:66;6829:10;;6800:140;;;6958:6;6955:1;6952:13;6949:2;;;7028:4;7023:2;7014:6;7003:9;6999:22;6995:31;6988:45;6949:2;-1:-1:-1;7095:2:1;7083:15;7100:66;7079:88;7064:104;;;;7170:2;7060:113;;6638:541;-1:-1:-1;;;6638:541:1:o;7184:348::-;7386:2;7368:21;;;7425:2;7405:18;;;7398:30;7464:26;7459:2;7444:18;;7437:54;7523:2;7508:18;;7358:174::o;7537:399::-;7739:2;7721:21;;;7778:2;7758:18;;;7751:30;7817:34;7812:2;7797:18;;7790:62;7888:5;7883:2;7868:18;;7861:33;7926:3;7911:19;;7711:225::o;7941:402::-;8143:2;8125:21;;;8182:2;8162:18;;;8155:30;8221:34;8216:2;8201:18;;8194:62;8292:8;8287:2;8272:18;;8265:36;8333:3;8318:19;;8115:228::o;8348:398::-;8550:2;8532:21;;;8589:2;8569:18;;;8562:30;8628:34;8623:2;8608:18;;8601:62;8699:4;8694:2;8679:18;;8672:32;8736:3;8721:19;;8522:224::o;8751:353::-;8953:2;8935:21;;;8992:2;8972:18;;;8965:30;9031:31;9026:2;9011:18;;9004:59;9095:2;9080:18;;8925:179::o;9109:402::-;9311:2;9293:21;;;9350:2;9330:18;;;9323:30;9389:34;9384:2;9369:18;;9362:62;9460:8;9455:2;9440:18;;9433:36;9501:3;9486:19;;9283:228::o;9516:398::-;9718:2;9700:21;;;9757:2;9737:18;;;9730:30;9796:34;9791:2;9776:18;;9769:62;9867:4;9862:2;9847:18;;9840:32;9904:3;9889:19;;9690:224::o;9919:402::-;10121:2;10103:21;;;10160:2;10140:18;;;10133:30;10199:34;10194:2;10179:18;;10172:62;10270:8;10265:2;10250:18;;10243:36;10311:3;10296:19;;10093:228::o;10326:401::-;10528:2;10510:21;;;10567:2;10547:18;;;10540:30;10606:34;10601:2;10586:18;;10579:62;10677:7;10672:2;10657:18;;10650:35;10717:3;10702:19;;10500:227::o;10732:398::-;10934:2;10916:21;;;10973:2;10953:18;;;10946:30;11012:34;11007:2;10992:18;;10985:62;11083:4;11078:2;11063:18;;11056:32;11120:3;11105:19;;10906:224::o;11135:403::-;11337:2;11319:21;;;11376:2;11356:18;;;11349:30;11415:34;11410:2;11395:18;;11388:62;11486:9;11481:2;11466:18;;11459:37;11528:3;11513:19;;11309:229::o;11543:354::-;11745:2;11727:21;;;11784:2;11764:18;;;11757:30;11823:32;11818:2;11803:18;;11796:60;11888:2;11873:18;;11717:180::o;11902:404::-;12104:2;12086:21;;;12143:2;12123:18;;;12116:30;12182:34;12177:2;12162:18;;12155:62;12253:10;12248:2;12233:18;;12226:38;12296:3;12281:19;;12076:230::o;12311:356::-;12513:2;12495:21;;;12532:18;;;12525:30;12591:34;12586:2;12571:18;;12564:62;12658:2;12643:18;;12485:182::o;12672:401::-;12874:2;12856:21;;;12913:2;12893:18;;;12886:30;12952:34;12947:2;12932:18;;12925:62;13023:7;13018:2;13003:18;;12996:35;13063:3;13048:19;;12846:227::o;13078:397::-;13280:2;13262:21;;;13319:2;13299:18;;;13292:30;13358:34;13353:2;13338:18;;13331:62;13429:3;13424:2;13409:18;;13402:31;13465:3;13450:19;;13252:223::o;13480:400::-;13682:2;13664:21;;;13721:2;13701:18;;;13694:30;13760:34;13755:2;13740:18;;13733:62;13831:6;13826:2;13811:18;;13804:34;13870:3;13855:19;;13654:226::o;13885:401::-;14087:2;14069:21;;;14126:2;14106:18;;;14099:30;14165:34;14160:2;14145:18;;14138:62;14236:7;14231:2;14216:18;;14209:35;14276:3;14261:19;;14059:227::o;14291:401::-;14493:2;14475:21;;;14532:2;14512:18;;;14505:30;14571:34;14566:2;14551:18;;14544:62;14642:7;14637:2;14622:18;;14615:35;14682:3;14667:19;;14465:227::o;14697:355::-;14899:2;14881:21;;;14938:2;14918:18;;;14911:30;14977:33;14972:2;14957:18;;14950:61;15043:2;15028:18;;14871:181::o;15239:248::-;15413:25;;;15469:2;15454:18;;15447:34;15401:2;15386:18;;15368:119::o;15492:192::-;15666:10;15654:23;;;;15636:42;;15624:2;15609:18;;15591:93::o;15689:263::-;15891:10;15879:23;;;;15861:42;;15934:2;15919:18;;15912:34;15849:2;15834:18;;15816:136::o;15957:184::-;16129:4;16117:17;;;;16099:36;;16087:2;16072:18;;16054:87::o;16146:128::-;;16217:1;16213:6;16210:1;16207:13;16204:2;;;16223:18;;:::i;:::-;-1:-1:-1;16259:9:1;;16194:80::o;16279:228::-;;16346:10;16383:2;16380:1;16376:10;16413:2;16410:1;16406:10;16444:3;16440:2;16436:12;16431:3;16428:21;16425:2;;;16452:18;;:::i;:::-;16488:13;;16326:181;-1:-1:-1;;;;16326:181:1:o;16512:345::-;;16577:10;16614:2;16611:1;16607:10;16636:3;16626:2;;16673:77;16670:1;16663:88;16774:4;16771:1;16764:15;16802:4;16799:1;16792:15;16626:2;16835:10;;16831:20;;;;;16557:300;-1:-1:-1;;16557:300:1:o;16862:125::-;;16930:1;16927;16924:8;16921:2;;;16935:18;;:::i;:::-;-1:-1:-1;16972:9:1;;16911:76::o;16992:221::-;;17060:10;17120;;;;17090;;17142:12;;;17139:2;;;17157:18;;:::i;:::-;17194:13;;17040:173;-1:-1:-1;;;17040:173:1:o;17218:437::-;17303:1;17293:12;;17350:1;17340:12;;;17361:2;;17415:4;17407:6;17403:17;17393:27;;17361:2;17468;17460:6;17457:14;17437:18;17434:38;17431:2;;;17505:77;17502:1;17495:88;17606:4;17603:1;17596:15;17634:4;17631:1;17624:15;17660:184;17712:77;17709:1;17702:88;17809:4;17806:1;17799:15;17833:4;17830:1;17823:15
Swarm Source
ipfs://bf8270bc64857a15475a63ea95e0795d71707aa052e94063a31e3d1966c13959
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.