ERC-20
Play-to-Earn
Overview
Max Total Supply
974,981,821.39748410004636335 SNCT
Holders
2,870
Market
Price
$0.0006 @ 0.000017 AVAX
Onchain Market Cap
$629,134.71
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
1,011.843431155556940311 SNCTValue
$0.65 ( ~0.0167352509507304 AVAX) [0.0001%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
SnctToken
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at snowscan.xyz on 2022-05-18 */ /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; ////import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * ////IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * ////IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * ////IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; ////import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; ////import "./ECDSA.sol"; /** * @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; address private immutable _CACHED_THIS; 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); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, 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); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; ////import "./IERC20.sol"; ////import "./extensions/IERC20Metadata.sol"; ////import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface 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); } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) pragma solidity ^0.8.0; /** * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. * * _Available since v4.5._ */ interface IVotes { /** * @dev Emitted when an account changes their delegate. */ event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /** * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. */ event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); /** * @dev Returns the current amount of votes that `account` has. */ function getVotes(address account) external view returns (uint256); /** * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). */ function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). * * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. * Votes that have not been delegated are still part of total supply, even though they would not participate in a * vote. */ function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the delegate that `account` has chosen. */ function delegates(address account) external view returns (address); /** * @dev Delegates votes from the sender to `delegatee`. */ function delegate(address delegatee) external; /** * @dev Delegates votes from signer to `delegatee`. */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external; } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; ////import "./draft-IERC20Permit.sol"; ////import "../ERC20.sol"; ////import "../../../utils/cryptography/draft-EIP712.sol"; ////import "../../../utils/cryptography/ECDSA.sol"; ////import "../../../utils/Counters.sol"; /** * @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 { 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. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; ////import "./draft-ERC20Permit.sol"; ////import "../../../utils/math/Math.sol"; ////import "../../../governance/utils/IVotes.sol"; ////import "../../../utils/math/SafeCast.sol"; ////import "../../../utils/cryptography/ECDSA.sol"; /** * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. * * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. * * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting * power can be queried through the public accessors {getVotes} and {getPastVotes}. * * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. * * _Available since v4.2._ */ abstract contract ERC20Votes is IVotes, ERC20Permit { struct Checkpoint { uint32 fromBlock; uint224 votes; } bytes32 private constant _DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); mapping(address => address) private _delegates; mapping(address => Checkpoint[]) private _checkpoints; Checkpoint[] private _totalSupplyCheckpoints; /** * @dev Get the `pos`-th checkpoint for `account`. */ function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { return _checkpoints[account][pos]; } /** * @dev Get number of checkpoints for `account`. */ function numCheckpoints(address account) public view virtual returns (uint32) { return SafeCast.toUint32(_checkpoints[account].length); } /** * @dev Get the address `account` is currently delegating to. */ function delegates(address account) public view virtual override returns (address) { return _delegates[account]; } /** * @dev Gets the current votes balance for `account` */ function getVotes(address account) public view virtual override returns (uint256) { uint256 pos = _checkpoints[account].length; return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; } /** * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. * * Requirements: * * - `blockNumber` must have been already mined */ function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_checkpoints[account], blockNumber); } /** * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. * It is but NOT the sum of all the delegated votes! * * Requirements: * * - `blockNumber` must have been already mined */ function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { require(blockNumber < block.number, "ERC20Votes: block not yet mined"); return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); } /** * @dev Lookup a value in a list of (sorted) checkpoints. */ function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. // // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not // out of bounds (in which case we're looking too far in the past and the result is 0). // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out // the same. uint256 high = ckpts.length; uint256 low = 0; while (low < high) { uint256 mid = Math.average(low, high); if (ckpts[mid].fromBlock > blockNumber) { high = mid; } else { low = mid + 1; } } return high == 0 ? 0 : ckpts[high - 1].votes; } /** * @dev Delegate votes from the sender to `delegatee`. */ function delegate(address delegatee) public virtual override { _delegate(_msgSender(), delegatee); } /** * @dev Delegates votes from signer to `delegatee` */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= expiry, "ERC20Votes: signature expired"); address signer = ECDSA.recover( _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), v, r, s ); require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); _delegate(signer, delegatee); } /** * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). */ function _maxSupply() internal view virtual returns (uint224) { return type(uint224).max; } /** * @dev Snapshots the totalSupply after it has been increased. */ function _mint(address account, uint256 amount) internal virtual override { super._mint(account, amount); require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); } /** * @dev Snapshots the totalSupply after it has been decreased. */ function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); } /** * @dev Move voting power when tokens are transferred. * * Emits a {DelegateVotesChanged} event. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._afterTokenTransfer(from, to, amount); _moveVotingPower(delegates(from), delegates(to), amount); } /** * @dev Change delegation for `delegator` to `delegatee`. * * Emits events {DelegateChanged} and {DelegateVotesChanged}. */ function _delegate(address delegator, address delegatee) internal virtual { address currentDelegate = delegates(delegator); uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveVotingPower(currentDelegate, delegatee, delegatorBalance); } function _moveVotingPower( address src, address dst, uint256 amount ) private { if (src != dst && amount > 0) { if (src != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); emit DelegateVotesChanged(src, oldWeight, newWeight); } if (dst != address(0)) { (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); emit DelegateVotesChanged(dst, oldWeight, newWeight); } } } function _writeCheckpoint( Checkpoint[] storage ckpts, function(uint256, uint256) view returns (uint256) op, uint256 delta ) private returns (uint256 oldWeight, uint256 newWeight) { uint256 pos = ckpts.length; oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes; newWeight = op(oldWeight, delta); if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) { ckpts[pos - 1].votes = SafeCast.toUint224(newWeight); } else { ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); } } function _add(uint256 a, uint256 b) private pure returns (uint256) { return a + b; } function _subtract(uint256 a, uint256 b) private pure returns (uint256) { return a - b; } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; ////import "../ERC20.sol"; ////import "../../../utils/Context.sol"; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; ////import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * SourceUnit: c:\Projects\snakecity\blockchain\smart-contracts\contracts\tokens\SnctToken.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT pragma solidity ^0.8.0; ////import "@openzeppelin/contracts/access/Ownable.sol"; ////import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; ////import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; interface IBotPrevention { function protect(address sender, address receiver, uint256 amount) external; } contract SnctToken is Ownable, ERC20Burnable, ERC20Votes { IBotPrevention public bpContract; bool public bpEnabled; bool public bpDisabledForever; constructor(string memory name, string memory symbol, uint256 initialSupply) ERC20(name, symbol) ERC20Permit(name) { _mint(_msgSender(), initialSupply); } function setBPContract(address addr) public onlyOwner { require(address(bpContract) == address(0), "SnctToken: can only be initialized once"); bpContract = IBotPrevention(addr); } function setBPEnabled(bool enabled) public onlyOwner { bpEnabled = enabled; } function setBPDisableForever() public onlyOwner { require(!bpDisabledForever, "SnctToken: bot prevention disabled"); bpDisabledForever = true; } function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(account, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal override { if (bpEnabled && !bpDisabledForever) { bpContract.protect(from, to, amount); } } function _afterTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"DOMAIN_SEPARATOR","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":[],"name":"bpContract","outputs":[{"internalType":"contract IBotPrevention","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bpDisabledForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bpEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"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":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"account","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":[{"internalType":"address","name":"addr","type":"address"}],"name":"setBPContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setBPDisableForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBPEnabled","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b5060405162002e4f38038062002e4f8339810160408190526200005a91620009ca565b8280604051806040016040528060018152602001603160f81b8152508585620000926200008c6200016660201b60201c565b6200016a565b8151620000a790600490602085019062000861565b508051620000bd90600590602084019062000861565b5050825160209384012082519284019290922060e08390526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301979097526060810194909452608080850193909352308483018190528151808603909301835260c09485019091528151919096012090529290925261012052506200015d90503382620001ba565b50505062000adb565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001d18282620001d560201b62000e3b1760201c565b5050565b620001ec82826200028c60201b62000ecb1760201c565b6001600160e01b0362000200620003898216565b11156200026d5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b62000286600962000fbe6200038f60201b1783620003a4565b50505050565b6001600160a01b038216620002e45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000264565b620002f26000838362000556565b806003600082825462000306919062000a53565b90915550506001600160a01b038216600090815260016020526040812080548392906200033590849062000a53565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001d160008383620005f6565b60035490565b60006200039d828462000a53565b9392505050565b825460009081908015620003f65785620003c060018362000a6e565b81548110620003d357620003d362000a88565b60009182526020909120015464010000000090046001600160e01b0316620003f9565b60005b6001600160e01b031692506200041083858760201c565b915060008111801562000454575043866200042d60018462000a6e565b8154811062000440576200044062000a88565b60009182526020909120015463ffffffff16145b15620004c85762000470826200060e60201b62000fca1760201c565b866200047e60018462000a6e565b8154811062000491576200049162000a88565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506200054d565b856040518060400160405280620004ea436200067d60201b620010371760201c565b63ffffffff1681526020016200050b856200060e60201b62000fca1760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b600a54600160a01b900460ff1680156200057a5750600a54600160a81b900460ff16155b15620005f157600a54604051637e2f3afd60e01b81526001600160a01b03858116600483015284811660248301526044820184905290911690637e2f3afd90606401600060405180830381600087803b158015620005d757600080fd5b505af1158015620005ec573d6000803e3d6000fd5b505050505b505050565b620005f1838383620006e460201b6200109c1760201c565b60006001600160e01b03821115620006795760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840162000264565b5090565b600063ffffffff821115620006795760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840162000264565b620006fc838383620005f160201b620010ce1760201c565b6001600160a01b03838116600090815260076020526040808220548584168352912054620005f1929182169116838183148015906200073b5750600081115b15620005f1576001600160a01b03831615620007c8576001600160a01b03831660009081526008602090815260408220829162000785919062000853901b620010d31785620003a4565b91509150846001600160a01b031660008051602062002e2f8339815191528383604051620007bd929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615620005f1576001600160a01b0382166000908152600860209081526040822082916200080c91906200038f901b62000fbe1785620003a4565b91509150836001600160a01b031660008051602062002e2f833981519152838360405162000844929190918252602082015260400190565b60405180910390a25050505050565b60006200039d828462000a6e565b8280546200086f9062000a9e565b90600052602060002090601f016020900481019282620008935760008555620008de565b82601f10620008ae57805160ff1916838001178555620008de565b82800160010185558215620008de579182015b82811115620008de578251825591602001919060010190620008c1565b50620006799291505b80821115620006795760008155600101620008e7565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200092557600080fd5b81516001600160401b0380821115620009425762000942620008fd565b604051601f8301601f19908116603f011681019082821181831017156200096d576200096d620008fd565b816040528381526020925086838588010111156200098a57600080fd5b600091505b83821015620009ae57858201830151818301840152908201906200098f565b83821115620009c05760008385830101525b9695505050505050565b600080600060608486031215620009e057600080fd5b83516001600160401b0380821115620009f857600080fd5b62000a068783880162000913565b9450602086015191508082111562000a1d57600080fd5b5062000a2c8682870162000913565b925050604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000a695762000a6962000a3d565b500190565b60008282101562000a835762000a8362000a3d565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000ab357607f821691505b6020821081141562000ad557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516122f962000b366000396000610c0f015260006114f801526000611547015260006115220152600061147b015260006114a5015260006114cf01526122f96000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063a457c2d7116100ad578063c3cda5201161007c578063c3cda5201461045c578063d505accf1461046f578063dd62ed3e14610482578063f1127ed8146104bb578063f2fde38b146104f857600080fd5b8063a457c2d71461041b578063a9059cbb1461042e578063af20025214610441578063c17d2a061461045457600080fd5b80638da5cb5b116100e95780638da5cb5b146103dc5780638e539e8c146103ed57806395d89b41146104005780639ab24eb01461040857600080fd5b8063715018a61461039b57806378f74560146103a357806379cc6790146103b65780637ecebe00146103c957600080fd5b80633a46b1a81161019257806359c002271161016157806359c00227146103245780635c19a95c146103375780636fcfff451461034a57806370a082311461037257600080fd5b80633a46b1a8146102a457806342966c68146102b75780634aaee112146102cc578063587cde1e146102e057600080fd5b806326898da9116101ce57806326898da914610266578063313ce5671461027a5780633644e51514610289578063395093511461029157600080fd5b806306fdde0314610200578063095ea7b31461021e57806318160ddd1461024157806323b872dd14610253575b600080fd5b61020861050b565b6040516102159190611f53565b60405180910390f35b61023161022c366004611fc4565b61059d565b6040519015158152602001610215565b6003545b604051908152602001610215565b610231610261366004611fee565b6105b5565b600a5461023190600160a01b900460ff1681565b60405160128152602001610215565b6102456105d9565b61023161029f366004611fc4565b6105e8565b6102456102b2366004611fc4565b610627565b6102ca6102c536600461202a565b6106a6565b005b600a5461023190600160a81b900460ff1681565b61030c6102ee366004612043565b6001600160a01b039081166000908152600760205260409020541690565b6040516001600160a01b039091168152602001610215565b600a5461030c906001600160a01b031681565b6102ca610345366004612043565b6106b3565b61035d610358366004612043565b6106bd565b60405163ffffffff9091168152602001610215565b610245610380366004612043565b6001600160a01b031660009081526001602052604090205490565b6102ca6106e5565b6102ca6103b1366004612043565b61071b565b6102ca6103c4366004611fc4565b6107d0565b6102456103d7366004612043565b6107e9565b6000546001600160a01b031661030c565b6102456103fb36600461202a565b610807565b610208610863565b610245610416366004612043565b610872565b610231610429366004611fc4565b6108f9565b61023161043c366004611fc4565b61098b565b6102ca61044f36600461205e565b610999565b6102ca6109e1565b6102ca61046a366004612091565b610a85565b6102ca61047d3660046120e9565b610bbb565b610245610490366004612153565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6104ce6104c9366004612186565b610d1f565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610215565b6102ca610506366004612043565b610da3565b60606004805461051a906121c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610546906121c6565b80156105935780601f1061056857610100808354040283529160200191610593565b820191906000526020600020905b81548152906001019060200180831161057657829003601f168201915b5050505050905090565b6000336105ab8185856110df565b5060019392505050565b6000336105c3858285611203565b6105ce85858561128f565b506001949350505050565b60006105e361146e565b905090565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091906105ab9082908690610622908790612211565b6110df565b600043821061067d5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b038316600090815260086020526040902061069f9083611595565b9392505050565b6106b03382611652565b50565b6106b0338261165c565b6001600160a01b0381166000908152600860205260408120546106df90611037565b92915050565b6000546001600160a01b0316331461070f5760405162461bcd60e51b815260040161067490612229565b61071960006116d6565b565b6000546001600160a01b031633146107455760405162461bcd60e51b815260040161067490612229565b600a546001600160a01b0316156107ae5760405162461bcd60e51b815260206004820152602760248201527f536e6374546f6b656e3a2063616e206f6e6c7920626520696e697469616c697a6044820152666564206f6e636560c81b6064820152608401610674565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6107db823383611203565b6107e58282611652565b5050565b6001600160a01b0381166000908152600660205260408120546106df565b60004382106108585760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610674565b6106df600983611595565b60606005805461051a906121c6565b6001600160a01b03811660009081526008602052604081205480156108e6576001600160a01b03831660009081526008602052604090206108b460018361225e565b815481106108c4576108c4612275565b60009182526020909120015464010000000090046001600160e01b03166108e9565b60005b6001600160e01b03169392505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091908381101561097e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610674565b6105ce82868684036110df565b6000336105ab81858561128f565b6000546001600160a01b031633146109c35760405162461bcd60e51b815260040161067490612229565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b815260040161067490612229565b600a54600160a81b900460ff1615610a705760405162461bcd60e51b815260206004820152602260248201527f536e6374546f6b656e3a20626f742070726576656e74696f6e2064697361626c604482015261195960f21b6064820152608401610674565b600a805460ff60a81b1916600160a81b179055565b83421115610ad55760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610674565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610b4f90610b479060a00160405160208183030381529060405280519060200120611726565b858585611774565b9050610b5a8161179c565b8614610ba85760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610674565b610bb2818861165c565b50505050505050565b83421115610c0b5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610674565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610c3a8c61179c565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610c9582611726565b90506000610ca582878787611774565b9050896001600160a01b0316816001600160a01b031614610d085760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610674565b610d138a8a8a6110df565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600860205260409020805463ffffffff8416908110610d6357610d63612275565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6000546001600160a01b03163314610dcd5760405162461bcd60e51b815260040161067490612229565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610674565b6106b0816116d6565b610e458282610ecb565b6003546001600160e01b031015610eb75760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610674565b610ec56009610fbe836117c4565b50505050565b6001600160a01b038216610f215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610674565b610f2d6000838361193d565b8060036000828254610f3f9190612211565b90915550506001600160a01b03821660009081526001602052604081208054839290610f6c908490612211565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36107e5600083836119cf565b600061069f8284612211565b60006001600160e01b038211156110335760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610674565b5090565b600063ffffffff8211156110335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610674565b6001600160a01b038381166000908152600760205260408082205485841683529120546110ce929182169116836119da565b505050565b600061069f828461225e565b6001600160a01b0383166111415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610674565b6001600160a01b0382166111a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610674565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600260209081526040808320938616835292905220546000198114610ec557818110156112825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610674565b610ec584848484036110df565b6001600160a01b0383166112f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610674565b6001600160a01b0382166113555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610674565b61136083838361193d565b6001600160a01b038316600090815260016020526040902054818110156113d85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610674565b6001600160a01b0380851660009081526001602052604080822085850390559185168152908120805484929061140f908490612211565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145b91815260200190565b60405180910390a3610ec58484846119cf565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156114c757507f000000000000000000000000000000000000000000000000000000000000000046145b156114f157507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156115f95760006115b08284611b17565b9050848682815481106115c5576115c5612275565b60009182526020909120015463ffffffff1611156115e5578092506115f3565b6115f0816001612211565b91505b5061159c565b811561163d578461160b60018461225e565b8154811061161b5761161b612275565b60009182526020909120015464010000000090046001600160e01b0316611640565b60005b6001600160e01b031695945050505050565b6107e58282611b32565b6001600160a01b03828116600081815260076020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ec58284836119da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006106df61173361146e565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061178587878787611b4a565b9150915061179281611c37565b5095945050505050565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b82546000908190801561180f57856117dd60018361225e565b815481106117ed576117ed612275565b60009182526020909120015464010000000090046001600160e01b0316611812565b60005b6001600160e01b0316925061182b83858763ffffffff16565b91506000811180156118695750438661184560018461225e565b8154811061185557611855612275565b60009182526020909120015463ffffffff16145b156118c95761187782610fca565b8661188360018461225e565b8154811061189357611893612275565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550611934565b8560405180604001604052806118de43611037565b63ffffffff1681526020016118f285610fca565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b600a54600160a01b900460ff1680156119605750600a54600160a81b900460ff16155b156110ce57600a54604051637e2f3afd60e01b81526001600160a01b03858116600483015284811660248301526044820184905290911690637e2f3afd90606401600060405180830381600087803b1580156119bb57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b6110ce83838361109c565b816001600160a01b0316836001600160a01b0316141580156119fc5750600081115b156110ce576001600160a01b03831615611a8a576001600160a01b03831660009081526008602052604081208190611a37906110d3856117c4565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611a7f929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156110ce576001600160a01b03821660009081526008602052604081208190611ac090610fbe856117c4565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611b08929190918252602082015260400190565b60405180910390a25050505050565b6000611b26600284841861228b565b61069f90848416612211565b611b3c8282611df2565b610ec560096110d3836117c4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b815750600090506003611c2e565b8460ff16601b14158015611b9957508460ff16601c14155b15611baa5750600090506004611c2e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611bfe573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c2757600060019250925050611c2e565b9150600090505b94509492505050565b6000816004811115611c4b57611c4b6122ad565b1415611c545750565b6001816004811115611c6857611c686122ad565b1415611cb65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610674565b6002816004811115611cca57611cca6122ad565b1415611d185760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610674565b6003816004811115611d2c57611d2c6122ad565b1415611d855760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610674565b6004816004811115611d9957611d996122ad565b14156106b05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610674565b6001600160a01b038216611e525760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610674565b611e5e8260008361193d565b6001600160a01b03821660009081526001602052604090205481811015611ed25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610674565b6001600160a01b0383166000908152600160205260408120838303905560038054849290611f0190849061225e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36110ce836000846119cf565b600060208083528351808285015260005b81811015611f8057858101830151858201604001528201611f64565b81811115611f92576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611fbf57600080fd5b919050565b60008060408385031215611fd757600080fd5b611fe083611fa8565b946020939093013593505050565b60008060006060848603121561200357600080fd5b61200c84611fa8565b925061201a60208501611fa8565b9150604084013590509250925092565b60006020828403121561203c57600080fd5b5035919050565b60006020828403121561205557600080fd5b61069f82611fa8565b60006020828403121561207057600080fd5b8135801515811461069f57600080fd5b803560ff81168114611fbf57600080fd5b60008060008060008060c087890312156120aa57600080fd5b6120b387611fa8565b955060208701359450604087013593506120cf60608801612080565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561210457600080fd5b61210d88611fa8565b965061211b60208901611fa8565b9550604088013594506060880135935061213760808901612080565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561216657600080fd5b61216f83611fa8565b915061217d60208401611fa8565b90509250929050565b6000806040838503121561219957600080fd5b6121a283611fa8565b9150602083013563ffffffff811681146121bb57600080fd5b809150509250929050565b600181811c908216806121da57607f821691505b602082108114156117be57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612224576122246121fb565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015612270576122706121fb565b500390565b634e487b7160e01b600052603260045260246000fd5b6000826122a857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220b19faddcacf6c5bb54981d88b62e442b04632ef230de205b4ebc1f3a6d0c037764736f6c634300080c0033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000000000000000010536e616b65204369747920546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534e435400000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a578063a457c2d7116100ad578063c3cda5201161007c578063c3cda5201461045c578063d505accf1461046f578063dd62ed3e14610482578063f1127ed8146104bb578063f2fde38b146104f857600080fd5b8063a457c2d71461041b578063a9059cbb1461042e578063af20025214610441578063c17d2a061461045457600080fd5b80638da5cb5b116100e95780638da5cb5b146103dc5780638e539e8c146103ed57806395d89b41146104005780639ab24eb01461040857600080fd5b8063715018a61461039b57806378f74560146103a357806379cc6790146103b65780637ecebe00146103c957600080fd5b80633a46b1a81161019257806359c002271161016157806359c00227146103245780635c19a95c146103375780636fcfff451461034a57806370a082311461037257600080fd5b80633a46b1a8146102a457806342966c68146102b75780634aaee112146102cc578063587cde1e146102e057600080fd5b806326898da9116101ce57806326898da914610266578063313ce5671461027a5780633644e51514610289578063395093511461029157600080fd5b806306fdde0314610200578063095ea7b31461021e57806318160ddd1461024157806323b872dd14610253575b600080fd5b61020861050b565b6040516102159190611f53565b60405180910390f35b61023161022c366004611fc4565b61059d565b6040519015158152602001610215565b6003545b604051908152602001610215565b610231610261366004611fee565b6105b5565b600a5461023190600160a01b900460ff1681565b60405160128152602001610215565b6102456105d9565b61023161029f366004611fc4565b6105e8565b6102456102b2366004611fc4565b610627565b6102ca6102c536600461202a565b6106a6565b005b600a5461023190600160a81b900460ff1681565b61030c6102ee366004612043565b6001600160a01b039081166000908152600760205260409020541690565b6040516001600160a01b039091168152602001610215565b600a5461030c906001600160a01b031681565b6102ca610345366004612043565b6106b3565b61035d610358366004612043565b6106bd565b60405163ffffffff9091168152602001610215565b610245610380366004612043565b6001600160a01b031660009081526001602052604090205490565b6102ca6106e5565b6102ca6103b1366004612043565b61071b565b6102ca6103c4366004611fc4565b6107d0565b6102456103d7366004612043565b6107e9565b6000546001600160a01b031661030c565b6102456103fb36600461202a565b610807565b610208610863565b610245610416366004612043565b610872565b610231610429366004611fc4565b6108f9565b61023161043c366004611fc4565b61098b565b6102ca61044f36600461205e565b610999565b6102ca6109e1565b6102ca61046a366004612091565b610a85565b6102ca61047d3660046120e9565b610bbb565b610245610490366004612153565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6104ce6104c9366004612186565b610d1f565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610215565b6102ca610506366004612043565b610da3565b60606004805461051a906121c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610546906121c6565b80156105935780601f1061056857610100808354040283529160200191610593565b820191906000526020600020905b81548152906001019060200180831161057657829003601f168201915b5050505050905090565b6000336105ab8185856110df565b5060019392505050565b6000336105c3858285611203565b6105ce85858561128f565b506001949350505050565b60006105e361146e565b905090565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091906105ab9082908690610622908790612211565b6110df565b600043821061067d5760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b038316600090815260086020526040902061069f9083611595565b9392505050565b6106b03382611652565b50565b6106b0338261165c565b6001600160a01b0381166000908152600860205260408120546106df90611037565b92915050565b6000546001600160a01b0316331461070f5760405162461bcd60e51b815260040161067490612229565b61071960006116d6565b565b6000546001600160a01b031633146107455760405162461bcd60e51b815260040161067490612229565b600a546001600160a01b0316156107ae5760405162461bcd60e51b815260206004820152602760248201527f536e6374546f6b656e3a2063616e206f6e6c7920626520696e697469616c697a6044820152666564206f6e636560c81b6064820152608401610674565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6107db823383611203565b6107e58282611652565b5050565b6001600160a01b0381166000908152600660205260408120546106df565b60004382106108585760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e6564006044820152606401610674565b6106df600983611595565b60606005805461051a906121c6565b6001600160a01b03811660009081526008602052604081205480156108e6576001600160a01b03831660009081526008602052604090206108b460018361225e565b815481106108c4576108c4612275565b60009182526020909120015464010000000090046001600160e01b03166108e9565b60005b6001600160e01b03169392505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091908381101561097e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610674565b6105ce82868684036110df565b6000336105ab81858561128f565b6000546001600160a01b031633146109c35760405162461bcd60e51b815260040161067490612229565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b03163314610a0b5760405162461bcd60e51b815260040161067490612229565b600a54600160a81b900460ff1615610a705760405162461bcd60e51b815260206004820152602260248201527f536e6374546f6b656e3a20626f742070726576656e74696f6e2064697361626c604482015261195960f21b6064820152608401610674565b600a805460ff60a81b1916600160a81b179055565b83421115610ad55760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610674565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610b4f90610b479060a00160405160208183030381529060405280519060200120611726565b858585611774565b9050610b5a8161179c565b8614610ba85760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610674565b610bb2818861165c565b50505050505050565b83421115610c0b5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610674565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610c3a8c61179c565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610c9582611726565b90506000610ca582878787611774565b9050896001600160a01b0316816001600160a01b031614610d085760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610674565b610d138a8a8a6110df565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600860205260409020805463ffffffff8416908110610d6357610d63612275565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6000546001600160a01b03163314610dcd5760405162461bcd60e51b815260040161067490612229565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610674565b6106b0816116d6565b610e458282610ecb565b6003546001600160e01b031015610eb75760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610674565b610ec56009610fbe836117c4565b50505050565b6001600160a01b038216610f215760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610674565b610f2d6000838361193d565b8060036000828254610f3f9190612211565b90915550506001600160a01b03821660009081526001602052604081208054839290610f6c908490612211565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36107e5600083836119cf565b600061069f8284612211565b60006001600160e01b038211156110335760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610674565b5090565b600063ffffffff8211156110335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610674565b6001600160a01b038381166000908152600760205260408082205485841683529120546110ce929182169116836119da565b505050565b600061069f828461225e565b6001600160a01b0383166111415760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610674565b6001600160a01b0382166111a25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610674565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600260209081526040808320938616835292905220546000198114610ec557818110156112825760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610674565b610ec584848484036110df565b6001600160a01b0383166112f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610674565b6001600160a01b0382166113555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610674565b61136083838361193d565b6001600160a01b038316600090815260016020526040902054818110156113d85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610674565b6001600160a01b0380851660009081526001602052604080822085850390559185168152908120805484929061140f908490612211565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145b91815260200190565b60405180910390a3610ec58484846119cf565b6000306001600160a01b037f0000000000000000000000002905d6d6957983d9ed73bc019ff2782c39dd7a49161480156114c757507f000000000000000000000000000000000000000000000000000000000000a86a46145b156114f157507f354cbdbfa87debd5908140a93c7596b7f6413874c43eaf211792674b11684c0990565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fd2ed7ce307c0ee94a6ab6decf3140db29956f5c20180b394ae9651e53aa2784f828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b818110156115f95760006115b08284611b17565b9050848682815481106115c5576115c5612275565b60009182526020909120015463ffffffff1611156115e5578092506115f3565b6115f0816001612211565b91505b5061159c565b811561163d578461160b60018461225e565b8154811061161b5761161b612275565b60009182526020909120015464010000000090046001600160e01b0316611640565b60005b6001600160e01b031695945050505050565b6107e58282611b32565b6001600160a01b03828116600081815260076020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610ec58284836119da565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006106df61173361146e565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061178587878787611b4a565b9150915061179281611c37565b5095945050505050565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b82546000908190801561180f57856117dd60018361225e565b815481106117ed576117ed612275565b60009182526020909120015464010000000090046001600160e01b0316611812565b60005b6001600160e01b0316925061182b83858763ffffffff16565b91506000811180156118695750438661184560018461225e565b8154811061185557611855612275565b60009182526020909120015463ffffffff16145b156118c95761187782610fca565b8661188360018461225e565b8154811061189357611893612275565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550611934565b8560405180604001604052806118de43611037565b63ffffffff1681526020016118f285610fca565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b600a54600160a01b900460ff1680156119605750600a54600160a81b900460ff16155b156110ce57600a54604051637e2f3afd60e01b81526001600160a01b03858116600483015284811660248301526044820184905290911690637e2f3afd90606401600060405180830381600087803b1580156119bb57600080fd5b505af1158015610bb2573d6000803e3d6000fd5b6110ce83838361109c565b816001600160a01b0316836001600160a01b0316141580156119fc5750600081115b156110ce576001600160a01b03831615611a8a576001600160a01b03831660009081526008602052604081208190611a37906110d3856117c4565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611a7f929190918252602082015260400190565b60405180910390a250505b6001600160a01b038216156110ce576001600160a01b03821660009081526008602052604081208190611ac090610fbe856117c4565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611b08929190918252602082015260400190565b60405180910390a25050505050565b6000611b26600284841861228b565b61069f90848416612211565b611b3c8282611df2565b610ec560096110d3836117c4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b815750600090506003611c2e565b8460ff16601b14158015611b9957508460ff16601c14155b15611baa5750600090506004611c2e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611bfe573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c2757600060019250925050611c2e565b9150600090505b94509492505050565b6000816004811115611c4b57611c4b6122ad565b1415611c545750565b6001816004811115611c6857611c686122ad565b1415611cb65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610674565b6002816004811115611cca57611cca6122ad565b1415611d185760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610674565b6003816004811115611d2c57611d2c6122ad565b1415611d855760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610674565b6004816004811115611d9957611d996122ad565b14156106b05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610674565b6001600160a01b038216611e525760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610674565b611e5e8260008361193d565b6001600160a01b03821660009081526001602052604090205481811015611ed25760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610674565b6001600160a01b0383166000908152600160205260408120838303905560038054849290611f0190849061225e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36110ce836000846119cf565b600060208083528351808285015260005b81811015611f8057858101830151858201604001528201611f64565b81811115611f92576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611fbf57600080fd5b919050565b60008060408385031215611fd757600080fd5b611fe083611fa8565b946020939093013593505050565b60008060006060848603121561200357600080fd5b61200c84611fa8565b925061201a60208501611fa8565b9150604084013590509250925092565b60006020828403121561203c57600080fd5b5035919050565b60006020828403121561205557600080fd5b61069f82611fa8565b60006020828403121561207057600080fd5b8135801515811461069f57600080fd5b803560ff81168114611fbf57600080fd5b60008060008060008060c087890312156120aa57600080fd5b6120b387611fa8565b955060208701359450604087013593506120cf60608801612080565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561210457600080fd5b61210d88611fa8565b965061211b60208901611fa8565b9550604088013594506060880135935061213760808901612080565b925060a0880135915060c0880135905092959891949750929550565b6000806040838503121561216657600080fd5b61216f83611fa8565b915061217d60208401611fa8565b90509250929050565b6000806040838503121561219957600080fd5b6121a283611fa8565b9150602083013563ffffffff811681146121bb57600080fd5b809150509250929050565b600181811c908216806121da57607f821691505b602082108114156117be57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612224576122246121fb565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015612270576122706121fb565b500390565b634e487b7160e01b600052603260045260246000fd5b6000826122a857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220b19faddcacf6c5bb54981d88b62e442b04632ef230de205b4ebc1f3a6d0c037764736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000000000000000010536e616b65204369747920546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004534e435400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Snake City Token
Arg [1] : symbol (string): SNCT
Arg [2] : initialSupply (uint256): 1000000000000000000000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [4] : 536e616b65204369747920546f6b656e00000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 534e435400000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68308:1692:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25610:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27961:201;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;27961:201:0;1053:187:1;26730:108:0;26818:12;;26730:108;;;1391:25:1;;;1379:2;1364:18;26730:108:0;1245:177:1;28742:295:0;;;;;;:::i;:::-;;:::i;68415:21::-;;;;;-1:-1:-1;;;68415:21:0;;;;;;26572:93;;;26655:2;1902:36:1;;1890:2;1875:18;26572:93:0;1760:184:1;53561:115:0;;;:::i;29446:240::-;;;;;;:::i;:::-;;:::i;57104:268::-;;;;;;:::i;:::-;;:::i;64491:91::-;;;;;;:::i;:::-;;:::i;:::-;;68443:29;;;;;-1:-1:-1;;;68443:29:0;;;;;;56478:128;;;;;;:::i;:::-;-1:-1:-1;;;;;56579:19:0;;;56552:7;56579:19;;;:10;:19;;;;;;;;56478:128;;;;-1:-1:-1;;;;;2671:32:1;;;2653:51;;2641:2;2626:18;56478:128:0;2507:203:1;68374:32:0;;;;;-1:-1:-1;;;;;68374:32:0;;;59577:114;;;;;;:::i;:::-;;:::i;56234:151::-;;;;;;:::i;:::-;;:::i;:::-;;;3120:10:1;3108:23;;;3090:42;;3078:2;3063:18;56234:151:0;2946:192:1;26901:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;27002:18:0;26975:7;27002:18;;;:9;:18;;;;;;;26901:127;66953:103;;;:::i;68680:227::-;;;;;;:::i;:::-;;:::i;64901:164::-;;;;;;:::i;:::-;;:::i;53303:128::-;;;;;;:::i;:::-;;:::i;66302:87::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;66302:87;;57661:259;;;;;;:::i;:::-;;:::i;25829:104::-;;;:::i;56690:212::-;;;;;;:::i;:::-;;:::i;30189:438::-;;;;;;:::i;:::-;;:::i;27234:193::-;;;;;;:::i;:::-;;:::i;68915:114::-;;;;;;:::i;:::-;;:::i;69037:192::-;;;:::i;59773:591::-;;;;;;:::i;:::-;;:::i;52592:645::-;;;;;;:::i;:::-;;:::i;27490:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;27606:18:0;;;27579:7;27606:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;27490:151;56004:150;;;;;;:::i;:::-;;:::i;:::-;;;;5573:13:1;;5588:10;5569:30;5551:49;;5660:4;5648:17;;;5642:24;-1:-1:-1;;;;;5638:50:1;5616:20;;;5609:80;;;;5524:18;56004:150:0;5349:346:1;67211:201:0;;;;;;:::i;:::-;;:::i;25610:100::-;25664:13;25697:5;25690:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25610:100;:::o;27961:201::-;28044:4;15848:10;28100:32;15848:10;28116:7;28125:6;28100:8;:32::i;:::-;-1:-1:-1;28150:4:0;;27961:201;-1:-1:-1;;;27961:201:0:o;28742:295::-;28873:4;15848:10;28931:38;28947:4;15848:10;28962:6;28931:15;:38::i;:::-;28980:27;28990:4;28996:2;29000:6;28980:9;:27::i;:::-;-1:-1:-1;29025:4:0;;28742:295;-1:-1:-1;;;;28742:295:0:o;53561:115::-;53621:7;53648:20;:18;:20::i;:::-;53641:27;;53561:115;:::o;29446:240::-;15848:10;29534:4;29615:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;29615:27:0;;;;;;;;;;29534:4;;15848:10;29590:66;;15848:10;;29615:27;;:40;;29645:10;;29615:40;:::i;:::-;29590:8;:66::i;57104:268::-;57202:7;57244:12;57230:11;:26;57222:70;;;;-1:-1:-1;;;57222:70:0;;6552:2:1;57222:70:0;;;6534:21:1;6591:2;6571:18;;;6564:30;6630:33;6610:18;;;6603:61;6681:18;;57222:70:0;;;;;;;;;-1:-1:-1;;;;;57329:21:0;;;;;;:12;:21;;;;;57310:54;;57352:11;57310:18;:54::i;:::-;57303:61;57104:268;-1:-1:-1;;;57104:268:0:o;64491:91::-;64547:27;15848:10;64567:6;64547:5;:27::i;:::-;64491:91;:::o;59577:114::-;59649:34;15848:10;59673:9;59649;:34::i;56234:151::-;-1:-1:-1;;;;;56348:21:0;;56304:6;56348:21;;;:12;:21;;;;;:28;56330:47;;:17;:47::i;:::-;56323:54;56234:151;-1:-1:-1;;56234:151:0:o;66953:103::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;15848:10;66522:23;66514:68;;;;-1:-1:-1;;;66514:68:0;;;;;;;:::i;:::-;67018:30:::1;67045:1;67018:18;:30::i;:::-;66953:103::o:0;68680:227::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;15848:10;66522:23;66514:68;;;;-1:-1:-1;;;66514:68:0;;;;;;;:::i;:::-;68784:10:::1;::::0;-1:-1:-1;;;;;68784:10:0::1;68776:33:::0;68768:85:::1;;;::::0;-1:-1:-1;;;68768:85:0;;7273:2:1;68768:85:0::1;::::0;::::1;7255:21:1::0;7312:2;7292:18;;;7285:30;7351:34;7331:18;;;7324:62;-1:-1:-1;;;7402:18:1;;;7395:37;7449:19;;68768:85:0::1;7071:403:1::0;68768:85:0::1;68866:10;:33:::0;;-1:-1:-1;;;;;;68866:33:0::1;-1:-1:-1::0;;;;;68866:33:0;;;::::1;::::0;;;::::1;::::0;;68680:227::o;64901:164::-;64978:46;64994:7;15848:10;65017:6;64978:15;:46::i;:::-;65035:22;65041:7;65050:6;65035:5;:22::i;:::-;64901:164;;:::o;53303:128::-;-1:-1:-1;;;;;53399:14:0;;53372:7;53399:14;;;:7;:14;;;;;17951;53399:24;17859:114;57661:259;57748:7;57790:12;57776:11;:26;57768:70;;;;-1:-1:-1;;;57768:70:0;;6552:2:1;57768:70:0;;;6534:21:1;6591:2;6571:18;;;6564:30;6630:33;6610:18;;;6603:61;6681:18;;57768:70:0;6350:355:1;57768:70:0;57856:56;57875:23;57900:11;57856:18;:56::i;25829:104::-;25885:13;25918:7;25911:14;;;;;:::i;56690:212::-;-1:-1:-1;;;;;56797:21:0;;56763:7;56797:21;;;:12;:21;;;;;:28;56843:8;;:51;;-1:-1:-1;;;;;56858:21:0;;;;;;:12;:21;;;;;56880:7;56886:1;56880:3;:7;:::i;:::-;56858:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;;;;-1:-1:-1;;;;;56858:36:0;56843:51;;;56854:1;56843:51;-1:-1:-1;;;;;56836:58:0;;56690:212;-1:-1:-1;;;56690:212:0:o;30189:438::-;15848:10;30282:4;30365:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;30365:27:0;;;;;;;;;;30282:4;;15848:10;30411:35;;;;30403:85;;;;-1:-1:-1;;;30403:85:0;;7943:2:1;30403:85:0;;;7925:21:1;7982:2;7962:18;;;7955:30;8021:34;8001:18;;;7994:62;-1:-1:-1;;;8072:18:1;;;8065:35;8117:19;;30403:85:0;7741:401:1;30403:85:0;30524:60;30533:5;30540:7;30568:15;30549:16;:34;30524:8;:60::i;27234:193::-;27313:4;15848:10;27369:28;15848:10;27386:2;27390:6;27369:9;:28::i;68915:114::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;15848:10;66522:23;66514:68;;;;-1:-1:-1;;;66514:68:0;;;;;;;:::i;:::-;69002:9:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;69002:19:0::1;-1:-1:-1::0;;;;69002:19:0;;::::1;::::0;;;::::1;::::0;;68915:114::o;69037:192::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;15848:10;66522:23;66514:68;;;;-1:-1:-1;;;66514:68:0;;;;;;;:::i;:::-;69128:17:::1;::::0;-1:-1:-1;;;69128:17:0;::::1;;;69127:18;69119:65;;;::::0;-1:-1:-1;;;69119:65:0;;8349:2:1;69119:65:0::1;::::0;::::1;8331:21:1::0;8388:2;8368:18;;;8361:30;8427:34;8407:18;;;8400:62;-1:-1:-1;;;8478:18:1;;;8471:32;8520:19;;69119:65:0::1;8147:398:1::0;69119:65:0::1;69197:17;:24:::0;;-1:-1:-1;;;;69197:24:0::1;-1:-1:-1::0;;;69197:24:0::1;::::0;;69037:192::o;59773:591::-;60000:6;59981:15;:25;;59973:67;;;;-1:-1:-1;;;59973:67:0;;8752:2:1;59973:67:0;;;8734:21:1;8791:2;8771:18;;;8764:30;8830:31;8810:18;;;8803:59;8879:18;;59973:67:0;8550:353:1;59973:67:0;60123:58;;;55684:71;60123:58;;;9139:25:1;-1:-1:-1;;;;;9200:32:1;;9180:18;;;9173:60;;;;9249:18;;;9242:34;;;9292:18;;;9285:34;;;60051:14:0;;60068:174;;60096:87;;9111:19:1;;60123:58:0;;;;;;;;;;;;60113:69;;;;;;60096:16;:87::i;:::-;60198:1;60214;60230;60068:13;:174::i;:::-;60051:191;;60270:17;60280:6;60270:9;:17::i;:::-;60261:5;:26;60253:64;;;;-1:-1:-1;;;60253:64:0;;9532:2:1;60253:64:0;;;9514:21:1;9571:2;9551:18;;;9544:30;9610:27;9590:18;;;9583:55;9655:18;;60253:64:0;9330:349:1;60253:64:0;60328:28;60338:6;60346:9;60328;:28::i;:::-;59962:402;59773:591;;;;;;:::o;52592:645::-;52836:8;52817:15;:27;;52809:69;;;;-1:-1:-1;;;52809:69:0;;9886:2:1;52809:69:0;;;9868:21:1;9925:2;9905:18;;;9898:30;9964:31;9944:18;;;9937:59;10013:18;;52809:69:0;9684:353:1;52809:69:0;52891:18;52933:16;52951:5;52958:7;52967:5;52974:16;52984:5;52974:9;:16::i;:::-;52922:79;;;;;;10329:25:1;;;;-1:-1:-1;;;;;10428:15:1;;;10408:18;;;10401:43;10480:15;;;;10460:18;;;10453:43;10512:18;;;10505:34;10555:19;;;10548:35;10599:19;;;10592:35;;;10301:19;;52922:79:0;;;;;;;;;;;;52912:90;;;;;;52891:111;;53015:12;53030:28;53047:10;53030:16;:28::i;:::-;53015:43;;53071:14;53088:28;53102:4;53108:1;53111;53114;53088:13;:28::i;:::-;53071:45;;53145:5;-1:-1:-1;;;;;53135:15:0;:6;-1:-1:-1;;;;;53135:15:0;;53127:58;;;;-1:-1:-1;;;53127:58:0;;10840:2:1;53127:58:0;;;10822:21:1;10879:2;10859:18;;;10852:30;10918:32;10898:18;;;10891:60;10968:18;;53127:58:0;10638:354:1;53127:58:0;53198:31;53207:5;53214:7;53223:5;53198:8;:31::i;:::-;52798:439;;;52592:645;;;;;;;:::o;56004:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;56120:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;56113:33;;;;;;;;;56120:26;;56113:33;;;;;;;;;-1:-1:-1;;;;;56113:33:0;;;;;;;;;56004:150;-1:-1:-1;;;56004:150:0:o;67211:201::-;66348:7;66375:6;-1:-1:-1;;;;;66375:6:0;15848:10;66522:23;66514:68;;;;-1:-1:-1;;;66514:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;67300:22:0;::::1;67292:73;;;::::0;-1:-1:-1;;;67292:73:0;;11199:2:1;67292:73:0::1;::::0;::::1;11181:21:1::0;11238:2;11218:18;;;11211:30;11277:34;11257:18;;;11250:62;-1:-1:-1;;;11328:18:1;;;11321:36;11374:19;;67292:73:0::1;10997:402:1::0;67292:73:0::1;67376:28;67395:8;67376:18;:28::i;60670:290::-:0;60755:28;60767:7;60776:6;60755:11;:28::i;:::-;26818:12;;-1:-1:-1;;;;;;60802:29:0;60794:90;;;;-1:-1:-1;;;60794:90:0;;11606:2:1;60794:90:0;;;11588:21:1;11645:2;11625:18;;;11618:30;11684:34;11664:18;;;11657:62;-1:-1:-1;;;11735:18:1;;;11728:46;11791:19;;60794:90:0;11404:412:1;60794:90:0;60897:55;60914:23;60939:4;60945:6;60897:16;:55::i;:::-;;;60670:290;;:::o;32064:399::-;-1:-1:-1;;;;;32148:21:0;;32140:65;;;;-1:-1:-1;;;32140:65:0;;12023:2:1;32140:65:0;;;12005:21:1;12062:2;12042:18;;;12035:30;12101:33;12081:18;;;12074:61;12152:18;;32140:65:0;11821:355:1;32140:65:0;32218:49;32247:1;32251:7;32260:6;32218:20;:49::i;:::-;32296:6;32280:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;32313:18:0;;;;;;:9;:18;;;;;:28;;32335:6;;32313:18;:28;;32335:6;;32313:28;:::i;:::-;;;;-1:-1:-1;;32357:37:0;;1391:25:1;;;-1:-1:-1;;;;;32357:37:0;;;32374:1;;32357:37;;1379:2:1;1364:18;32357:37:0;;;;;;;32407:48;32435:1;32439:7;32448:6;32407:19;:48::i;63514:98::-;63572:7;63599:5;63603:1;63599;:5;:::i;40201:195::-;40258:7;-1:-1:-1;;;;;40286:26:0;;;40278:78;;;;-1:-1:-1;;;40278:78:0;;12383:2:1;40278:78:0;;;12365:21:1;12422:2;12402:18;;;12395:30;12461:34;12441:18;;;12434:62;-1:-1:-1;;;12512:18:1;;;12505:37;12559:19;;40278:78:0;12181:403:1;40278:78:0;-1:-1:-1;40382:5:0;40201:195::o;42171:190::-;42227:6;42263:16;42254:25;;;42246:76;;;;-1:-1:-1;;;42246:76:0;;12791:2:1;42246:76:0;;;12773:21:1;12830:2;12810:18;;;12803:30;12869:34;12849:18;;;12842:62;-1:-1:-1;;;12920:18:1;;;12913:36;12966:19;;42246:76:0;12589:402:1;61388:262:0;-1:-1:-1;;;;;56579:19:0;;;56552:7;56579:19;;;:10;:19;;;;;;;;;;;;;;;61586:56;;56579:19;;;;;61635:6;61586:16;:56::i;:::-;61388:262;;;:::o;63620:103::-;63683:7;63710:5;63714:1;63710;:5;:::i;33825:380::-;-1:-1:-1;;;;;33961:19:0;;33953:68;;;;-1:-1:-1;;;33953:68:0;;13198:2:1;33953:68:0;;;13180:21:1;13237:2;13217:18;;;13210:30;13276:34;13256:18;;;13249:62;-1:-1:-1;;;13327:18:1;;;13320:34;13371:19;;33953:68:0;12996:400:1;33953:68:0;-1:-1:-1;;;;;34040:21:0;;34032:68;;;;-1:-1:-1;;;34032:68:0;;13603:2:1;34032:68:0;;;13585:21:1;13642:2;13622:18;;;13615:30;13681:34;13661:18;;;13654:62;-1:-1:-1;;;13732:18:1;;;13725:32;13774:19;;34032:68:0;13401:398:1;34032:68:0;-1:-1:-1;;;;;34113:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;34165:32;;1391:25:1;;;34165:32:0;;1364:18:1;34165:32:0;;;;;;;33825:380;;;:::o;34492:453::-;-1:-1:-1;;;;;27606:18:0;;;34627:24;27606:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;34694:37:0;;34690:248;;34776:6;34756:16;:26;;34748:68;;;;-1:-1:-1;;;34748:68:0;;14006:2:1;34748:68:0;;;13988:21:1;14045:2;14025:18;;;14018:30;14084:31;14064:18;;;14057:59;14133:18;;34748:68:0;13804:353:1;34748:68:0;34860:51;34869:5;34876:7;34904:6;34885:16;:25;34860:8;:51::i;31106:671::-;-1:-1:-1;;;;;31237:18:0;;31229:68;;;;-1:-1:-1;;;31229:68:0;;14364:2:1;31229:68:0;;;14346:21:1;14403:2;14383:18;;;14376:30;14442:34;14422:18;;;14415:62;-1:-1:-1;;;14493:18:1;;;14486:35;14538:19;;31229:68:0;14162:401:1;31229:68:0;-1:-1:-1;;;;;31316:16:0;;31308:64;;;;-1:-1:-1;;;31308:64:0;;14770:2:1;31308:64:0;;;14752:21:1;14809:2;14789:18;;;14782:30;14848:34;14828:18;;;14821:62;-1:-1:-1;;;14899:18:1;;;14892:33;14942:19;;31308:64:0;14568:399:1;31308:64:0;31385:38;31406:4;31412:2;31416:6;31385:20;:38::i;:::-;-1:-1:-1;;;;;31458:15:0;;31436:19;31458:15;;;:9;:15;;;;;;31492:21;;;;31484:72;;;;-1:-1:-1;;;31484:72:0;;15174:2:1;31484:72:0;;;15156:21:1;15213:2;15193:18;;;15186:30;15252:34;15232:18;;;15225:62;-1:-1:-1;;;15303:18:1;;;15296:36;15349:19;;31484:72:0;14972:402:1;31484:72:0;-1:-1:-1;;;;;31592:15:0;;;;;;;:9;:15;;;;;;31610:20;;;31592:38;;31652:13;;;;;;;;:23;;31624:6;;31592:15;31652:23;;31624:6;;31652:23;:::i;:::-;;;;;;;;31708:2;-1:-1:-1;;;;;31693:26:0;31702:4;-1:-1:-1;;;;;31693:26:0;;31712:6;31693:26;;;;1391:25:1;;1379:2;1364:18;;1245:177;31693:26:0;;;;;;;;31732:37;31752:4;31758:2;31762:6;31732:19;:37::i;21824:314::-;21877:7;21909:4;-1:-1:-1;;;;;21918:12:0;21901:29;;:66;;;;;21951:16;21934:13;:33;21901:66;21897:234;;;-1:-1:-1;21991:24:0;;21824:314::o;21897:234::-;-1:-1:-1;22327:73:0;;;22077:10;22327:73;;;;16271:25:1;;;;22089:12:0;16312:18:1;;;16305:34;22103:15:0;16355:18:1;;;16348:34;22371:13:0;16398:18:1;;;16391:34;22394:4:0;16441:19:1;;;;16434:61;;;;22327:73:0;;;;;;;;;;16243:19:1;;;;22327:73:0;;;22317:84;;;;;;53561:115::o;58009:1482::-;59142:12;;58108:7;;;59191:236;59204:4;59198:3;:10;59191:236;;;59225:11;59239:23;59252:3;59257:4;59239:12;:23::i;:::-;59225:37;;59304:11;59281:5;59287:3;59281:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;59277:139;;;59343:3;59336:10;;59277:139;;;59393:7;:3;59399:1;59393:7;:::i;:::-;59387:13;;59277:139;59210:217;59191:236;;;59446:9;;:37;;59462:5;59468:8;59475:1;59468:4;:8;:::i;:::-;59462:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;-1:-1:-1;;;;;59462:21:0;59446:37;;;59458:1;59446:37;-1:-1:-1;;;;;59439:44:0;;58009:1482;-1:-1:-1;;;;;58009:1482:0:o;69400:155::-;69519:28;69531:7;69540:6;69519:11;:28::i;61814:388::-;-1:-1:-1;;;;;56579:19:0;;;61899:23;56579:19;;;:10;:19;;;;;;;;;;27002:9;:18;;;;;;62014:21;;;;:33;;;-1:-1:-1;;;;;;62014:33:0;;;;;;;62065:54;;56579:19;;;;;27002:18;;62014:33;;56579:19;;;62065:54;;61899:23;62065:54;62132:62;62149:15;62166:9;62177:16;62132;:62::i;67572:191::-;67646:16;67665:6;;-1:-1:-1;;;;;67682:17:0;;;-1:-1:-1;;;;;;67682:17:0;;;;;;67715:40;;67665:6;;;;;;;67715:40;;67646:16;67715:40;67635:128;67572:191;:::o;23051:167::-;23128:7;23155:55;23177:20;:18;:20::i;:::-;23199:10;11872:57;;-1:-1:-1;;;11872:57:0;;;16986:27:1;17029:11;;;17022:27;;;17065:12;;;17058:28;;;11835:7:0;;17102:12:1;;11872:57:0;;;;;;;;;;;;11862:68;;;;;;11855:75;;11742:196;;;;;10051:279;10179:7;10200:17;10219:18;10241:25;10252:4;10258:1;10261;10264;10241:10;:25::i;:::-;10199:67;;;;10277:18;10289:5;10277:11;:18::i;:::-;-1:-1:-1;10313:9:0;10051:279;-1:-1:-1;;;;;10051:279:0:o;53814:207::-;-1:-1:-1;;;;;53935:14:0;;53874:15;53935:14;;;:7;:14;;;;;17951;;18088:1;18070:19;;;;17951:14;53996:17;53891:130;53814:207;;;:::o;62861:645::-;63098:12;;63035:17;;;;63133:8;;:35;;63148:5;63154:7;63160:1;63154:3;:7;:::i;:::-;63148:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;-1:-1:-1;;;;;63148:20:0;63133:35;;;63144:1;63133:35;-1:-1:-1;;;;;63121:47:0;;;63191:20;63194:9;63205:5;63191:2;:20;;:::i;:::-;63179:32;;63234:1;63228:3;:7;:51;;;;-1:-1:-1;63267:12:0;63239:5;63245:7;63251:1;63245:3;:7;:::i;:::-;63239:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;63228:51;63224:275;;;63319:29;63338:9;63319:18;:29::i;:::-;63296:5;63302:7;63308:1;63302:3;:7;:::i;:::-;63296:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;63296:52:0;;;;;-1:-1:-1;;;;;63296:52:0;;;;;;63224:275;;;63381:5;63392:94;;;;;;;;63415:31;63433:12;63415:17;:31::i;:::-;63392:94;;;;;;63455:29;63474:9;63455:18;:29::i;:::-;-1:-1:-1;;;;;63392:94:0;;;;;;63381:106;;;;;;;-1:-1:-1;63381:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63224:275;63073:433;62861:645;;;;;;:::o;69563:231::-;69691:9;;-1:-1:-1;;;69691:9:0;;;;:31;;;;-1:-1:-1;69705:17:0;;-1:-1:-1;;;69705:17:0;;;;69704:18;69691:31;69687:100;;;69739:10;;:36;;-1:-1:-1;;;69739:36:0;;-1:-1:-1;;;;;15637:15:1;;;69739:36:0;;;15619:34:1;15689:15;;;15669:18;;;15662:43;15721:18;;;15714:34;;;69739:10:0;;;;:18;;15554::1;;69739:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69802:193;69944:43;69970:4;69976:2;69980:6;69944:25;:43::i;62210:643::-;62342:3;-1:-1:-1;;;;;62335:10:0;:3;-1:-1:-1;;;;;62335:10:0;;;:24;;;;;62358:1;62349:6;:10;62335:24;62331:515;;;-1:-1:-1;;;;;62380:17:0;;;62376:224;;-1:-1:-1;;;;;62476:17:0;;62419;62476;;;:12;:17;;;;;62419;;62459:54;;62495:9;62506:6;62459:16;:54::i;:::-;62418:95;;;;62558:3;-1:-1:-1;;;;;62537:47:0;;62563:9;62574;62537:47;;;;;;15933:25:1;;;15989:2;15974:18;;15967:34;15921:2;15906:18;;15759:248;62537:47:0;;;;;;;;62399:201;;62376:224;-1:-1:-1;;;;;62620:17:0;;;62616:219;;-1:-1:-1;;;;;62716:17:0;;62659;62716;;;:12;:17;;;;;62659;;62699:49;;62735:4;62741:6;62699:16;:49::i;:::-;62658:90;;;;62793:3;-1:-1:-1;;;;;62772:47:0;;62798:9;62809;62772:47;;;;;;15933:25:1;;;15989:2;15974:18;;15967:34;15921:2;15906:18;;15759:248;62772:47:0;;;;;;;;62639:196;;62210:643;;;:::o;50240:156::-;50302:7;50377:11;50387:1;50378:5;;;50377:11;:::i;:::-;50367:21;;50368:5;;;50367:21;:::i;61054:194::-;61139:28;61151:7;61160:6;61139:11;:28::i;:::-;61180:60;61197:23;61222:9;61233:6;61180:16;:60::i;8280:1632::-;8411:7;;9345:66;9332:79;;9328:163;;;-1:-1:-1;9444:1:0;;-1:-1:-1;9448:30:0;9428:51;;9328:163;9505:1;:7;;9510:2;9505:7;;:18;;;;;9516:1;:7;;9521:2;9516:7;;9505:18;9501:102;;;-1:-1:-1;9556:1:0;;-1:-1:-1;9560:30:0;9540:51;;9501:102;9717:24;;;9700:14;9717:24;;;;;;;;;17352:25:1;;;17425:4;17413:17;;17393:18;;;17386:45;;;;17447:18;;;17440:34;;;17490:18;;;17483:34;;;9717:24:0;;17324:19:1;;9717:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9717:24:0;;-1:-1:-1;;9717:24:0;;;-1:-1:-1;;;;;;;9756:20:0;;9752:103;;9809:1;9813:29;9793:50;;;;;;;9752:103;9875:6;-1:-1:-1;9883:20:0;;-1:-1:-1;8280:1632:0;;;;;;;;:::o;2981:643::-;3059:20;3050:5;:29;;;;;;;;:::i;:::-;;3046:571;;;2981:643;:::o;3046:571::-;3157:29;3148:5;:38;;;;;;;;:::i;:::-;;3144:473;;;3203:34;;-1:-1:-1;;;3203:34:0;;17862:2:1;3203:34:0;;;17844:21:1;17901:2;17881:18;;;17874:30;17940:26;17920:18;;;17913:54;17984:18;;3203:34:0;17660:348:1;3144:473:0;3268:35;3259:5;:44;;;;;;;;:::i;:::-;;3255:362;;;3320:41;;-1:-1:-1;;;3320:41:0;;18215:2:1;3320:41:0;;;18197:21:1;18254:2;18234:18;;;18227:30;18293:33;18273:18;;;18266:61;18344:18;;3320:41:0;18013:355:1;3255:362:0;3392:30;3383:5;:39;;;;;;;;:::i;:::-;;3379:238;;;3439:44;;-1:-1:-1;;;3439:44:0;;18575:2:1;3439:44:0;;;18557:21:1;18614:2;18594:18;;;18587:30;18653:34;18633:18;;;18626:62;-1:-1:-1;;;18704:18:1;;;18697:32;18746:19;;3439:44:0;18373:398:1;3379:238:0;3514:30;3505:5;:39;;;;;;;;:::i;:::-;;3501:116;;;3561:44;;-1:-1:-1;;;3561:44:0;;18978:2:1;3561:44:0;;;18960:21:1;19017:2;18997:18;;;18990:30;19056:34;19036:18;;;19029:62;-1:-1:-1;;;19107:18:1;;;19100:32;19149:19;;3561:44:0;18776:398:1;32796:591:0;-1:-1:-1;;;;;32880:21:0;;32872:67;;;;-1:-1:-1;;;32872:67:0;;19381:2:1;32872:67:0;;;19363:21:1;19420:2;19400:18;;;19393:30;19459:34;19439:18;;;19432:62;-1:-1:-1;;;19510:18:1;;;19503:31;19551:19;;32872:67:0;19179:397:1;32872:67:0;32952:49;32973:7;32990:1;32994:6;32952:20;:49::i;:::-;-1:-1:-1;;;;;33039:18:0;;33014:22;33039:18;;;:9;:18;;;;;;33076:24;;;;33068:71;;;;-1:-1:-1;;;33068:71:0;;19783:2:1;33068:71:0;;;19765:21:1;19822:2;19802:18;;;19795:30;19861:34;19841:18;;;19834:62;-1:-1:-1;;;19912:18:1;;;19905:32;19954:19;;33068:71:0;19581:398:1;33068:71:0;-1:-1:-1;;;;;33175:18:0;;;;;;:9;:18;;;;;33196:23;;;33175:44;;33241:12;:22;;33213:6;;33175:18;33241:22;;33213:6;;33241:22;:::i;:::-;;;;-1:-1:-1;;33281:37:0;;1391:25:1;;;33307:1:0;;-1:-1:-1;;;;;33281:37:0;;;;;1379:2:1;1364:18;33281:37:0;;;;;;;33331:48;33351:7;33368:1;33372:6;33331:19;:48::i;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;713:70;616:173;;;:::o;794:254::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;2131:180::-;2190:6;2243:2;2231:9;2222:7;2218:23;2214:32;2211:52;;;2259:1;2256;2249:12;2211:52;-1:-1:-1;2282:23:1;;2131:180;-1:-1:-1;2131:180:1:o;2316:186::-;2375:6;2428:2;2416:9;2407:7;2403:23;2399:32;2396:52;;;2444:1;2441;2434:12;2396:52;2467:29;2486:9;2467:29;:::i;3143:273::-;3199:6;3252:2;3240:9;3231:7;3227:23;3223:32;3220:52;;;3268:1;3265;3258:12;3220:52;3307:9;3294:23;3360:5;3353:13;3346:21;3339:5;3336:32;3326:60;;3382:1;3379;3372:12;3421:156;3487:20;;3547:4;3536:16;;3526:27;;3516:55;;3567:1;3564;3557:12;3582:531;3684:6;3692;3700;3708;3716;3724;3777:3;3765:9;3756:7;3752:23;3748:33;3745:53;;;3794:1;3791;3784:12;3745:53;3817:29;3836:9;3817:29;:::i;:::-;3807:39;;3893:2;3882:9;3878:18;3865:32;3855:42;;3944:2;3933:9;3929:18;3916:32;3906:42;;3967:36;3999:2;3988:9;3984:18;3967:36;:::i;:::-;3957:46;;4050:3;4039:9;4035:19;4022:33;4012:43;;4102:3;4091:9;4087:19;4074:33;4064:43;;3582:531;;;;;;;;:::o;4118:606::-;4229:6;4237;4245;4253;4261;4269;4277;4330:3;4318:9;4309:7;4305:23;4301:33;4298:53;;;4347:1;4344;4337:12;4298:53;4370:29;4389:9;4370:29;:::i;:::-;4360:39;;4418:38;4452:2;4441:9;4437:18;4418:38;:::i;:::-;4408:48;;4503:2;4492:9;4488:18;4475:32;4465:42;;4554:2;4543:9;4539:18;4526:32;4516:42;;4577:37;4609:3;4598:9;4594:19;4577:37;:::i;:::-;4567:47;;4661:3;4650:9;4646:19;4633:33;4623:43;;4713:3;4702:9;4698:19;4685:33;4675:43;;4118:606;;;;;;;;;;:::o;4729:260::-;4797:6;4805;4858:2;4846:9;4837:7;4833:23;4829:32;4826:52;;;4874:1;4871;4864:12;4826:52;4897:29;4916:9;4897:29;:::i;:::-;4887:39;;4945:38;4979:2;4968:9;4964:18;4945:38;:::i;:::-;4935:48;;4729:260;;;;;:::o;4994:350::-;5061:6;5069;5122:2;5110:9;5101:7;5097:23;5093:32;5090:52;;;5138:1;5135;5128:12;5090:52;5161:29;5180:9;5161:29;:::i;:::-;5151:39;;5240:2;5229:9;5225:18;5212:32;5284:10;5277:5;5273:22;5266:5;5263:33;5253:61;;5310:1;5307;5300:12;5253:61;5333:5;5323:15;;;4994:350;;;;;:::o;5700:380::-;5779:1;5775:12;;;;5822;;;5843:61;;5897:4;5889:6;5885:17;5875:27;;5843:61;5950:2;5942:6;5939:14;5919:18;5916:38;5913:161;;;5996:10;5991:3;5987:20;5984:1;5977:31;6031:4;6028:1;6021:15;6059:4;6056:1;6049:15;6085:127;6146:10;6141:3;6137:20;6134:1;6127:31;6177:4;6174:1;6167:15;6201:4;6198:1;6191:15;6217:128;6257:3;6288:1;6284:6;6281:1;6278:13;6275:39;;;6294:18;;:::i;:::-;-1:-1:-1;6330:9:1;;6217:128::o;6710:356::-;6912:2;6894:21;;;6931:18;;;6924:30;6990:34;6985:2;6970:18;;6963:62;7057:2;7042:18;;6710:356::o;7479:125::-;7519:4;7547:1;7544;7541:8;7538:34;;;7552:18;;:::i;:::-;-1:-1:-1;7589:9:1;;7479:125::o;7609:127::-;7670:10;7665:3;7661:20;7658:1;7651:31;7701:4;7698:1;7691:15;7725:4;7722:1;7715:15;16506:217;16546:1;16572;16562:132;;16616:10;16611:3;16607:20;16604:1;16597:31;16651:4;16648:1;16641:15;16679:4;16676:1;16669:15;16562:132;-1:-1:-1;16708:9:1;;16506:217::o;17528:127::-;17589:10;17584:3;17580:20;17577:1;17570:31;17620:4;17617:1;17610:15;17644:4;17641:1;17634:15
Swarm Source
ipfs://b19faddcacf6c5bb54981d88b62e442b04632ef230de205b4ebc1f3a6d0c0377
[ 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.