ERC-20
DeFi
Overview
Max Total Supply
120,000,000 DEVVE
Holders
9,336 ( 0.129%)
Market
Price
$0.88 @ 0.000263 ETH (-1.90%)
Onchain Market Cap
$105,070,800.00
Circulating Supply Market Cap
$76,818,654.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
10,000.440183856078930812 DEVVEValue
$8,756.29 ( ~2.6263 Eth) [0.0083%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DevvE
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-01 */ // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ 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-upgradeable/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @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}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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. */ abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 struct ERC20Storage { mapping(address account => uint256) _balances; mapping(address account => mapping(address spender => uint256)) _allowances; uint256 _totalSupply; string _name; string _symbol; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; function _getERC20Storage() private pure returns (ERC20Storage storage $) { assembly { $.slot := ERC20StorageLocation } } /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { ERC20Storage storage $ = _getERC20Storage(); $._name = name_; $._symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); 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 default value returned by this function, unless * it's 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 returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` 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 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); 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 `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * 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. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows $._totalSupply += value; } else { uint256 fromBalance = $._balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. $._balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. $._totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. $._balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` 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. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } $._allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File: contracts/DevvE.sol pragma solidity 0.8.20; contract DevvE is ERC20Upgradeable { mapping(address => uint256) internal _minterLimit; mapping(address => uint256) internal _mintedAmount; mapping(address => bool) internal _explicitMinter; //Limit constants are integers (multplied by 10^18 in the mint() function) uint256 public constant GLOBAL_LIMIT = 300000000; address public constant FOREVVER_MINTER = 0xcC812569809Db07CF922171B1e7861a84e24839a; uint256 public constant FOREVVER_LIMIT = 150000000; address public constant DEVVIO_MINTER = 0xe84C2A38AeA6b700189A97E383783DF9Ae637f65; uint256 public constant DEVVIO_LIMIT = 150000000; address public constant CONTRACT_ADMIN = 0x37d0A81aD6A85945Db59E33C40cEa53275aC5694; function initialize() public initializer { __ERC20_init("DevvE", "DEVVE"); _explicitMinter[DEVVIO_MINTER] = true; _explicitMinter[FOREVVER_MINTER] = true; _minterLimit[DEVVIO_MINTER] = DEVVIO_LIMIT; _minterLimit[FOREVVER_MINTER] = FOREVVER_LIMIT; _mintedAmount[DEVVIO_MINTER] = 0; _mintedAmount[FOREVVER_MINTER] = 0; } function multiTransfer(address[] memory recipients, uint256[] memory amounts) public { require(recipients.length > 0, "No recipients listed."); require(recipients.length == amounts.length, "Amount and recipient lengths do not match."); uint256 totalAmount = 0; for (uint256 i = 0; i < recipients.length; i++) { require(amounts[i] > 0, "Every amount must be positive."); totalAmount += amounts[i]; } require(totalAmount <= balanceOf(msg.sender), "Sender does not have enough DevvE tokens."); for (uint256 i = 0; i < recipients.length; i++) { this.transferFrom(msg.sender, recipients[i], amounts[i]); } } function multiMint(address[] memory recipients, uint256[] memory amounts) public { require(_explicitMinter[msg.sender], "Caller does not have the minter role"); require(recipients.length > 0, "No mint recipients."); require(recipients.length == amounts.length, "Recipient/Amount mismatch."); for (uint256 i = 0; i < recipients.length; i++) { mint(recipients[i], amounts[i]); } } function mint(address to, uint256 amount) public { require(to != address(0), "Mint to the zero address"); require(_explicitMinter[msg.sender], "Caller does not have the minter role"); require(amount > 0, "Invalid amount (zero or less)."); require(totalSupply() + amount <= GLOBAL_LIMIT*(10**18), "Minting this amount would exceed the global limit"); require(_mintedAmount[msg.sender] + amount <= _minterLimit[msg.sender]*(10**18), "Mint amount exceeds the caller's minting limit"); _mintedAmount[msg.sender] += amount; _mint(to, amount); } function getMinterLimit(address minter) external view returns (uint256) { return _minterLimit[minter]*(10**18); } function getMintedAmountBy(address minter) external view returns (uint256) { return _mintedAmount[minter]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"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":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","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":"CONTRACT_ADMIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVVIO_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVVIO_MINTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FOREVVER_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FOREVVER_MINTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLOBAL_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getMintedAmountBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getMinterLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"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":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506129778061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610135575f3560e01c806370a08231116100b657806395d89b411161007a57806395d89b41146103295780639afcd33614610347578063a9059cbb14610377578063dd62ed3e146103a7578063e8e0c29f146103d7578063f64bdbc0146103f557610135565b806370a08231146102835780638129fc1c146102b357806383ba6b59146102bd5780638dae9318146102ed5780638fc590141461030b57610135565b806323b872dd116100fd57806323b872dd146101df5780632c3b27241461020f5780632f81bc711461022d578063313ce5671461024957806340c10f191461026757610135565b806306fdde0314610139578063095ea7b314610157578063178bc9d51461018757806318160ddd146101a55780631e89d545146101c3575b5f80fd5b610141610413565b60405161014e9190611a27565b60405180910390f35b610171600480360381019061016c9190611ae5565b6104b1565b60405161017e9190611b3d565b60405180910390f35b61018f6104d3565b60405161019c9190611b65565b60405180910390f35b6101ad6104eb565b6040516101ba9190611b8d565b60405180910390f35b6101dd60048036038101906101d89190611da6565b610502565b005b6101f960048036038101906101f49190611e1c565b61074e565b6040516102069190611b3d565b60405180910390f35b61021761077c565b6040516102249190611b8d565b60405180910390f35b61024760048036038101906102429190611da6565b610784565b005b6102516108f5565b60405161025e9190611e87565b60405180910390f35b610281600480360381019061027c9190611ae5565b6108fd565b005b61029d60048036038101906102989190611ea0565b610bdd565b6040516102aa9190611b8d565b60405180910390f35b6102bb610c30565b005b6102d760048036038101906102d29190611ea0565b61104b565b6040516102e49190611b8d565b60405180910390f35b6102f56110a3565b6040516103029190611b8d565b60405180910390f35b6103136110ab565b6040516103209190611b65565b60405180910390f35b6103316110c3565b60405161033e9190611a27565b60405180910390f35b610361600480360381019061035c9190611ea0565b611161565b60405161036e9190611b8d565b60405180910390f35b610391600480360381019061038c9190611ae5565b6111a7565b60405161039e9190611b3d565b60405180910390f35b6103c160048036038101906103bc9190611ecb565b6111c9565b6040516103ce9190611b8d565b60405180910390f35b6103df611259565b6040516103ec9190611b65565b60405180910390f35b6103fd611271565b60405161040a9190611b8d565b60405180910390f35b60605f61041e611279565b905080600301805461042f90611f36565b80601f016020809104026020016040519081016040528092919081815260200182805461045b90611f36565b80156104a65780601f1061047d576101008083540402835291602001916104a6565b820191905f5260205f20905b81548152906001019060200180831161048957829003601f168201915b505050505091505090565b5f806104bb6112a0565b90506104c88185856112a7565b600191505092915050565b73cc812569809db07cf922171b1e7861a84e24839a81565b5f806104f5611279565b9050806002015491505090565b5f825111610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053c90611fb0565b60405180910390fd5b8051825114610589576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061203e565b60405180910390fd5b5f805b835181101561062c575f8382815181106105a9576105a861205c565b5b6020026020010151116105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e8906120d3565b60405180910390fd5b8281815181106106045761060361205c565b5b602002602001015182610617919061211e565b9150808061062490612151565b91505061058c565b5061063633610bdd565b811115610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f90612208565b60405180910390fd5b5f5b8351811015610748573073ffffffffffffffffffffffffffffffffffffffff166323b872dd338684815181106106b3576106b261205c565b5b60200260200101518685815181106106ce576106cd61205c565b5b60200260200101516040518463ffffffff1660e01b81526004016106f493929190612226565b6020604051808303815f875af1158015610710573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107349190612285565b50808061074090612151565b91505061067a565b50505050565b5f806107586112a0565b90506107658582856112b9565b61077085858561134b565b60019150509392505050565b6308f0d18081565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490612320565b60405180910390fd5b5f825111610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790612388565b60405180910390fd5b8051825114610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906123f0565b60405180910390fd5b5f5b82518110156108f0576108dd8382815181106108b5576108b461205c565b5b60200260200101518383815181106108d0576108cf61205c565b5b60200260200101516108fd565b80806108e890612151565b915050610896565b505050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361096b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096290612458565b60405180910390fd5b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90612320565b60405180910390fd5b5f8111610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906124c0565b60405180910390fd5b670de0b6b3a76400006311e1a300610a4e91906124de565b81610a576104eb565b610a61919061211e565b1115610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999061258f565b60405180910390fd5b670de0b6b3a76400005f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610af291906124de565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610b3b919061211e565b1115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b739061261d565b60405180910390fd5b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bc8919061211e565b92505081905550610bd9828261143b565b5050565b5f80610be7611279565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b5f610c396114ba565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff16148015610c815750825b90505f60018367ffffffffffffffff16148015610cb457505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015610cc2575080155b15610cf9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315610d46576001855f0160086101000a81548160ff0219169083151502179055505b610dba6040518060400160405280600581526020017f44657676450000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44455656450000000000000000000000000000000000000000000000000000008152506114e1565b600160025f73e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160025f73cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506308f0d1805f8073e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506308f0d1805f8073cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60015f73e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60015f73cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508315611044575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161103b9190612690565b60405180910390a15b5050505050565b5f670de0b6b3a76400005f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461109c91906124de565b9050919050565b6311e1a30081565b7337d0a81ad6a85945db59e33c40cea53275ac569481565b60605f6110ce611279565b90508060040180546110df90611f36565b80601f016020809104026020016040519081016040528092919081815260200182805461110b90611f36565b80156111565780601f1061112d57610100808354040283529160200191611156565b820191905f5260205f20905b81548152906001019060200180831161113957829003601f168201915b505050505091505090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f806111b16112a0565b90506111be81858561134b565b600191505092915050565b5f806111d3611279565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b73e84c2a38aea6b700189a97e383783df9ae637f6581565b6308f0d18081565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b6112b483838360016114f7565b505050565b5f6112c484846111c9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113455781811015611336578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161132d939291906126a9565b60405180910390fd5b61134484848484035f6114f7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113b29190611b65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114229190611b65565b60405180910390fd5b6114368383836116d4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ab575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114a29190611b65565b60405180910390fd5b6114b65f83836116d4565b5050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6114e9611903565b6114f38282611943565b5050565b5f611500611279565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611572575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016115699190611b65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115e2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016115d99190611b65565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081156116cd578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516116c49190611b8d565b60405180910390a35b5050505050565b5f6116dd611279565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117315781816002015f828254611725919061211e565b92505081905550611803565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156117bc578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117b3939291906126a9565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184c5781816002015f8282540392505081905550611898565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118f59190611b8d565b60405180910390a350505050565b61190b61197f565b611941576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61194b611903565b5f611954611279565b9050828160030190816119679190612872565b50818160040190816119799190612872565b50505050565b5f6119886114ba565b5f0160089054906101000a900460ff16905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156119d45780820151818401526020810190506119b9565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6119f98261199d565b611a0381856119a7565b9350611a138185602086016119b7565b611a1c816119df565b840191505092915050565b5f6020820190508181035f830152611a3f81846119ef565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a8182611a58565b9050919050565b611a9181611a77565b8114611a9b575f80fd5b50565b5f81359050611aac81611a88565b92915050565b5f819050919050565b611ac481611ab2565b8114611ace575f80fd5b50565b5f81359050611adf81611abb565b92915050565b5f8060408385031215611afb57611afa611a50565b5b5f611b0885828601611a9e565b9250506020611b1985828601611ad1565b9150509250929050565b5f8115159050919050565b611b3781611b23565b82525050565b5f602082019050611b505f830184611b2e565b92915050565b611b5f81611a77565b82525050565b5f602082019050611b785f830184611b56565b92915050565b611b8781611ab2565b82525050565b5f602082019050611ba05f830184611b7e565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826119df565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611a47565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f611c63611c5e84611c22565b611c08565b90508083825260208201905060208402830185811115611c8657611c85611c4d565b5b835b81811015611caf5780611c9b8882611a9e565b845260208401935050602081019050611c88565b5050509392505050565b5f82601f830112611ccd57611ccc611ba6565b5b8135611cdd848260208601611c51565b91505092915050565b5f67ffffffffffffffff821115611d0057611cff611baa565b5b602082029050602081019050919050565b5f611d23611d1e84611ce6565b611c08565b90508083825260208201905060208402830185811115611d4657611d45611c4d565b5b835b81811015611d6f5780611d5b8882611ad1565b845260208401935050602081019050611d48565b5050509392505050565b5f82601f830112611d8d57611d8c611ba6565b5b8135611d9d848260208601611d11565b91505092915050565b5f8060408385031215611dbc57611dbb611a50565b5b5f83013567ffffffffffffffff811115611dd957611dd8611a54565b5b611de585828601611cb9565b925050602083013567ffffffffffffffff811115611e0657611e05611a54565b5b611e1285828601611d79565b9150509250929050565b5f805f60608486031215611e3357611e32611a50565b5b5f611e4086828701611a9e565b9350506020611e5186828701611a9e565b9250506040611e6286828701611ad1565b9150509250925092565b5f60ff82169050919050565b611e8181611e6c565b82525050565b5f602082019050611e9a5f830184611e78565b92915050565b5f60208284031215611eb557611eb4611a50565b5b5f611ec284828501611a9e565b91505092915050565b5f8060408385031215611ee157611ee0611a50565b5b5f611eee85828601611a9e565b9250506020611eff85828601611a9e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f4d57607f821691505b602082108103611f6057611f5f611f09565b5b50919050565b7f4e6f20726563697069656e7473206c69737465642e00000000000000000000005f82015250565b5f611f9a6015836119a7565b9150611fa582611f66565b602082019050919050565b5f6020820190508181035f830152611fc781611f8e565b9050919050565b7f416d6f756e7420616e6420726563697069656e74206c656e6774687320646f205f8201527f6e6f74206d617463682e00000000000000000000000000000000000000000000602082015250565b5f612028602a836119a7565b915061203382611fce565b604082019050919050565b5f6020820190508181035f8301526120558161201c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f457665727920616d6f756e74206d75737420626520706f7369746976652e00005f82015250565b5f6120bd601e836119a7565b91506120c882612089565b602082019050919050565b5f6020820190508181035f8301526120ea816120b1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61212882611ab2565b915061213383611ab2565b925082820190508082111561214b5761214a6120f1565b5b92915050565b5f61215b82611ab2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361218d5761218c6120f1565b5b600182019050919050565b7f53656e64657220646f6573206e6f74206861766520656e6f75676820446576765f8201527f4520746f6b656e732e0000000000000000000000000000000000000000000000602082015250565b5f6121f26029836119a7565b91506121fd82612198565b604082019050919050565b5f6020820190508181035f83015261221f816121e6565b9050919050565b5f6060820190506122395f830186611b56565b6122466020830185611b56565b6122536040830184611b7e565b949350505050565b61226481611b23565b811461226e575f80fd5b50565b5f8151905061227f8161225b565b92915050565b5f6020828403121561229a57612299611a50565b5b5f6122a784828501612271565b91505092915050565b7f43616c6c657220646f6573206e6f74206861766520746865206d696e746572205f8201527f726f6c6500000000000000000000000000000000000000000000000000000000602082015250565b5f61230a6024836119a7565b9150612315826122b0565b604082019050919050565b5f6020820190508181035f830152612337816122fe565b9050919050565b7f4e6f206d696e7420726563697069656e74732e000000000000000000000000005f82015250565b5f6123726013836119a7565b915061237d8261233e565b602082019050919050565b5f6020820190508181035f83015261239f81612366565b9050919050565b7f526563697069656e742f416d6f756e74206d69736d617463682e0000000000005f82015250565b5f6123da601a836119a7565b91506123e5826123a6565b602082019050919050565b5f6020820190508181035f830152612407816123ce565b9050919050565b7f4d696e7420746f20746865207a65726f206164647265737300000000000000005f82015250565b5f6124426018836119a7565b915061244d8261240e565b602082019050919050565b5f6020820190508181035f83015261246f81612436565b9050919050565b7f496e76616c696420616d6f756e7420287a65726f206f72206c657373292e00005f82015250565b5f6124aa601e836119a7565b91506124b582612476565b602082019050919050565b5f6020820190508181035f8301526124d78161249e565b9050919050565b5f6124e882611ab2565b91506124f383611ab2565b925082820261250181611ab2565b91508282048414831517612518576125176120f1565b5b5092915050565b7f4d696e74696e67207468697320616d6f756e7420776f756c64206578636565645f8201527f2074686520676c6f62616c206c696d6974000000000000000000000000000000602082015250565b5f6125796031836119a7565b91506125848261251f565b604082019050919050565b5f6020820190508181035f8301526125a68161256d565b9050919050565b7f4d696e7420616d6f756e742065786365656473207468652063616c6c657227735f8201527f206d696e74696e67206c696d6974000000000000000000000000000000000000602082015250565b5f612607602e836119a7565b9150612612826125ad565b604082019050919050565b5f6020820190508181035f830152612634816125fb565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f61267a6126756126708461263b565b612657565b612644565b9050919050565b61268a81612660565b82525050565b5f6020820190506126a35f830184612681565b92915050565b5f6060820190506126bc5f830186611b56565b6126c96020830185611b7e565b6126d66040830184611b7e565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261273a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126ff565b61274486836126ff565b95508019841693508086168417925050509392505050565b5f61277661277161276c84611ab2565b612657565b611ab2565b9050919050565b5f819050919050565b61278f8361275c565b6127a361279b8261277d565b84845461270b565b825550505050565b5f90565b6127b76127ab565b6127c2818484612786565b505050565b5b818110156127e5576127da5f826127af565b6001810190506127c8565b5050565b601f82111561282a576127fb816126de565b612804846126f0565b81016020851015612813578190505b61282761281f856126f0565b8301826127c7565b50505b505050565b5f82821c905092915050565b5f61284a5f198460080261282f565b1980831691505092915050565b5f612862838361283b565b9150826002028217905092915050565b61287b8261199d565b67ffffffffffffffff81111561289457612893611baa565b5b61289e8254611f36565b6128a98282856127e9565b5f60209050601f8311600181146128da575f84156128c8578287015190505b6128d28582612857565b865550612939565b601f1984166128e8866126de565b5f5b8281101561290f578489015182556001820191506020850194506020810190506128ea565b8683101561292c5784890151612928601f89168261283b565b8355505b6001600288020188555050505b50505050505056fea264697066735822122063d2d96caace7da09dfb4cc9b282b8181f1de5e39383fb4217149e22814446bf64736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610135575f3560e01c806370a08231116100b657806395d89b411161007a57806395d89b41146103295780639afcd33614610347578063a9059cbb14610377578063dd62ed3e146103a7578063e8e0c29f146103d7578063f64bdbc0146103f557610135565b806370a08231146102835780638129fc1c146102b357806383ba6b59146102bd5780638dae9318146102ed5780638fc590141461030b57610135565b806323b872dd116100fd57806323b872dd146101df5780632c3b27241461020f5780632f81bc711461022d578063313ce5671461024957806340c10f191461026757610135565b806306fdde0314610139578063095ea7b314610157578063178bc9d51461018757806318160ddd146101a55780631e89d545146101c3575b5f80fd5b610141610413565b60405161014e9190611a27565b60405180910390f35b610171600480360381019061016c9190611ae5565b6104b1565b60405161017e9190611b3d565b60405180910390f35b61018f6104d3565b60405161019c9190611b65565b60405180910390f35b6101ad6104eb565b6040516101ba9190611b8d565b60405180910390f35b6101dd60048036038101906101d89190611da6565b610502565b005b6101f960048036038101906101f49190611e1c565b61074e565b6040516102069190611b3d565b60405180910390f35b61021761077c565b6040516102249190611b8d565b60405180910390f35b61024760048036038101906102429190611da6565b610784565b005b6102516108f5565b60405161025e9190611e87565b60405180910390f35b610281600480360381019061027c9190611ae5565b6108fd565b005b61029d60048036038101906102989190611ea0565b610bdd565b6040516102aa9190611b8d565b60405180910390f35b6102bb610c30565b005b6102d760048036038101906102d29190611ea0565b61104b565b6040516102e49190611b8d565b60405180910390f35b6102f56110a3565b6040516103029190611b8d565b60405180910390f35b6103136110ab565b6040516103209190611b65565b60405180910390f35b6103316110c3565b60405161033e9190611a27565b60405180910390f35b610361600480360381019061035c9190611ea0565b611161565b60405161036e9190611b8d565b60405180910390f35b610391600480360381019061038c9190611ae5565b6111a7565b60405161039e9190611b3d565b60405180910390f35b6103c160048036038101906103bc9190611ecb565b6111c9565b6040516103ce9190611b8d565b60405180910390f35b6103df611259565b6040516103ec9190611b65565b60405180910390f35b6103fd611271565b60405161040a9190611b8d565b60405180910390f35b60605f61041e611279565b905080600301805461042f90611f36565b80601f016020809104026020016040519081016040528092919081815260200182805461045b90611f36565b80156104a65780601f1061047d576101008083540402835291602001916104a6565b820191905f5260205f20905b81548152906001019060200180831161048957829003601f168201915b505050505091505090565b5f806104bb6112a0565b90506104c88185856112a7565b600191505092915050565b73cc812569809db07cf922171b1e7861a84e24839a81565b5f806104f5611279565b9050806002015491505090565b5f825111610545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053c90611fb0565b60405180910390fd5b8051825114610589576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105809061203e565b60405180910390fd5b5f805b835181101561062c575f8382815181106105a9576105a861205c565b5b6020026020010151116105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e8906120d3565b60405180910390fd5b8281815181106106045761060361205c565b5b602002602001015182610617919061211e565b9150808061062490612151565b91505061058c565b5061063633610bdd565b811115610678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066f90612208565b60405180910390fd5b5f5b8351811015610748573073ffffffffffffffffffffffffffffffffffffffff166323b872dd338684815181106106b3576106b261205c565b5b60200260200101518685815181106106ce576106cd61205c565b5b60200260200101516040518463ffffffff1660e01b81526004016106f493929190612226565b6020604051808303815f875af1158015610710573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107349190612285565b50808061074090612151565b91505061067a565b50505050565b5f806107586112a0565b90506107658582856112b9565b61077085858561134b565b60019150509392505050565b6308f0d18081565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490612320565b60405180910390fd5b5f825111610850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084790612388565b60405180910390fd5b8051825114610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906123f0565b60405180910390fd5b5f5b82518110156108f0576108dd8382815181106108b5576108b461205c565b5b60200260200101518383815181106108d0576108cf61205c565b5b60200260200101516108fd565b80806108e890612151565b915050610896565b505050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361096b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096290612458565b60405180910390fd5b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166109f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109eb90612320565b60405180910390fd5b5f8111610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d906124c0565b60405180910390fd5b670de0b6b3a76400006311e1a300610a4e91906124de565b81610a576104eb565b610a61919061211e565b1115610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a999061258f565b60405180910390fd5b670de0b6b3a76400005f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610af291906124de565b8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610b3b919061211e565b1115610b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b739061261d565b60405180910390fd5b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610bc8919061211e565b92505081905550610bd9828261143b565b5050565b5f80610be7611279565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054915050919050565b5f610c396114ba565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f808267ffffffffffffffff16148015610c815750825b90505f60018367ffffffffffffffff16148015610cb457505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015610cc2575080155b15610cf9576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315610d46576001855f0160086101000a81548160ff0219169083151502179055505b610dba6040518060400160405280600581526020017f44657676450000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44455656450000000000000000000000000000000000000000000000000000008152506114e1565b600160025f73e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160025f73cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506308f0d1805f8073e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506308f0d1805f8073cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60015f73e84c2a38aea6b700189a97e383783df9ae637f6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60015f73cc812569809db07cf922171b1e7861a84e24839a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508315611044575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2600160405161103b9190612690565b60405180910390a15b5050505050565b5f670de0b6b3a76400005f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461109c91906124de565b9050919050565b6311e1a30081565b7337d0a81ad6a85945db59e33c40cea53275ac569481565b60605f6110ce611279565b90508060040180546110df90611f36565b80601f016020809104026020016040519081016040528092919081815260200182805461110b90611f36565b80156111565780601f1061112d57610100808354040283529160200191611156565b820191905f5260205f20905b81548152906001019060200180831161113957829003601f168201915b505050505091505090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f806111b16112a0565b90506111be81858561134b565b600191505092915050565b5f806111d3611279565b9050806001015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205491505092915050565b73e84c2a38aea6b700189a97e383783df9ae637f6581565b6308f0d18081565b5f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00905090565b5f33905090565b6112b483838360016114f7565b505050565b5f6112c484846111c9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146113455781811015611336578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161132d939291906126a9565b60405180910390fd5b61134484848484035f6114f7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113b29190611b65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114229190611b65565b60405180910390fd5b6114368383836116d4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114ab575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016114a29190611b65565b60405180910390fd5b6114b65f83836116d4565b5050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6114e9611903565b6114f38282611943565b5050565b5f611500611279565b90505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611572575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016115699190611b65565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036115e2575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016115d99190611b65565b60405180910390fd5b82816001015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081156116cd578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516116c49190611b8d565b60405180910390a35b5050505050565b5f6116dd611279565b90505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117315781816002015f828254611725919061211e565b92505081905550611803565b5f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050828110156117bc578481846040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117b3939291906126a9565b60405180910390fd5b828103825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184c5781816002015f8282540392505081905550611898565b81815f015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118f59190611b8d565b60405180910390a350505050565b61190b61197f565b611941576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b61194b611903565b5f611954611279565b9050828160030190816119679190612872565b50818160040190816119799190612872565b50505050565b5f6119886114ba565b5f0160089054906101000a900460ff16905090565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156119d45780820151818401526020810190506119b9565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6119f98261199d565b611a0381856119a7565b9350611a138185602086016119b7565b611a1c816119df565b840191505092915050565b5f6020820190508181035f830152611a3f81846119ef565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611a8182611a58565b9050919050565b611a9181611a77565b8114611a9b575f80fd5b50565b5f81359050611aac81611a88565b92915050565b5f819050919050565b611ac481611ab2565b8114611ace575f80fd5b50565b5f81359050611adf81611abb565b92915050565b5f8060408385031215611afb57611afa611a50565b5b5f611b0885828601611a9e565b9250506020611b1985828601611ad1565b9150509250929050565b5f8115159050919050565b611b3781611b23565b82525050565b5f602082019050611b505f830184611b2e565b92915050565b611b5f81611a77565b82525050565b5f602082019050611b785f830184611b56565b92915050565b611b8781611ab2565b82525050565b5f602082019050611ba05f830184611b7e565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611be0826119df565b810181811067ffffffffffffffff82111715611bff57611bfe611baa565b5b80604052505050565b5f611c11611a47565b9050611c1d8282611bd7565b919050565b5f67ffffffffffffffff821115611c3c57611c3b611baa565b5b602082029050602081019050919050565b5f80fd5b5f611c63611c5e84611c22565b611c08565b90508083825260208201905060208402830185811115611c8657611c85611c4d565b5b835b81811015611caf5780611c9b8882611a9e565b845260208401935050602081019050611c88565b5050509392505050565b5f82601f830112611ccd57611ccc611ba6565b5b8135611cdd848260208601611c51565b91505092915050565b5f67ffffffffffffffff821115611d0057611cff611baa565b5b602082029050602081019050919050565b5f611d23611d1e84611ce6565b611c08565b90508083825260208201905060208402830185811115611d4657611d45611c4d565b5b835b81811015611d6f5780611d5b8882611ad1565b845260208401935050602081019050611d48565b5050509392505050565b5f82601f830112611d8d57611d8c611ba6565b5b8135611d9d848260208601611d11565b91505092915050565b5f8060408385031215611dbc57611dbb611a50565b5b5f83013567ffffffffffffffff811115611dd957611dd8611a54565b5b611de585828601611cb9565b925050602083013567ffffffffffffffff811115611e0657611e05611a54565b5b611e1285828601611d79565b9150509250929050565b5f805f60608486031215611e3357611e32611a50565b5b5f611e4086828701611a9e565b9350506020611e5186828701611a9e565b9250506040611e6286828701611ad1565b9150509250925092565b5f60ff82169050919050565b611e8181611e6c565b82525050565b5f602082019050611e9a5f830184611e78565b92915050565b5f60208284031215611eb557611eb4611a50565b5b5f611ec284828501611a9e565b91505092915050565b5f8060408385031215611ee157611ee0611a50565b5b5f611eee85828601611a9e565b9250506020611eff85828601611a9e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f4d57607f821691505b602082108103611f6057611f5f611f09565b5b50919050565b7f4e6f20726563697069656e7473206c69737465642e00000000000000000000005f82015250565b5f611f9a6015836119a7565b9150611fa582611f66565b602082019050919050565b5f6020820190508181035f830152611fc781611f8e565b9050919050565b7f416d6f756e7420616e6420726563697069656e74206c656e6774687320646f205f8201527f6e6f74206d617463682e00000000000000000000000000000000000000000000602082015250565b5f612028602a836119a7565b915061203382611fce565b604082019050919050565b5f6020820190508181035f8301526120558161201c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f457665727920616d6f756e74206d75737420626520706f7369746976652e00005f82015250565b5f6120bd601e836119a7565b91506120c882612089565b602082019050919050565b5f6020820190508181035f8301526120ea816120b1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61212882611ab2565b915061213383611ab2565b925082820190508082111561214b5761214a6120f1565b5b92915050565b5f61215b82611ab2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361218d5761218c6120f1565b5b600182019050919050565b7f53656e64657220646f6573206e6f74206861766520656e6f75676820446576765f8201527f4520746f6b656e732e0000000000000000000000000000000000000000000000602082015250565b5f6121f26029836119a7565b91506121fd82612198565b604082019050919050565b5f6020820190508181035f83015261221f816121e6565b9050919050565b5f6060820190506122395f830186611b56565b6122466020830185611b56565b6122536040830184611b7e565b949350505050565b61226481611b23565b811461226e575f80fd5b50565b5f8151905061227f8161225b565b92915050565b5f6020828403121561229a57612299611a50565b5b5f6122a784828501612271565b91505092915050565b7f43616c6c657220646f6573206e6f74206861766520746865206d696e746572205f8201527f726f6c6500000000000000000000000000000000000000000000000000000000602082015250565b5f61230a6024836119a7565b9150612315826122b0565b604082019050919050565b5f6020820190508181035f830152612337816122fe565b9050919050565b7f4e6f206d696e7420726563697069656e74732e000000000000000000000000005f82015250565b5f6123726013836119a7565b915061237d8261233e565b602082019050919050565b5f6020820190508181035f83015261239f81612366565b9050919050565b7f526563697069656e742f416d6f756e74206d69736d617463682e0000000000005f82015250565b5f6123da601a836119a7565b91506123e5826123a6565b602082019050919050565b5f6020820190508181035f830152612407816123ce565b9050919050565b7f4d696e7420746f20746865207a65726f206164647265737300000000000000005f82015250565b5f6124426018836119a7565b915061244d8261240e565b602082019050919050565b5f6020820190508181035f83015261246f81612436565b9050919050565b7f496e76616c696420616d6f756e7420287a65726f206f72206c657373292e00005f82015250565b5f6124aa601e836119a7565b91506124b582612476565b602082019050919050565b5f6020820190508181035f8301526124d78161249e565b9050919050565b5f6124e882611ab2565b91506124f383611ab2565b925082820261250181611ab2565b91508282048414831517612518576125176120f1565b5b5092915050565b7f4d696e74696e67207468697320616d6f756e7420776f756c64206578636565645f8201527f2074686520676c6f62616c206c696d6974000000000000000000000000000000602082015250565b5f6125796031836119a7565b91506125848261251f565b604082019050919050565b5f6020820190508181035f8301526125a68161256d565b9050919050565b7f4d696e7420616d6f756e742065786365656473207468652063616c6c657227735f8201527f206d696e74696e67206c696d6974000000000000000000000000000000000000602082015250565b5f612607602e836119a7565b9150612612826125ad565b604082019050919050565b5f6020820190508181035f830152612634816125fb565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f819050919050565b5f61267a6126756126708461263b565b612657565b612644565b9050919050565b61268a81612660565b82525050565b5f6020820190506126a35f830184612681565b92915050565b5f6060820190506126bc5f830186611b56565b6126c96020830185611b7e565b6126d66040830184611b7e565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261273a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126ff565b61274486836126ff565b95508019841693508086168417925050509392505050565b5f61277661277161276c84611ab2565b612657565b611ab2565b9050919050565b5f819050919050565b61278f8361275c565b6127a361279b8261277d565b84845461270b565b825550505050565b5f90565b6127b76127ab565b6127c2818484612786565b505050565b5b818110156127e5576127da5f826127af565b6001810190506127c8565b5050565b601f82111561282a576127fb816126de565b612804846126f0565b81016020851015612813578190505b61282761281f856126f0565b8301826127c7565b50505b505050565b5f82821c905092915050565b5f61284a5f198460080261282f565b1980831691505092915050565b5f612862838361283b565b9150826002028217905092915050565b61287b8261199d565b67ffffffffffffffff81111561289457612893611baa565b5b61289e8254611f36565b6128a98282856127e9565b5f60209050601f8311600181146128da575f84156128c8578287015190505b6128d28582612857565b865550612939565b601f1984166128e8866126de565b5f5b8281101561290f578489015182556001820191506020850194506020810190506128ea565b8683101561292c5784890151612928601f89168261283b565b8355505b6001600288020188555050505b50505050505056fea264697066735822122063d2d96caace7da09dfb4cc9b282b8181f1de5e39383fb4217149e22814446bf64736f6c63430008140033
Deployed Bytecode Sourcemap
33280:3176:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23485:147;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26058:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33626:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24699:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34404:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26826:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33863:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35130:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24550:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35579:609;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24917:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34010:386;;;:::i;:::-;;36196:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33571:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33918:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23751:151;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36331:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25296:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25541:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33774:82;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33717:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23485:147;23530:13;23556:22;23581:18;:16;:18::i;:::-;23556:43;;23617:1;:7;;23610:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23485:147;:::o;26058:190::-;26131:4;26148:13;26164:12;:10;:12::i;:::-;26148:28;;26187:31;26196:5;26203:7;26212:5;26187:8;:31::i;:::-;26236:4;26229:11;;;26058:190;;;;:::o;33626:84::-;33668:42;33626:84;:::o;24699:155::-;24751:7;24771:22;24796:18;:16;:18::i;:::-;24771:43;;24832:1;:14;;;24825:21;;;24699:155;:::o;34404:718::-;34528:1;34508:10;:17;:21;34500:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34595:7;:14;34574:10;:17;:35;34566:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;34667:19;34706:9;34701:172;34725:10;:17;34721:1;:21;34701:172;;;34785:1;34772:7;34780:1;34772:10;;;;;;;;:::i;:::-;;;;;;;;:14;34764:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34851:7;34859:1;34851:10;;;;;;;;:::i;:::-;;;;;;;;34836:25;;;;;:::i;:::-;;;34744:3;;;;;:::i;:::-;;;;34701:172;;;;34906:21;34916:10;34906:9;:21::i;:::-;34891:11;:36;;34883:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;34989:9;34984:131;35008:10;:17;35004:1;:21;34984:131;;;35047:4;:17;;;35065:10;35077;35088:1;35077:13;;;;;;;;:::i;:::-;;;;;;;;35092:7;35100:1;35092:10;;;;;;;;:::i;:::-;;;;;;;;35047:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35027:3;;;;;:::i;:::-;;;;34984:131;;;;34489:633;34404:718;;:::o;26826:249::-;26913:4;26930:15;26948:12;:10;:12::i;:::-;26930:30;;26971:37;26987:4;26993:7;27002:5;26971:15;:37::i;:::-;27019:26;27029:4;27035:2;27039:5;27019:9;:26::i;:::-;27063:4;27056:11;;;26826:249;;;;;:::o;33863:48::-;33902:9;33863:48;:::o;35130:441::-;35230:15;:27;35246:10;35230:27;;;;;;;;;;;;;;;;;;;;;;;;;35222:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35337:1;35317:10;:17;:21;35309:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35402:7;:14;35381:10;:17;:35;35373:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35463:9;35458:106;35482:10;:17;35478:1;:21;35458:106;;;35521:31;35526:10;35537:1;35526:13;;;;;;;;:::i;:::-;;;;;;;;35541:7;35549:1;35541:10;;;;;;;;:::i;:::-;;;;;;;;35521:4;:31::i;:::-;35501:3;;;;;:::i;:::-;;;;35458:106;;;;35130:441;;:::o;24550:84::-;24599:5;24624:2;24617:9;;24550:84;:::o;35579:609::-;35661:1;35647:16;;:2;:16;;;35639:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35711:15;:27;35727:10;35711:27;;;;;;;;;;;;;;;;;;;;;;;;;35703:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35807:1;35798:6;:10;35790:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35902:6;33610:9;35888:21;;;;:::i;:::-;35878:6;35862:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:47;;35854:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;36046:6;36020:12;:24;36033:10;36020:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;36010:6;35982:13;:25;35996:10;35982:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:71;;35974:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;36146:6;36117:13;:25;36131:10;36117:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;36163:17;36169:2;36173:6;36163:5;:17::i;:::-;35579:609;;:::o;24917:174::-;24982:7;25002:22;25027:18;:16;:18::i;:::-;25002:43;;25063:1;:11;;:20;25075:7;25063:20;;;;;;;;;;;;;;;;25056:27;;;24917:174;;;:::o;34010:386::-;11040:30;11073:26;:24;:26::i;:::-;11040:59;;11164:19;11187:1;:15;;;;;;;;;;;;11186:16;11164:38;;11213:18;11234:1;:14;;;;;;;;;;;;11213:35;;11599:17;11634:1;11619:11;:16;;;:34;;;;;11639:14;11619:34;11599:54;;11664:17;11699:1;11684:11;:16;;;:50;;;;;11733:1;11712:4;11704:25;;;:30;11684:50;11664:70;;11752:12;11751:13;:30;;;;;11769:12;11768:13;11751:30;11747:93;;;11805:23;;;;;;;;;;;;;;11747:93;11867:1;11850;:14;;;:18;;;;;;;;;;;;;;;;;;11883:14;11879:69;;;11932:4;11914:1;:15;;;:22;;;;;;;;;;;;;;;;;;11879:69;34062:30:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:30::i;:::-;34136:4;34103:15;:30;33814:42;34103:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34186:4;34151:15;:32;33668:42;34151:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;33902:9;34201:12;:27:::0;33814:42:::1;34201:27;;;;;;;;;;;;;;;:42;;;;33758:9;34254:12;:29:::0;33668:42:::1;34254:29;;;;;;;;;;;;;;;:46;;;;34342:1;34311:13;:28;33814:42;34311:28;;;;;;;;;;;;;;;:32;;;;34387:1;34354:13;:30;33668:42;34354:30;;;;;;;;;;;;;;;:34;;;;11974:14:::0;11970:104;;;12023:5;12005:1;:15;;;:23;;;;;;;;;;;;;;;;;;12048:14;12060:1;12048:14;;;;;;:::i;:::-;;;;;;;;11970:104;10972:1109;;;;;34010:386::o;36196:127::-;36259:7;36308:6;36286:12;:20;36299:6;36286:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;36279:36;;36196:127;;;:::o;33571:48::-;33610:9;33571:48;:::o;33918:83::-;33959:42;33918:83;:::o;23751:151::-;23798:13;23824:22;23849:18;:16;:18::i;:::-;23824:43;;23885:1;:9;;23878:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23751:151;:::o;36331:122::-;36397:7;36424:13;:21;36438:6;36424:21;;;;;;;;;;;;;;;;36417:28;;36331:122;;;:::o;25296:182::-;25365:4;25382:13;25398:12;:10;:12::i;:::-;25382:28;;25421:27;25431:5;25438:2;25442:5;25421:9;:27::i;:::-;25466:4;25459:11;;;25296:182;;;;:::o;25541:198::-;25621:7;25641:22;25666:18;:16;:18::i;:::-;25641:43;;25702:1;:13;;:20;25716:5;25702:20;;;;;;;;;;;;;;;:29;25723:7;25702:29;;;;;;;;;;;;;;;;25695:36;;;25541:198;;;;:::o;33774:82::-;33814:42;33774:82;:::o;33717:50::-;33758:9;33717:50;:::o;22691:157::-;22741:22;22810:20;22800:30;;22691:157;:::o;16809:98::-;16862:7;16889:10;16882:17;;16809:98;:::o;30949:130::-;31034:37;31043:5;31050:7;31059:5;31066:4;31034:8;:37::i;:::-;30949:130;;;:::o;32721:487::-;32821:24;32848:25;32858:5;32865:7;32848:9;:25::i;:::-;32821:52;;32908:17;32888:16;:37;32884:317;;32965:5;32946:16;:24;32942:132;;;33025:7;33034:16;33052:5;32998:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;32942:132;33117:57;33126:5;33133:7;33161:5;33142:16;:24;33168:5;33117:8;:57::i;:::-;32884:317;32810:398;32721:487;;;:::o;27460:308::-;27560:1;27544:18;;:4;:18;;;27540:88;;27613:1;27586:30;;;;;;;;;;;:::i;:::-;;;;;;;;27540:88;27656:1;27642:16;;:2;:16;;;27638:88;;27711:1;27682:32;;;;;;;;;;;:::i;:::-;;;;;;;;27638:88;27736:24;27744:4;27750:2;27754:5;27736:7;:24::i;:::-;27460:308;;;:::o;29644:213::-;29734:1;29715:21;;:7;:21;;;29711:93;;29789:1;29760:32;;;;;;;;;;;:::i;:::-;;;;;;;;29711:93;29814:35;29830:1;29834:7;29843:5;29814:7;:35::i;:::-;29644:213;;:::o;15736:174::-;15794:30;15871:21;15861:31;;15736:174;:::o;23038:149::-;13878:20;:18;:20::i;:::-;23141:38:::1;23164:5;23171:7;23141:22;:38::i;:::-;23038:149:::0;;:::o;31930:499::-;32039:22;32064:18;:16;:18::i;:::-;32039:43;;32114:1;32097:19;;:5;:19;;;32093:91;;32169:1;32140:32;;;;;;;;;;;:::i;:::-;;;;;;;;32093:91;32217:1;32198:21;;:7;:21;;;32194:92;;32271:1;32243:31;;;;;;;;;;;:::i;:::-;;;;;;;;32194:92;32328:5;32296:1;:13;;:20;32310:5;32296:20;;;;;;;;;;;;;;;:29;32317:7;32296:29;;;;;;;;;;;;;;;:37;;;;32348:9;32344:78;;;32395:7;32379:31;;32388:5;32379:31;;;32404:5;32379:31;;;;;;:::i;:::-;;;;;;;;32344:78;32028:401;31930:499;;;;:::o;28092:1199::-;28178:22;28203:18;:16;:18::i;:::-;28178:43;;28252:1;28236:18;;:4;:18;;;28232:558;;28392:5;28374:1;:14;;;:23;;;;;;;:::i;:::-;;;;;;;;28232:558;;;28430:19;28452:1;:11;;:17;28464:4;28452:17;;;;;;;;;;;;;;;;28430:39;;28502:5;28488:11;:19;28484:117;;;28560:4;28566:11;28579:5;28535:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;28484:117;28758:5;28744:11;:19;28724:1;:11;;:17;28736:4;28724:17;;;;;;;;;;;;;;;:39;;;;28415:375;28232:558;28820:1;28806:16;;:2;:16;;;28802:439;;28990:5;28972:1;:14;;;:23;;;;;;;;;;;28802:439;;;29209:5;29190:1;:11;;:15;29202:2;29190:15;;;;;;;;;;;;;;;;:24;;;;;;;;;;;28802:439;29273:2;29258:25;;29267:4;29258:25;;;29277:5;29258:25;;;;;;:::i;:::-;;;;;;;;28167:1124;28092:1199;;;:::o;14038:145::-;14106:17;:15;:17::i;:::-;14101:75;;14147:17;;;;;;;;;;;;;;14101:75;14038:145::o;23195:220::-;13878:20;:18;:20::i;:::-;23308:22:::1;23333:18;:16;:18::i;:::-;23308:43;;23372:5;23362:1;:7;;:15;;;;;;:::i;:::-;;23400:7;23388:1;:9;;:19;;;;;;:::i;:::-;;23297:118;23195:220:::0;;:::o;15478:122::-;15528:4;15552:26;:24;:26::i;:::-;:40;;;;;;;;;;;;15545:47;;15478:122;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:118::-;3885:24;3903:5;3885:24;:::i;:::-;3880:3;3873:37;3798:118;;:::o;3922:222::-;4015:4;4053:2;4042:9;4038:18;4030:26;;4066:71;4134:1;4123:9;4119:17;4110:6;4066:71;:::i;:::-;3922:222;;;;:::o;4150:117::-;4259:1;4256;4249:12;4273:180;4321:77;4318:1;4311:88;4418:4;4415:1;4408:15;4442:4;4439:1;4432:15;4459:281;4542:27;4564:4;4542:27;:::i;:::-;4534:6;4530:40;4672:6;4660:10;4657:22;4636:18;4624:10;4621:34;4618:62;4615:88;;;4683:18;;:::i;:::-;4615:88;4723:10;4719:2;4712:22;4502:238;4459:281;;:::o;4746:129::-;4780:6;4807:20;;:::i;:::-;4797:30;;4836:33;4864:4;4856:6;4836:33;:::i;:::-;4746:129;;;:::o;4881:311::-;4958:4;5048:18;5040:6;5037:30;5034:56;;;5070:18;;:::i;:::-;5034:56;5120:4;5112:6;5108:17;5100:25;;5180:4;5174;5170:15;5162:23;;4881:311;;;:::o;5198:117::-;5307:1;5304;5297:12;5338:710;5434:5;5459:81;5475:64;5532:6;5475:64;:::i;:::-;5459:81;:::i;:::-;5450:90;;5560:5;5589:6;5582:5;5575:21;5623:4;5616:5;5612:16;5605:23;;5676:4;5668:6;5664:17;5656:6;5652:30;5705:3;5697:6;5694:15;5691:122;;;5724:79;;:::i;:::-;5691:122;5839:6;5822:220;5856:6;5851:3;5848:15;5822:220;;;5931:3;5960:37;5993:3;5981:10;5960:37;:::i;:::-;5955:3;5948:50;6027:4;6022:3;6018:14;6011:21;;5898:144;5882:4;5877:3;5873:14;5866:21;;5822:220;;;5826:21;5440:608;;5338:710;;;;;:::o;6071:370::-;6142:5;6191:3;6184:4;6176:6;6172:17;6168:27;6158:122;;6199:79;;:::i;:::-;6158:122;6316:6;6303:20;6341:94;6431:3;6423:6;6416:4;6408:6;6404:17;6341:94;:::i;:::-;6332:103;;6148:293;6071:370;;;;:::o;6447:311::-;6524:4;6614:18;6606:6;6603:30;6600:56;;;6636:18;;:::i;:::-;6600:56;6686:4;6678:6;6674:17;6666:25;;6746:4;6740;6736:15;6728:23;;6447:311;;;:::o;6781:710::-;6877:5;6902:81;6918:64;6975:6;6918:64;:::i;:::-;6902:81;:::i;:::-;6893:90;;7003:5;7032:6;7025:5;7018:21;7066:4;7059:5;7055:16;7048:23;;7119:4;7111:6;7107:17;7099:6;7095:30;7148:3;7140:6;7137:15;7134:122;;;7167:79;;:::i;:::-;7134:122;7282:6;7265:220;7299:6;7294:3;7291:15;7265:220;;;7374:3;7403:37;7436:3;7424:10;7403:37;:::i;:::-;7398:3;7391:50;7470:4;7465:3;7461:14;7454:21;;7341:144;7325:4;7320:3;7316:14;7309:21;;7265:220;;;7269:21;6883:608;;6781:710;;;;;:::o;7514:370::-;7585:5;7634:3;7627:4;7619:6;7615:17;7611:27;7601:122;;7642:79;;:::i;:::-;7601:122;7759:6;7746:20;7784:94;7874:3;7866:6;7859:4;7851:6;7847:17;7784:94;:::i;:::-;7775:103;;7591:293;7514:370;;;;:::o;7890:894::-;8008:6;8016;8065:2;8053:9;8044:7;8040:23;8036:32;8033:119;;;8071:79;;:::i;:::-;8033:119;8219:1;8208:9;8204:17;8191:31;8249:18;8241:6;8238:30;8235:117;;;8271:79;;:::i;:::-;8235:117;8376:78;8446:7;8437:6;8426:9;8422:22;8376:78;:::i;:::-;8366:88;;8162:302;8531:2;8520:9;8516:18;8503:32;8562:18;8554:6;8551:30;8548:117;;;8584:79;;:::i;:::-;8548:117;8689:78;8759:7;8750:6;8739:9;8735:22;8689:78;:::i;:::-;8679:88;;8474:303;7890:894;;;;;:::o;8790:619::-;8867:6;8875;8883;8932:2;8920:9;8911:7;8907:23;8903:32;8900:119;;;8938:79;;:::i;:::-;8900:119;9058:1;9083:53;9128:7;9119:6;9108:9;9104:22;9083:53;:::i;:::-;9073:63;;9029:117;9185:2;9211:53;9256:7;9247:6;9236:9;9232:22;9211:53;:::i;:::-;9201:63;;9156:118;9313:2;9339:53;9384:7;9375:6;9364:9;9360:22;9339:53;:::i;:::-;9329:63;;9284:118;8790:619;;;;;:::o;9415:86::-;9450:7;9490:4;9483:5;9479:16;9468:27;;9415:86;;;:::o;9507:112::-;9590:22;9606:5;9590:22;:::i;:::-;9585:3;9578:35;9507:112;;:::o;9625:214::-;9714:4;9752:2;9741:9;9737:18;9729:26;;9765:67;9829:1;9818:9;9814:17;9805:6;9765:67;:::i;:::-;9625:214;;;;:::o;9845:329::-;9904:6;9953:2;9941:9;9932:7;9928:23;9924:32;9921:119;;;9959:79;;:::i;:::-;9921:119;10079:1;10104:53;10149:7;10140:6;10129:9;10125:22;10104:53;:::i;:::-;10094:63;;10050:117;9845:329;;;;:::o;10180:474::-;10248:6;10256;10305:2;10293:9;10284:7;10280:23;10276:32;10273:119;;;10311:79;;:::i;:::-;10273:119;10431:1;10456:53;10501:7;10492:6;10481:9;10477:22;10456:53;:::i;:::-;10446:63;;10402:117;10558:2;10584:53;10629:7;10620:6;10609:9;10605:22;10584:53;:::i;:::-;10574:63;;10529:118;10180:474;;;;;:::o;10660:180::-;10708:77;10705:1;10698:88;10805:4;10802:1;10795:15;10829:4;10826:1;10819:15;10846:320;10890:6;10927:1;10921:4;10917:12;10907:22;;10974:1;10968:4;10964:12;10995:18;10985:81;;11051:4;11043:6;11039:17;11029:27;;10985:81;11113:2;11105:6;11102:14;11082:18;11079:38;11076:84;;11132:18;;:::i;:::-;11076:84;10897:269;10846:320;;;:::o;11172:171::-;11312:23;11308:1;11300:6;11296:14;11289:47;11172:171;:::o;11349:366::-;11491:3;11512:67;11576:2;11571:3;11512:67;:::i;:::-;11505:74;;11588:93;11677:3;11588:93;:::i;:::-;11706:2;11701:3;11697:12;11690:19;;11349:366;;;:::o;11721:419::-;11887:4;11925:2;11914:9;11910:18;11902:26;;11974:9;11968:4;11964:20;11960:1;11949:9;11945:17;11938:47;12002:131;12128:4;12002:131;:::i;:::-;11994:139;;11721:419;;;:::o;12146:229::-;12286:34;12282:1;12274:6;12270:14;12263:58;12355:12;12350:2;12342:6;12338:15;12331:37;12146:229;:::o;12381:366::-;12523:3;12544:67;12608:2;12603:3;12544:67;:::i;:::-;12537:74;;12620:93;12709:3;12620:93;:::i;:::-;12738:2;12733:3;12729:12;12722:19;;12381:366;;;:::o;12753:419::-;12919:4;12957:2;12946:9;12942:18;12934:26;;13006:9;13000:4;12996:20;12992:1;12981:9;12977:17;12970:47;13034:131;13160:4;13034:131;:::i;:::-;13026:139;;12753:419;;;:::o;13178:180::-;13226:77;13223:1;13216:88;13323:4;13320:1;13313:15;13347:4;13344:1;13337:15;13364:180;13504:32;13500:1;13492:6;13488:14;13481:56;13364:180;:::o;13550:366::-;13692:3;13713:67;13777:2;13772:3;13713:67;:::i;:::-;13706:74;;13789:93;13878:3;13789:93;:::i;:::-;13907:2;13902:3;13898:12;13891:19;;13550:366;;;:::o;13922:419::-;14088:4;14126:2;14115:9;14111:18;14103:26;;14175:9;14169:4;14165:20;14161:1;14150:9;14146:17;14139:47;14203:131;14329:4;14203:131;:::i;:::-;14195:139;;13922:419;;;:::o;14347:180::-;14395:77;14392:1;14385:88;14492:4;14489:1;14482:15;14516:4;14513:1;14506:15;14533:191;14573:3;14592:20;14610:1;14592:20;:::i;:::-;14587:25;;14626:20;14644:1;14626:20;:::i;:::-;14621:25;;14669:1;14666;14662:9;14655:16;;14690:3;14687:1;14684:10;14681:36;;;14697:18;;:::i;:::-;14681:36;14533:191;;;;:::o;14730:233::-;14769:3;14792:24;14810:5;14792:24;:::i;:::-;14783:33;;14838:66;14831:5;14828:77;14825:103;;14908:18;;:::i;:::-;14825:103;14955:1;14948:5;14944:13;14937:20;;14730:233;;;:::o;14969:228::-;15109:34;15105:1;15097:6;15093:14;15086:58;15178:11;15173:2;15165:6;15161:15;15154:36;14969:228;:::o;15203:366::-;15345:3;15366:67;15430:2;15425:3;15366:67;:::i;:::-;15359:74;;15442:93;15531:3;15442:93;:::i;:::-;15560:2;15555:3;15551:12;15544:19;;15203:366;;;:::o;15575:419::-;15741:4;15779:2;15768:9;15764:18;15756:26;;15828:9;15822:4;15818:20;15814:1;15803:9;15799:17;15792:47;15856:131;15982:4;15856:131;:::i;:::-;15848:139;;15575:419;;;:::o;16000:442::-;16149:4;16187:2;16176:9;16172:18;16164:26;;16200:71;16268:1;16257:9;16253:17;16244:6;16200:71;:::i;:::-;16281:72;16349:2;16338:9;16334:18;16325:6;16281:72;:::i;:::-;16363;16431:2;16420:9;16416:18;16407:6;16363:72;:::i;:::-;16000:442;;;;;;:::o;16448:116::-;16518:21;16533:5;16518:21;:::i;:::-;16511:5;16508:32;16498:60;;16554:1;16551;16544:12;16498:60;16448:116;:::o;16570:137::-;16624:5;16655:6;16649:13;16640:22;;16671:30;16695:5;16671:30;:::i;:::-;16570:137;;;;:::o;16713:345::-;16780:6;16829:2;16817:9;16808:7;16804:23;16800:32;16797:119;;;16835:79;;:::i;:::-;16797:119;16955:1;16980:61;17033:7;17024:6;17013:9;17009:22;16980:61;:::i;:::-;16970:71;;16926:125;16713:345;;;;:::o;17064:223::-;17204:34;17200:1;17192:6;17188:14;17181:58;17273:6;17268:2;17260:6;17256:15;17249:31;17064:223;:::o;17293:366::-;17435:3;17456:67;17520:2;17515:3;17456:67;:::i;:::-;17449:74;;17532:93;17621:3;17532:93;:::i;:::-;17650:2;17645:3;17641:12;17634:19;;17293:366;;;:::o;17665:419::-;17831:4;17869:2;17858:9;17854:18;17846:26;;17918:9;17912:4;17908:20;17904:1;17893:9;17889:17;17882:47;17946:131;18072:4;17946:131;:::i;:::-;17938:139;;17665:419;;;:::o;18090:169::-;18230:21;18226:1;18218:6;18214:14;18207:45;18090:169;:::o;18265:366::-;18407:3;18428:67;18492:2;18487:3;18428:67;:::i;:::-;18421:74;;18504:93;18593:3;18504:93;:::i;:::-;18622:2;18617:3;18613:12;18606:19;;18265:366;;;:::o;18637:419::-;18803:4;18841:2;18830:9;18826:18;18818:26;;18890:9;18884:4;18880:20;18876:1;18865:9;18861:17;18854:47;18918:131;19044:4;18918:131;:::i;:::-;18910:139;;18637:419;;;:::o;19062:176::-;19202:28;19198:1;19190:6;19186:14;19179:52;19062:176;:::o;19244:366::-;19386:3;19407:67;19471:2;19466:3;19407:67;:::i;:::-;19400:74;;19483:93;19572:3;19483:93;:::i;:::-;19601:2;19596:3;19592:12;19585:19;;19244:366;;;:::o;19616:419::-;19782:4;19820:2;19809:9;19805:18;19797:26;;19869:9;19863:4;19859:20;19855:1;19844:9;19840:17;19833:47;19897:131;20023:4;19897:131;:::i;:::-;19889:139;;19616:419;;;:::o;20041:174::-;20181:26;20177:1;20169:6;20165:14;20158:50;20041:174;:::o;20221:366::-;20363:3;20384:67;20448:2;20443:3;20384:67;:::i;:::-;20377:74;;20460:93;20549:3;20460:93;:::i;:::-;20578:2;20573:3;20569:12;20562:19;;20221:366;;;:::o;20593:419::-;20759:4;20797:2;20786:9;20782:18;20774:26;;20846:9;20840:4;20836:20;20832:1;20821:9;20817:17;20810:47;20874:131;21000:4;20874:131;:::i;:::-;20866:139;;20593:419;;;:::o;21018:180::-;21158:32;21154:1;21146:6;21142:14;21135:56;21018:180;:::o;21204:366::-;21346:3;21367:67;21431:2;21426:3;21367:67;:::i;:::-;21360:74;;21443:93;21532:3;21443:93;:::i;:::-;21561:2;21556:3;21552:12;21545:19;;21204:366;;;:::o;21576:419::-;21742:4;21780:2;21769:9;21765:18;21757:26;;21829:9;21823:4;21819:20;21815:1;21804:9;21800:17;21793:47;21857:131;21983:4;21857:131;:::i;:::-;21849:139;;21576:419;;;:::o;22001:410::-;22041:7;22064:20;22082:1;22064:20;:::i;:::-;22059:25;;22098:20;22116:1;22098:20;:::i;:::-;22093:25;;22153:1;22150;22146:9;22175:30;22193:11;22175:30;:::i;:::-;22164:41;;22354:1;22345:7;22341:15;22338:1;22335:22;22315:1;22308:9;22288:83;22265:139;;22384:18;;:::i;:::-;22265:139;22049:362;22001:410;;;;:::o;22417:236::-;22557:34;22553:1;22545:6;22541:14;22534:58;22626:19;22621:2;22613:6;22609:15;22602:44;22417:236;:::o;22659:366::-;22801:3;22822:67;22886:2;22881:3;22822:67;:::i;:::-;22815:74;;22898:93;22987:3;22898:93;:::i;:::-;23016:2;23011:3;23007:12;23000:19;;22659:366;;;:::o;23031:419::-;23197:4;23235:2;23224:9;23220:18;23212:26;;23284:9;23278:4;23274:20;23270:1;23259:9;23255:17;23248:47;23312:131;23438:4;23312:131;:::i;:::-;23304:139;;23031:419;;;:::o;23456:233::-;23596:34;23592:1;23584:6;23580:14;23573:58;23665:16;23660:2;23652:6;23648:15;23641:41;23456:233;:::o;23695:366::-;23837:3;23858:67;23922:2;23917:3;23858:67;:::i;:::-;23851:74;;23934:93;24023:3;23934:93;:::i;:::-;24052:2;24047:3;24043:12;24036:19;;23695:366;;;:::o;24067:419::-;24233:4;24271:2;24260:9;24256:18;24248:26;;24320:9;24314:4;24310:20;24306:1;24295:9;24291:17;24284:47;24348:131;24474:4;24348:131;:::i;:::-;24340:139;;24067:419;;;:::o;24492:85::-;24537:7;24566:5;24555:16;;24492:85;;;:::o;24583:101::-;24619:7;24659:18;24652:5;24648:30;24637:41;;24583:101;;;:::o;24690:60::-;24718:3;24739:5;24732:12;;24690:60;;;:::o;24756:156::-;24813:9;24846:60;24863:42;24872:32;24898:5;24872:32;:::i;:::-;24863:42;:::i;:::-;24846:60;:::i;:::-;24833:73;;24756:156;;;:::o;24918:145::-;25012:44;25050:5;25012:44;:::i;:::-;25007:3;25000:57;24918:145;;:::o;25069:236::-;25169:4;25207:2;25196:9;25192:18;25184:26;;25220:78;25295:1;25284:9;25280:17;25271:6;25220:78;:::i;:::-;25069:236;;;;:::o;25311:442::-;25460:4;25498:2;25487:9;25483:18;25475:26;;25511:71;25579:1;25568:9;25564:17;25555:6;25511:71;:::i;:::-;25592:72;25660:2;25649:9;25645:18;25636:6;25592:72;:::i;:::-;25674;25742:2;25731:9;25727:18;25718:6;25674:72;:::i;:::-;25311:442;;;;;;:::o;25759:141::-;25808:4;25831:3;25823:11;;25854:3;25851:1;25844:14;25888:4;25885:1;25875:18;25867:26;;25759:141;;;:::o;25906:93::-;25943:6;25990:2;25985;25978:5;25974:14;25970:23;25960:33;;25906:93;;;:::o;26005:107::-;26049:8;26099:5;26093:4;26089:16;26068:37;;26005:107;;;;:::o;26118:393::-;26187:6;26237:1;26225:10;26221:18;26260:97;26290:66;26279:9;26260:97;:::i;:::-;26378:39;26408:8;26397:9;26378:39;:::i;:::-;26366:51;;26450:4;26446:9;26439:5;26435:21;26426:30;;26499:4;26489:8;26485:19;26478:5;26475:30;26465:40;;26194:317;;26118:393;;;;;:::o;26517:142::-;26567:9;26600:53;26618:34;26627:24;26645:5;26627:24;:::i;:::-;26618:34;:::i;:::-;26600:53;:::i;:::-;26587:66;;26517:142;;;:::o;26665:75::-;26708:3;26729:5;26722:12;;26665:75;;;:::o;26746:269::-;26856:39;26887:7;26856:39;:::i;:::-;26917:91;26966:41;26990:16;26966:41;:::i;:::-;26958:6;26951:4;26945:11;26917:91;:::i;:::-;26911:4;26904:105;26822:193;26746:269;;;:::o;27021:73::-;27066:3;27021:73;:::o;27100:189::-;27177:32;;:::i;:::-;27218:65;27276:6;27268;27262:4;27218:65;:::i;:::-;27153:136;27100:189;;:::o;27295:186::-;27355:120;27372:3;27365:5;27362:14;27355:120;;;27426:39;27463:1;27456:5;27426:39;:::i;:::-;27399:1;27392:5;27388:13;27379:22;;27355:120;;;27295:186;;:::o;27487:543::-;27588:2;27583:3;27580:11;27577:446;;;27622:38;27654:5;27622:38;:::i;:::-;27706:29;27724:10;27706:29;:::i;:::-;27696:8;27692:44;27889:2;27877:10;27874:18;27871:49;;;27910:8;27895:23;;27871:49;27933:80;27989:22;28007:3;27989:22;:::i;:::-;27979:8;27975:37;27962:11;27933:80;:::i;:::-;27592:431;;27577:446;27487:543;;;:::o;28036:117::-;28090:8;28140:5;28134:4;28130:16;28109:37;;28036:117;;;;:::o;28159:169::-;28203:6;28236:51;28284:1;28280:6;28272:5;28269:1;28265:13;28236:51;:::i;:::-;28232:56;28317:4;28311;28307:15;28297:25;;28210:118;28159:169;;;;:::o;28333:295::-;28409:4;28555:29;28580:3;28574:4;28555:29;:::i;:::-;28547:37;;28617:3;28614:1;28610:11;28604:4;28601:21;28593:29;;28333:295;;;;:::o;28633:1395::-;28750:37;28783:3;28750:37;:::i;:::-;28852:18;28844:6;28841:30;28838:56;;;28874:18;;:::i;:::-;28838:56;28918:38;28950:4;28944:11;28918:38;:::i;:::-;29003:67;29063:6;29055;29049:4;29003:67;:::i;:::-;29097:1;29121:4;29108:17;;29153:2;29145:6;29142:14;29170:1;29165:618;;;;29827:1;29844:6;29841:77;;;29893:9;29888:3;29884:19;29878:26;29869:35;;29841:77;29944:67;30004:6;29997:5;29944:67;:::i;:::-;29938:4;29931:81;29800:222;29135:887;;29165:618;29217:4;29213:9;29205:6;29201:22;29251:37;29283:4;29251:37;:::i;:::-;29310:1;29324:208;29338:7;29335:1;29332:14;29324:208;;;29417:9;29412:3;29408:19;29402:26;29394:6;29387:42;29468:1;29460:6;29456:14;29446:24;;29515:2;29504:9;29500:18;29487:31;;29361:4;29358:1;29354:12;29349:17;;29324:208;;;29560:6;29551:7;29548:19;29545:179;;;29618:9;29613:3;29609:19;29603:26;29661:48;29703:4;29695:6;29691:17;29680:9;29661:48;:::i;:::-;29653:6;29646:64;29568:156;29545:179;29770:1;29766;29758:6;29754:14;29750:22;29744:4;29737:36;29172:611;;;29135:887;;28725:1303;;;28633:1395;;:::o
Swarm Source
ipfs://63d2d96caace7da09dfb4cc9b282b8181f1de5e39383fb4217149e22814446bf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.