Token PILLS Token
Overview ERC-20
Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
9,779,710.389531 PILLS
Holders:
5,417 addresses
Transfers:
-
Contract:
Decimals:
18
Official Site:
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
Morpheus Swap is a new yield farming & yield aggregator protocol, and powered by Fantom.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PillsToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-07 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overloaded; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) { return keccak256( abi.encode( typeHash, name, version, block.chainid, address(this) ) ); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // This version of ERC20Permit is from OpenZeppelin as of commit // https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5171e46c47bd6be781aa92315944ca37126d4a73 /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping (address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") { } /** * @dev See {IERC20Permit-permit}. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override { // solhint-disable-next-line not-rely-on-time require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( _PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline ) ); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract PillsToken is ERC20Permit, Ownable { constructor() ERC20("PILLS Token", "PILLS") ERC20Permit("PILLS Token") { } function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _to, _amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol // A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); // A record of states for signing / validating signatures //mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { bool result = super.transferFrom(sender, recipient, amount); // Call parent hook _moveDelegates(sender, recipient, amount); return result; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { bool result = super.transfer(recipient, amount); // Call parent hook _moveDelegates(_msgSender(), recipient, amount); return result; } /** * @param delegator The address to get delegates for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "PILLS::delegateBySig: invalid signature"); require(nonce == _useNonce(signatory), "PILLS::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "PILLS::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "PILLS::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying PILLs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "PILLS::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b506040518060400160405280600b81526020016a2824a62629902a37b5b2b760a91b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600b81526020016a2824a62629902a37b5b2b760a91b8152506040518060400160405280600581526020016450494c4c5360d81b8152508160039080519060200190620000d1929190620001eb565b508051620000e7906004906020840190620001eb565b5050825160208085019190912083519184019190912060c082905260e08190524660a0529091507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200013c818484620001ab565b60805261010052506000935062000157925050620001e79050565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620002fa565b60008383834630604051602001620001c895949392919062000291565b6040516020818303038152906040528051906020012090509392505050565b3390565b828054620001f990620002bd565b90600052602060002090601f0160209004810192826200021d576000855562000268565b82601f106200023857805160ff191683800117855562000268565b8280016001018555821562000268579182015b82811115620002685782518255916020019190600101906200024b565b50620002769291506200027a565b5090565b5b808211156200027657600081556001016200027b565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600281046001821680620002d257607f821691505b60208210811415620002f457634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516120e66200034a6000396000610bc0015260006110b3015260006110f5015260006110d4015260006110610152600061108a01526120e66000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063715018a6116100f9578063b4b5ea5711610097578063dd62ed3e11610071578063dd62ed3e14610364578063e7a324dc14610377578063f1127ed81461037f578063f2fde38b146103a0576101a9565b8063b4b5ea571461032b578063c3cda5201461033e578063d505accf14610351576101a9565b80638da5cb5b116100d35780638da5cb5b146102f557806395d89b41146102fd578063a457c2d714610305578063a9059cbb14610318576101a9565b8063715018a6146102c7578063782d6fe1146102cf5780637ecebe00146102e2576101a9565b80633644e51511610166578063587cde1e11610140578063587cde1e146102615780635c19a95c146102815780636fcfff451461029457806370a08231146102b4576101a9565b80633644e51514610231578063395093511461023957806340c10f191461024c576101a9565b806306fdde03146101ae578063095ea7b3146101cc57806318160ddd146101ec57806320606b701461020157806323b872dd14610209578063313ce5671461021c575b600080fd5b6101b66103b3565b6040516101c39190611a1a565b60405180910390f35b6101df6101da366004611853565b610446565b6040516101c39190611940565b6101f4610464565b6040516101c3919061194b565b6101f461046a565b6101df6102173660046117af565b61048e565b6102246104b1565b6040516101c39190611f77565b6101f46104b6565b6101df610247366004611853565b6104c5565b61025f61025a366004611853565b610519565b005b61027461026f366004611763565b61057b565b6040516101c3919061192c565b61025f61028f366004611763565b61059c565b6102a76102a2366004611763565b6105a9565b6040516101c39190611f50565b6101f46102c2366004611763565b6105c1565b61025f6105dc565b6101f46102dd366004611853565b610665565b6101f46102f0366004611763565b61088a565b6102746108ab565b6101b66108ba565b6101df610313366004611853565b6108c9565b6101df610326366004611853565b610944565b6101f4610339366004611763565b61096c565b61025f61034c36600461187c565b6109e0565b61025f61035f3660046117ea565b610b9c565b6101f461037236600461177d565b610c72565b6101f4610c9d565b61039261038d3660046118d3565b610cc1565b6040516101c3929190611f61565b61025f6103ae366004611763565b610cee565b6060600380546103c290612030565b80601f01602080910402602001604051908101604052809291908181526020018280546103ee90612030565b801561043b5780601f106104105761010080835404028352916020019161043b565b820191906000526020600020905b81548152906001019060200180831161041e57829003601f168201915b505050505090505b90565b600061045a610453610daf565b8484610db3565b5060015b92915050565b60025490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60008061049c858585610e67565b90506104a9858585610ef9565b949350505050565b601290565b60006104c061105d565b905090565b600061045a6104d2610daf565b8484600160006104e0610daf565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546105149190611f85565b610db3565b610521610daf565b6001600160a01b03166105326108ab565b6001600160a01b0316146105615760405162461bcd60e51b815260040161055890611dc0565b60405180910390fd5b61056b8282611120565b61057760008383610ef9565b5050565b6001600160a01b03808216600090815260076020526040902054165b919050565b6105a633826111e0565b50565b60096020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526020819052604090205490565b6105e4610daf565b6001600160a01b03166105f56108ab565b6001600160a01b03161461061b5760405162461bcd60e51b815260040161055890611dc0565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b60004382106106865760405162461bcd60e51b815260040161055890611e7e565b6001600160a01b03831660009081526009602052604090205463ffffffff16806106b457600091505061045e565b6001600160a01b038416600090815260086020526040812084916106d960018561200b565b63ffffffff90811682526020820192909252604001600020541611610742576001600160a01b03841660009081526008602052604081209061071c60018461200b565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061045e565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff1683101561077d57600091505061045e565b60008061078b60018461200b565b90505b8163ffffffff168163ffffffff16111561085357600060026107b0848461200b565b6107ba9190611fc5565b6107c4908361200b565b6001600160a01b038816600090815260086020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156108275760200151945061045e9350505050565b805163ffffffff1687111561083e5781935061084c565b61084960018361200b565b92505b505061078e565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b6001600160a01b038116600090815260056020526040812061045e90611275565b6006546001600160a01b031690565b6060600480546103c290612030565b600080600160006108d8610daf565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156109245760405162461bcd60e51b815260040161055890611ec6565b61093a61092f610daf565b856105148685611ff4565b5060019392505050565b6000806109518484611279565b905061096561095e610daf565b8585610ef9565b9392505050565b6001600160a01b03811660009081526009602052604081205463ffffffff1680610997576000610965565b6001600160a01b0383166000908152600860205260408120906109bb60018461200b565b63ffffffff1663ffffffff168152602001908152602001600020600101549392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610a0b6103b3565b80519060200120610a1a61128d565b30604051602001610a2e94939291906119d8565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610a7f9493929190611988565b60405160208183030381529060405280519060200120905060008282604051602001610aac929190611911565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610ae994939291906119fc565b6020604051602081039080840390855afa158015610b0b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610b3e5760405162461bcd60e51b815260040161055890611cfa565b610b4781611291565b8914610b655760405162461bcd60e51b815260040161055890611b2e565b87421115610b855760405162461bcd60e51b815260040161055890611ae7565b610b8f818b6111e0565b505050505b505050505050565b83421115610bbc5760405162461bcd60e51b815260040161055890611bf9565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610beb8c611291565b89604051602001610c0196959493929190611954565b6040516020818303038152906040528051906020012090506000610c24826112c3565b90506000610c34828787876112d6565b9050896001600160a01b0316816001600160a01b031614610c675760405162461bcd60e51b815260040161055890611d41565b610b8f8a8a8a610db3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b610cf6610daf565b6001600160a01b0316610d076108ab565b6001600160a01b031614610d2d5760405162461bcd60e51b815260040161055890611dc0565b6001600160a01b038116610d535760405162461bcd60e51b815260040161055890611b71565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316610dd95760405162461bcd60e51b815260040161055890611e3a565b6001600160a01b038216610dff5760405162461bcd60e51b815260040161055890611bb7565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e5a90859061194b565b60405180910390a3505050565b6000610e748484846113cc565b6001600160a01b038416600090815260016020526040812081610e95610daf565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610ed85760405162461bcd60e51b815260040161055890611d78565b610eee85610ee4610daf565b6105148685611ff4565b506001949350505050565b816001600160a01b0316836001600160a01b031614158015610f1b5750600081115b15611058576001600160a01b03831615610fbe576001600160a01b03831660009081526009602052604081205463ffffffff169081610f5b576000610f9e565b6001600160a01b038516600090815260086020526040812090610f7f60018561200b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000610fac8483611ff4565b9050610fba868484846114f4565b5050505b6001600160a01b03821615611058576001600160a01b03821660009081526009602052604081205463ffffffff169081610ff957600061103c565b6001600160a01b03841660009081526008602052604081209061101d60018561200b565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061104a8483611f85565b9050610b94858484846114f4565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614156110ae57507f0000000000000000000000000000000000000000000000000000000000000000610443565b6111197f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611695565b9050610443565b6001600160a01b0382166111465760405162461bcd60e51b815260040161055890611f0b565b61115260008383611058565b80600260008282546111649190611f85565b90915550506001600160a01b03821660009081526020819052604081208054839290611191908490611f85565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906111d490859061194b565b60405180910390a35050565b6001600160a01b0380831660009081526007602052604081205490911690611207846105c1565b6001600160a01b0385811660008181526007602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461126f828483610ef9565b50505050565b5490565b600061045a611286610daf565b84846113cc565b4690565b6001600160a01b03811660009081526005602052604081206112b281611275565b91506112bd816116cf565b50919050565b600061045e6112d061105d565b836116d8565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156113185760405162461bcd60e51b815260040161055890611c76565b8360ff16601b148061132d57508360ff16601c145b6113495760405162461bcd60e51b815260040161055890611cb8565b60006001868686866040516000815260200160405260405161136e94939291906119fc565b6020604051602081039080840390855afa158015611390573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c35760405162461bcd60e51b815260040161055890611a6d565b95945050505050565b6001600160a01b0383166113f25760405162461bcd60e51b815260040161055890611df5565b6001600160a01b0382166114185760405162461bcd60e51b815260040161055890611aa4565b611423838383611058565b6001600160a01b0383166000908152602081905260409020548181101561145c5760405162461bcd60e51b815260040161055890611c30565b6114668282611ff4565b6001600160a01b03808616600090815260208190526040808220939093559085168152908120805484929061149c908490611f85565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516114e6919061194b565b60405180910390a350505050565b60006115184360405180606001604052806035815260200161207c6035913961170b565b905060008463ffffffff1611801561157257506001600160a01b038516600090815260086020526040812063ffffffff83169161155660018861200b565b63ffffffff908116825260208201929092526040016000205416145b156115bb576001600160a01b0385166000908152600860205260408120839161159c60018861200b565b63ffffffff16815260208101919091526040016000206001015561164b565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600883528581208a851682529092529390209151825463ffffffff19169116178155905160019182015561161a908590611f9d565b6001600160a01b0386166000908152600960205260409020805463ffffffff191663ffffffff929092169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611686929190611f42565b60405180910390a25050505050565b600083838346306040516020016116b09594939291906119ac565b6040516020818303038152906040528051906020012090509392505050565b80546001019055565b600082826040516020016116ed929190611911565b60405160208183030381529060405280519060200120905092915050565b60008164010000000084106117335760405162461bcd60e51b81526004016105589190611a1a565b509192915050565b80356001600160a01b038116811461059757600080fd5b803560ff8116811461059757600080fd5b600060208284031215611774578081fd5b6109658261173b565b6000806040838503121561178f578081fd5b6117988361173b565b91506117a66020840161173b565b90509250929050565b6000806000606084860312156117c3578081fd5b6117cc8461173b565b92506117da6020850161173b565b9150604084013590509250925092565b600080600080600080600060e0888a031215611804578283fd5b61180d8861173b565b965061181b6020890161173b565b9550604088013594506060880135935061183760808901611752565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215611865578182fd5b61186e8361173b565b946020939093013593505050565b60008060008060008060c08789031215611894578182fd5b61189d8761173b565b955060208701359450604087013593506118b960608801611752565b92506080870135915060a087013590509295509295509295565b600080604083850312156118e5578182fd5b6118ee8361173b565b9150602083013563ffffffff81168114611906578182fd5b809150509250929050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015611a4657858101830151858201604001528201611a2a565b81811115611a575783604083870101525b50601f01601f1916929092016040019392505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526027908201527f50494c4c533a3a64656c656761746542795369673a207369676e617475726520604082015266195e1c1a5c995960ca1b606082015260800190565b60208082526023908201527f50494c4c533a3a64656c656761746542795369673a20696e76616c6964206e6f6040820152626e636560e81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601d908201527f45524332305065726d69743a206578706972656420646561646c696e65000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526027908201527f50494c4c533a3a64656c656761746542795369673a20696e76616c6964207369604082015266676e617475726560c81b606082015260800190565b6020808252601e908201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526028908201527f50494c4c533a3a6765745072696f72566f7465733a206e6f74207965742064656040820152671d195c9b5a5b995960c21b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b60008219821115611f9857611f98612065565b500190565b600063ffffffff808316818516808303821115611fbc57611fbc612065565b01949350505050565b600063ffffffff80841680611fe857634e487b7160e01b83526012600452602483fd5b92169190910492915050565b60008282101561200657612006612065565b500390565b600063ffffffff8381169083168181101561202857612028612065565b039392505050565b60028104600182168061204457607f821691505b602082108114156112bd57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fdfe50494c4c533a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220b63e3f9d62743a8bacaced24ccb5d12b8a8e67a61996158580b3fde419518d7f64736f6c63430008000033
Deployed ByteCode Sourcemap
31732:9355:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7756:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6709:108::-;;;:::i;:::-;;;;;;;:::i;33042:122::-;;;:::i;33884:299::-;;;;;;:::i;:::-;;:::i;6560:84::-;;;:::i;:::-;;;;;;;:::i;29092:115::-;;;:::i;9238:215::-;;;;;;:::i;:::-;;:::i;31879:152::-;;;;;;:::i;:::-;;:::i;:::-;;34548:149;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34841:104::-;;;;;;:::i;:::-;;:::i;32920:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6880:127::-;;;;;;:::i;:::-;;:::i;31180:148::-;;;:::i;37386:1254::-;;;;;;:::i;:::-;;:::i;28834:128::-;;;;;;:::i;:::-;;:::i;30529:87::-;;;:::i;5826:95::-;;;:::i;9956:377::-;;;;;;:::i;:::-;;:::i;34191:273::-;;;;;;:::i;:::-;;:::i;36700:255::-;;;;;;:::i;:::-;;:::i;35379:1120::-;;;;;;:::i;:::-;;:::i;27997:771::-;;;;;;:::i;:::-;;:::i;7458:151::-;;;;;;:::i;:::-;;:::i;33258:117::-;;;:::i;32781:70::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;31483:244::-;;;;;;:::i;:::-;;:::i;5616:91::-;5661:13;5694:5;5687:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:91;;:::o;7756:169::-;7839:4;7856:39;7865:12;:10;:12::i;:::-;7879:7;7888:6;7856:8;:39::i;:::-;-1:-1:-1;7913:4:0;7756:169;;;;;:::o;6709:108::-;6797:12;;6709:108;:::o;33042:122::-;33084:80;33042:122;:::o;33884:299::-;33996:4;34018:11;34032:45;34051:6;34059:9;34070:6;34032:18;:45::i;:::-;34018:59;;34108:41;34123:6;34131:9;34142:6;34108:14;:41::i;:::-;34169:6;33884:299;-1:-1:-1;;;;33884:299:0:o;6560:84::-;6634:2;6560:84;:::o;29092:115::-;29152:7;29179:20;:18;:20::i;:::-;29172:27;;29092:115;:::o;9238:215::-;9326:4;9343:80;9352:12;:10;:12::i;:::-;9366:7;9412:10;9375:11;:25;9387:12;:10;:12::i;:::-;-1:-1:-1;;;;;9375:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;9375:25:0;;;:34;;;;;;;;;;:47;;;;:::i;:::-;9343:8;:80::i;31879:152::-;30760:12;:10;:12::i;:::-;-1:-1:-1;;;;;30749:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30749:23:0;;30741:68;;;;-1:-1:-1;;;30741:68:0;;;;;;;:::i;:::-;;;;;;;;;31953:19:::1;31959:3;31964:7;31953:5;:19::i;:::-;31983:40;32006:1;32010:3;32015:7;31983:14;:40::i;:::-;31879:152:::0;;:::o;34548:149::-;-1:-1:-1;;;;;34668:21:0;;;34636:7;34668:21;;;:10;:21;;;;;;;34548:149;;;;:::o;34841:104::-;34905:32;34915:10;34927:9;34905;:32::i;:::-;34841:104;:::o;32920:49::-;;;;;;;;;;;;;;;:::o;6880:127::-;-1:-1:-1;;;;;6981:18:0;6954:7;6981:18;;;;;;;;;;;;6880:127::o;31180:148::-;30760:12;:10;:12::i;:::-;-1:-1:-1;;;;;30749:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30749:23:0;;30741:68;;;;-1:-1:-1;;;30741:68:0;;;;;;;:::i;:::-;31271:6:::1;::::0;31250:40:::1;::::0;31287:1:::1;::::0;-1:-1:-1;;;;;31271:6:0::1;::::0;31250:40:::1;::::0;31287:1;;31250:40:::1;31301:6;:19:::0;;-1:-1:-1;;;;;;31301:19:0::1;::::0;;31180:148::o;37386:1254::-;37494:7;37541:12;37527:11;:26;37519:79;;;;-1:-1:-1;;;37519:79:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37633:23:0;;37611:19;37633:23;;;:14;:23;;;;;;;;37671:17;37667:58;;37712:1;37705:8;;;;;37667:58;-1:-1:-1;;;;;37785:20:0;;;;;;:11;:20;;;;;37837:11;;37806:16;37821:1;37806:12;:16;:::i;:::-;37785:38;;;;;;;;;;;;;;;-1:-1:-1;37785:38:0;:48;;:63;37781:147;;-1:-1:-1;;;;;37872:20:0;;;;;;:11;:20;;;;;;37893:16;37908:1;37893:12;:16;:::i;:::-;37872:38;;;;;;;;;;;;;;;:44;;;37865:51;;;;;37781:147;-1:-1:-1;;;;;37989:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;37985:88:0;;;38060:1;38053:8;;;;;37985:88;38085:12;;38127:16;38142:1;38127:12;:16;:::i;:::-;38112:31;;38154:428;38169:5;38161:13;;:5;:13;;;38154:428;;;38191:13;38233:1;38216:13;38224:5;38216;:13;:::i;:::-;38215:19;;;;:::i;:::-;38207:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;38299:20:0;;38276;38299;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;38276:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;38191:43;;-1:-1:-1;38346:27:0;;38342:229;;;38401:8;;;;-1:-1:-1;38394:15:0;;-1:-1:-1;;;;38394:15:0;38342:229;38435:12;;:26;;;-1:-1:-1;38431:140:0;;;38490:6;38482:14;;38431:140;;;38545:10;38554:1;38545:6;:10;:::i;:::-;38537:18;;38431:140;38154:428;;;;;-1:-1:-1;;;;;;38599:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;37386:1254:0;;;;:::o;28834:128::-;-1:-1:-1;;;;;28930:14:0;;28903:7;28930:14;;;:7;:14;;;;;:24;;:22;:24::i;30529:87::-;30602:6;;-1:-1:-1;;;;;30602:6:0;30529:87;:::o;5826:95::-;5873:13;5906:7;5899:14;;;;;:::i;9956:377::-;10049:4;10066:24;10093:11;:25;10105:12;:10;:12::i;:::-;-1:-1:-1;;;;;10093:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10093:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10146:35:0;;;;10138:85;;;;-1:-1:-1;;;10138:85:0;;;;;;;:::i;:::-;10234:67;10243:12;:10;:12::i;:::-;10257:7;10266:34;10285:15;10266:16;:34;:::i;10234:67::-;-1:-1:-1;10321:4:0;;9956:377;-1:-1:-1;;;9956:377:0:o;34191:273::-;34283:4;34305:11;34319:33;34334:9;34345:6;34319:14;:33::i;:::-;34305:47;;34383;34398:12;:10;:12::i;:::-;34412:9;34423:6;34383:14;:47::i;:::-;34450:6;34191:273;-1:-1:-1;;;34191:273:0:o;36700:255::-;-1:-1:-1;;;;;36839:23:0;;36792:7;36839:23;;;:14;:23;;;;;;;;36880:16;:67;;36946:1;36880:67;;;-1:-1:-1;;;;;36899:20:0;;;;;;:11;:20;;;;;;36920:16;36935:1;36920:12;:16;:::i;:::-;36899:38;;;;;;;;;;;;;;;:44;;;36873:74;36700:255;-1:-1:-1;;;36700:255:0:o;35379:1120::-;35498:23;33084:80;35627:6;:4;:6::i;:::-;35611:24;;;;;;35654:12;:10;:12::i;:::-;35693:4;35548:165;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35524:200;;;;;;35498:226;;35737:18;33304:71;35849:9;35877:5;35901:6;35782:140;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35758:175;;;;;;35737:196;;35946:14;36051:15;36085:10;35987:123;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35963:158;;;;;;35946:175;;36134:17;36154:26;36164:6;36172:1;36175;36178;36154:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36154:26:0;;-1:-1:-1;;36154:26:0;;;-1:-1:-1;;;;;;;36199:23:0;;36191:75;;;;-1:-1:-1;;;36191:75:0;;;;;;;:::i;:::-;36294:20;36304:9;36294;:20::i;:::-;36285:5;:29;36277:77;;;;-1:-1:-1;;;36277:77:0;;;;;;;:::i;:::-;36392:6;36373:15;:25;;36365:77;;;;-1:-1:-1;;;36365:77:0;;;;;;;:::i;:::-;36460:31;36470:9;36481;36460;:31::i;:::-;36453:38;;;;35379:1120;;;;;;;:::o;27997:771::-;28226:8;28207:15;:27;;28199:69;;;;-1:-1:-1;;;28199:69:0;;;;;;;:::i;:::-;28281:18;28355:16;28390:5;28414:7;28440:5;28464:16;28474:5;28464:9;:16::i;:::-;28499:8;28326:196;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28302:231;;;;;;28281:252;;28546:12;28561:28;28578:10;28561:16;:28::i;:::-;28546:43;;28602:14;28619:28;28633:4;28639:1;28642;28645;28619:13;:28::i;:::-;28602:45;;28676:5;-1:-1:-1;;;;;28666:15:0;:6;-1:-1:-1;;;;;28666:15:0;;28658:58;;;;-1:-1:-1;;;28658:58:0;;;;;;;:::i;:::-;28729:31;28738:5;28745:7;28754:5;28729:8;:31::i;7458:151::-;-1:-1:-1;;;;;7574:18:0;;;7547:7;7574:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7458:151::o;33258:117::-;33304:71;33258:117;:::o;32781:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31483:244::-;30760:12;:10;:12::i;:::-;-1:-1:-1;;;;;30749:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;30749:23:0;;30741:68;;;;-1:-1:-1;;;30741:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31572:22:0;::::1;31564:73;;;;-1:-1:-1::0;;;31564:73:0::1;;;;;;;:::i;:::-;31674:6;::::0;31653:38:::1;::::0;-1:-1:-1;;;;;31653:38:0;;::::1;::::0;31674:6:::1;::::0;31653:38:::1;::::0;31674:6:::1;::::0;31653:38:::1;31702:6;:17:::0;;-1:-1:-1;;;;;;31702:17:0::1;-1:-1:-1::0;;;;;31702:17:0;;;::::1;::::0;;;::::1;::::0;;31483:244::o;599:98::-;679:10;599:98;:::o;13312:346::-;-1:-1:-1;;;;;13414:19:0;;13406:68;;;;-1:-1:-1;;;13406:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13493:21:0;;13485:68;;;;-1:-1:-1;;;13485:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13566:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;13618:32;;;;;13596:6;;13618:32;:::i;:::-;;;;;;;;13312:346;;;:::o;8407:422::-;8513:4;8530:36;8540:6;8548:9;8559:6;8530:9;:36::i;:::-;-1:-1:-1;;;;;8606:19:0;;8579:24;8606:19;;;:11;:19;;;;;8579:24;8626:12;:10;:12::i;:::-;-1:-1:-1;;;;;8606:33:0;-1:-1:-1;;;;;8606:33:0;;;;;;;;;;;;;8579:60;;8678:6;8658:16;:26;;8650:79;;;;-1:-1:-1;;;8650:79:0;;;;;;;:::i;:::-;8740:57;8749:6;8757:12;:10;:12::i;:::-;8771:25;8790:6;8771:16;:25;:::i;8740:57::-;-1:-1:-1;8817:4:0;;8407:422;-1:-1:-1;;;;8407:422:0:o;39094:941::-;39200:6;-1:-1:-1;;;;;39190:16:0;:6;-1:-1:-1;;;;;39190:16:0;;;:30;;;;;39219:1;39210:6;:10;39190:30;39186:842;;;-1:-1:-1;;;;;39241:20:0;;;39237:382;;-1:-1:-1;;;;;39349:22:0;;39330:16;39349:22;;;:14;:22;;;;;;;;;39410:13;:60;;39469:1;39410:60;;;-1:-1:-1;;;;;39426:19:0;;;;;;:11;:19;;;;;;39446:13;39458:1;39446:9;:13;:::i;:::-;39426:34;;;;;;;;;;;;;;;:40;;;39410:60;39390:80;-1:-1:-1;39489:17:0;39509:18;39521:6;39390:80;39509:18;:::i;:::-;39489:38;;39546:57;39563:6;39571:9;39582;39593;39546:16;:57::i;:::-;39237:382;;;;-1:-1:-1;;;;;39639:20:0;;;39635:382;;-1:-1:-1;;;;;39747:22:0;;39728:16;39747:22;;;:14;:22;;;;;;;;;39808:13;:60;;39867:1;39808:60;;;-1:-1:-1;;;;;39824:19:0;;;;;;:11;:19;;;;;;39844:13;39856:1;39844:9;:13;:::i;:::-;39824:34;;;;;;;;;;;;;;;:40;;;39808:60;39788:80;-1:-1:-1;39887:17:0;39907:18;39919:6;39788:80;39907:18;:::i;:::-;39887:38;;39944:57;39961:6;39969:9;39980;39991;39944:16;:57::i;39635:382::-;39094:941;;;:::o;21788:281::-;21841:7;21882:16;21865:13;:33;21861:201;;;-1:-1:-1;21922:24:0;21915:31;;21861:201;21986:64;22008:10;22020:12;22034:15;21986:21;:64::i;:::-;21979:71;;;;11709:338;-1:-1:-1;;;;;11793:21:0;;11785:65;;;;-1:-1:-1;;;11785:65:0;;;;;;;:::i;:::-;11863:49;11892:1;11896:7;11905:6;11863:20;:49::i;:::-;11941:6;11925:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;11958:18:0;;:9;:18;;;;;;;;;;:28;;11980:6;;11958:9;:28;;11980:6;;11958:28;:::i;:::-;;;;-1:-1:-1;;12002:37:0;;-1:-1:-1;;;;;12002:37:0;;;12019:1;;12002:37;;;;12032:6;;12002:37;:::i;:::-;;;;;;;;11709:338;;:::o;38648:438::-;-1:-1:-1;;;;;38765:21:0;;;38739:23;38765:21;;;:10;:21;;;;;;;;;;38824:20;38776:9;38824;:20::i;:::-;-1:-1:-1;;;;;38900:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;38900:33:0;;;;;;;;;;38951:54;;38797:47;;-1:-1:-1;38900:33:0;38951:54;;;;;;38900:21;38951:54;39018:60;39033:15;39050:9;39061:16;39018:14;:60::i;:::-;38648:438;;;;:::o;23961:114::-;24053:14;;23961:114::o;7220:175::-;7306:4;7323:42;7333:12;:10;:12::i;:::-;7347:9;7358:6;7323:9;:42::i;40925:153::-;41035:9;40925:153;:::o;29305:207::-;-1:-1:-1;;;;;29426:14:0;;29365:15;29426:14;;;:7;:14;;;;;29461:15;29426:14;29461:13;:15::i;:::-;29451:25;;29487:17;:5;:15;:17::i;:::-;29305:207;;;;:::o;23056:167::-;23133:7;23160:55;23182:20;:18;:20::i;:::-;23204:10;23160:21;:55::i;16289:1432::-;16374:7;17299:66;17285:80;;;17277:127;;;;-1:-1:-1;;;17277:127:0;;;;;;;:::i;:::-;17423:1;:7;;17428:2;17423:7;:18;;;;17434:1;:7;;17439:2;17434:7;17423:18;17415:65;;;;-1:-1:-1;;;17415:65:0;;;;;;;:::i;:::-;17578:14;17595:24;17605:4;17611:1;17614;17617;17595:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17595:24:0;;-1:-1:-1;;17595:24:0;;;-1:-1:-1;;;;;;;17638:20:0;;17630:57;;;;-1:-1:-1;;;17630:57:0;;;;;;;:::i;:::-;17707:6;16289:1432;-1:-1:-1;;;;;16289:1432:0:o;10823:604::-;-1:-1:-1;;;;;10929:20:0;;10921:70;;;;-1:-1:-1;;;10921:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11010:23:0;;11002:71;;;;-1:-1:-1;;;11002:71:0;;;;;;;:::i;:::-;11086:47;11107:6;11115:9;11126:6;11086:20;:47::i;:::-;-1:-1:-1;;;;;11170:17:0;;11146:21;11170:17;;;;;;;;;;;11206:23;;;;11198:74;;;;-1:-1:-1;;;11198:74:0;;;;;;;:::i;:::-;11303:22;11319:6;11303:13;:22;:::i;:::-;-1:-1:-1;;;;;11283:17:0;;;:9;:17;;;;;;;;;;;:42;;;;11336:20;;;;;;;;:30;;11360:6;;11283:9;11336:30;;11360:6;;11336:30;:::i;:::-;;;;;;;;11401:9;-1:-1:-1;;;;;11384:35:0;11393:6;-1:-1:-1;;;;;11384:35:0;;11412:6;11384:35;;;;;;:::i;:::-;;;;;;;;10823:604;;;;:::o;40043:705::-;40222:18;40243:77;40250:12;40243:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;40222:98;;40352:1;40337:12;:16;;;:85;;;;-1:-1:-1;;;;;;40357:22:0;;;;;;:11;:22;;;;;:65;;;;40380:16;40395:1;40380:12;:16;:::i;:::-;40357:40;;;;;;;;;;;;;;;-1:-1:-1;40357:40:0;:50;;:65;40337:85;40333:339;;;-1:-1:-1;;;;;40439:22:0;;;;;;:11;:22;;;;;40488:8;;40462:16;40477:1;40462:12;:16;:::i;:::-;40439:40;;;;;;;;;;;;;-1:-1:-1;40439:40:0;:46;;:57;40333:339;;;40568:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40529:22:0;;-1:-1:-1;40529:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;40529:72:0;;;;;;;;-1:-1:-1;40529:72:0;;;;40644:16;;40529:36;;40644:16;:::i;:::-;-1:-1:-1;;;;;40616:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;40616:44:0;;;;;;;;;;;;40333:339;40710:9;-1:-1:-1;;;;;40689:51:0;;40721:8;40731;40689:51;;;;;;;:::i;:::-;;;;;;;;40043:705;;;;;:::o;22077:337::-;22179:7;22259:8;22286:4;22309:7;22335:13;22375:4;22230:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22206:200;;;;;;22199:207;;22077:337;;;;;:::o;24083:127::-;24172:19;;24190:1;24172:19;;;24083:127::o;18640:196::-;18733:7;18799:15;18816:10;18770:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18760:68;;;;;;18753:75;;18640:196;;;;:::o;40756:161::-;40831:6;40869:12;40862:5;40858:9;;40850:32;;;;-1:-1:-1;;;40850:32:0;;;;;;;;:::i;:::-;-1:-1:-1;40907:1:0;;40756:161;-1:-1:-1;;40756:161:0:o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:158;262:20;;322:4;311:16;;301:27;;291:2;;342:1;339;332:12;357:198;;469:2;457:9;448:7;444:23;440:32;437:2;;;490:6;482;475:22;437:2;518:31;539:9;518:31;:::i;560:274::-;;;689:2;677:9;668:7;664:23;660:32;657:2;;;710:6;702;695:22;657:2;738:31;759:9;738:31;:::i;:::-;728:41;;788:40;824:2;813:9;809:18;788:40;:::i;:::-;778:50;;647:187;;;;;:::o;839:342::-;;;;985:2;973:9;964:7;960:23;956:32;953:2;;;1006:6;998;991:22;953:2;1034:31;1055:9;1034:31;:::i;:::-;1024:41;;1084:40;1120:2;1109:9;1105:18;1084:40;:::i;:::-;1074:50;;1171:2;1160:9;1156:18;1143:32;1133:42;;943:238;;;;;:::o;1186:622::-;;;;;;;;1398:3;1386:9;1377:7;1373:23;1369:33;1366:2;;;1420:6;1412;1405:22;1366:2;1448:31;1469:9;1448:31;:::i;:::-;1438:41;;1498:40;1534:2;1523:9;1519:18;1498:40;:::i;:::-;1488:50;;1585:2;1574:9;1570:18;1557:32;1547:42;;1636:2;1625:9;1621:18;1608:32;1598:42;;1659:39;1693:3;1682:9;1678:19;1659:39;:::i;:::-;1649:49;;1745:3;1734:9;1730:19;1717:33;1707:43;;1797:3;1786:9;1782:19;1769:33;1759:43;;1356:452;;;;;;;;;;:::o;1813:266::-;;;1942:2;1930:9;1921:7;1917:23;1913:32;1910:2;;;1963:6;1955;1948:22;1910:2;1991:31;2012:9;1991:31;:::i;:::-;1981:41;2069:2;2054:18;;;;2041:32;;-1:-1:-1;;;1900:179:1:o;2084:545::-;;;;;;;2279:3;2267:9;2258:7;2254:23;2250:33;2247:2;;;2301:6;2293;2286:22;2247:2;2329:31;2350:9;2329:31;:::i;:::-;2319:41;;2407:2;2396:9;2392:18;2379:32;2369:42;;2458:2;2447:9;2443:18;2430:32;2420:42;;2481:38;2515:2;2504:9;2500:18;2481:38;:::i;:::-;2471:48;;2566:3;2555:9;2551:19;2538:33;2528:43;;2618:3;2607:9;2603:19;2590:33;2580:43;;2237:392;;;;;;;;:::o;2634:372::-;;;2762:2;2750:9;2741:7;2737:23;2733:32;2730:2;;;2783:6;2775;2768:22;2730:2;2811:31;2832:9;2811:31;:::i;:::-;2801:41;;2892:2;2881:9;2877:18;2864:32;2936:10;2929:5;2925:22;2918:5;2915:33;2905:2;;2967:6;2959;2952:22;2905:2;2995:5;2985:15;;;2720:286;;;;;:::o;3011:392::-;-1:-1:-1;;;3269:27:1;;3321:1;3312:11;;3305:27;;;;3357:2;3348:12;;3341:28;3394:2;3385:12;;3259:144::o;3408:203::-;-1:-1:-1;;;;;3572:32:1;;;;3554:51;;3542:2;3527:18;;3509:102::o;3616:187::-;3781:14;;3774:22;3756:41;;3744:2;3729:18;;3711:92::o;3808:177::-;3954:25;;;3942:2;3927:18;;3909:76::o;3990:591::-;4277:25;;;-1:-1:-1;;;;;4376:15:1;;;4371:2;4356:18;;4349:43;4428:15;;;;4423:2;4408:18;;4401:43;4475:2;4460:18;;4453:34;4518:3;4503:19;;4496:35;;;;4329:3;4547:19;;4540:35;4264:3;4249:19;;4231:350::o;4586:417::-;4817:25;;;-1:-1:-1;;;;;4878:32:1;;;;4873:2;4858:18;;4851:60;4942:2;4927:18;;4920:34;4985:2;4970:18;;4963:34;4804:3;4789:19;;4771:232::o;5008:489::-;5267:25;;;5323:2;5308:18;;5301:34;;;;5366:2;5351:18;;5344:34;;;;5409:2;5394:18;;5387:34;-1:-1:-1;;;;;5458:32:1;5452:3;5437:19;;5430:61;5254:3;5239:19;;5221:276::o;5502:417::-;5733:25;;;5789:2;5774:18;;5767:34;;;;5832:2;5817:18;;5810:34;-1:-1:-1;;;;;5880:32:1;5875:2;5860:18;;5853:60;5720:3;5705:19;;5687:232::o;5924:398::-;6151:25;;;6224:4;6212:17;;;;6207:2;6192:18;;6185:45;6261:2;6246:18;;6239:34;6304:2;6289:18;;6282:34;6138:3;6123:19;;6105:217::o;6327:603::-;;6468:2;6497;6486:9;6479:21;6529:6;6523:13;6572:6;6567:2;6556:9;6552:18;6545:34;6597:4;6610:140;6624:6;6621:1;6618:13;6610:140;;;6719:14;;;6715:23;;6709:30;6685:17;;;6704:2;6681:26;6674:66;6639:10;;6610:140;;;6768:6;6765:1;6762:13;6759:2;;;6838:4;6833:2;6824:6;6813:9;6809:22;6805:31;6798:45;6759:2;-1:-1:-1;6914:2:1;6893:15;-1:-1:-1;;6889:29:1;6874:45;;;;6921:2;6870:54;;6448:482;-1:-1:-1;;;6448:482:1:o;6935:348::-;7137:2;7119:21;;;7176:2;7156:18;;;7149:30;7215:26;7210:2;7195:18;;7188:54;7274:2;7259:18;;7109:174::o;7288:399::-;7490:2;7472:21;;;7529:2;7509:18;;;7502:30;7568:34;7563:2;7548:18;;7541:62;-1:-1:-1;;;7634:2:1;7619:18;;7612:33;7677:3;7662:19;;7462:225::o;7692:403::-;7894:2;7876:21;;;7933:2;7913:18;;;7906:30;7972:34;7967:2;7952:18;;7945:62;-1:-1:-1;;;8038:2:1;8023:18;;8016:37;8085:3;8070:19;;7866:229::o;8100:399::-;8302:2;8284:21;;;8341:2;8321:18;;;8314:30;8380:34;8375:2;8360:18;;8353:62;-1:-1:-1;;;8446:2:1;8431:18;;8424:33;8489:3;8474:19;;8274:225::o;8504:402::-;8706:2;8688:21;;;8745:2;8725:18;;;8718:30;8784:34;8779:2;8764:18;;8757:62;-1:-1:-1;;;8850:2:1;8835:18;;8828:36;8896:3;8881:19;;8678:228::o;8911:398::-;9113:2;9095:21;;;9152:2;9132:18;;;9125:30;9191:34;9186:2;9171:18;;9164:62;-1:-1:-1;;;9257:2:1;9242:18;;9235:32;9299:3;9284:19;;9085:224::o;9314:353::-;9516:2;9498:21;;;9555:2;9535:18;;;9528:30;9594:31;9589:2;9574:18;;9567:59;9658:2;9643:18;;9488:179::o;9672:402::-;9874:2;9856:21;;;9913:2;9893:18;;;9886:30;9952:34;9947:2;9932:18;;9925:62;-1:-1:-1;;;10018:2:1;10003:18;;9996:36;10064:3;10049:19;;9846:228::o;10079:398::-;10281:2;10263:21;;;10320:2;10300:18;;;10293:30;10359:34;10354:2;10339:18;;10332:62;-1:-1:-1;;;10425:2:1;10410:18;;10403:32;10467:3;10452:19;;10253:224::o;10482:398::-;10684:2;10666:21;;;10723:2;10703:18;;;10696:30;10762:34;10757:2;10742:18;;10735:62;-1:-1:-1;;;10828:2:1;10813:18;;10806:32;10870:3;10855:19;;10656:224::o;10885:403::-;11087:2;11069:21;;;11126:2;11106:18;;;11099:30;11165:34;11160:2;11145:18;;11138:62;-1:-1:-1;;;11231:2:1;11216:18;;11209:37;11278:3;11263:19;;11059:229::o;11293:354::-;11495:2;11477:21;;;11534:2;11514:18;;;11507:30;11573:32;11568:2;11553:18;;11546:60;11638:2;11623:18;;11467:180::o;11652:404::-;11854:2;11836:21;;;11893:2;11873:18;;;11866:30;11932:34;11927:2;11912:18;;11905:62;-1:-1:-1;;;11998:2:1;11983:18;;11976:38;12046:3;12031:19;;11826:230::o;12061:356::-;12263:2;12245:21;;;12282:18;;;12275:30;12341:34;12336:2;12321:18;;12314:62;12408:2;12393:18;;12235:182::o;12422:401::-;12624:2;12606:21;;;12663:2;12643:18;;;12636:30;12702:34;12697:2;12682:18;;12675:62;-1:-1:-1;;;12768:2:1;12753:18;;12746:35;12813:3;12798:19;;12596:227::o;12828:400::-;13030:2;13012:21;;;13069:2;13049:18;;;13042:30;13108:34;13103:2;13088:18;;13081:62;-1:-1:-1;;;13174:2:1;13159:18;;13152:34;13218:3;13203:19;;13002:226::o;13233:404::-;13435:2;13417:21;;;13474:2;13454:18;;;13447:30;13513:34;13508:2;13493:18;;13486:62;-1:-1:-1;;;13579:2:1;13564:18;;13557:38;13627:3;13612:19;;13407:230::o;13642:401::-;13844:2;13826:21;;;13883:2;13863:18;;;13856:30;13922:34;13917:2;13902:18;;13895:62;-1:-1:-1;;;13988:2:1;13973:18;;13966:35;14033:3;14018:19;;13816:227::o;14048:355::-;14250:2;14232:21;;;14289:2;14269:18;;;14262:30;14328:33;14323:2;14308:18;;14301:61;14394:2;14379:18;;14222:181::o;14590:248::-;14764:25;;;14820:2;14805:18;;14798:34;14752:2;14737:18;;14719:119::o;14843:192::-;15017:10;15005:23;;;;14987:42;;14975:2;14960:18;;14942:93::o;15040:263::-;15242:10;15230:23;;;;15212:42;;15285:2;15270:18;;15263:34;15200:2;15185:18;;15167:136::o;15308:184::-;15480:4;15468:17;;;;15450:36;;15438:2;15423:18;;15405:87::o;15497:128::-;;15568:1;15564:6;15561:1;15558:13;15555:2;;;15574:18;;:::i;:::-;-1:-1:-1;15610:9:1;;15545:80::o;15630:228::-;;15697:10;15734:2;15731:1;15727:10;15764:2;15761:1;15757:10;15795:3;15791:2;15787:12;15782:3;15779:21;15776:2;;;15803:18;;:::i;:::-;15839:13;;15677:181;-1:-1:-1;;;;15677:181:1:o;15863:288::-;;15928:10;15965:2;15962:1;15958:10;15987:3;15977:2;;-1:-1:-1;;;16014:31:1;;16068:4;16065:1;16058:15;16096:4;16021:1;16086:15;15977:2;16129:10;;16125:20;;;;;15908:243;-1:-1:-1;;15908:243:1:o;16156:125::-;;16224:1;16221;16218:8;16215:2;;;16229:18;;:::i;:::-;-1:-1:-1;16266:9:1;;16205:76::o;16286:221::-;;16354:10;16414;;;;16384;;16436:12;;;16433:2;;;16451:18;;:::i;:::-;16488:13;;16334:173;-1:-1:-1;;;16334:173:1:o;16512:380::-;16597:1;16587:12;;16644:1;16634:12;;;16655:2;;16709:4;16701:6;16697:17;16687:27;;16655:2;16762;16754:6;16751:14;16731:18;16728:38;16725:2;;;16808:10;16803:3;16799:20;16796:1;16789:31;16843:4;16840:1;16833:15;16871:4;16868:1;16861:15;16897:127;16958:10;16953:3;16949:20;16946:1;16939:31;16989:4;16986:1;16979:15;17013:4;17010:1;17003:15
Swarm Source
ipfs://b63e3f9d62743a8bacaced24ccb5d12b8a8e67a61996158580b3fde419518d7f