Contract
0x449674b82f05d498e126dd6615a1057a9c088f2c
2
[ Download CSV Export ]
OVERVIEW
Lost Worlds a 1st of its kind NFT platform experience where NFTs are geographically bound to real world locations for collectors to discover and mint.Contract Name:
LostToken
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-04-01 */ // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: 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); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @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); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // 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); } // File @openzeppelin/contracts/utils/[email protected] // 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); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // 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)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @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); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @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(); } } // File @openzeppelin/contracts/utils/math/[email protected] // 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); } } // File @openzeppelin/contracts/governance/utils/[email protected] // 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; } // File @openzeppelin/contracts/utils/math/[email protected] // 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); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) pragma solidity ^0.8.0; /** * @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; } } // File contracts/core/LostToken.sol pragma solidity ^0.8.13; // External /** * @notice Lost Token responsible for running the LOST Economy * @author 0xLostArchitect * ,--, ,---.'| | | : ___ .---. ,--, : : | ,--.'|_ /. ./| ,--.'| ,---, | ' : ,---. | | :,' .--'. ' ; ,---. __ ,-.| | : ,---.'| ; ; ' ' ,'\ .--.--. : : ' : /__./ \ : | ' ,'\ ,' ,'/ /|: : ' | | : .--.--. ' | |__ / / | / / '.;__,' / .--'. ' \' . / / |' | |' || ' | | | | / / ' | | :.'|. ; ,. :| : /`./| | | /___/ \ | ' '. ; ,. :| | ,'' | | ,--.__| || : /`./ ' : ;' | |: :| : ;_ :__,'| : ; \ \; :' | |: :' : / | | : / ,' || : ;_ | | ./ ' | .; : \ \ `. ' : |__ \ ; ` |' | .; :| | ' ' : |__ . ' / | \ \ `. ; : ; | : | `----. \| | '.'| . \ .\ ;| : |; : | | | '.'|' ; |: | `----. \ | ,/ \ \ / / /`--' /; : ; \ \ ' \ | \ \ / | , ; ; : ;| | '/ ' / /`--' / '---' `----' '--'. / | , / : ' |--" `----' ---' | , / | : :|'--'. / `--'---' ---`-' \ \ ; ---`-' \ \ / `--'---' '---" `----' */ contract LostToken is ERC20, ERC20Burnable, ERC20Votes { constructor() ERC20("LostToken", "LOST") ERC20Permit("LostToken") { _mint(msg.sender, 50000000 * 10**decimals()); } // The following functions are overrides required by Solidity. function _afterTokenTransfer( address from, address to, uint256 amount ) internal override(ERC20, ERC20Votes) { super._afterTokenTransfer(from, to, amount); } function _mint(address to, uint256 amount) internal override(ERC20, ERC20Votes) { super._mint(to, amount); } function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { super._burn(account, amount); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[{"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":[{"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":"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"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b50604051806040016040528060098152602001682637b9ba2a37b5b2b760b91b81525080604051806040016040528060018152602001603160f81b815250604051806040016040528060098152602001682637b9ba2a37b5b2b760b91b815250604051806040016040528060048152602001631313d4d560e21b8152508160039080519060200190620000cc929190620007a5565b508051620000e2906004906020840190620007a5565b5050825160209384012082519284019290922060e08390526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301979097526060810194909452608080850193909352308483018190528151808603909301835260c09485019091528151919096012090529290925261012052506200019f905033620001896012600a62000954565b62000199906302faf08062000965565b620001a5565b62000a0e565b620001bc8282620001c060201b62000a941760201c565b5050565b620001d782826200027760201b62000b241760201c565b6001600160e01b03620001eb620003668216565b1115620002585760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084015b60405180910390fd5b62000271600862000c0b6200036c60201b178362000383565b50505050565b6001600160a01b038216620002cf5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200024f565b8060026000828254620002e3919062000987565b90915550506001600160a01b038216600090815260208190526040812080548392906200031290849062000987565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001bc600083836200053a565b60025490565b60006200037a828462000987565b90505b92915050565b825460009081908015620003d557856200039f600183620009a2565b81548110620003b257620003b2620009bc565b60009182526020909120015464010000000090046001600160e01b0316620003d8565b60005b6001600160e01b03169250620003ef83858760201c565b915060008111801562000433575043866200040c600184620009a2565b815481106200041f576200041f620009bc565b60009182526020909120015463ffffffff16145b15620004a7576200044f826200055260201b62000c171760201c565b866200045d600184620009a2565b81548110620004705762000470620009bc565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506200052c565b856040518060400160405280620004c943620005c160201b62000c841760201c565b63ffffffff168152602001620004ea856200055260201b62000c171760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b505050565b620005358383836200062860201b62000ce91760201c565b60006001600160e01b03821115620005bd5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016200024f565b5090565b600063ffffffff821115620005bd5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016200024f565b620006408383836200053560201b62000d1b1760201c565b6001600160a01b0383811660009081526006602052604080822054858416835291205462000535929182169116838183148015906200067f5750600081115b1562000535576001600160a01b038316156200070c576001600160a01b038316600090815260076020908152604082208291620006c9919062000797901b62000d20178562000383565b91509150846001600160a01b031660008051602062002858833981519152838360405162000701929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161562000535576001600160a01b0382166000908152600760209081526040822082916200075091906200036c901b62000c0b178562000383565b91509150836001600160a01b031660008051602062002858833981519152838360405162000788929190918252602082015260400190565b60405180910390a25050505050565b60006200037a8284620009a2565b828054620007b390620009d2565b90600052602060002090601f016020900481019282620007d7576000855562000822565b82601f10620007f257805160ff191683800117855562000822565b8280016001018555821562000822579182015b828111156200082257825182559160200191906001019062000805565b50620005bd9291505b80821115620005bd57600081556001016200082b565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620008985781600019048211156200087c576200087c62000841565b808516156200088a57918102915b93841c93908002906200085c565b509250929050565b600082620008b1575060016200037d565b81620008c0575060006200037d565b8160018114620008d95760028114620008e45762000904565b60019150506200037d565b60ff841115620008f857620008f862000841565b50506001821b6200037d565b5060208310610133831016604e8410600b841016171562000929575081810a6200037d565b62000935838362000857565b80600019048211156200094c576200094c62000841565b029392505050565b60006200037a60ff841683620008a0565b600081600019048311821515161562000982576200098262000841565b500290565b600082198211156200099d576200099d62000841565b500190565b600082821015620009b757620009b762000841565b500390565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009e757607f821691505b60208210810362000a0857634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161014051611def62000a6960003960006109000152600061113a0152600061118901526000611164015260006110bd015260006110e7015260006111110152611def6000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806370a08231116100c3578063a457c2d71161007c578063a457c2d714610311578063a9059cbb14610324578063c3cda52014610337578063d505accf1461034a578063dd62ed3e1461035d578063f1127ed81461039657600080fd5b806370a082311461029457806379cc6790146102bd5780637ecebe00146102d05780638e539e8c146102e357806395d89b41146102f65780639ab24eb0146102fe57600080fd5b8063395093511161011557806339509351146101da5780633a46b1a8146101ed57806342966c6814610200578063587cde1e146102155780635c19a95c146102595780636fcfff451461026c57600080fd5b806306fdde031461015d578063095ea7b31461017b57806318160ddd1461019e57806323b872dd146101b0578063313ce567146101c35780633644e515146101d2575b600080fd5b6101656103d3565b6040516101729190611aa1565b60405180910390f35b61018e610189366004611b12565b610465565b6040519015158152602001610172565b6002545b604051908152602001610172565b61018e6101be366004611b3c565b61047d565b60405160128152602001610172565b6101a26104a1565b61018e6101e8366004611b12565b6104b0565b6101a26101fb366004611b12565b6104ef565b61021361020e366004611b78565b61056e565b005b610241610223366004611b91565b6001600160a01b039081166000908152600660205260409020541690565b6040516001600160a01b039091168152602001610172565b610213610267366004611b91565b61057b565b61027f61027a366004611b91565b610585565b60405163ffffffff9091168152602001610172565b6101a26102a2366004611b91565b6001600160a01b031660009081526020819052604090205490565b6102136102cb366004611b12565b6105ad565b6101a26102de366004611b91565b6105c6565b6101a26102f1366004611b78565b6105e4565b610165610640565b6101a261030c366004611b91565b61064f565b61018e61031f366004611b12565b6106d6565b61018e610332366004611b12565b610768565b610213610345366004611bbd565b610776565b610213610358366004611c15565b6108ac565b6101a261036b366004611c7f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103a96103a4366004611cb2565b610a10565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610172565b6060600380546103e290611cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461040e90611cf2565b801561045b5780601f106104305761010080835404028352916020019161045b565b820191906000526020600020905b81548152906001019060200180831161043e57829003601f168201915b5050505050905090565b600033610473818585610d2c565b5060019392505050565b60003361048b858285610e50565b610496858585610edc565b506001949350505050565b60006104ab6110b0565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061047390829086906104ea908790611d3c565b610d2c565b60004382106105455760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e65640060448201526064015b60405180910390fd5b6001600160a01b038316600090815260076020526040902061056790836111d7565b9392505050565b6105783382611294565b50565b610578338261129e565b6001600160a01b0381166000908152600760205260408120546105a790610c84565b92915050565b6105b8823383610e50565b6105c28282611294565b5050565b6001600160a01b0381166000908152600560205260408120546105a7565b60004382106106355760405162461bcd60e51b815260206004820152601f60248201527f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400604482015260640161053c565b6105a76008836111d7565b6060600480546103e290611cf2565b6001600160a01b03811660009081526007602052604081205480156106c3576001600160a01b0383166000908152600760205260409020610691600183611d54565b815481106106a1576106a1611d6b565b60009182526020909120015464010000000090046001600160e01b03166106c6565b60005b6001600160e01b03169392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561075b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161053c565b6104968286868403610d2c565b600033610473818585610edc565b834211156107c65760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e61747572652065787069726564000000604482015260640161053c565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610840906108389060a00160405160208183030381529060405280519060200120611317565b858585611365565b905061084b8161138d565b86146108995760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000604482015260640161053c565b6108a3818861129e565b50505050505050565b834211156108fc5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161053c565b60007f000000000000000000000000000000000000000000000000000000000000000088888861092b8c61138d565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061098682611317565b9050600061099682878787611365565b9050896001600160a01b0316816001600160a01b0316146109f95760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161053c565b610a048a8a8a610d2c565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600760205260409020805463ffffffff8416908110610a5457610a54611d6b565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b610a9e8282610b24565b6002546001600160e01b031015610b105760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b606482015260840161053c565b610b1e6008610c0b836113b5565b50505050565b6001600160a01b038216610b7a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161053c565b8060026000828254610b8c9190611d3c565b90915550506001600160a01b03821660009081526020819052604081208054839290610bb9908490611d3c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36105c26000838361152e565b60006105678284611d3c565b60006001600160e01b03821115610c805760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840161053c565b5090565b600063ffffffff821115610c805760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840161053c565b6001600160a01b03838116600090815260066020526040808220548584168352912054610d1b92918216911683611539565b505050565b60006105678284611d54565b6001600160a01b038316610d8e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161053c565b6001600160a01b038216610def5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161053c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610b1e5781811015610ecf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161053c565b610b1e8484848403610d2c565b6001600160a01b038316610f405760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161053c565b6001600160a01b038216610fa25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161053c565b6001600160a01b0383166000908152602081905260409020548181101561101a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161053c565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611051908490611d3c565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161109d91815260200190565b60405180910390a3610b1e84848461152e565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561110957507f000000000000000000000000000000000000000000000000000000000000000046145b1561113357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b8154600090815b8181101561123b5760006111f28284611676565b90508486828154811061120757611207611d6b565b60009182526020909120015463ffffffff16111561122757809250611235565b611232816001611d3c565b91505b506111de565b811561127f578461124d600184611d54565b8154811061125d5761125d611d6b565b60009182526020909120015464010000000090046001600160e01b0316611282565b60005b6001600160e01b031695945050505050565b6105c28282611691565b6001600160a01b038281166000818152600660208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4610b1e828483611539565b60006105a76113246110b0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611376878787876116a9565b9150915061138381611796565b5095945050505050565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b82546000908190801561140057856113ce600183611d54565b815481106113de576113de611d6b565b60009182526020909120015464010000000090046001600160e01b0316611403565b60005b6001600160e01b0316925061141c83858763ffffffff16565b915060008111801561145a57504386611436600184611d54565b8154811061144657611446611d6b565b60009182526020909120015463ffffffff16145b156114ba5761146882610c17565b86611474600184611d54565b8154811061148457611484611d6b565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b03160217905550611525565b8560405180604001604052806114cf43610c84565b63ffffffff1681526020016114e385610c17565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b50935093915050565b610d1b838383610ce9565b816001600160a01b0316836001600160a01b03161415801561155b5750600081115b15610d1b576001600160a01b038316156115e9576001600160a01b0383166000908152600760205260408120819061159690610d20856113b5565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516115de929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615610d1b576001600160a01b0382166000908152600760205260408120819061161f90610c0b856113b5565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611667929190918252602082015260400190565b60405180910390a25050505050565b60006116856002848418611d81565b61056790848416611d3c565b61169b828261194c565b610b1e6008610d20836113b5565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156116e0575060009050600361178d565b8460ff16601b141580156116f857508460ff16601c14155b15611709575060009050600461178d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561175d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166117865760006001925092505061178d565b9150600090505b94509492505050565b60008160048111156117aa576117aa611da3565b036117b25750565b60018160048111156117c6576117c6611da3565b036118135760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161053c565b600281600481111561182757611827611da3565b036118745760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161053c565b600381600481111561188857611888611da3565b036118e05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161053c565b60048160048111156118f4576118f4611da3565b036105785760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161053c565b6001600160a01b0382166119ac5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161053c565b6001600160a01b03821660009081526020819052604090205481811015611a205760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161053c565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611a4f908490611d54565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610d1b8360008461152e565b600060208083528351808285015260005b81811015611ace57858101830151858201604001528201611ab2565b81811115611ae0576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611b0d57600080fd5b919050565b60008060408385031215611b2557600080fd5b611b2e83611af6565b946020939093013593505050565b600080600060608486031215611b5157600080fd5b611b5a84611af6565b9250611b6860208501611af6565b9150604084013590509250925092565b600060208284031215611b8a57600080fd5b5035919050565b600060208284031215611ba357600080fd5b61056782611af6565b803560ff81168114611b0d57600080fd5b60008060008060008060c08789031215611bd657600080fd5b611bdf87611af6565b95506020870135945060408701359350611bfb60608801611bac565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215611c3057600080fd5b611c3988611af6565b9650611c4760208901611af6565b95506040880135945060608801359350611c6360808901611bac565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611c9257600080fd5b611c9b83611af6565b9150611ca960208401611af6565b90509250929050565b60008060408385031215611cc557600080fd5b611cce83611af6565b9150602083013563ffffffff81168114611ce757600080fd5b809150509250929050565b600181811c90821680611d0657607f821691505b6020821081036113af57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115611d4f57611d4f611d26565b500190565b600082821015611d6657611d66611d26565b500390565b634e487b7160e01b600052603260045260246000fd5b600082611d9e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220df433d440f4ff2040e574c3c88dd611df0cbf2b2f5fec82125a040f1e2da6b0f64736f6c634300080d0033dec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724
Deployed ByteCode Sourcemap
64800:792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6770:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9121:201;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;9121:201:0;1053:187:1;7890:108:0;7978:12;;7890:108;;;1391:25:1;;;1379:2;1364:18;7890:108:0;1245:177:1;9902:295:0;;;;;;:::i;:::-;;:::i;7732:93::-;;;7815:2;1902:36:1;;1890:2;1875:18;7732:93:0;1760:184:1;41314:115:0;;;:::i;10606:240::-;;;;;;:::i;:::-;;:::i;56085:268::-;;;;;;:::i;:::-;;:::i;18152:91::-;;;;;;:::i;:::-;;:::i;:::-;;55459:128;;;;;;:::i;:::-;-1:-1:-1;;;;;55560:19:0;;;55533:7;55560:19;;;:10;:19;;;;;;;;55459:128;;;;-1:-1:-1;;;;;2671:32:1;;;2653:51;;2641:2;2626:18;55459:128:0;2507:203:1;58558:114:0;;;;;;:::i;:::-;;:::i;55215:151::-;;;;;;:::i;:::-;;:::i;:::-;;;2889:10:1;2877:23;;;2859:42;;2847:2;2832:18;55215:151:0;2715:192:1;8061:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;8162:18:0;8135:7;8162:18;;;;;;;;;;;;8061:127;18562:164;;;;;;:::i;:::-;;:::i;41056:128::-;;;;;;:::i;:::-;;:::i;56642:259::-;;;;;;:::i;:::-;;:::i;6989:104::-;;;:::i;55671:212::-;;;;;;:::i;:::-;;:::i;11349:438::-;;;;;;:::i;:::-;;:::i;8394:193::-;;;;;;:::i;:::-;;:::i;58754:591::-;;;;;;:::i;:::-;;:::i;40345:645::-;;;;;;:::i;:::-;;:::i;8650:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8766:18:0;;;8739:7;8766:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8650:151;54985:150;;;;;;:::i;:::-;;:::i;:::-;;;;5064:13:1;;5079:10;5060:30;5042:49;;5151:4;5139:17;;;5133:24;-1:-1:-1;;;;;5129:50:1;5107:20;;;5100:80;;;;5015:18;54985:150:0;4840:346:1;6770:100:0;6824:13;6857:5;6850:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6770:100;:::o;9121:201::-;9204:4;4486:10;9260:32;4486:10;9276:7;9285:6;9260:8;:32::i;:::-;-1:-1:-1;9310:4:0;;9121:201;-1:-1:-1;;;9121:201:0:o;9902:295::-;10033:4;4486:10;10091:38;10107:4;4486:10;10122:6;10091:15;:38::i;:::-;10140:27;10150:4;10156:2;10160:6;10140:9;:27::i;:::-;-1:-1:-1;10185:4:0;;9902:295;-1:-1:-1;;;;9902:295:0:o;41314:115::-;41374:7;41401:20;:18;:20::i;:::-;41394:27;;41314:115;:::o;10606:240::-;4486:10;10694:4;10775:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;10775:27:0;;;;;;;;;;10694:4;;4486:10;10750:66;;4486:10;;10775:27;;:40;;10805:10;;10775:40;:::i;:::-;10750:8;:66::i;56085:268::-;56183:7;56225:12;56211:11;:26;56203:70;;;;-1:-1:-1;;;56203:70:0;;6043:2:1;56203:70:0;;;6025:21:1;6082:2;6062:18;;;6055:30;6121:33;6101:18;;;6094:61;6172:18;;56203:70:0;;;;;;;;;-1:-1:-1;;;;;56310:21:0;;;;;;:12;:21;;;;;56291:54;;56333:11;56291:18;:54::i;:::-;56284:61;56085:268;-1:-1:-1;;;56085:268:0:o;18152:91::-;18208:27;4486:10;18228:6;18208:5;:27::i;:::-;18152:91;:::o;58558:114::-;58630:34;4486:10;58654:9;58630;:34::i;55215:151::-;-1:-1:-1;;;;;55329:21:0;;55285:6;55329:21;;;:12;:21;;;;;:28;55311:47;;:17;:47::i;:::-;55304:54;55215:151;-1:-1:-1;;55215:151:0:o;18562:164::-;18639:46;18655:7;4486:10;18678:6;18639:15;:46::i;:::-;18696:22;18702:7;18711:6;18696:5;:22::i;:::-;18562:164;;:::o;41056:128::-;-1:-1:-1;;;;;41152:14:0;;41125:7;41152:14;;;:7;:14;;;;;38377;41152:24;38285:114;56642:259;56729:7;56771:12;56757:11;:26;56749:70;;;;-1:-1:-1;;;56749:70:0;;6043:2:1;56749:70:0;;;6025:21:1;6082:2;6062:18;;;6055:30;6121:33;6101:18;;;6094:61;6172:18;;56749:70:0;5841:355:1;56749:70:0;56837:56;56856:23;56881:11;56837:18;:56::i;6989:104::-;7045:13;7078:7;7071:14;;;;;:::i;55671:212::-;-1:-1:-1;;;;;55778:21:0;;55744:7;55778:21;;;:12;:21;;;;;:28;55824:8;;:51;;-1:-1:-1;;;;;55839:21:0;;;;;;:12;:21;;;;;55861:7;55867:1;55861:3;:7;:::i;:::-;55839:30;;;;;;;;:::i;:::-;;;;;;;;;;:36;;;;-1:-1:-1;;;;;55839:36:0;55824:51;;;55835:1;55824:51;-1:-1:-1;;;;;55817:58:0;;55671:212;-1:-1:-1;;;55671:212:0:o;11349:438::-;4486:10;11442:4;11525:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;11525:27:0;;;;;;;;;;11442:4;;4486:10;11571:35;;;;11563:85;;;;-1:-1:-1;;;11563:85:0;;6665:2:1;11563:85:0;;;6647:21:1;6704:2;6684:18;;;6677:30;6743:34;6723:18;;;6716:62;-1:-1:-1;;;6794:18:1;;;6787:35;6839:19;;11563:85:0;6463:401:1;11563:85:0;11684:60;11693:5;11700:7;11728:15;11709:16;:34;11684:8;:60::i;8394:193::-;8473:4;4486:10;8529:28;4486:10;8546:2;8550:6;8529:9;:28::i;58754:591::-;58981:6;58962:15;:25;;58954:67;;;;-1:-1:-1;;;58954:67:0;;7071:2:1;58954:67:0;;;7053:21:1;7110:2;7090:18;;;7083:30;7149:31;7129:18;;;7122:59;7198:18;;58954:67:0;6869:353:1;58954:67:0;59104:58;;;54665:71;59104:58;;;7458:25:1;-1:-1:-1;;;;;7519:32:1;;7499:18;;;7492:60;;;;7568:18;;;7561:34;;;7611:18;;;7604:34;;;59032:14:0;;59049:174;;59077:87;;7430:19:1;;59104:58:0;;;;;;;;;;;;59094:69;;;;;;59077:16;:87::i;:::-;59179:1;59195;59211;59049:13;:174::i;:::-;59032:191;;59251:17;59261:6;59251:9;:17::i;:::-;59242:5;:26;59234:64;;;;-1:-1:-1;;;59234:64:0;;7851:2:1;59234:64:0;;;7833:21:1;7890:2;7870:18;;;7863:30;7929:27;7909:18;;;7902:55;7974:18;;59234:64:0;7649:349:1;59234:64:0;59309:28;59319:6;59327:9;59309;:28::i;:::-;58943:402;58754:591;;;;;;:::o;40345:645::-;40589:8;40570:15;:27;;40562:69;;;;-1:-1:-1;;;40562:69:0;;8205:2:1;40562:69:0;;;8187:21:1;8244:2;8224:18;;;8217:30;8283:31;8263:18;;;8256:59;8332:18;;40562:69:0;8003:353:1;40562:69:0;40644:18;40686:16;40704:5;40711:7;40720:5;40727:16;40737:5;40727:9;:16::i;:::-;40675:79;;;;;;8648:25:1;;;;-1:-1:-1;;;;;8747:15:1;;;8727:18;;;8720:43;8799:15;;;;8779:18;;;8772:43;8831:18;;;8824:34;8874:19;;;8867:35;8918:19;;;8911:35;;;8620:19;;40675:79:0;;;;;;;;;;;;40665:90;;;;;;40644:111;;40768:12;40783:28;40800:10;40783:16;:28::i;:::-;40768:43;;40824:14;40841:28;40855:4;40861:1;40864;40867;40841:13;:28::i;:::-;40824:45;;40898:5;-1:-1:-1;;;;;40888:15:0;:6;-1:-1:-1;;;;;40888:15:0;;40880:58;;;;-1:-1:-1;;;40880:58:0;;9159:2:1;40880:58:0;;;9141:21:1;9198:2;9178:18;;;9171:30;9237:32;9217:18;;;9210:60;9287:18;;40880:58:0;8957:354:1;40880:58:0;40951:31;40960:5;40967:7;40976:5;40951:8;:31::i;:::-;40551:439;;;40345:645;;;;;;;:::o;54985:150::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;55101:21:0;;;;;;:12;:21;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;55094:33;;;;;;;;;55101:26;;55094:33;;;;;;;;;-1:-1:-1;;;;;55094:33:0;;;;;;;;;54985:150;-1:-1:-1;;;54985:150:0:o;59651:290::-;59736:28;59748:7;59757:6;59736:11;:28::i;:::-;7978:12;;-1:-1:-1;;;;;;59783:29:0;59775:90;;;;-1:-1:-1;;;59775:90:0;;9518:2:1;59775:90:0;;;9500:21:1;9557:2;9537:18;;;9530:30;9596:34;9576:18;;;9569:62;-1:-1:-1;;;9647:18:1;;;9640:46;9703:19;;59775:90:0;9316:412:1;59775:90:0;59878:55;59895:23;59920:4;59926:6;59878:16;:55::i;:::-;;;59651:290;;:::o;13224:399::-;-1:-1:-1;;;;;13308:21:0;;13300:65;;;;-1:-1:-1;;;13300:65:0;;9935:2:1;13300:65:0;;;9917:21:1;9974:2;9954:18;;;9947:30;10013:33;9993:18;;;9986:61;10064:18;;13300:65:0;9733:355:1;13300:65:0;13456:6;13440:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13473:18:0;;:9;:18;;;;;;;;;;:28;;13495:6;;13473:9;:28;;13495:6;;13473:28;:::i;:::-;;;;-1:-1:-1;;13517:37:0;;1391:25:1;;;-1:-1:-1;;;;;13517:37:0;;;13534:1;;13517:37;;1379:2:1;1364:18;13517:37:0;;;;;;;13567:48;13595:1;13599:7;13608:6;13567:19;:48::i;62495:98::-;62553:7;62580:5;62584:1;62580;:5;:::i;46451:195::-;46508:7;-1:-1:-1;;;;;46536:26:0;;;46528:78;;;;-1:-1:-1;;;46528:78:0;;10295:2:1;46528:78:0;;;10277:21:1;10334:2;10314:18;;;10307:30;10373:34;10353:18;;;10346:62;-1:-1:-1;;;10424:18:1;;;10417:37;10471:19;;46528:78:0;10093:403:1;46528:78:0;-1:-1:-1;46632:5:0;46451:195::o;48421:190::-;48477:6;48513:16;48504:25;;;48496:76;;;;-1:-1:-1;;;48496:76:0;;10703:2:1;48496:76:0;;;10685:21:1;10742:2;10722:18;;;10715:30;10781:34;10761:18;;;10754:62;-1:-1:-1;;;10832:18:1;;;10825:36;10878:19;;48496:76:0;10501:402:1;60369:262:0;-1:-1:-1;;;;;55560:19:0;;;55533:7;55560:19;;;:10;:19;;;;;;;;;;;;;;;60567:56;;55560:19;;;;;60616:6;60567:16;:56::i;:::-;60369:262;;;:::o;62601:103::-;62664:7;62691:5;62695:1;62691;:5;:::i;14985:380::-;-1:-1:-1;;;;;15121:19:0;;15113:68;;;;-1:-1:-1;;;15113:68:0;;11110:2:1;15113:68:0;;;11092:21:1;11149:2;11129:18;;;11122:30;11188:34;11168:18;;;11161:62;-1:-1:-1;;;11239:18:1;;;11232:34;11283:19;;15113:68:0;10908:400:1;15113:68:0;-1:-1:-1;;;;;15200:21:0;;15192:68;;;;-1:-1:-1;;;15192:68:0;;11515:2:1;15192:68:0;;;11497:21:1;11554:2;11534:18;;;11527:30;11593:34;11573:18;;;11566:62;-1:-1:-1;;;11644:18:1;;;11637:32;11686:19;;15192:68:0;11313:398:1;15192:68:0;-1:-1:-1;;;;;15273:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15325:32;;1391:25:1;;;15325:32:0;;1364:18:1;15325:32:0;;;;;;;14985:380;;;:::o;15652:453::-;-1:-1:-1;;;;;8766:18:0;;;15787:24;8766:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;15854:37:0;;15850:248;;15936:6;15916:16;:26;;15908:68;;;;-1:-1:-1;;;15908:68:0;;11918:2:1;15908:68:0;;;11900:21:1;11957:2;11937:18;;;11930:30;11996:31;11976:18;;;11969:59;12045:18;;15908:68:0;11716:353:1;15908:68:0;16020:51;16029:5;16036:7;16064:6;16045:16;:25;16020:8;:51::i;12266:671::-;-1:-1:-1;;;;;12397:18:0;;12389:68;;;;-1:-1:-1;;;12389:68:0;;12276:2:1;12389:68:0;;;12258:21:1;12315:2;12295:18;;;12288:30;12354:34;12334:18;;;12327:62;-1:-1:-1;;;12405:18:1;;;12398:35;12450:19;;12389:68:0;12074:401:1;12389:68:0;-1:-1:-1;;;;;12476:16:0;;12468:64;;;;-1:-1:-1;;;12468:64:0;;12682:2:1;12468:64:0;;;12664:21:1;12721:2;12701:18;;;12694:30;12760:34;12740:18;;;12733:62;-1:-1:-1;;;12811:18:1;;;12804:33;12854:19;;12468:64:0;12480:399:1;12468:64:0;-1:-1:-1;;;;;12618:15:0;;12596:19;12618:15;;;;;;;;;;;12652:21;;;;12644:72;;;;-1:-1:-1;;;12644:72:0;;13086:2:1;12644:72:0;;;13068:21:1;13125:2;13105:18;;;13098:30;13164:34;13144:18;;;13137:62;-1:-1:-1;;;13215:18:1;;;13208:36;13261:19;;12644:72:0;12884:402:1;12644:72:0;-1:-1:-1;;;;;12752:15:0;;;:9;:15;;;;;;;;;;;12770:20;;;12752:38;;12812:13;;;;;;;;:23;;12784:6;;12752:9;12812:23;;12784:6;;12812:23;:::i;:::-;;;;;;;;12868:2;-1:-1:-1;;;;;12853:26:0;12862:4;-1:-1:-1;;;;;12853:26:0;;12872:6;12853:26;;;;1391:25:1;;1379:2;1364:18;;1245:177;12853:26:0;;;;;;;;12892:37;12912:4;12918:2;12922:6;12892:19;:37::i;36006:314::-;36059:7;36091:4;-1:-1:-1;;;;;36100:12:0;36083:29;;:66;;;;;36133:16;36116:13;:33;36083:66;36079:234;;;-1:-1:-1;36173:24:0;;36006:314::o;36079:234::-;-1:-1:-1;36509:73:0;;;36259:10;36509:73;;;;13803:25:1;;;;36271:12:0;13844:18:1;;;13837:34;36285:15:0;13887:18:1;;;13880:34;36553:13:0;13930:18:1;;;13923:34;36576:4:0;13973:19:1;;;;13966:61;;;;36509:73:0;;;;;;;;;;13775:19:1;;;;36509:73:0;;;36499:84;;;;;;41314:115::o;56990:1482::-;58123:12;;57089:7;;;58172:236;58185:4;58179:3;:10;58172:236;;;58206:11;58220:23;58233:3;58238:4;58220:12;:23::i;:::-;58206:37;;58285:11;58262:5;58268:3;58262:10;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;:34;58258:139;;;58324:3;58317:10;;58258:139;;;58374:7;:3;58380:1;58374:7;:::i;:::-;58368:13;;58258:139;58191:217;58172:236;;;58427:9;;:37;;58443:5;58449:8;58456:1;58449:4;:8;:::i;:::-;58443:15;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;-1:-1:-1;;;;;58443:21:0;58427:37;;;58439:1;58427:37;-1:-1:-1;;;;;58420:44:0;;56990:1482;-1:-1:-1;;;;;56990:1482:0:o;65434:155::-;65553:28;65565:7;65574:6;65553:11;:28::i;60795:388::-;-1:-1:-1;;;;;55560:19:0;;;60880:23;55560:19;;;:10;:19;;;;;;;;;;8162:18;;;;;;;60995:21;;;;:33;;;-1:-1:-1;;;;;;60995:33:0;;;;;;;61046:54;;55560:19;;;;;8162:18;;60995:33;;55560:19;;;61046:54;;60880:23;61046:54;61113:62;61130:15;61147:9;61158:16;61113;:62::i;37233:167::-;37310:7;37337:55;37359:20;:18;:20::i;:::-;37381:10;32699:57;;-1:-1:-1;;;32699:57:0;;;14518:27:1;14561:11;;;14554:27;;;14597:12;;;14590:28;;;32662:7:0;;14634:12:1;;32699:57:0;;;;;;;;;;;;32689:68;;;;;;32682:75;;32569:196;;;;;30878:279;31006:7;31027:17;31046:18;31068:25;31079:4;31085:1;31088;31091;31068:10;:25::i;:::-;31026:67;;;;31104:18;31116:5;31104:11;:18::i;:::-;-1:-1:-1;31140:9:0;30878:279;-1:-1:-1;;;;;30878:279:0:o;41567:207::-;-1:-1:-1;;;;;41688:14:0;;41627:15;41688:14;;;:7;:14;;;;;38377;;38514:1;38496:19;;;;38377:14;41749:17;41644:130;41567:207;;;:::o;61842:645::-;62079:12;;62016:17;;;;62114:8;;:35;;62129:5;62135:7;62141:1;62135:3;:7;:::i;:::-;62129:14;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;-1:-1:-1;;;;;62129:20:0;62114:35;;;62125:1;62114:35;-1:-1:-1;;;;;62102:47:0;;;62172:20;62175:9;62186:5;62172:2;:20;;:::i;:::-;62160:32;;62215:1;62209:3;:7;:51;;;;-1:-1:-1;62248:12:0;62220:5;62226:7;62232:1;62226:3;:7;:::i;:::-;62220:14;;;;;;;;:::i;:::-;;;;;;;;;;:24;;;:40;62209:51;62205:275;;;62300:29;62319:9;62300:18;:29::i;:::-;62277:5;62283:7;62289:1;62283:3;:7;:::i;:::-;62277:14;;;;;;;;:::i;:::-;;;;;;;;:20;;;:52;;;;;-1:-1:-1;;;;;62277:52:0;;;;;-1:-1:-1;;;;;62277:52:0;;;;;;62205:275;;;62362:5;62373:94;;;;;;;;62396:31;62414:12;62396:17;:31::i;:::-;62373:94;;;;;;62436:29;62455:9;62436:18;:29::i;:::-;-1:-1:-1;;;;;62373:94:0;;;;;;62362:106;;;;;;;-1:-1:-1;62362:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62205:275;62054:433;61842:645;;;;;;:::o;65069:204::-;65222:43;65248:4;65254:2;65258:6;65222:25;:43::i;61191:643::-;61323:3;-1:-1:-1;;;;;61316:10:0;:3;-1:-1:-1;;;;;61316:10:0;;;:24;;;;;61339:1;61330:6;:10;61316:24;61312:515;;;-1:-1:-1;;;;;61361:17:0;;;61357:224;;-1:-1:-1;;;;;61457:17:0;;61400;61457;;;:12;:17;;;;;61400;;61440:54;;61476:9;61487:6;61440:16;:54::i;:::-;61399:95;;;;61539:3;-1:-1:-1;;;;;61518:47:0;;61544:9;61555;61518:47;;;;;;13465:25:1;;;13521:2;13506:18;;13499:34;13453:2;13438:18;;13291:248;61518:47:0;;;;;;;;61380:201;;61357:224;-1:-1:-1;;;;;61601:17:0;;;61597:219;;-1:-1:-1;;;;;61697:17:0;;61640;61697;;;:12;:17;;;;;61640;;61680:49;;61716:4;61722:6;61680:16;:49::i;:::-;61639:90;;;;61774:3;-1:-1:-1;;;;;61753:47:0;;61779:9;61790;61753:47;;;;;;13465:25:1;;;13521:2;13506:18;;13499:34;13453:2;13438:18;;13291:248;61753:47:0;;;;;;;;61620:196;;61191:643;;;:::o;42517:156::-;42579:7;42654:11;42664:1;42655:5;;;42654:11;:::i;:::-;42644:21;;42645:5;;;42644:21;:::i;60035:194::-;60120:28;60132:7;60141:6;60120:11;:28::i;:::-;60161:60;60178:23;60203:9;60214:6;60161:16;:60::i;29107:1632::-;29238:7;;30172:66;30159:79;;30155:163;;;-1:-1:-1;30271:1:0;;-1:-1:-1;30275:30:0;30255:51;;30155:163;30332:1;:7;;30337:2;30332:7;;:18;;;;;30343:1;:7;;30348:2;30343:7;;30332:18;30328:102;;;-1:-1:-1;30383:1:0;;-1:-1:-1;30387:30:0;30367:51;;30328:102;30544:24;;;30527:14;30544:24;;;;;;;;;14884:25:1;;;14957:4;14945:17;;14925:18;;;14918:45;;;;14979:18;;;14972:34;;;15022:18;;;15015:34;;;30544:24:0;;14856:19:1;;30544:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30544:24:0;;-1:-1:-1;;30544:24:0;;;-1:-1:-1;;;;;;;30583:20:0;;30579:103;;30636:1;30640:29;30620:50;;;;;;;30579:103;30702:6;-1:-1:-1;30710:20:0;;-1:-1:-1;29107:1632:0;;;;;;;;:::o;23816:643::-;23894:20;23885:5;:29;;;;;;;;:::i;:::-;;23881:571;;23816:643;:::o;23881:571::-;23992:29;23983:5;:38;;;;;;;;:::i;:::-;;23979:473;;24038:34;;-1:-1:-1;;;24038:34:0;;15394:2:1;24038:34:0;;;15376:21:1;15433:2;15413:18;;;15406:30;15472:26;15452:18;;;15445:54;15516:18;;24038:34:0;15192:348:1;23979:473:0;24103:35;24094:5;:44;;;;;;;;:::i;:::-;;24090:362;;24155:41;;-1:-1:-1;;;24155:41:0;;15747:2:1;24155:41:0;;;15729:21:1;15786:2;15766:18;;;15759:30;15825:33;15805:18;;;15798:61;15876:18;;24155:41:0;15545:355:1;24090:362:0;24227:30;24218:5;:39;;;;;;;;:::i;:::-;;24214:238;;24274:44;;-1:-1:-1;;;24274:44:0;;16107:2:1;24274:44:0;;;16089:21:1;16146:2;16126:18;;;16119:30;16185:34;16165:18;;;16158:62;-1:-1:-1;;;16236:18:1;;;16229:32;16278:19;;24274:44:0;15905:398:1;24214:238:0;24349:30;24340:5;:39;;;;;;;;:::i;:::-;;24336:116;;24396:44;;-1:-1:-1;;;24396:44:0;;16510:2:1;24396:44:0;;;16492:21:1;16549:2;16529:18;;;16522:30;16588:34;16568:18;;;16561:62;-1:-1:-1;;;16639:18:1;;;16632:32;16681:19;;24396:44:0;16308:398:1;13956:591:0;-1:-1:-1;;;;;14040:21:0;;14032:67;;;;-1:-1:-1;;;14032:67:0;;16913:2:1;14032:67:0;;;16895:21:1;16952:2;16932:18;;;16925:30;16991:34;16971:18;;;16964:62;-1:-1:-1;;;17042:18:1;;;17035:31;17083:19;;14032:67:0;16711:397:1;14032:67:0;-1:-1:-1;;;;;14199:18:0;;14174:22;14199:18;;;;;;;;;;;14236:24;;;;14228:71;;;;-1:-1:-1;;;14228:71:0;;17315:2:1;14228:71:0;;;17297:21:1;17354:2;17334:18;;;17327:30;17393:34;17373:18;;;17366:62;-1:-1:-1;;;17444:18:1;;;17437:32;17486:19;;14228:71:0;17113:398:1;14228:71:0;-1:-1:-1;;;;;14335:18:0;;:9;:18;;;;;;;;;;14356:23;;;14335:44;;14401:12;:22;;14373:6;;14335:9;14401:22;;14373:6;;14401:22;:::i;:::-;;;;-1:-1:-1;;14441:37:0;;1391:25:1;;;14467:1:0;;-1:-1:-1;;;;;14441:37:0;;;;;1379:2:1;1364:18;14441:37:0;;;;;;;14491:48;14511:7;14528:1;14532:6;14491: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;2912:156::-;2978:20;;3038:4;3027:16;;3017:27;;3007:55;;3058:1;3055;3048:12;3073:531;3175:6;3183;3191;3199;3207;3215;3268:3;3256:9;3247:7;3243:23;3239:33;3236:53;;;3285:1;3282;3275:12;3236:53;3308:29;3327:9;3308:29;:::i;:::-;3298:39;;3384:2;3373:9;3369:18;3356:32;3346:42;;3435:2;3424:9;3420:18;3407:32;3397:42;;3458:36;3490:2;3479:9;3475:18;3458:36;:::i;:::-;3448:46;;3541:3;3530:9;3526:19;3513:33;3503:43;;3593:3;3582:9;3578:19;3565:33;3555:43;;3073:531;;;;;;;;:::o;3609:606::-;3720:6;3728;3736;3744;3752;3760;3768;3821:3;3809:9;3800:7;3796:23;3792:33;3789:53;;;3838:1;3835;3828:12;3789:53;3861:29;3880:9;3861:29;:::i;:::-;3851:39;;3909:38;3943:2;3932:9;3928:18;3909:38;:::i;:::-;3899:48;;3994:2;3983:9;3979:18;3966:32;3956:42;;4045:2;4034:9;4030:18;4017:32;4007:42;;4068:37;4100:3;4089:9;4085:19;4068:37;:::i;:::-;4058:47;;4152:3;4141:9;4137:19;4124:33;4114:43;;4204:3;4193:9;4189:19;4176:33;4166:43;;3609:606;;;;;;;;;;:::o;4220:260::-;4288:6;4296;4349:2;4337:9;4328:7;4324:23;4320:32;4317:52;;;4365:1;4362;4355:12;4317:52;4388:29;4407:9;4388:29;:::i;:::-;4378:39;;4436:38;4470:2;4459:9;4455:18;4436:38;:::i;:::-;4426:48;;4220:260;;;;;:::o;4485:350::-;4552:6;4560;4613:2;4601:9;4592:7;4588:23;4584:32;4581:52;;;4629:1;4626;4619:12;4581:52;4652:29;4671:9;4652:29;:::i;:::-;4642:39;;4731:2;4720:9;4716:18;4703:32;4775:10;4768:5;4764:22;4757:5;4754:33;4744:61;;4801:1;4798;4791:12;4744:61;4824:5;4814:15;;;4485:350;;;;;:::o;5191:380::-;5270:1;5266:12;;;;5313;;;5334:61;;5388:4;5380:6;5376:17;5366:27;;5334:61;5441:2;5433:6;5430:14;5410:18;5407:38;5404:161;;5487:10;5482:3;5478:20;5475:1;5468:31;5522:4;5519:1;5512:15;5550:4;5547:1;5540:15;5576:127;5637:10;5632:3;5628:20;5625:1;5618:31;5668:4;5665:1;5658:15;5692:4;5689:1;5682:15;5708:128;5748:3;5779:1;5775:6;5772:1;5769:13;5766:39;;;5785:18;;:::i;:::-;-1:-1:-1;5821:9:1;;5708:128::o;6201:125::-;6241:4;6269:1;6266;6263:8;6260:34;;;6274:18;;:::i;:::-;-1:-1:-1;6311:9:1;;6201:125::o;6331:127::-;6392:10;6387:3;6383:20;6380:1;6373:31;6423:4;6420:1;6413:15;6447:4;6444:1;6437:15;14038:217;14078:1;14104;14094:132;;14148:10;14143:3;14139:20;14136:1;14129:31;14183:4;14180:1;14173:15;14211:4;14208:1;14201:15;14094:132;-1:-1:-1;14240:9:1;;14038:217::o;15060:127::-;15121:10;15116:3;15112:20;15109:1;15102:31;15152:4;15149:1;15142:15;15176:4;15173:1;15166:15
Swarm Source
ipfs://df433d440f4ff2040e574c3c88dd611df0cbf2b2f5fec82125a040f1e2da6b0f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.