Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OokiToken
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-18 */ /** * Copyright 2017-2021, OokiDao. All Rights Reserved. * Licensed under the Apache License, Version 2.0. */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } contract Upgradeable_0_8 is Ownable { address public implementation; } contract OokiToken is Upgradeable_0_8, ERC20Burnable { bytes32 public DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; constructor() ERC20("Ooki Token", "OOKI") {} function initialize() public onlyOwner { DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes("Ooki Token")), keccak256(bytes("1")), block.chainid, address(this) ) ); } function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); } function rescue(IERC20 _token) public onlyOwner { SafeERC20.safeTransfer(_token, msg.sender, _token.balanceOf(address(this))); } // constructor does not modify proxy storage function name() public view override returns (string memory) { return "Ooki Token"; } // constructor does not modify proxy storage function symbol() public view override returns (string memory) { return "OOKI"; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "OOKI: EXPIRED"); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)))); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "OOKI: INVALID_SIGNATURE"); _approve(owner, spender, value); } function _beforeTokenTransfer( address /*from*/, address to, uint256 /*amount*/ ) internal override { require(to != address(this), "ERC20: token contract is receiver"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600a81526020016927b7b5b4902a37b5b2b760b11b815250604051806040016040528060048152602001634f4f4b4960e01b8152506200006c62000066620000a060201b60201c565b620000a4565b815162000081906005906020850190620000f4565b50805162000097906006906020840190620000f4565b505050620001d7565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000102906200019a565b90600052602060002090601f01602090048101928262000126576000855562000171565b82601f106200014157805160ff191683800117855562000171565b8280016001018555821562000171579182015b828111156200017157825182559160200191906001019062000154565b506200017f92915062000183565b5090565b5b808211156200017f576000815560010162000184565b600181811c90821680620001af57607f821691505b60208210811415620001d157634e487b7160e01b600052602260045260246000fd5b50919050565b61162f80620001e76000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c357806395d89b411161007c57806395d89b4114610312578063a457c2d714610332578063a9059cbb14610345578063d505accf14610358578063dd62ed3e1461036b578063f2fde38b146103a457600080fd5b8063715018a6146102ab57806379cc6790146102b35780637ecebe00146102c65780638129fc1c146102e6578063839006f2146102ee5780638da5cb5b1461030157600080fd5b80633644e515116101155780633644e51514610213578063395093511461021c57806340c10f191461022f57806342966c68146102445780635c60da1b1461025757806370a082311461028257600080fd5b806306fdde031461015d578063095ea7b31461019557806318160ddd146101b857806323b872dd146101ca57806330adf81f146101dd578063313ce56714610204575b600080fd5b60408051808201909152600a81526927b7b5b4902a37b5b2b760b11b60208201525b60405161018c9190611372565b60405180910390f35b6101a86101a33660046113ba565b6103b7565b604051901515815260200161018c565b6004545b60405190815260200161018c565b6101a86101d83660046113e6565b6103cd565b6101bc7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040516012815260200161018c565b6101bc60075481565b6101a861022a3660046113ba565b61047e565b61024261023d3660046113ba565b6104ba565b005b610242610252366004611427565b6104f2565b60015461026a906001600160a01b031681565b6040516001600160a01b03909116815260200161018c565b6101bc610290366004611440565b6001600160a01b031660009081526002602052604090205490565b6102426104ff565b6102426102c13660046113ba565b610535565b6101bc6102d4366004611440565b60086020526000908152604090205481565b6102426105bb565b6102426102fc366004611440565b6106b8565b6000546001600160a01b031661026a565b6040805180820190915260048152634f4f4b4960e01b602082015261017f565b6101a86103403660046113ba565b610766565b6101a86103533660046113ba565b6107ff565b61024261036636600461145d565b61080c565b6101bc6103793660046114d4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6102426103b2366004611440565b610a1b565b60006103c4338484610ab3565b50600192915050565b60006103da848484610bd7565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156104645760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104718533858403610ab3565b60019150505b9392505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103c49185906104b5908690611523565b610ab3565b6000546001600160a01b031633146104e45760405162461bcd60e51b815260040161045b9061153b565b6104ee8282610db2565b5050565b6104fc3382610e9d565b50565b6000546001600160a01b031633146105295760405162461bcd60e51b815260040161045b9061153b565b6105336000610ff7565b565b60006105418333610379565b90508181101561059f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161045b565b6105ac8333848403610ab3565b6105b68383610e9d565b505050565b6000546001600160a01b031633146105e55760405162461bcd60e51b815260040161045b9061153b565b604080518082018252600a81526927b7b5b4902a37b5b2b760b11b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f862748ae03e0f3f0987fe44e89c29f2459391052a212ab25c5ba98ad69b5017f818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600755565b6000546001600160a01b031633146106e25760405162461bcd60e51b815260040161045b9061153b565b6040516370a0823160e01b81523060048201526104fc90829033906001600160a01b038316906370a082319060240160206040518083038186803b15801561072957600080fd5b505afa15801561073d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107619190611570565b611047565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156107e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161045b565b6107f53385858403610ab3565b5060019392505050565b60006103c4338484610bd7565b4284101561084c5760405162461bcd60e51b815260206004820152600d60248201526c13d3d2d24e8811561412549151609a1b604482015260640161045b565b6007546001600160a01b038816600090815260086020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761089f83611589565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161091892919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610983573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109b95750886001600160a01b0316816001600160a01b0316145b610a055760405162461bcd60e51b815260206004820152601760248201527f4f4f4b493a20494e56414c49445f5349474e4154555245000000000000000000604482015260640161045b565b610a10898989610ab3565b505050505050505050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260040161045b9061153b565b6001600160a01b038116610aaa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045b565b6104fc81610ff7565b6001600160a01b038316610b155760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161045b565b6001600160a01b038216610b765760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161045b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610c3b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161045b565b6001600160a01b038216610c9d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161045b565b610ca8838383611099565b6001600160a01b03831660009081526002602052604090205481811015610d205760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161045b565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290610d57908490611523565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610da391815260200190565b60405180910390a35b50505050565b6001600160a01b038216610e085760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161045b565b610e1460008383611099565b8060046000828254610e269190611523565b90915550506001600160a01b03821660009081526002602052604081208054839290610e53908490611523565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610efd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161045b565b610f0982600083611099565b6001600160a01b03821660009081526002602052604090205481811015610f7d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161045b565b6001600160a01b0383166000908152600260205260408120838303905560048054849290610fac9084906115a4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526105b69084906110fc565b6001600160a01b0382163014156105b65760405162461bcd60e51b815260206004820152602160248201527f45524332303a20746f6b656e20636f6e747261637420697320726563656976656044820152603960f91b606482015260840161045b565b6000611151826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111ce9092919063ffffffff16565b8051909150156105b6578080602001905181019061116f91906115bb565b6105b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161045b565b60606111dd84846000856111e5565b949350505050565b6060824710156112465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161045b565b843b6112945760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161045b565b600080866001600160a01b031685876040516112b091906115dd565b60006040518083038185875af1925050503d80600081146112ed576040519150601f19603f3d011682016040523d82523d6000602084013e6112f2565b606091505b509150915061130282828661130d565b979650505050505050565b6060831561131c575081610477565b82511561132c5782518084602001fd5b8160405162461bcd60e51b815260040161045b9190611372565b60005b83811015611361578181015183820152602001611349565b83811115610dac5750506000910152565b6020815260008251806020840152611391816040850160208701611346565b601f01601f19169190910160400192915050565b6001600160a01b03811681146104fc57600080fd5b600080604083850312156113cd57600080fd5b82356113d8816113a5565b946020939093013593505050565b6000806000606084860312156113fb57600080fd5b8335611406816113a5565b92506020840135611416816113a5565b929592945050506040919091013590565b60006020828403121561143957600080fd5b5035919050565b60006020828403121561145257600080fd5b8135610477816113a5565b600080600080600080600060e0888a03121561147857600080fd5b8735611483816113a5565b96506020880135611493816113a5565b95506040880135945060608801359350608088013560ff811681146114b757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156114e757600080fd5b82356114f2816113a5565b91506020830135611502816113a5565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082198211156115365761153661150d565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561158257600080fd5b5051919050565b600060001982141561159d5761159d61150d565b5060010190565b6000828210156115b6576115b661150d565b500390565b6000602082840312156115cd57600080fd5b8151801515811461047757600080fd5b600082516115ef818460208701611346565b919091019291505056fea2646970667358221220a4486c49958c991ab4d5964ab17dab1517dc2d1b633b9a735303e740b1de557064736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c357806395d89b411161007c57806395d89b4114610312578063a457c2d714610332578063a9059cbb14610345578063d505accf14610358578063dd62ed3e1461036b578063f2fde38b146103a457600080fd5b8063715018a6146102ab57806379cc6790146102b35780637ecebe00146102c65780638129fc1c146102e6578063839006f2146102ee5780638da5cb5b1461030157600080fd5b80633644e515116101155780633644e51514610213578063395093511461021c57806340c10f191461022f57806342966c68146102445780635c60da1b1461025757806370a082311461028257600080fd5b806306fdde031461015d578063095ea7b31461019557806318160ddd146101b857806323b872dd146101ca57806330adf81f146101dd578063313ce56714610204575b600080fd5b60408051808201909152600a81526927b7b5b4902a37b5b2b760b11b60208201525b60405161018c9190611372565b60405180910390f35b6101a86101a33660046113ba565b6103b7565b604051901515815260200161018c565b6004545b60405190815260200161018c565b6101a86101d83660046113e6565b6103cd565b6101bc7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040516012815260200161018c565b6101bc60075481565b6101a861022a3660046113ba565b61047e565b61024261023d3660046113ba565b6104ba565b005b610242610252366004611427565b6104f2565b60015461026a906001600160a01b031681565b6040516001600160a01b03909116815260200161018c565b6101bc610290366004611440565b6001600160a01b031660009081526002602052604090205490565b6102426104ff565b6102426102c13660046113ba565b610535565b6101bc6102d4366004611440565b60086020526000908152604090205481565b6102426105bb565b6102426102fc366004611440565b6106b8565b6000546001600160a01b031661026a565b6040805180820190915260048152634f4f4b4960e01b602082015261017f565b6101a86103403660046113ba565b610766565b6101a86103533660046113ba565b6107ff565b61024261036636600461145d565b61080c565b6101bc6103793660046114d4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6102426103b2366004611440565b610a1b565b60006103c4338484610ab3565b50600192915050565b60006103da848484610bd7565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156104645760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104718533858403610ab3565b60019150505b9392505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103c49185906104b5908690611523565b610ab3565b6000546001600160a01b031633146104e45760405162461bcd60e51b815260040161045b9061153b565b6104ee8282610db2565b5050565b6104fc3382610e9d565b50565b6000546001600160a01b031633146105295760405162461bcd60e51b815260040161045b9061153b565b6105336000610ff7565b565b60006105418333610379565b90508181101561059f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161045b565b6105ac8333848403610ab3565b6105b68383610e9d565b505050565b6000546001600160a01b031633146105e55760405162461bcd60e51b815260040161045b9061153b565b604080518082018252600a81526927b7b5b4902a37b5b2b760b11b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f862748ae03e0f3f0987fe44e89c29f2459391052a212ab25c5ba98ad69b5017f818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600755565b6000546001600160a01b031633146106e25760405162461bcd60e51b815260040161045b9061153b565b6040516370a0823160e01b81523060048201526104fc90829033906001600160a01b038316906370a082319060240160206040518083038186803b15801561072957600080fd5b505afa15801561073d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107619190611570565b611047565b3360009081526003602090815260408083206001600160a01b0386168452909152812054828110156107e85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161045b565b6107f53385858403610ab3565b5060019392505050565b60006103c4338484610bd7565b4284101561084c5760405162461bcd60e51b815260206004820152600d60248201526c13d3d2d24e8811561412549151609a1b604482015260640161045b565b6007546001600160a01b038816600090815260086020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b91908761089f83611589565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161091892919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610983573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906109b95750886001600160a01b0316816001600160a01b0316145b610a055760405162461bcd60e51b815260206004820152601760248201527f4f4f4b493a20494e56414c49445f5349474e4154555245000000000000000000604482015260640161045b565b610a10898989610ab3565b505050505050505050565b6000546001600160a01b03163314610a455760405162461bcd60e51b815260040161045b9061153b565b6001600160a01b038116610aaa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045b565b6104fc81610ff7565b6001600160a01b038316610b155760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161045b565b6001600160a01b038216610b765760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161045b565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610c3b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161045b565b6001600160a01b038216610c9d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161045b565b610ca8838383611099565b6001600160a01b03831660009081526002602052604090205481811015610d205760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161045b565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290610d57908490611523565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610da391815260200190565b60405180910390a35b50505050565b6001600160a01b038216610e085760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161045b565b610e1460008383611099565b8060046000828254610e269190611523565b90915550506001600160a01b03821660009081526002602052604081208054839290610e53908490611523565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b038216610efd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161045b565b610f0982600083611099565b6001600160a01b03821660009081526002602052604090205481811015610f7d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161045b565b6001600160a01b0383166000908152600260205260408120838303905560048054849290610fac9084906115a4565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526105b69084906110fc565b6001600160a01b0382163014156105b65760405162461bcd60e51b815260206004820152602160248201527f45524332303a20746f6b656e20636f6e747261637420697320726563656976656044820152603960f91b606482015260840161045b565b6000611151826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111ce9092919063ffffffff16565b8051909150156105b6578080602001905181019061116f91906115bb565b6105b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161045b565b60606111dd84846000856111e5565b949350505050565b6060824710156112465760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161045b565b843b6112945760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161045b565b600080866001600160a01b031685876040516112b091906115dd565b60006040518083038185875af1925050503d80600081146112ed576040519150601f19603f3d011682016040523d82523d6000602084013e6112f2565b606091505b509150915061130282828661130d565b979650505050505050565b6060831561131c575081610477565b82511561132c5782518084602001fd5b8160405162461bcd60e51b815260040161045b9190611372565b60005b83811015611361578181015183820152602001611349565b83811115610dac5750506000910152565b6020815260008251806020840152611391816040850160208701611346565b601f01601f19169190910160400192915050565b6001600160a01b03811681146104fc57600080fd5b600080604083850312156113cd57600080fd5b82356113d8816113a5565b946020939093013593505050565b6000806000606084860312156113fb57600080fd5b8335611406816113a5565b92506020840135611416816113a5565b929592945050506040919091013590565b60006020828403121561143957600080fd5b5035919050565b60006020828403121561145257600080fd5b8135610477816113a5565b600080600080600080600060e0888a03121561147857600080fd5b8735611483816113a5565b96506020880135611493816113a5565b95506040880135945060608801359350608088013560ff811681146114b757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156114e757600080fd5b82356114f2816113a5565b91506020830135611502816113a5565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082198211156115365761153661150d565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561158257600080fd5b5051919050565b600060001982141561159d5761159d61150d565b5060010190565b6000828210156115b6576115b661150d565b500390565b6000602082840312156115cd57600080fd5b8151801515811461047757600080fd5b600082516115ef818460208701611346565b919091019291505056fea2646970667358221220a4486c49958c991ab4d5964ab17dab1517dc2d1b633b9a735303e740b1de557064736f6c63430008090033
Deployed Bytecode Sourcemap
31437:2278:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32578:99;32650:19;;;;;;;;;;;;-1:-1:-1;;;32650:19:0;;;;32578:99;;;;;;;:::i;:::-;;;;;;;;16385:169;;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;16385:169:0;1121:187:1;15338:108:0;15426:12;;15338:108;;;1459:25:1;;;1447:2;1432:18;15338:108:0;1313:177:1;17036:492:0;;;;;;:::i;:::-;;:::i;31640:108::-;;31682:66;31640:108;;15180:93;;;15263:2;2280:36:1;;2268:2;2253:18;15180:93:0;2138:184:1;31497:31:0;;;;;;17937:215;;;;;;:::i;:::-;;:::i;32271:99::-;;;;;;:::i;:::-;;:::i;:::-;;30572:91;;;;;;:::i;:::-;;:::i;31400:29::-;;;;;-1:-1:-1;;;;;31400:29:0;;;;;;-1:-1:-1;;;;;2676:32:1;;;2658:51;;2646:2;2631:18;31400:29:0;2512:203:1;15509:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;15610:18:0;15583:7;15610:18;;;:9;:18;;;;;;;15509:127;29562:94;;;:::i;30982:368::-;;;;;;:::i;:::-;;:::i;31757:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;31859:404;;;:::i;32378:142::-;;;;;;:::i;:::-;;:::i;28911:87::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;28911:87;;32735:95;32809:13;;;;;;;;;;;;-1:-1:-1;;;32809:13:0;;;;32735:95;;18655:413;;;;;;:::i;:::-;;:::i;15849:175::-;;;;;;:::i;:::-;;:::i;32838:650::-;;;;;;:::i;:::-;;:::i;16087:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;16203:18:0;;;16176:7;16203:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;16087:151;29811:192;;;;;;:::i;:::-;;:::i;16385:169::-;16468:4;16485:39;8813:10;16508:7;16517:6;16485:8;:39::i;:::-;-1:-1:-1;16542:4:0;16385:169;;;;:::o;17036:492::-;17176:4;17193:36;17203:6;17211:9;17222:6;17193:9;:36::i;:::-;-1:-1:-1;;;;;17269:19:0;;17242:24;17269:19;;;:11;:19;;;;;;;;8813:10;17269:33;;;;;;;;17321:26;;;;17313:79;;;;-1:-1:-1;;;17313:79:0;;4667:2:1;17313:79:0;;;4649:21:1;4706:2;4686:18;;;4679:30;4745:34;4725:18;;;4718:62;-1:-1:-1;;;4796:18:1;;;4789:38;4844:19;;17313:79:0;;;;;;;;;17428:57;17437:6;8813:10;17478:6;17459:16;:25;17428:8;:57::i;:::-;17516:4;17509:11;;;17036:492;;;;;;:::o;17937:215::-;8813:10;18025:4;18074:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18074:34:0;;;;;;;;;;18025:4;;18042:80;;18065:7;;18074:47;;18111:10;;18074:47;:::i;:::-;18042:8;:80::i;32271:99::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;8813:10;29131:23;29123:68;;;;-1:-1:-1;;;29123:68:0;;;;;;;:::i;:::-;32343:19:::1;32349:3;32354:7;32343:5;:19::i;:::-;32271:99:::0;;:::o;30572:91::-;30628:27;8813:10;30648:6;30628:5;:27::i;:::-;30572:91;:::o;29562:94::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;8813:10;29131:23;29123:68;;;;-1:-1:-1;;;29123:68:0;;;;;;;:::i;:::-;29627:21:::1;29645:1;29627:9;:21::i;:::-;29562:94::o:0;30982:368::-;31059:24;31086:32;31096:7;8813:10;16087:151;:::i;31086:32::-;31059:59;;31157:6;31137:16;:26;;31129:75;;;;-1:-1:-1;;;31129:75:0;;5702:2:1;31129:75:0;;;5684:21:1;5741:2;5721:18;;;5714:30;5780:34;5760:18;;;5753:62;-1:-1:-1;;;5831:18:1;;;5824:34;5875:19;;31129:75:0;5500:400:1;31129:75:0;31240:58;31249:7;8813:10;31291:6;31272:16;:25;31240:8;:58::i;:::-;31320:22;31326:7;31335:6;31320:5;:22::i;:::-;31048:302;30982:368;;:::o;31859:404::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;8813:10;29131:23;29123:68;;;;-1:-1:-1;;;29123:68:0;;;;;;;:::i;:::-;32105:19:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;32105:19:0::1;::::0;;::::1;::::0;32154:10;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;32154:10:0;;::::1;::::0;31952:292;;31981:95:::1;31952:292:::0;;::::1;6164:25:1::0;32095:30:0;6205:18:1;;;6198:34;32144:21:0;6248:18:1;;;6241:34;32184:13:0::1;6291:18:1::0;;;6284:34;32224:4:0::1;6334:19:1::0;;;;6327:61;;;;31952:292:0;;;;;;;;;;6136:19:1;;;;31952:292:0;;;31928:327;;;::::1;::::0;31909:16:::1;:346:::0;31859:404::o;32378:142::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;8813:10;29131:23;29123:68;;;;-1:-1:-1;;;29123:68:0;;;;;;;:::i;:::-;32480:31:::1;::::0;-1:-1:-1;;;32480:31:0;;32505:4:::1;32480:31;::::0;::::1;2658:51:1::0;32437:75:0::1;::::0;32460:6;;32468:10:::1;::::0;-1:-1:-1;;;;;32480:16:0;::::1;::::0;::::1;::::0;2631:18:1;;32480:31:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32437:22;:75::i;18655:413::-:0;8813:10;18748:4;18792:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;18792:34:0;;;;;;;;;;18845:35;;;;18837:85;;;;-1:-1:-1;;;18837:85:0;;6790:2:1;18837:85:0;;;6772:21:1;6829:2;6809:18;;;6802:30;6868:34;6848:18;;;6841:62;-1:-1:-1;;;6919:18:1;;;6912:35;6964:19;;18837:85:0;6588:401:1;18837:85:0;18958:67;8813:10;18981:7;19009:15;18990:16;:34;18958:8;:67::i;:::-;-1:-1:-1;19056:4:0;;18655:413;-1:-1:-1;;;18655:413:0:o;15849:175::-;15935:4;15952:42;8813:10;15976:9;15987:6;15952:9;:42::i;32838:650::-;33060:15;33048:8;:27;;33040:53;;;;-1:-1:-1;;;33040:53:0;;7196:2:1;33040:53:0;;;7178:21:1;7235:2;7215:18;;;7208:30;-1:-1:-1;;;7254:18:1;;;7247:43;7307:18;;33040:53:0;6994:337:1;33040:53:0;33160:16;;-1:-1:-1;;;;;33239:13:0;;33104:14;33239:13;;;:6;:13;;;;;:15;;33104:14;;33160:16;31682:66;;33216:5;;33223:7;;33232:5;;33239:15;33104:14;33239:15;;;:::i;:::-;;;;-1:-1:-1;33188:77:0;;;;;;7763:25:1;;;;-1:-1:-1;;;;;7862:15:1;;;7842:18;;;7835:43;7914:15;;;;7894:18;;;7887:43;7946:18;;;7939:34;7989:19;;;7982:35;8033:19;;;8026:35;;;7735:19;;33188:77:0;;;;;;;;;;;;33178:88;;;;;;33131:136;;;;;;;;-1:-1:-1;;;8330:27:1;;8382:1;8373:11;;8366:27;;;;8418:2;8409:12;;8402:28;8455:2;8446:12;;8072:392;33131:136:0;;;;-1:-1:-1;;33131:136:0;;;;;;;;;33121:147;;33131:136;33121:147;;;;33279:24;33306:26;;;;;;;;;8696:25:1;;;8769:4;8757:17;;8737:18;;;8730:45;;;;8791:18;;;8784:34;;;8834:18;;;8827:34;;;33121:147:0;;-1:-1:-1;33279:24:0;33306:26;;8668:19:1;;33306:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33306:26:0;;-1:-1:-1;;33306:26:0;;;-1:-1:-1;;;;;;;33351:30:0;;;;;;:59;;;33405:5;-1:-1:-1;;;;;33385:25:0;:16;-1:-1:-1;;;;;33385:25:0;;33351:59;33343:95;;;;-1:-1:-1;;;33343:95:0;;9074:2:1;33343:95:0;;;9056:21:1;9113:2;9093:18;;;9086:30;9152:25;9132:18;;;9125:53;9195:18;;33343:95:0;8872:347:1;33343:95:0;33449:31;33458:5;33465:7;33474:5;33449:8;:31::i;:::-;33029:459;;32838:650;;;;;;;:::o;29811:192::-;28957:7;28984:6;-1:-1:-1;;;;;28984:6:0;8813:10;29131:23;29123:68;;;;-1:-1:-1;;;29123:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29900:22:0;::::1;29892:73;;;::::0;-1:-1:-1;;;29892:73:0;;9426:2:1;29892:73:0::1;::::0;::::1;9408:21:1::0;9465:2;9445:18;;;9438:30;9504:34;9484:18;;;9477:62;-1:-1:-1;;;9555:18:1;;;9548:36;9601:19;;29892:73:0::1;9224:402:1::0;29892:73:0::1;29976:19;29986:8;29976:9;:19::i;22339:380::-:0;-1:-1:-1;;;;;22475:19:0;;22467:68;;;;-1:-1:-1;;;22467:68:0;;9833:2:1;22467:68:0;;;9815:21:1;9872:2;9852:18;;;9845:30;9911:34;9891:18;;;9884:62;-1:-1:-1;;;9962:18:1;;;9955:34;10006:19;;22467:68:0;9631:400:1;22467:68:0;-1:-1:-1;;;;;22554:21:0;;22546:68;;;;-1:-1:-1;;;22546:68:0;;10238:2:1;22546:68:0;;;10220:21:1;10277:2;10257:18;;;10250:30;10316:34;10296:18;;;10289:62;-1:-1:-1;;;10367:18:1;;;10360:32;10409:19;;22546:68:0;10036:398:1;22546:68:0;-1:-1:-1;;;;;22627:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22679:32;;1459:25:1;;;22679:32:0;;1432:18:1;22679:32:0;;;;;;;22339:380;;;:::o;19558:733::-;-1:-1:-1;;;;;19698:20:0;;19690:70;;;;-1:-1:-1;;;19690:70:0;;10641:2:1;19690:70:0;;;10623:21:1;10680:2;10660:18;;;10653:30;10719:34;10699:18;;;10692:62;-1:-1:-1;;;10770:18:1;;;10763:35;10815:19;;19690:70:0;10439:401:1;19690:70:0;-1:-1:-1;;;;;19779:23:0;;19771:71;;;;-1:-1:-1;;;19771:71:0;;11047:2:1;19771:71:0;;;11029:21:1;11086:2;11066:18;;;11059:30;11125:34;11105:18;;;11098:62;-1:-1:-1;;;11176:18:1;;;11169:33;11219:19;;19771:71:0;10845:399:1;19771:71:0;19855:47;19876:6;19884:9;19895:6;19855:20;:47::i;:::-;-1:-1:-1;;;;;19939:17:0;;19915:21;19939:17;;;:9;:17;;;;;;19975:23;;;;19967:74;;;;-1:-1:-1;;;19967:74:0;;11451:2:1;19967:74:0;;;11433:21:1;11490:2;11470:18;;;11463:30;11529:34;11509:18;;;11502:62;-1:-1:-1;;;11580:18:1;;;11573:36;11626:19;;19967:74:0;11249:402:1;19967:74:0;-1:-1:-1;;;;;20077:17:0;;;;;;;:9;:17;;;;;;20097:22;;;20077:42;;20141:20;;;;;;;;:30;;20113:6;;20077:17;20141:30;;20113:6;;20141:30;:::i;:::-;;;;;;;;20206:9;-1:-1:-1;;;;;20189:35:0;20198:6;-1:-1:-1;;;;;20189:35:0;;20217:6;20189:35;;;;1459:25:1;;1447:2;1432:18;;1313:177;20189:35:0;;;;;;;;20237:46;19679:612;19558:733;;;:::o;20578:399::-;-1:-1:-1;;;;;20662:21:0;;20654:65;;;;-1:-1:-1;;;20654:65:0;;11858:2:1;20654:65:0;;;11840:21:1;11897:2;11877:18;;;11870:30;11936:33;11916:18;;;11909:61;11987:18;;20654:65:0;11656:355:1;20654:65:0;20732:49;20761:1;20765:7;20774:6;20732:20;:49::i;:::-;20810:6;20794:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;20827:18:0;;;;;;:9;:18;;;;;:28;;20849:6;;20827:18;:28;;20849:6;;20827:28;:::i;:::-;;;;-1:-1:-1;;20871:37:0;;1459:25:1;;;-1:-1:-1;;;;;20871:37:0;;;20888:1;;20871:37;;1447:2:1;1432:18;20871:37:0;;;;;;;32271:99;;:::o;21310:591::-;-1:-1:-1;;;;;21394:21:0;;21386:67;;;;-1:-1:-1;;;21386:67:0;;12218:2:1;21386:67:0;;;12200:21:1;12257:2;12237:18;;;12230:30;12296:34;12276:18;;;12269:62;-1:-1:-1;;;12347:18:1;;;12340:31;12388:19;;21386:67:0;12016:397:1;21386:67:0;21466:49;21487:7;21504:1;21508:6;21466:20;:49::i;:::-;-1:-1:-1;;;;;21553:18:0;;21528:22;21553:18;;;:9;:18;;;;;;21590:24;;;;21582:71;;;;-1:-1:-1;;;21582:71:0;;12620:2:1;21582:71:0;;;12602:21:1;12659:2;12639:18;;;12632:30;12698:34;12678:18;;;12671:62;-1:-1:-1;;;12749:18:1;;;12742:32;12791:19;;21582:71:0;12418:398:1;21582:71:0;-1:-1:-1;;;;;21689:18:0;;;;;;:9;:18;;;;;21710:23;;;21689:44;;21755:12;:22;;21727:6;;21689:18;21755:22;;21727:6;;21755:22;:::i;:::-;;;;-1:-1:-1;;21795:37:0;;1459:25:1;;;21821:1:0;;-1:-1:-1;;;;;21795:37:0;;;;;1447:2:1;1432:18;21795:37:0;;;;;;;31048:302;30982:368;;:::o;30011:173::-;30067:16;30086:6;;-1:-1:-1;;;;;30103:17:0;;;-1:-1:-1;;;;;;30103:17:0;;;;;;30136:40;;30086:6;;;;;;;30136:40;;30067:16;30136:40;30056:128;30011:173;:::o;24705:211::-;24849:58;;;-1:-1:-1;;;;;13143:32:1;;24849:58:0;;;13125:51:1;13192:18;;;;13185:34;;;24849:58:0;;;;;;;;;;13098:18:1;;;;24849:58:0;;;;;;;;-1:-1:-1;;;;;24849:58:0;-1:-1:-1;;;24849:58:0;;;24822:86;;24842:5;;24822:19;:86::i;33496:216::-;-1:-1:-1;;;;;33647:19:0;;33661:4;33647:19;;33639:65;;;;-1:-1:-1;;;33639:65:0;;13432:2:1;33639:65:0;;;13414:21:1;13471:2;13451:18;;;13444:30;13510:34;13490:18;;;13483:62;-1:-1:-1;;;13561:18:1;;;13554:31;13602:19;;33639:65:0;13230:397:1;27278:716:0;27702:23;27728:69;27756:4;27728:69;;;;;;;;;;;;;;;;;27736:5;-1:-1:-1;;;;;27728:27:0;;;:69;;;;;:::i;:::-;27812:17;;27702:95;;-1:-1:-1;27812:21:0;27808:179;;27909:10;27898:30;;;;;;;;;;;;:::i;:::-;27890:85;;;;-1:-1:-1;;;27890:85:0;;14116:2:1;27890:85:0;;;14098:21:1;14155:2;14135:18;;;14128:30;14194:34;14174:18;;;14167:62;-1:-1:-1;;;14245:18:1;;;14238:40;14295:19;;27890:85:0;13914:406:1;3668:229:0;3805:12;3837:52;3859:6;3867:4;3873:1;3876:12;3837:21;:52::i;:::-;3830:59;3668:229;-1:-1:-1;;;;3668:229:0:o;4788:510::-;4958:12;5016:5;4991:21;:30;;4983:81;;;;-1:-1:-1;;;4983:81:0;;14527:2:1;4983:81:0;;;14509:21:1;14566:2;14546:18;;;14539:30;14605:34;14585:18;;;14578:62;-1:-1:-1;;;14656:18:1;;;14649:36;14702:19;;4983:81:0;14325:402:1;4983:81:0;1185:20;;5075:60;;;;-1:-1:-1;;;5075:60:0;;14934:2:1;5075:60:0;;;14916:21:1;14973:2;14953:18;;;14946:30;15012:31;14992:18;;;14985:59;15061:18;;5075:60:0;14732:353:1;5075:60:0;5149:12;5163:23;5190:6;-1:-1:-1;;;;;5190:11:0;5209:5;5216:4;5190:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5148:73;;;;5239:51;5256:7;5265:10;5277:12;5239:16;:51::i;:::-;5232:58;4788:510;-1:-1:-1;;;;;;;4788:510:0:o;7474:712::-;7624:12;7653:7;7649:530;;;-1:-1:-1;7684:10:0;7677:17;;7649:530;7798:17;;:21;7794:374;;7996:10;7990:17;8057:15;8044:10;8040:2;8036:19;8029:44;7794:374;8139:12;8132:20;;-1:-1:-1;;;8132:20:0;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;801:315;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1495:456::-;1572:6;1580;1588;1641:2;1629:9;1620:7;1616:23;1612:32;1609:52;;;1657:1;1654;1647:12;1609:52;1696:9;1683:23;1715:31;1740:5;1715:31;:::i;:::-;1765:5;-1:-1:-1;1822:2:1;1807:18;;1794:32;1835:33;1794:32;1835:33;:::i;:::-;1495:456;;1887:7;;-1:-1:-1;;;1941:2:1;1926:18;;;;1913:32;;1495:456::o;2327:180::-;2386:6;2439:2;2427:9;2418:7;2414:23;2410:32;2407:52;;;2455:1;2452;2445:12;2407:52;-1:-1:-1;2478:23:1;;2327:180;-1:-1:-1;2327:180:1:o;2720:247::-;2779:6;2832:2;2820:9;2811:7;2807:23;2803:32;2800:52;;;2848:1;2845;2838:12;2800:52;2887:9;2874:23;2906:31;2931:5;2906:31;:::i;3238:829::-;3349:6;3357;3365;3373;3381;3389;3397;3450:3;3438:9;3429:7;3425:23;3421:33;3418:53;;;3467:1;3464;3457:12;3418:53;3506:9;3493:23;3525:31;3550:5;3525:31;:::i;:::-;3575:5;-1:-1:-1;3632:2:1;3617:18;;3604:32;3645:33;3604:32;3645:33;:::i;:::-;3697:7;-1:-1:-1;3751:2:1;3736:18;;3723:32;;-1:-1:-1;3802:2:1;3787:18;;3774:32;;-1:-1:-1;3858:3:1;3843:19;;3830:33;3907:4;3894:18;;3882:31;;3872:59;;3927:1;3924;3917:12;3872:59;3238:829;;;;-1:-1:-1;3238:829:1;;;;3950:7;4004:3;3989:19;;3976:33;;-1:-1:-1;4056:3:1;4041:19;;;4028:33;;3238:829;-1:-1:-1;;3238:829:1:o;4072:388::-;4140:6;4148;4201:2;4189:9;4180:7;4176:23;4172:32;4169:52;;;4217:1;4214;4207:12;4169:52;4256:9;4243:23;4275:31;4300:5;4275:31;:::i;:::-;4325:5;-1:-1:-1;4382:2:1;4367:18;;4354:32;4395:33;4354:32;4395:33;:::i;:::-;4447:7;4437:17;;;4072:388;;;;;:::o;4874:127::-;4935:10;4930:3;4926:20;4923:1;4916:31;4966:4;4963:1;4956:15;4990:4;4987:1;4980:15;5006:128;5046:3;5077:1;5073:6;5070:1;5067:13;5064:39;;;5083:18;;:::i;:::-;-1:-1:-1;5119:9:1;;5006:128::o;5139:356::-;5341:2;5323:21;;;5360:18;;;5353:30;5419:34;5414:2;5399:18;;5392:62;5486:2;5471:18;;5139:356::o;6399:184::-;6469:6;6522:2;6510:9;6501:7;6497:23;6493:32;6490:52;;;6538:1;6535;6528:12;6490:52;-1:-1:-1;6561:16:1;;6399:184;-1:-1:-1;6399:184:1:o;7336:135::-;7375:3;-1:-1:-1;;7396:17:1;;7393:43;;;7416:18;;:::i;:::-;-1:-1:-1;7463:1:1;7452:13;;7336:135::o;12821:125::-;12861:4;12889:1;12886;12883:8;12880:34;;;12894:18;;:::i;:::-;-1:-1:-1;12931:9:1;;12821:125::o;13632:277::-;13699:6;13752:2;13740:9;13731:7;13727:23;13723:32;13720:52;;;13768:1;13765;13758:12;13720:52;13800:9;13794:16;13853:5;13846:13;13839:21;13832:5;13829:32;13819:60;;13875:1;13872;13865:12;15090:274;15219:3;15257:6;15251:13;15273:53;15319:6;15314:3;15307:4;15299:6;15295:17;15273:53;:::i;:::-;15342:16;;;;;15090:274;-1:-1:-1;;15090:274:1:o
Swarm Source
ipfs://a4486c49958c991ab4d5964ab17dab1517dc2d1b633b9a735303e740b1de5570
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.