ERC-20
Gaming
Overview
Max Total Supply
5,000,000,000 GFOX
Holders
3,957 ( 0.025%)
Market
Price
$0.00 @ 0.000000 ETH (+0.52%)
Onchain Market Cap
$702,637.32
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
GalaxyFox
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2024-01-25 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; string constant NAME = "Galaxy Fox"; string constant SYMBOL = "GFOX"; uint256 constant INITIAL_SUPPLY = 5000000000 * 10 ** 18; uint16 constant BUY_TAX_LIQUIDIY = 200; // 2% uint16 constant BUY_TAX_MARKETING = 200; // 2% uint16 constant BUY_TAX_ECOSYSTEM = 200; // 2% uint16 constant SELL_TAX_LIQUIDIY = 200; // 2% uint16 constant SELL_TAX_MARKETING = 200; // 2% uint16 constant SELL_TAX_ECOSYSTEM = 200; // 2% 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); } 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); } abstract contract Context { 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; } } 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); } // // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * 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 ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the 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) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `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) { 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 { 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 { 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); } } } } interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall( address target, bytes memory data ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall( address target, bytes memory data ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall( address target, bytes memory data ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult( bool success, bytes memory returndata ) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) /** * @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; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance( address spender, uint256 currentAllowance, uint256 requestedDecrease ); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeCall(token.transferFrom, (from, to, value)) ); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance( IERC20 token, address spender, uint256 requestedDecrease ) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance( spender, currentAllowance, requestedDecrease ); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove( IERC20 token, address spender, uint256 value ) internal { bytes memory approvalCall = abi.encodeCall( token.approve, (spender, value) ); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn( token, abi.encodeCall(token.approve, (spender, 0)) ); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool( IERC20 token, bytes memory data ) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function swapTokensForExactETH( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapETHForExactTokens( uint amountOut, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); function quote( uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB); function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut ) external pure returns (uint amountOut); function getAmountIn( uint amountOut, uint reserveIn, uint reserveOut ) external pure returns (uint amountIn); function getAmountsOut( uint amountIn, address[] calldata path ) external view returns (uint[] memory amounts); function getAmountsIn( uint amountOut, address[] calldata path ) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance( address owner, address spender ) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom( address from, address to, uint value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn( address indexed sender, uint amount0, uint amount1, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // // Uncomment this line to use console.log // import "hardhat/console.sol"; // 5% uint256 constant TAX_BASE = 10000; uint256 constant MAX_TAX = 2000; // 20% uint256 constant DAY = 1 days; struct Tax { uint16 liquidity; uint16 marketing; uint16 ecosystem; } interface IUniFactory { function createPair( address tokenA, address tokenB ) external returns (address pair); } contract GalaxyFox is ERC20, Ownable { using SafeERC20 for IERC20; Tax public buyTax = Tax(BUY_TAX_LIQUIDIY, BUY_TAX_MARKETING, BUY_TAX_ECOSYSTEM); // 6 bytes Tax public sellTax = Tax(SELL_TAX_LIQUIDIY, SELL_TAX_MARKETING, SELL_TAX_ECOSYSTEM); // 6 bytes address payable public liquidityHolder; // 20 bytes address payable public marketingHolder; // 20 bytes address payable public ecosystemHolder; // 20 bytes bool public taxEnabled = false; IUniFactory public immutable uniFactory; // 20 bytes IUniswapV2Router02 public immutable uniRouter; // 20 bytes address public immutable weth; // 20 bytes address public immutable uniPair; // 20 bytes mapping(address => bool) public isExcludedFromFee; mapping(address => bool) public isPair; mapping(address => mapping(uint256 => uint256)) public volume; mapping(address => bool) public isExcludedFromDailyVolume; uint256 public maxDailyVolume = INITIAL_SUPPLY / 1000; uint256 public liquidityReserves; uint256 public miniBeforeLiquify; event TaxEnabled(bool enabled); event ExeededFromFee(address account, bool excluded); event Pair(address pair, bool isPair); event EcosystemHolder(address oldHolder, address holder); event MarketingHolder(address oldHolder, address holder); event LiquidityHolder(address oldHolder, address holder); event SellTaxChanged(uint16 liquidity, uint16 marketing, uint16 ecosystem); event BuyTaxChanged(uint16 liquidity, uint16 marketing, uint16 ecosystem); event ExcludedFromDailyVolume(address account, bool excluded); event MaxDailyVolumeChanged(uint256 maxDailyVolume); event MiniBeforeLiquifyChanged(uint256 miniBeforeLiquifyArg); constructor( // to allow for easy testing/deploy on behalf of someone else address _ownerArg, address payable _ecosystemHolder, address payable _marketingHolder, address payable _liquidityHolder, IUniswapV2Router02 _uniswapV2Router, IUniFactory _uniswapV2Factory ) ERC20(NAME, SYMBOL) Ownable(_ownerArg) { _mint(_ownerArg, INITIAL_SUPPLY); require( _ecosystemHolder != address(0), "GalaxyFox: ecosystem holder is the zero address" ); ecosystemHolder = _ecosystemHolder; require( _marketingHolder != address(0), "GalaxyFox: marketing holder is the zero address" ); marketingHolder = _marketingHolder; require( _liquidityHolder != address(0), "GalaxyFox: liquidity holder is the zero address" ); liquidityHolder = _liquidityHolder; uniRouter = _uniswapV2Router; uniFactory = _uniswapV2Factory; weth = _uniswapV2Router.WETH(); // Create a uniswap pair for this new token uniPair = _uniswapV2Factory.createPair(address(this), weth); // approve token transfer to cover all future transfereFrom calls _approve(address(this), address(_uniswapV2Router), type(uint256).max); isPair[uniPair] = true; isExcludedFromFee[address(this)] = true; isExcludedFromFee[_ownerArg] = true; isExcludedFromDailyVolume[_ownerArg] = true; isExcludedFromDailyVolume[uniPair] = true; isExcludedFromDailyVolume[address(this)] = true; } receive() external payable { // only receive from router require(msg.sender == address(uniRouter), "Invalid sender"); } /** * @notice Transfers tokens to a recipient * @param recipient address to send the tokens to * @param amount amount of tokens to send */ function transfer( address recipient, uint256 amount ) public virtual override returns (bool) { _customTransfer(_msgSender(), recipient, amount); return true; } /** * @notice Transfers tokens from a sender to a recipient (requires approval) * @param sender address to send the tokens from * @param recipient address to send the tokens to * @param amount amount of tokens to send */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { uint256 allowance = allowance(sender, _msgSender()); require(amount <= allowance, "Transfer amount exceeds allowance"); // overflow is checked above unchecked { // decrease allowance if not max approved if (allowance < type(uint256).max) _approve(sender, _msgSender(), allowance - amount, true); } _customTransfer(sender, recipient, amount); return true; } function _customTransfer( address sender, address recipient, uint256 amount ) internal { if (sender != uniPair) _liquify(); if ( !taxEnabled || isExcludedFromFee[sender] || isExcludedFromFee[recipient] || (!isPair[recipient] && !isPair[sender]) || inswap == 1 ) { _transfer(sender, recipient, amount); } else { Tax memory tax = isPair[recipient] ? buyTax : sellTax; // buy uint256 marketingTax = (amount * tax.marketing) / TAX_BASE; uint256 ecosystemTax = (amount * tax.ecosystem) / TAX_BASE; uint256 liquidityTax = (amount * tax.liquidity) / TAX_BASE; if (ecosystemTax > 0) _transfer(sender, ecosystemHolder, ecosystemTax); if (marketingTax > 0) _transfer(sender, marketingHolder, marketingTax); _transfer( sender, recipient, amount - marketingTax - ecosystemTax - liquidityTax ); if (liquidityTax > 0) { liquidityReserves += liquidityTax; _transfer(sender, address(this), liquidityTax); } } // DAY is constant so no division by 0 // volume can't overflow if we reached this point (balance check) unchecked { // loss of precision is wanted here uint256 period = block.timestamp / DAY; volume[sender][period] += amount; require( volume[sender][period] <= maxDailyVolume || isExcludedFromDailyVolume[sender], "GalaxyFox: max daily volume exceeded" ); } } /** * @notice Enable or disable taxes * @param taxEnabledArg true to enable tax, false to disable */ function setTaxEnabled(bool taxEnabledArg) public onlyOwner { require(taxEnabled != taxEnabledArg, "GalaxyFox: already set"); taxEnabled = taxEnabledArg; emit TaxEnabled(taxEnabledArg); } /** * @notice Sets the minimum amount of tokens that must be in the contract before liquifying * @param miniBeforeLiquifyArg The minimum amount of tokens that must be in the contract before liquifying */ function setMiniBeforeLiquify( uint256 miniBeforeLiquifyArg ) public onlyOwner { require( miniBeforeLiquifyArg != miniBeforeLiquify, "GalaxyFox: already set" ); miniBeforeLiquify = miniBeforeLiquifyArg; emit MiniBeforeLiquifyChanged(miniBeforeLiquifyArg); } /** * @notice sets whether an address is excluded from fees or not * @param account The address to exclude/include from fees * @param excluded true to exclude, false to include */ function setExcludedFromFee( address account, bool excluded ) public onlyOwner { require( isExcludedFromFee[account] != excluded, "GalaxyFox: already set" ); isExcludedFromFee[account] = excluded; emit ExeededFromFee(account, excluded); } /** * @notice declare if an address is an lp pair or not * @param pair address of the LP Pool * @param isPairArg true if the address is a pair, false otherwise */ function setPair(address pair, bool isPairArg) public onlyOwner { require(isPair[pair] != isPairArg, "GalaxyFox: already set"); isPair[pair] = isPairArg; emit Pair(pair, isPairArg); } /** * @dev sets the ecosystem holder address * @param _ecosystemHolder The address of the ecosystem holder */ function setEcosystemHolder( address payable _ecosystemHolder ) public onlyOwner { require(_ecosystemHolder != ecosystemHolder, "GalaxyFox: already set"); require(_ecosystemHolder != address(0), "GalaxyFox: zero address"); ecosystemHolder = _ecosystemHolder; emit EcosystemHolder(ecosystemHolder, _ecosystemHolder); } /** * @dev Sets the marketing holder address * @param _marketingHolder The address of the marketing holder */ function setMarketingHolder( address payable _marketingHolder ) public onlyOwner { require(_marketingHolder != marketingHolder, "GalaxyFox: already set"); require(_marketingHolder != address(0), "GalaxyFox: zero address"); marketingHolder = _marketingHolder; emit MarketingHolder(marketingHolder, _marketingHolder); } /** * @dev Sets the liquidity holder address * @param _liquidityHolder The address of the liquidity holder */ function setLiquidityHolder( address payable _liquidityHolder ) public onlyOwner { require(_liquidityHolder != liquidityHolder, "GalaxyFox: already set"); require(_liquidityHolder != address(0), "GalaxyFox: zero address"); liquidityHolder = _liquidityHolder; emit LiquidityHolder(liquidityHolder, _liquidityHolder); } /** * @dev Changes the tax on buys * @param _liquidity liquidity tax in basis points * @param _marketing marketing tax in basis points * @param _ecosystem ecosystem tax in basis points */ function setSellTax( uint16 _liquidity, uint16 _marketing, uint16 _ecosystem ) public onlyOwner { require( _liquidity + _marketing + _ecosystem <= MAX_TAX, "GalaxyFox: tax too high" ); sellTax = Tax(_liquidity, _marketing, _ecosystem); emit SellTaxChanged(_liquidity, _marketing, _ecosystem); } /** * @dev Changes the tax on sells * @param _liquidity liquidity tax in basis points * @param _marketing marketing tax in basis points * @param _ecosystem ecosystem tax in basis points */ function setBuyTax( uint16 _liquidity, uint16 _marketing, uint16 _ecosystem ) public onlyOwner { require( _liquidity + _marketing + _ecosystem <= MAX_TAX, "GalaxyFox: tax too high" ); buyTax = Tax(_liquidity, _marketing, _ecosystem); emit BuyTaxChanged(_liquidity, _marketing, _ecosystem); } /** * @notice Burns tokens from the caller * @param amount amount of tokens to burn */ function burn(uint256 amount) public { _burn(msg.sender, amount); } /** * @notice Recovers lost tokens or ETH, doesn't include the liquidity reserves * @param tokenAddress address of the token to recover */ function recoverLostTokens(address tokenAddress) public onlyOwner { if (tokenAddress != address(this)) { uint256 tokenAmount = tokenAddress != address(0) ? IERC20(tokenAddress).balanceOf(address(this)) : address(this).balance; if (tokenAmount > 0 && tokenAddress != address(0)) { IERC20(tokenAddress).safeTransfer(msg.sender, tokenAmount); } else if (tokenAmount > 0) { (bool success, ) = payable(msg.sender).call{value: tokenAmount}( "" ); require(success, "Failed to send Ether"); } } else { uint256 tokenAmount = balanceOf(address(this)) - liquidityReserves; _transfer(address(this), msg.sender, tokenAmount); } } /** * @notice Sets whether an address is excluded from maxDailyVolume or not * @param account account to be included/excluded from maxDailyVolume * @param excluded true to exclude, false to include */ function setExludedFromDailyVolume( address account, bool excluded ) public onlyOwner { require( isExcludedFromDailyVolume[account] != excluded, "GalaxyFox: already set" ); isExcludedFromDailyVolume[account] = excluded; emit ExcludedFromDailyVolume(account, excluded); } /** * @notice Sets the max daily volume max is 0.1% of the total supply * @param maxDailyVolumeArg The new max daily volume */ function setMaxDailyVolume(uint256 maxDailyVolumeArg) public onlyOwner { require(maxDailyVolumeArg != maxDailyVolume, "GalaxyFox: already set"); // require that the max daily volume is at least 0.1% of the total supply require( maxDailyVolumeArg >= totalSupply() / 1000, "GalaxyFox: max daily volume too low" ); maxDailyVolume = maxDailyVolumeArg; emit MaxDailyVolumeChanged(maxDailyVolumeArg); } // using uint256 is cheaper than using bool // because there will be no extra work to read it // sunce when used we always return it back to 0 // it will trigger a refund uint256 inswap = 0; /** * @notice creates lp from the liquidity reserves */ function liquify() external onlyOwner { _liquify(); } function _liquify() private { if (inswap == 1) return; if (liquidityReserves > miniBeforeLiquify) { inswap = 1; // get reserves from pair (uint256 reserves0, uint256 reserves1, ) = IUniswapV2Pair(uniPair) .getReserves(); // Check Uniswap library sortTokens (token0 < token1) uint256 tokenReserves = address(this) < weth ? reserves0 : reserves1; // swap capped at 10% of the reserves which is tecnically 5% because we only swap half uint256 maxToSwap = (tokenReserves * 10) / 100; uint256 toswap = liquidityReserves > maxToSwap ? maxToSwap : liquidityReserves; uint256 half = toswap / 2; // avoids precision loss uint256 otherHalf = toswap - half; _swapTokensForEth(half); uint256 newBalance = address(this).balance; _addLiquidity(otherHalf, newBalance); liquidityReserves -= toswap; inswap = 0; } } function _swapTokensForEth(uint256 tokenAmount) internal { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = weth; // make the swap safely, do not revert if swap fails try uniRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ) {} catch {} } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal { // do not revert if addlp fails try uniRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, liquidityHolder, block.timestamp ) {} catch {} } }
Contract Security Audit
- Cyberscope- May 17th, 2024 - Security Audit Report
[{"inputs":[{"internalType":"address","name":"_ownerArg","type":"address"},{"internalType":"address payable","name":"_ecosystemHolder","type":"address"},{"internalType":"address payable","name":"_marketingHolder","type":"address"},{"internalType":"address payable","name":"_liquidityHolder","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"_uniswapV2Router","type":"address"},{"internalType":"contract IUniFactory","name":"_uniswapV2Factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"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":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","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":"uint16","name":"liquidity","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketing","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"ecosystem","type":"uint16"}],"name":"BuyTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"EcosystemHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludedFromDailyVolume","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExeededFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"LiquidityHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldHolder","type":"address"},{"indexed":false,"internalType":"address","name":"holder","type":"address"}],"name":"MarketingHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxDailyVolume","type":"uint256"}],"name":"MaxDailyVolumeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"miniBeforeLiquifyArg","type":"uint256"}],"name":"MiniBeforeLiquifyChanged","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":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"isPair","type":"bool"}],"name":"Pair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"liquidity","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketing","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"ecosystem","type":"uint16"}],"name":"SellTaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","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":[{"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"ecosystem","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ecosystemHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromDailyVolume","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingHolder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDailyVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miniBeforeLiquify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverLostTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"ecosystem","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidity","type":"uint16"},{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_ecosystem","type":"uint16"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ecosystemHolder","type":"address"}],"name":"setEcosystemHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExludedFromDailyVolume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_liquidityHolder","type":"address"}],"name":"setLiquidityHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_marketingHolder","type":"address"}],"name":"setMarketingHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxDailyVolumeArg","type":"uint256"}],"name":"setMaxDailyVolume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"miniBeforeLiquifyArg","type":"uint256"}],"name":"setMiniBeforeLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"isPairArg","type":"bool"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidity","type":"uint16"},{"internalType":"uint16","name":"_marketing","type":"uint16"},{"internalType":"uint16","name":"_ecosystem","type":"uint16"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"taxEnabledArg","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"inputs":[],"name":"uniFactory","outputs":[{"internalType":"contract IUniFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"volume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c86101008190526101208190526101408190526006805464c800c800c865ffffffffffff1991821681179092556101c06040526101608390526101808390526101a09290925260078054909216179055600a805460ff60a01b19169055620000776103e86b1027e72f1f128130880000006200073a565b600f555f6012553480156200008a575f80fd5b5060405162002dea38038062002dea833981016040819052620000ad9162000772565b856040518060400160405280600a81526020016908ec2d8c2f0f2408cdef60b31b8152506040518060400160405280600481526020016308e8c9eb60e31b8152508160039081620000ff91906200089f565b5060046200010e82826200089f565b5050506001600160a01b0381166200014057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6200014b8162000491565b5062000164866b1027e72f1f12813088000000620004e2565b6001600160a01b038516620001d45760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a2065636f73797374656d20686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600a80546001600160a01b0319166001600160a01b038781169190911790915584166200025c5760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a206d61726b6574696e6720686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600980546001600160a01b0319166001600160a01b03868116919091179091558316620002e45760405162461bcd60e51b815260206004820152602f60248201527f47616c617879466f783a206c697175696469747920686f6c646572206973207460448201526e6865207a65726f206164647265737360881b606482015260840162000137565b600880546001600160a01b0319166001600160a01b038581169190911790915582811660a0819052908216608052604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa1580156200034c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200037291906200096b565b6001600160a01b0390811660c08190526040516364e329cb60e11b815230600482015260248101919091529082169063c9c65396906044016020604051808303815f875af1158015620003c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003ed91906200096b565b6001600160a01b031660e0526200040730835f196200051e565b505060e0516001600160a01b039081165f818152600c602090815260408083208054600160ff19918216811790925530808652600b855283862080548316841790559a90961684528184208054871682179055600e9092528083208054861683179055928252828220805485168217905596815220805490911690941790935550620009b6915050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166200050d5760405163ec442f0560e01b81525f600482015260240162000137565b6200051a5f838362000532565b5050565b6200052d838383600162000661565b505050565b6001600160a01b03831662000560578060025f82825462000554919062000990565b90915550620005d29050565b6001600160a01b0383165f9081526020819052604090205481811015620005b45760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000137565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620005f0576002805482900390556200060e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200065491815260200190565b60405180910390a3505050565b6001600160a01b0384166200068c5760405163e602df0560e01b81525f600482015260240162000137565b6001600160a01b038316620006b757604051634a1406b160e11b81525f600482015260240162000137565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156200073457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200072b91815260200190565b60405180910390a35b50505050565b5f826200075557634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146200076f575f80fd5b50565b5f805f805f8060c0878903121562000788575f80fd5b865162000795816200075a565b6020880151909650620007a8816200075a565b6040880151909550620007bb816200075a565b6060880151909450620007ce816200075a565b6080880151909350620007e1816200075a565b60a0880151909250620007f4816200075a565b809150509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200082b57607f821691505b6020821081036200084a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200052d57805f5260205f20601f840160051c81016020851015620008775750805b601f840160051c820191505b8181101562000898575f815560010162000883565b5050505050565b81516001600160401b03811115620008bb57620008bb62000802565b620008d381620008cc845462000816565b8462000850565b602080601f83116001811462000909575f8415620008f15750858301515b5f19600386901b1c1916600185901b17855562000963565b5f85815260208120601f198616915b82811015620009395788860151825594840194600190910190840162000918565b50858210156200095757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156200097c575f80fd5b815162000989816200075a565b9392505050565b80820180821115620009b057634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05160e0516123cf62000a1b5f395f81816103e901528181611527015261197d01525f818161043401528181611a170152611ca601525f81816102670152818161069e01528181611cfd0152611daf01525f6105fb01526123cf5ff3fe608060405260043610610257575f3560e01c806386a22eff1161013f578063c6af580b116100b3578063d8286d7911610078578063d8286d791461081e578063dd62ed3e1461083d578063e5e31b1314610881578063e78f6ceb146108af578063ee8ce789146108ce578063f2fde38b146108ed575f80fd5b8063c6af580b14610787578063c9a88338146107a6578063cb9598c3146107c5578063cc1776d3146107d9578063cec1b34414610809575f80fd5b8063a572c78b11610104578063a572c78b146106c0578063a70c1aba146106df578063a9059cbb14610715578063b9e8ce2c14610734578063c169306e14610753578063c26a564514610768575f80fd5b806386a22eff1461061d578063870bd30b1461063c5780638da5cb5b1461065c57806395d89b4114610679578063a0e47bf61461068d575f80fd5b806342966c68116101d657806356da87bc1161019b57806356da87bc146105455780635c3f2f4a146105645780636612e66f1461058357806370a08231146105a2578063715018a6146105d657806376771d4b146105ea575f80fd5b806342966c6814610456578063435fff271461047557806344f1ca37146104945780634f7041a5146104c25780635342acb414610517575f80fd5b806318160ddd1161021c57806318160ddd1461038a57806323b872dd1461039e578063313ce567146103bd57806332972e46146103d85780633fc8cef314610423575f80fd5b806306fdde03146102d057806307df2f18146102fa578063095ea7b31461031d5780630c3266641461034c5780631472c83d1461036b575f80fd5b366102cc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102ca5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b60448201526064015b60405180910390fd5b005b5f80fd5b3480156102db575f80fd5b506102e461090c565b6040516102f19190611f48565b60405180910390f35b348015610305575f80fd5b5061030f600f5481565b6040519081526020016102f1565b348015610328575f80fd5b5061033c610337366004611f8e565b61099c565b60405190151581526020016102f1565b348015610357575f80fd5b506102ca610366366004611fb8565b6109b5565b348015610376575f80fd5b506102ca610385366004611fe5565b610a1a565b348015610395575f80fd5b5060025461030f565b3480156103a9575f80fd5b5061033c6103b8366004612025565b610b1a565b3480156103c8575f80fd5b50604051601281526020016102f1565b3480156103e3575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102f1565b34801561042e575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610461575f80fd5b506102ca610470366004611fb8565b610bb2565b348015610480575f80fd5b506102ca61048f366004612063565b610bbf565b34801561049f575f80fd5b5061033c6104ae366004612063565b600e6020525f908152604090205460ff1681565b3480156104cd575f80fd5b506006546104f29061ffff808216916201000081048216916401000000009091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102f1565b348015610522575f80fd5b5061033c610531366004612063565b600b6020525f908152604090205460ff1681565b348015610550575f80fd5b506102ca61055f366004611fe5565b610c70565b34801561056f575f80fd5b506102ca61057e366004611fb8565b610d67565b34801561058e575f80fd5b506102ca61059d36600461208b565b610e36565b3480156105ad575f80fd5b5061030f6105bc366004612063565b6001600160a01b03165f9081526020819052604090205490565b3480156105e1575f80fd5b506102ca610ee0565b3480156105f5575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610628575f80fd5b506102ca61063736600461208b565b610ef3565b348015610647575f80fd5b50600a5461033c90600160a01b900460ff1681565b348015610667575f80fd5b506005546001600160a01b031661040b565b348015610684575f80fd5b506102e4610f95565b348015610698575f80fd5b5061040b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cb575f80fd5b5060085461040b906001600160a01b031681565b3480156106ea575f80fd5b5061030f6106f9366004611f8e565b600d60209081525f928352604080842090915290825290205481565b348015610720575f80fd5b5061033c61072f366004611f8e565b610fa4565b34801561073f575f80fd5b506102ca61074e366004612063565b610fb9565b34801561075e575f80fd5b5061030f60115481565b348015610773575f80fd5b5060095461040b906001600160a01b031681565b348015610792575f80fd5b506102ca6107a13660046120c2565b611143565b3480156107b1575f80fd5b506102ca6107c0366004612063565b6111ca565b3480156107d0575f80fd5b506102ca61127b565b3480156107e4575f80fd5b506007546104f29061ffff808216916201000081048216916401000000009091041683565b348015610814575f80fd5b5061030f60105481565b348015610829575f80fd5b50600a5461040b906001600160a01b031681565b348015610848575f80fd5b5061030f6108573660046120dd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088c575f80fd5b5061033c61089b366004612063565b600c6020525f908152604090205460ff1681565b3480156108ba575f80fd5b506102ca6108c936600461208b565b61128b565b3480156108d9575f80fd5b506102ca6108e8366004612063565b61132d565b3480156108f8575f80fd5b506102ca610907366004612063565b6113de565b60606003805461091b90612109565b80601f016020809104026020016040519081016040528092919081815260200182805461094790612109565b80156109925780601f1061096957610100808354040283529160200191610992565b820191905f5260205f20905b81548152906001019060200180831161097557829003601f168201915b5050505050905090565b5f336109a9818585611418565b60019150505b92915050565b6109bd611425565b60115481036109de5760405162461bcd60e51b81526004016102c190612141565b60118190556040518181527fe67e4ad89b973bf2fae6c1b3c3b2773e9c25d2ec1eb05eb37a6eb494a0122e1d906020015b60405180910390a150565b610a22611425565b6107d081610a308486612185565b610a3a9190612185565b61ffff161115610a865760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526006805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f24e45e298f32af538a5d4e1fed903ae9ed92fe19f7e0bf21ebbebb55e2ac424191015b60405180910390a1505050565b5f80610b268533610857565b905080831115610b825760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b60648201526084016102c1565b5f19811015610b9a57610b9a85338584036001611452565b610ba5858585611525565b60019150505b9392505050565b610bbc3382611825565b50565b610bc7611425565b6009546001600160a01b0390811690821603610bf55760405162461bcd60e51b81526004016102c190612141565b6001600160a01b038116610c1b5760405162461bcd60e51b81526004016102c1906121a7565b600980546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fd64d9347eb205df6c87314d366a4395d7e0abe3ddf2b1aada45992bd35880f969101610a0f565b610c78611425565b6107d081610c868486612185565b610c909190612185565b61ffff161115610cdc5760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526007805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f7b2ba3c0360c4a8fadbd496c0e80fdade44b389b7a7f859678daa06def09430d9101610b0d565b610d6f611425565b600f548103610d905760405162461bcd60e51b81526004016102c190612141565b6103e8610d9c60025490565b610da691906121de565b811015610e015760405162461bcd60e51b815260206004820152602360248201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520746f6f206044820152626c6f7760e81b60648201526084016102c1565b600f8190556040518181527ff7395978b671c0c395531979e2d0271383027646278868275e4a6ea786fb835790602001610a0f565b610e3e611425565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610e7d5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f9f4f589ceb417a14ba902c1dc85dccd9c09dcbfe6422b8f85f01a94955f6920a91015b60405180910390a15050565b610ee8611425565b610ef15f611859565b565b610efb611425565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610f3a5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527fcd9591ba5f72df9031bde1e48a0cb86ae47760110b36b9b69ab2730bf57ab3579101610ed4565b60606004805461091b90612109565b5f610fb0338484611525565b50600192915050565b610fc1611425565b6001600160a01b0381163014611119575f6001600160a01b038216610fe6574761104c565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104c91906121fd565b90505f8111801561106557506001600160a01b03821615155b156110825761107e6001600160a01b03831633836118aa565b5050565b801561107e576040515f90339083908381818185875af1925050503d805f81146110c7576040519150601f19603f3d011682016040523d82523d5f602084013e6110cc565b606091505b50509050806111145760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016102c1565b505050565b601054305f90815260208190526040812054909161113691612214565b905061107e3033836118fc565b61114b611425565b801515600a60149054906101000a900460ff1615150361117d5760405162461bcd60e51b81526004016102c190612141565b600a8054821515600160a01b0260ff60a01b199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610a0f90831515815260200190565b6111d2611425565b6008546001600160a01b03908116908216036112005760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166112265760405162461bcd60e51b81526004016102c1906121a7565b600880546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fea1204643e42072ee8d3e7fa0b0ee2acd4d81330c5b6944ebb5e4b84e83a23019101610a0f565b611283611425565b610ef1611959565b611293611425565b6001600160a01b0382165f908152600e602052604090205481151560ff9091161515036112d25760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f64187f0942d70c898df934114314164934b824a0cfc00f3a1017d04906f35ba59101610ed4565b611335611425565b600a546001600160a01b03908116908216036113635760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166113895760405162461bcd60e51b81526004016102c1906121a7565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527ffbad7c7fc3034d0c4aed9fb20b4fd0197bd14a41a8c2d814f9d06507f3d92eb29101610a0f565b6113e6611425565b6001600160a01b03811661140f57604051631e4fbdf760e01b81525f60048201526024016102c1565b610bbc81611859565b6111148383836001611452565b6005546001600160a01b03163314610ef15760405163118cdaa760e01b81523360048201526024016102c1565b6001600160a01b03841661147b5760405163e602df0560e01b81525f60048201526024016102c1565b6001600160a01b0383166114a457604051634a1406b160e11b81525f60048201526024016102c1565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561151f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161151691815260200190565b60405180910390a35b50505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161461156657611566611959565b600a54600160a01b900460ff16158061159657506001600160a01b0383165f908152600b602052604090205460ff165b806115b857506001600160a01b0382165f908152600b602052604090205460ff165b806115fe57506001600160a01b0382165f908152600c602052604090205460ff161580156115fe57506001600160a01b0383165f908152600c602052604090205460ff16155b8061160b57506012546001145b156116205761161b8383836118fc565b611776565b6001600160a01b0382165f908152600c602052604081205460ff16611646576007611649565b60065b60408051606081018252915461ffff808216845262010000820481166020850181905264010000000090920416918301919091529091505f90612710906116909085612227565b61169a91906121de565b90505f612710836040015161ffff16856116b49190612227565b6116be91906121de565b90505f612710845f015161ffff16866116d79190612227565b6116e191906121de565b9050811561170157600a546117019088906001600160a01b0316846118fc565b821561171f5760095461171f9088906001600160a01b0316856118fc565b61174987878385611730888b612214565b61173a9190612214565b6117449190612214565b6118fc565b8015611771578060105f828254611760919061223e565b9091555061177190508730836118fc565b505050505b6001600160a01b0383165f908152600d6020908152604080832062015180420480855292529091208054830190819055600f541015806117cd57506001600160a01b0384165f908152600e602052604090205460ff165b61151f5760405162461bcd60e51b8152602060048201526024808201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520657863656044820152631959195960e21b60648201526084016102c1565b6001600160a01b03821661184e57604051634b637e8f60e11b81525f60048201526024016102c1565b61107e825f83611aca565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611114908490611bf0565b6001600160a01b03831661192557604051634b637e8f60e11b81525f60048201526024016102c1565b6001600160a01b03821661194e5760405163ec442f0560e01b81525f60048201526024016102c1565b611114838383611aca565b60125460010361196557565b6011546010541115610ef15760016012819055505f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156119d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fb9190612267565b506001600160701b0391821693501690505f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163010611a435781611a45565b825b90505f6064611a5583600a612227565b611a5f91906121de565b90505f8160105411611a7357601054611a75565b815b90505f611a836002836121de565b90505f611a908284612214565b9050611a9b82611c51565b47611aa68282611d6d565b8360105f828254611ab79190612214565b90915550505f6012555050505050505050565b6001600160a01b038316611af4578060025f828254611ae9919061223e565b90915550611b649050565b6001600160a01b0383165f9081526020819052604090205481811015611b465760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016102c1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8057600280548290039055611b9e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be391815260200190565b60405180910390a3505050565b5f611c046001600160a01b03841683611e24565b905080515f14158015611c28575080806020019051810190611c2691906122b3565b155b1561111457604051635274afe760e01b81526001600160a01b03841660048201526024016102c1565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c8457611c846122ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611cd857611cd86122ce565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790611d3c9085905f908690309042906004016122e2565b5f604051808303815f87803b158015611d53575f80fd5b505af1925050508015611d64575060015b1561107e575050565b60085460405163f305d71960e01b8152306004820152602481018490525f6044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af193505050508015611e18575060408051601f3d908101601f19168201909252611e1591810190612353565b60015b1561107e575050505050565b6060610bab83835f845f80856001600160a01b03168486604051611e48919061237e565b5f6040518083038185875af1925050503d805f8114611e82576040519150601f19603f3d011682016040523d82523d5f602084013e611e87565b606091505b5091509150611e97868383611ea1565b9695505050505050565b606082611eb657611eb182611efd565b610bab565b8151158015611ecd57506001600160a01b0384163b155b15611ef657604051639996b31560e01b81526001600160a01b03851660048201526024016102c1565b5080610bab565b805115611f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015611f40578181015183820152602001611f28565b50505f910152565b602081525f8251806020840152611f66816040850160208701611f26565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610bbc575f80fd5b5f8060408385031215611f9f575f80fd5b8235611faa81611f7a565b946020939093013593505050565b5f60208284031215611fc8575f80fd5b5035919050565b803561ffff81168114611fe0575f80fd5b919050565b5f805f60608486031215611ff7575f80fd5b61200084611fcf565b925061200e60208501611fcf565b915061201c60408501611fcf565b90509250925092565b5f805f60608486031215612037575f80fd5b833561204281611f7a565b9250602084013561205281611f7a565b929592945050506040919091013590565b5f60208284031215612073575f80fd5b8135610bab81611f7a565b8015158114610bbc575f80fd5b5f806040838503121561209c575f80fd5b82356120a781611f7a565b915060208301356120b78161207e565b809150509250929050565b5f602082840312156120d2575f80fd5b8135610bab8161207e565b5f80604083850312156120ee575f80fd5b82356120f981611f7a565b915060208301356120b781611f7a565b600181811c9082168061211d57607f821691505b60208210810361213b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526016908201527511d85b185e1e519bde0e88185b1c9958591e481cd95d60521b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156121a0576121a0612171565b5092915050565b60208082526017908201527f47616c617879466f783a207a65726f2061646472657373000000000000000000604082015260600190565b5f826121f857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561220d575f80fd5b5051919050565b818103818111156109af576109af612171565b80820281158282048414176109af576109af612171565b808201808211156109af576109af612171565b80516001600160701b0381168114611fe0575f80fd5b5f805f60608486031215612279575f80fd5b61228284612251565b925061229060208501612251565b9150604084015163ffffffff811681146122a8575f80fd5b809150509250925092565b5f602082840312156122c3575f80fd5b8151610bab8161207e565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123325784516001600160a01b03168352938301939183019160010161230d565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612365575f80fd5b8351925060208401519150604084015190509250925092565b5f825161238f818460208701611f26565b919091019291505056fea2646970667358221220183a02c078f663bcdb2ae338660573d04bf4ed0b31f9d2e2b0a8d0ccfb310c6564736f6c634300081700330000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Deployed Bytecode
0x608060405260043610610257575f3560e01c806386a22eff1161013f578063c6af580b116100b3578063d8286d7911610078578063d8286d791461081e578063dd62ed3e1461083d578063e5e31b1314610881578063e78f6ceb146108af578063ee8ce789146108ce578063f2fde38b146108ed575f80fd5b8063c6af580b14610787578063c9a88338146107a6578063cb9598c3146107c5578063cc1776d3146107d9578063cec1b34414610809575f80fd5b8063a572c78b11610104578063a572c78b146106c0578063a70c1aba146106df578063a9059cbb14610715578063b9e8ce2c14610734578063c169306e14610753578063c26a564514610768575f80fd5b806386a22eff1461061d578063870bd30b1461063c5780638da5cb5b1461065c57806395d89b4114610679578063a0e47bf61461068d575f80fd5b806342966c68116101d657806356da87bc1161019b57806356da87bc146105455780635c3f2f4a146105645780636612e66f1461058357806370a08231146105a2578063715018a6146105d657806376771d4b146105ea575f80fd5b806342966c6814610456578063435fff271461047557806344f1ca37146104945780634f7041a5146104c25780635342acb414610517575f80fd5b806318160ddd1161021c57806318160ddd1461038a57806323b872dd1461039e578063313ce567146103bd57806332972e46146103d85780633fc8cef314610423575f80fd5b806306fdde03146102d057806307df2f18146102fa578063095ea7b31461031d5780630c3266641461034c5780631472c83d1461036b575f80fd5b366102cc57336001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16146102ca5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b60448201526064015b60405180910390fd5b005b5f80fd5b3480156102db575f80fd5b506102e461090c565b6040516102f19190611f48565b60405180910390f35b348015610305575f80fd5b5061030f600f5481565b6040519081526020016102f1565b348015610328575f80fd5b5061033c610337366004611f8e565b61099c565b60405190151581526020016102f1565b348015610357575f80fd5b506102ca610366366004611fb8565b6109b5565b348015610376575f80fd5b506102ca610385366004611fe5565b610a1a565b348015610395575f80fd5b5060025461030f565b3480156103a9575f80fd5b5061033c6103b8366004612025565b610b1a565b3480156103c8575f80fd5b50604051601281526020016102f1565b3480156103e3575f80fd5b5061040b7f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d081565b6040516001600160a01b0390911681526020016102f1565b34801561042e575f80fd5b5061040b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610461575f80fd5b506102ca610470366004611fb8565b610bb2565b348015610480575f80fd5b506102ca61048f366004612063565b610bbf565b34801561049f575f80fd5b5061033c6104ae366004612063565b600e6020525f908152604090205460ff1681565b3480156104cd575f80fd5b506006546104f29061ffff808216916201000081048216916401000000009091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102f1565b348015610522575f80fd5b5061033c610531366004612063565b600b6020525f908152604090205460ff1681565b348015610550575f80fd5b506102ca61055f366004611fe5565b610c70565b34801561056f575f80fd5b506102ca61057e366004611fb8565b610d67565b34801561058e575f80fd5b506102ca61059d36600461208b565b610e36565b3480156105ad575f80fd5b5061030f6105bc366004612063565b6001600160a01b03165f9081526020819052604090205490565b3480156105e1575f80fd5b506102ca610ee0565b3480156105f5575f80fd5b5061040b7f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b348015610628575f80fd5b506102ca61063736600461208b565b610ef3565b348015610647575f80fd5b50600a5461033c90600160a01b900460ff1681565b348015610667575f80fd5b506005546001600160a01b031661040b565b348015610684575f80fd5b506102e4610f95565b348015610698575f80fd5b5061040b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156106cb575f80fd5b5060085461040b906001600160a01b031681565b3480156106ea575f80fd5b5061030f6106f9366004611f8e565b600d60209081525f928352604080842090915290825290205481565b348015610720575f80fd5b5061033c61072f366004611f8e565b610fa4565b34801561073f575f80fd5b506102ca61074e366004612063565b610fb9565b34801561075e575f80fd5b5061030f60115481565b348015610773575f80fd5b5060095461040b906001600160a01b031681565b348015610792575f80fd5b506102ca6107a13660046120c2565b611143565b3480156107b1575f80fd5b506102ca6107c0366004612063565b6111ca565b3480156107d0575f80fd5b506102ca61127b565b3480156107e4575f80fd5b506007546104f29061ffff808216916201000081048216916401000000009091041683565b348015610814575f80fd5b5061030f60105481565b348015610829575f80fd5b50600a5461040b906001600160a01b031681565b348015610848575f80fd5b5061030f6108573660046120dd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088c575f80fd5b5061033c61089b366004612063565b600c6020525f908152604090205460ff1681565b3480156108ba575f80fd5b506102ca6108c936600461208b565b61128b565b3480156108d9575f80fd5b506102ca6108e8366004612063565b61132d565b3480156108f8575f80fd5b506102ca610907366004612063565b6113de565b60606003805461091b90612109565b80601f016020809104026020016040519081016040528092919081815260200182805461094790612109565b80156109925780601f1061096957610100808354040283529160200191610992565b820191905f5260205f20905b81548152906001019060200180831161097557829003601f168201915b5050505050905090565b5f336109a9818585611418565b60019150505b92915050565b6109bd611425565b60115481036109de5760405162461bcd60e51b81526004016102c190612141565b60118190556040518181527fe67e4ad89b973bf2fae6c1b3c3b2773e9c25d2ec1eb05eb37a6eb494a0122e1d906020015b60405180910390a150565b610a22611425565b6107d081610a308486612185565b610a3a9190612185565b61ffff161115610a865760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526006805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f24e45e298f32af538a5d4e1fed903ae9ed92fe19f7e0bf21ebbebb55e2ac424191015b60405180910390a1505050565b5f80610b268533610857565b905080831115610b825760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636044820152606560f81b60648201526084016102c1565b5f19811015610b9a57610b9a85338584036001611452565b610ba5858585611525565b60019150505b9392505050565b610bbc3382611825565b50565b610bc7611425565b6009546001600160a01b0390811690821603610bf55760405162461bcd60e51b81526004016102c190612141565b6001600160a01b038116610c1b5760405162461bcd60e51b81526004016102c1906121a7565b600980546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fd64d9347eb205df6c87314d366a4395d7e0abe3ddf2b1aada45992bd35880f969101610a0f565b610c78611425565b6107d081610c868486612185565b610c909190612185565b61ffff161115610cdc5760405162461bcd60e51b815260206004820152601760248201527608ec2d8c2f0f28cdef07440e8c2f040e8dede40d0d2ced604b1b60448201526064016102c1565b604080516060808201835261ffff86811680845286821660208086018290529287169486018590526007805463ffffffff191683176201000083021765ffff0000000019166401000000008702179055855191825291810191909152928301919091527f7b2ba3c0360c4a8fadbd496c0e80fdade44b389b7a7f859678daa06def09430d9101610b0d565b610d6f611425565b600f548103610d905760405162461bcd60e51b81526004016102c190612141565b6103e8610d9c60025490565b610da691906121de565b811015610e015760405162461bcd60e51b815260206004820152602360248201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520746f6f206044820152626c6f7760e81b60648201526084016102c1565b600f8190556040518181527ff7395978b671c0c395531979e2d0271383027646278868275e4a6ea786fb835790602001610a0f565b610e3e611425565b6001600160a01b0382165f908152600b602052604090205481151560ff909116151503610e7d5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600b6020908152604091829020805460ff19168515159081179091558251938452908301527f9f4f589ceb417a14ba902c1dc85dccd9c09dcbfe6422b8f85f01a94955f6920a91015b60405180910390a15050565b610ee8611425565b610ef15f611859565b565b610efb611425565b6001600160a01b0382165f908152600c602052604090205481151560ff909116151503610f3a5760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527fcd9591ba5f72df9031bde1e48a0cb86ae47760110b36b9b69ab2730bf57ab3579101610ed4565b60606004805461091b90612109565b5f610fb0338484611525565b50600192915050565b610fc1611425565b6001600160a01b0381163014611119575f6001600160a01b038216610fe6574761104c565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611028573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104c91906121fd565b90505f8111801561106557506001600160a01b03821615155b156110825761107e6001600160a01b03831633836118aa565b5050565b801561107e576040515f90339083908381818185875af1925050503d805f81146110c7576040519150601f19603f3d011682016040523d82523d5f602084013e6110cc565b606091505b50509050806111145760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b60448201526064016102c1565b505050565b601054305f90815260208190526040812054909161113691612214565b905061107e3033836118fc565b61114b611425565b801515600a60149054906101000a900460ff1615150361117d5760405162461bcd60e51b81526004016102c190612141565b600a8054821515600160a01b0260ff60a01b199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe13390610a0f90831515815260200190565b6111d2611425565b6008546001600160a01b03908116908216036112005760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166112265760405162461bcd60e51b81526004016102c1906121a7565b600880546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527fea1204643e42072ee8d3e7fa0b0ee2acd4d81330c5b6944ebb5e4b84e83a23019101610a0f565b611283611425565b610ef1611959565b611293611425565b6001600160a01b0382165f908152600e602052604090205481151560ff9091161515036112d25760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0382165f818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f64187f0942d70c898df934114314164934b824a0cfc00f3a1017d04906f35ba59101610ed4565b611335611425565b600a546001600160a01b03908116908216036113635760405162461bcd60e51b81526004016102c190612141565b6001600160a01b0381166113895760405162461bcd60e51b81526004016102c1906121a7565b600a80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527ffbad7c7fc3034d0c4aed9fb20b4fd0197bd14a41a8c2d814f9d06507f3d92eb29101610a0f565b6113e6611425565b6001600160a01b03811661140f57604051631e4fbdf760e01b81525f60048201526024016102c1565b610bbc81611859565b6111148383836001611452565b6005546001600160a01b03163314610ef15760405163118cdaa760e01b81523360048201526024016102c1565b6001600160a01b03841661147b5760405163e602df0560e01b81525f60048201526024016102c1565b6001600160a01b0383166114a457604051634a1406b160e11b81525f60048201526024016102c1565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561151f57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161151691815260200190565b60405180910390a35b50505050565b7f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d06001600160a01b0316836001600160a01b03161461156657611566611959565b600a54600160a01b900460ff16158061159657506001600160a01b0383165f908152600b602052604090205460ff165b806115b857506001600160a01b0382165f908152600b602052604090205460ff165b806115fe57506001600160a01b0382165f908152600c602052604090205460ff161580156115fe57506001600160a01b0383165f908152600c602052604090205460ff16155b8061160b57506012546001145b156116205761161b8383836118fc565b611776565b6001600160a01b0382165f908152600c602052604081205460ff16611646576007611649565b60065b60408051606081018252915461ffff808216845262010000820481166020850181905264010000000090920416918301919091529091505f90612710906116909085612227565b61169a91906121de565b90505f612710836040015161ffff16856116b49190612227565b6116be91906121de565b90505f612710845f015161ffff16866116d79190612227565b6116e191906121de565b9050811561170157600a546117019088906001600160a01b0316846118fc565b821561171f5760095461171f9088906001600160a01b0316856118fc565b61174987878385611730888b612214565b61173a9190612214565b6117449190612214565b6118fc565b8015611771578060105f828254611760919061223e565b9091555061177190508730836118fc565b505050505b6001600160a01b0383165f908152600d6020908152604080832062015180420480855292529091208054830190819055600f541015806117cd57506001600160a01b0384165f908152600e602052604090205460ff165b61151f5760405162461bcd60e51b8152602060048201526024808201527f47616c617879466f783a206d6178206461696c7920766f6c756d6520657863656044820152631959195960e21b60648201526084016102c1565b6001600160a01b03821661184e57604051634b637e8f60e11b81525f60048201526024016102c1565b61107e825f83611aca565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611114908490611bf0565b6001600160a01b03831661192557604051634b637e8f60e11b81525f60048201526024016102c1565b6001600160a01b03821661194e5760405163ec442f0560e01b81525f60048201526024016102c1565b611114838383611aca565b60125460010361196557565b6011546010541115610ef15760016012819055505f807f00000000000000000000000092ee0df7f6b0674cabc9bfc64873786fa7be82d06001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156119d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fb9190612267565b506001600160701b0391821693501690505f6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2163010611a435781611a45565b825b90505f6064611a5583600a612227565b611a5f91906121de565b90505f8160105411611a7357601054611a75565b815b90505f611a836002836121de565b90505f611a908284612214565b9050611a9b82611c51565b47611aa68282611d6d565b8360105f828254611ab79190612214565b90915550505f6012555050505050505050565b6001600160a01b038316611af4578060025f828254611ae9919061223e565b90915550611b649050565b6001600160a01b0383165f9081526020819052604090205481811015611b465760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016102c1565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b8057600280548290039055611b9e565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611be391815260200190565b60405180910390a3505050565b5f611c046001600160a01b03841683611e24565b905080515f14158015611c28575080806020019051810190611c2691906122b3565b155b1561111457604051635274afe760e01b81526001600160a01b03841660048201526024016102c1565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c8457611c846122ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611cd857611cd86122ce565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790611d3c9085905f908690309042906004016122e2565b5f604051808303815f87803b158015611d53575f80fd5b505af1925050508015611d64575060015b1561107e575050565b60085460405163f305d71960e01b8152306004820152602481018490525f6044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af193505050508015611e18575060408051601f3d908101601f19168201909252611e1591810190612353565b60015b1561107e575050505050565b6060610bab83835f845f80856001600160a01b03168486604051611e48919061237e565b5f6040518083038185875af1925050503d805f8114611e82576040519150601f19603f3d011682016040523d82523d5f602084013e611e87565b606091505b5091509150611e97868383611ea1565b9695505050505050565b606082611eb657611eb182611efd565b610bab565b8151158015611ecd57506001600160a01b0384163b155b15611ef657604051639996b31560e01b81526001600160a01b03851660048201526024016102c1565b5080610bab565b805115611f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f5b83811015611f40578181015183820152602001611f28565b50505f910152565b602081525f8251806020840152611f66816040850160208701611f26565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610bbc575f80fd5b5f8060408385031215611f9f575f80fd5b8235611faa81611f7a565b946020939093013593505050565b5f60208284031215611fc8575f80fd5b5035919050565b803561ffff81168114611fe0575f80fd5b919050565b5f805f60608486031215611ff7575f80fd5b61200084611fcf565b925061200e60208501611fcf565b915061201c60408501611fcf565b90509250925092565b5f805f60608486031215612037575f80fd5b833561204281611f7a565b9250602084013561205281611f7a565b929592945050506040919091013590565b5f60208284031215612073575f80fd5b8135610bab81611f7a565b8015158114610bbc575f80fd5b5f806040838503121561209c575f80fd5b82356120a781611f7a565b915060208301356120b78161207e565b809150509250929050565b5f602082840312156120d2575f80fd5b8135610bab8161207e565b5f80604083850312156120ee575f80fd5b82356120f981611f7a565b915060208301356120b781611f7a565b600181811c9082168061211d57607f821691505b60208210810361213b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526016908201527511d85b185e1e519bde0e88185b1c9958591e481cd95d60521b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156121a0576121a0612171565b5092915050565b60208082526017908201527f47616c617879466f783a207a65726f2061646472657373000000000000000000604082015260600190565b5f826121f857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561220d575f80fd5b5051919050565b818103818111156109af576109af612171565b80820281158282048414176109af576109af612171565b808201808211156109af576109af612171565b80516001600160701b0381168114611fe0575f80fd5b5f805f60608486031215612279575f80fd5b61228284612251565b925061229060208501612251565b9150604084015163ffffffff811681146122a8575f80fd5b809150509250925092565b5f602082840312156122c3575f80fd5b8151610bab8161207e565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156123325784516001600160a01b03168352938301939183019160010161230d565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612365575f80fd5b8351925060208401519150604084015190509250925092565b5f825161238f818460208701611f26565b919091019291505056fea2646970667358221220183a02c078f663bcdb2ae338660573d04bf4ed0b31f9d2e2b0a8d0ccfb310c6564736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e7000000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
-----Decoded View---------------
Arg [0] : _ownerArg (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [1] : _ecosystemHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [2] : _marketingHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [3] : _liquidityHolder (address): 0x4e6647a2bda8dfe75316a72E73586eCD24d0e700
Arg [4] : _uniswapV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [5] : _uniswapV2Factory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [1] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [2] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [3] : 0000000000000000000000004e6647a2bda8dfe75316a72e73586ecd24d0e700
Arg [4] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [5] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Deployed Bytecode Sourcemap
43124:16425:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46697:10;-1:-1:-1;;;;;46719:9:0;46697:32;;46689:59;;;;-1:-1:-1;;;46689:59:0;;216:2:1;46689:59:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:44;328:18;;46689:59:0;;;;;;;;;43124:16425;;;;;7758:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44093:53;;;;;;;;;;;;;;;;;;;1159:25:1;;;1147:2;1132:18;44093:53:0;1013:177:1;10076:215:0;;;;;;;;;;-1:-1:-1;10076:215:0;;;;;:::i;:::-;;:::i;:::-;;;1816:14:1;;1809:22;1791:41;;1779:2;1764:18;10076:215:0;1651:187:1;50467:340:0;;;;;;;;;;-1:-1:-1;50467:340:0;;;;;:::i;:::-;;:::i;54176:392::-;;;;;;;;;;-1:-1:-1;54176:392:0;;;;;:::i;:::-;;:::i;8860:99::-;;;;;;;;;;-1:-1:-1;8939:12:0;;8860:99;;47404:621;;;;;;;;;;-1:-1:-1;47404:621:0;;;;;:::i;:::-;;:::i;8711:84::-;;;;;;;;;;-1:-1:-1;8711:84:0;;8785:2;3128:36:1;;3116:2;3101:18;8711:84:0;2986:184:1;43801:32:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3339:32:1;;;3321:51;;3309:2;3294:18;43801:32:0;3175:203:1;43753:29:0;;;;;;;;;;;;;;;54686:81;;;;;;;;;;-1:-1:-1;54686:81:0;;;;;:::i;:::-;;:::i;52431:374::-;;;;;;;;;;-1:-1:-1;52431:374:0;;;;;:::i;:::-;;:::i;44027:57::-;;;;;;;;;;-1:-1:-1;44027:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43203:88;;;;;;;;;;-1:-1:-1;43203:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;4101:6:1;4134:15;;;4116:34;;4186:15;;;4181:2;4166:18;;4159:43;4238:15;;4218:18;;;4211:43;;;;4079:2;4064:18;43203:88:0;3895:365:1;43854:49:0;;;;;;;;;;-1:-1:-1;43854:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53549:395;;;;;;;;;;-1:-1:-1;53549:395:0;;;;;:::i;:::-;;:::i;56546:483::-;;;;;;;;;;-1:-1:-1;56546:483:0;;;;;:::i;:::-;;:::i;51026:330::-;;;;;;;;;;-1:-1:-1;51026:330:0;;;;;:::i;:::-;;:::i;9022:118::-;;;;;;;;;;-1:-1:-1;9022:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;9114:18:0;9087:7;9114:18;;;;;;;;;;;;9022:118;33858:103;;;;;;;;;;;;;:::i;43631:39::-;;;;;;;;;;;;;;;51558:217;;;;;;;;;;-1:-1:-1;51558:217:0;;;;;:::i;:::-;;:::i;43592:30::-;;;;;;;;;;-1:-1:-1;43592:30:0;;;;-1:-1:-1;;;43592:30:0;;;;;;33183:87;;;;;;;;;;-1:-1:-1;33256:6:0;;-1:-1:-1;;;;;33256:6:0;33183:87;;7968:95;;;;;;;;;;;;;:::i;43689:45::-;;;;;;;;;;;;;;;43421:38;;;;;;;;;;-1:-1:-1;43421:38:0;;;;-1:-1:-1;;;;;43421:38:0;;;43959:61;;;;;;;;;;-1:-1:-1;43959:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;46933:206;;;;;;;;;;-1:-1:-1;46933:206:0;;;;;:::i;:::-;;:::i;54937:851::-;;;;;;;;;;-1:-1:-1;54937:851:0;;;;;:::i;:::-;;:::i;44194:32::-;;;;;;;;;;;;;;;;43478:38;;;;;;;;;;-1:-1:-1;43478:38:0;;;;-1:-1:-1;;;;;43478:38:0;;;50010:221;;;;;;;;;;-1:-1:-1;50010:221:0;;;;;:::i;:::-;;:::i;52946:372::-;;;;;;;;;;-1:-1:-1;52946:372:0;;;;;:::i;:::-;;:::i;57328:67::-;;;;;;;;;;;;;:::i;43309:92::-;;;;;;;;;;-1:-1:-1;43309:92:0;;;;;;;;;;;;;;;;;;;;;;44155:32;;;;;;;;;;;;;;;;43535:38;;;;;;;;;;-1:-1:-1;43535:38:0;;;;-1:-1:-1;;;;;43535:38:0;;;9590:167;;;;;;;;;;-1:-1:-1;9590:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;9722:18:0;;;9695:7;9722:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9590:167;43912:38;;;;;;;;;;-1:-1:-1;43912:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56026:362;;;;;;;;;;-1:-1:-1;56026:362:0;;;;;:::i;:::-;;:::i;51916:374::-;;;;;;;;;;-1:-1:-1;51916:374:0;;;;;:::i;:::-;;:::i;34116:220::-;;;;;;;;;;-1:-1:-1;34116:220:0;;;;;:::i;:::-;;:::i;7758:91::-;7803:13;7836:5;7829:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7758:91;:::o;10076:215::-;10174:4;3782:10;10230:31;3782:10;10246:7;10255:5;10230:8;:31::i;:::-;10279:4;10272:11;;;10076:215;;;;;:::o;50467:340::-;33069:13;:11;:13::i;:::-;50617:17:::1;;50593:20;:41:::0;50571:113:::1;;;;-1:-1:-1::0;;;50571:113:0::1;;;;;;;:::i;:::-;50695:17;:40:::0;;;50753:46:::1;::::0;1159:25:1;;;50753:46:0::1;::::0;1147:2:1;1132:18;50753:46:0::1;;;;;;;;50467:340:::0;:::o;54176:392::-;33069:13;:11;:13::i;:::-;42840:4:::1;54362:10:::0;54336:23:::1;54349:10:::0;54336;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:47;;;;54314:120;;;::::0;-1:-1:-1;;;54314:120:0;;7344:2:1;54314:120:0::1;::::0;::::1;7326:21:1::0;7383:2;7363:18;;;7356:30;-1:-1:-1;;;7402:18:1;;;7395:53;7465:18;;54314:120:0::1;7142:347:1::0;54314:120:0::1;54454:39;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;54445:6:::1;:48:::0;;-1:-1:-1;;54445:48:0;;;;;::::1;;-1:-1:-1::0;;54445:48:0::1;::::0;;::::1;;::::0;;54511:49;;4116:34:1;;;4166:18;;;4159:43;;;;4218:18;;;4211:43;;;;54511:49:0::1;::::0;4064:18:1;54511:49:0::1;;;;;;;;54176:392:::0;;;:::o;47404:621::-;47544:4;;47581:31;47591:6;3782:10;9590:167;:::i;47581:31::-;47561:51;;47641:9;47631:6;:19;;47623:65;;;;-1:-1:-1;;;47623:65:0;;7696:2:1;47623:65:0;;;7678:21:1;7735:2;7715:18;;;7708:30;7774:34;7754:18;;;7747:62;-1:-1:-1;;;7825:18:1;;;7818:31;7866:19;;47623:65:0;7494:397:1;47623:65:0;-1:-1:-1;;47823:9:0;:29;47819:108;;;47871:56;47880:6;3782:10;47914:6;47902:9;:18;47922:4;47871:8;:56::i;:::-;47951:42;47967:6;47975:9;47986:6;47951:15;:42::i;:::-;48013:4;48006:11;;;47404:621;;;;;;:::o;54686:81::-;54734:25;54740:10;54752:6;54734:5;:25::i;:::-;54686:81;:::o;52431:374::-;33069:13;:11;:13::i;:::-;52565:15:::1;::::0;-1:-1:-1;;;;;52565:15:0;;::::1;52545:35:::0;;::::1;::::0;52537:70:::1;;;;-1:-1:-1::0;;;52537:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52626:30:0;::::1;52618:66;;;;-1:-1:-1::0;;;52618:66:0::1;;;;;;;:::i;:::-;52695:15;:34:::0;;-1:-1:-1;;;;;;52695:34:0::1;-1:-1:-1::0;;;;;52695:34:0;::::1;::::0;;::::1;::::0;;;52747:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;52747:50:0::1;::::0;8411:18:1;52747:50:0::1;8248:320:1::0;53549:395:0;33069:13;:11;:13::i;:::-;42840:4:::1;53736:10:::0;53710:23:::1;53723:10:::0;53710;:23:::1;:::i;:::-;:36;;;;:::i;:::-;:47;;;;53688:120;;;::::0;-1:-1:-1;;;53688:120:0;;7344:2:1;53688:120:0::1;::::0;::::1;7326:21:1::0;7383:2;7363:18;;;7356:30;-1:-1:-1;;;7402:18:1;;;7395:53;7465:18;;53688:120:0::1;7142:347:1::0;53688:120:0::1;53829:39;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;53819:7:::1;:49:::0;;-1:-1:-1;;53819:49:0;;;;;::::1;;-1:-1:-1::0;;53819:49:0::1;::::0;;::::1;;::::0;;53886:50;;4116:34:1;;;4166:18;;;4159:43;;;;4218:18;;;4211:43;;;;53886:50:0::1;::::0;4064:18:1;53886:50:0::1;3895:365:1::0;56546:483:0;33069:13;:11;:13::i;:::-;56657:14:::1;;56636:17;:35:::0;56628:70:::1;;;;-1:-1:-1::0;;;56628:70:0::1;;;;;;;:::i;:::-;56851:4;56835:13;8939:12:::0;;;8860:99;56835:13:::1;:20;;;;:::i;:::-;56814:17;:41;;56792:126;;;::::0;-1:-1:-1;;;56792:126:0;;9129:2:1;56792:126:0::1;::::0;::::1;9111:21:1::0;9168:2;9148:18;;;9141:30;9207:34;9187:18;;;9180:62;-1:-1:-1;;;9258:18:1;;;9251:33;9301:19;;56792:126:0::1;8927:399:1::0;56792:126:0::1;56929:14;:34:::0;;;56981:40:::1;::::0;1159:25:1;;;56981:40:0::1;::::0;1147:2:1;1132:18;56981:40:0::1;1013:177:1::0;51026:330:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;51161:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:38;::::1;;:26;::::0;;::::1;:38;;::::0;51139:110:::1;;;;-1:-1:-1::0;;;51139:110:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51260:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:37;;-1:-1:-1;;51260:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51315:33;;9499:51:1;;;9566:18;;;9559:50;51315:33:0::1;::::0;9472:18:1;51315:33:0::1;;;;;;;;51026:330:::0;;:::o;33858:103::-;33069:13;:11;:13::i;:::-;33923:30:::1;33950:1;33923:18;:30::i;:::-;33858:103::o:0;51558:217::-;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;51641:12:0;::::1;;::::0;;;:6:::1;:12;::::0;;;;;:25;::::1;;:12;::::0;;::::1;:25;;::::0;51633:60:::1;;;;-1:-1:-1::0;;;51633:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51704:12:0;::::1;;::::0;;;:6:::1;:12;::::0;;;;;;;;:24;;-1:-1:-1;;51704:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51746:21;;9499:51:1;;;9566:18;;;9559:50;51746:21:0::1;::::0;9472:18:1;51746:21:0::1;9331:284:1::0;7968:95:0;8015:13;8048:7;8041:14;;;;;:::i;46933:206::-;47044:4;47061:48;3782:10;47091:9;47102:6;47061:15;:48::i;:::-;-1:-1:-1;47127:4:0;46933:206;;;;:::o;54937:851::-;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;55018:29:0;::::1;55042:4;55018:29;55014:767;;55064:19;-1:-1:-1::0;;;;;55086:26:0;::::1;:132;;55197:21;55086:132;;;55132:45;::::0;-1:-1:-1;;;55132:45:0;;55171:4:::1;55132:45;::::0;::::1;3321:51:1::0;-1:-1:-1;;;;;55132:30:0;::::1;::::0;::::1;::::0;3294:18:1;;55132:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55064:154;;55253:1;55239:11;:15;:45;;;;-1:-1:-1::0;;;;;;55258:26:0;::::1;::::0;::::1;55239:45;55235:372;;;55305:58;-1:-1:-1::0;;;;;55305:33:0;::::1;55339:10;55351:11:::0;55305:33:::1;:58::i;:::-;55049:569;54686:81:::0;:::o;55235:372::-:1;55389:15:::0;;55385:222:::1;;55444:88;::::0;55426:12:::1;::::0;55452:10:::1;::::0;55476:11;;55426:12;55444:88;55426:12;55444:88;55476:11;55452:10;55444:88:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55425:107;;;55559:7;55551:40;;;::::0;-1:-1:-1;;;55551:40:0;;10221:2:1;55551:40:0::1;::::0;::::1;10203:21:1::0;10260:2;10240:18;;;10233:30;-1:-1:-1;;;10279:18:1;;;10272:50;10339:18;;55551:40:0::1;10019:344:1::0;55551:40:0::1;55406:201;55049:569;54686:81:::0;:::o;55014:767::-:1;55688:17;::::0;55679:4:::1;55639:19;9114:18:::0;;;;;;;;;;;55639:19;;55661:44:::1;::::0;::::1;:::i;:::-;55639:66;;55720:49;55738:4;55745:10;55757:11;55720:9;:49::i;50010:221::-:0;33069:13;:11;:13::i;:::-;50103::::1;50089:27;;:10;;;;;;;;;;;:27;;::::0;50081:62:::1;;;;-1:-1:-1::0;;;50081:62:0::1;;;;;;;:::i;:::-;50154:10;:26:::0;;;::::1;;-1:-1:-1::0;;;50154:26:0::1;-1:-1:-1::0;;;;50154:26:0;;::::1;;::::0;;50198:25:::1;::::0;::::1;::::0;::::1;::::0;50167:13;1816:14:1;1809:22;1791:41;;1779:2;1764:18;;1651:187;52946:372:0;33069:13;:11;:13::i;:::-;53080:15:::1;::::0;-1:-1:-1;;;;;53080:15:0;;::::1;53060:35:::0;;::::1;::::0;53052:70:::1;;;;-1:-1:-1::0;;;53052:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53141:30:0;::::1;53133:66;;;;-1:-1:-1::0;;;53133:66:0::1;;;;;;;:::i;:::-;53210:15;:34:::0;;-1:-1:-1;;;;;;53210:34:0::1;-1:-1:-1::0;;;;;53210:34:0;::::1;::::0;;::::1;::::0;;;53260:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;53260:50:0::1;::::0;8411:18:1;53260:50:0::1;8248:320:1::0;57328:67:0;33069:13;:11;:13::i;:::-;57377:10:::1;:8;:10::i;56026:362::-:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;56168:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:46;::::1;;:34;::::0;;::::1;:46;;::::0;56146:118:::1;;;;-1:-1:-1::0;;;56146:118:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56275:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:45;;-1:-1:-1;;56275:45:0::1;::::0;::::1;;::::0;;::::1;::::0;;;56338:42;;9499:51:1;;;9566:18;;;9559:50;56338:42:0::1;::::0;9472:18:1;56338:42:0::1;9331:284:1::0;51916:374:0;33069:13;:11;:13::i;:::-;52050:15:::1;::::0;-1:-1:-1;;;;;52050:15:0;;::::1;52030:35:::0;;::::1;::::0;52022:70:::1;;;;-1:-1:-1::0;;;52022:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52111:30:0;::::1;52103:66;;;;-1:-1:-1::0;;;52103:66:0::1;;;;;;;:::i;:::-;52180:15;:34:::0;;-1:-1:-1;;;;;;52180:34:0::1;-1:-1:-1::0;;;;;52180:34:0;::::1;::::0;;::::1;::::0;;;52232:50:::1;::::0;;8476:34:1;;;8541:2;8526:18;;8519:43;;;;52232:50:0::1;::::0;8411:18:1;52232:50:0::1;8248:320:1::0;34116:220:0;33069:13;:11;:13::i;:::-;-1:-1:-1;;;;;34201:22:0;::::1;34197:93;;34247:31;::::0;-1:-1:-1;;;34247:31:0;;34275:1:::1;34247:31;::::0;::::1;3321:51:1::0;3294:18;;34247:31:0::1;3175:203:1::0;34197:93:0::1;34300:28;34319:8;34300:18;:28::i;14962:130::-:0;15047:37;15056:5;15063:7;15072:5;15079:4;15047:8;:37::i;33348:166::-;33256:6;;-1:-1:-1;;;;;33256:6:0;3782:10;33408:23;33404:103;;33455:40;;-1:-1:-1;;;33455:40:0;;3782:10;33455:40;;;3321:51:1;3294:18;;33455:40:0;3175:203:1;15943:486:0;-1:-1:-1;;;;;16099:19:0;;16095:91;;16142:32;;-1:-1:-1;;;16142:32:0;;16171:1;16142:32;;;3321:51:1;3294:18;;16142:32:0;3175:203:1;16095:91:0;-1:-1:-1;;;;;16200:21:0;;16196:92;;16245:31;;-1:-1:-1;;;16245:31:0;;16273:1;16245:31;;;3321:51:1;3294:18;;16245:31:0;3175:203:1;16196:92:0;-1:-1:-1;;;;;16298:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;16344:78;;;;16395:7;-1:-1:-1;;;;;16379:31:0;16388:5;-1:-1:-1;;;;;16379:31:0;;16404:5;16379:31;;;;1159:25:1;;1147:2;1132:18;;1013:177;16379:31:0;;;;;;;;16344:78;15943:486;;;;:::o;48033:1845::-;48177:7;-1:-1:-1;;;;;48167:17:0;:6;-1:-1:-1;;;;;48167:17:0;;48163:33;;48186:10;:8;:10::i;:::-;48228;;-1:-1:-1;;;48228:10:0;;;;48227:11;;:53;;-1:-1:-1;;;;;;48255:25:0;;;;;;:17;:25;;;;;;;;48227:53;:98;;;-1:-1:-1;;;;;;48297:28:0;;;;;;:17;:28;;;;;;;;48227:98;:154;;;-1:-1:-1;;;;;;48344:17:0;;;;;;:6;:17;;;;;;;;48343:18;:37;;;;-1:-1:-1;;;;;;48366:14:0;;;;;;:6;:14;;;;;;;;48365:15;48343:37;48227:182;;;;48398:6;;48408:1;48398:11;48227:182;48209:1143;;;48436:36;48446:6;48454:9;48465:6;48436:9;:36::i;:::-;48209:1143;;;-1:-1:-1;;;;;48522:17:0;;48505:14;48522:17;;;:6;:17;;;;;;;;:36;;48551:7;48522:36;;;48542:6;48522:36;48505:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42803:5:0;;48619:22;;:6;:22;:::i;:::-;48618:35;;;;:::i;:::-;48595:58;;48668:20;42803:5;48701:3;:13;;;48692:22;;:6;:22;;;;:::i;:::-;48691:35;;;;:::i;:::-;48668:58;;48741:20;42803:5;48774:3;:13;;;48765:22;;:6;:22;;;;:::i;:::-;48764:35;;;;:::i;:::-;48741:58;-1:-1:-1;48820:16:0;;48816:87;;48873:15;;48855:48;;48865:6;;-1:-1:-1;;;;;48873:15:0;48890:12;48855:9;:48::i;:::-;48922:16;;48918:87;;48975:15;;48957:48;;48967:6;;-1:-1:-1;;;;;48975:15:0;48992:12;48957:9;:48::i;:::-;49022:147;49050:6;49075:9;49142:12;49127;49103:21;49112:12;49103:6;:21;:::i;:::-;:36;;;;:::i;:::-;:51;;;;:::i;:::-;49022:9;:147::i;:::-;49190:16;;49186:155;;49248:12;49227:17;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;49279:46:0;;-1:-1:-1;49289:6:0;49305:4;49312:12;49279:9;:46::i;:::-;48490:862;;;;48209:1143;-1:-1:-1;;;;;49616:14:0;;49561;49616;;;:6;:14;;;;;;;;42880:6;49578:15;:21;49616:22;;;;;;;;:32;;;;;;;;49715:14;;-1:-1:-1;49689:40:0;;:98;;-1:-1:-1;;;;;;49754:33:0;;;;;;:25;:33;;;;;;;;49689:98;49663:196;;;;-1:-1:-1;;;49663:196:0;;11006:2:1;49663:196:0;;;10988:21:1;11045:2;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;-1:-1:-1;;;11135:18:1;;;11128:34;11179:19;;49663:196:0;10804:400:1;14198:211:0;-1:-1:-1;;;;;14269:21:0;;14265:91;;14314:30;;-1:-1:-1;;;14314:30:0;;14341:1;14314:30;;;3321:51:1;3294:18;;14314:30:0;3175:203:1;14265:91:0;14366:35;14374:7;14391:1;14395:5;14366:7;:35::i;34496:191::-;34589:6;;;-1:-1:-1;;;;;34606:17:0;;;-1:-1:-1;;;;;;34606:17:0;;;;;;;34639:40;;34589:6;;;34606:17;34589:6;;34639:40;;34570:16;;34639:40;34559:128;34496:191;:::o;26607:162::-;26717:43;;;-1:-1:-1;;;;;11401:32:1;;26717:43:0;;;11383:51:1;11450:18;;;;11443:34;;;26717:43:0;;;;;;;;;;11356:18:1;;;;26717:43:0;;;;;;;;-1:-1:-1;;;;;26717:43:0;-1:-1:-1;;;26717:43:0;;;26690:71;;26710:5;;26690:19;:71::i;11537:308::-;-1:-1:-1;;;;;11621:18:0;;11617:88;;11663:30;;-1:-1:-1;;;11663:30:0;;11690:1;11663:30;;;3321:51:1;3294:18;;11663:30:0;3175:203:1;11617:88:0;-1:-1:-1;;;;;11719:16:0;;11715:88;;11759:32;;-1:-1:-1;;;11759:32:0;;11788:1;11759:32;;;3321:51:1;3294:18;;11759:32:0;3175:203:1;11715:88:0;11813:24;11821:4;11827:2;11831:5;11813:7;:24::i;57403:1141::-;57446:6;;57456:1;57446:11;57442:24;;57403:1141::o;57442:24::-;57502:17;;57482;;:37;57478:1059;;;57545:1;57536:6;:10;;;;57601:17;57620;57658:7;-1:-1:-1;;;;;57643:53:0;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;57600:98:0;;;;-1:-1:-1;57600:98:0;;-1:-1:-1;57782:21:0;-1:-1:-1;;;;;57822:4:0;57806:20;57814:4;57806:20;:78;;57875:9;57806:78;;;57846:9;57806:78;57782:102;-1:-1:-1;58001:17:0;58044:3;58022:18;57782:102;58038:2;58022:18;:::i;:::-;58021:26;;;;:::i;:::-;58001:46;;58064:14;58101:9;58081:17;;:29;:95;;58159:17;;58081:95;;;58130:9;58081:95;58064:112;-1:-1:-1;58193:12:0;58208:10;58217:1;58064:112;58208:10;:::i;:::-;58193:25;-1:-1:-1;58271:17:0;58291:13;58193:25;58291:6;:13;:::i;:::-;58271:33;;58321:23;58339:4;58321:17;:23::i;:::-;58382:21;58420:36;58434:9;58382:21;58420:13;:36::i;:::-;58494:6;58473:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;58524:1:0;58515:6;:10;-1:-1:-1;;;;;;;;57403:1141:0:o;12169:1135::-;-1:-1:-1;;;;;12259:18:0;;12255:552;;12413:5;12397:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;12255:552:0;;-1:-1:-1;12255:552:0;;-1:-1:-1;;;;;12473:15:0;;12451:19;12473:15;;;;;;;;;;;12507:19;;;12503:117;;;12554:50;;-1:-1:-1;;;12554:50:0;;-1:-1:-1;;;;;12356:32:1;;12554:50:0;;;12338:51:1;12405:18;;;12398:34;;;12448:18;;;12441:34;;;12311:18;;12554:50:0;12136:345:1;12503:117:0;-1:-1:-1;;;;;12743:15:0;;:9;:15;;;;;;;;;;12761:19;;;;12743:37;;12255:552;-1:-1:-1;;;;;12823:16:0;;12819:435;;12989:12;:21;;;;;;;12819:435;;;-1:-1:-1;;;;;13205:13:0;;:9;:13;;;;;;;;;;:22;;;;;;12819:435;13286:2;-1:-1:-1;;;;;13271:25:0;13280:4;-1:-1:-1;;;;;13271:25:0;;13290:5;13271:25;;;;1159::1;;1147:2;1132:18;;1013:177;13271:25:0;;;;;;;;12169:1135;;;:::o;29768:638::-;30192:23;30218:33;-1:-1:-1;;;;;30218:27:0;;30246:4;30218:27;:33::i;:::-;30192:59;;30266:10;:17;30287:1;30266:22;;:57;;;;;30304:10;30293:30;;;;;;;;;;;;:::i;:::-;30292:31;30266:57;30262:137;;;30347:40;;-1:-1:-1;;;30347:40:0;;-1:-1:-1;;;;;3339:32:1;;30347:40:0;;;3321:51:1;3294:18;;30347:40:0;3175:203:1;58552:589:0;58704:16;;;58718:1;58704:16;;;;;;;;58680:21;;58704:16;;;;;;;;;;-1:-1:-1;58704:16:0;58680:40;;58749:4;58731;58736:1;58731:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;58731:23:0;;;-1:-1:-1;;;;;58731:23:0;;;;;58775:4;58765;58770:1;58765:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58765:14:0;;;:7;;;;;;;;;:14;58871:242;;-1:-1:-1;;;58871:242:0;;:9;:60;;;;;;:242;;58950:11;;58980:1;;59028:4;;59059;;59083:15;;58871:242;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58854:280;;;58609:532;58552:589;:::o;59149:397::-;59454:15;;59290:228;;-1:-1:-1;;;59290:228:0;;59360:4;59290:228;;;14334:34:1;14384:18;;;14377:34;;;59414:1:0;14427:18:1;;;14420:34;;;14470:18;;;14463:34;-1:-1:-1;;;;;59454:15:0;;;14513:19:1;;;14506:44;59488:15:0;14566:19:1;;;14559:35;59290:9:0;:25;;;;;;59323:9;;14268:19:1;;59290:228:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59290:228:0;;;;;;;;-1:-1:-1;;59290:228:0;;;;;;;;;;;;:::i;:::-;;;59273:266;;;;;;59149:397;;:::o;21643:178::-;21743:12;21775:38;21797:6;21805:4;21811:1;21743:12;22435;22449:23;22476:6;-1:-1:-1;;;;;22476:11:0;22495:5;22516:4;22476:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:97;;;;22549:55;22576:6;22584:7;22593:10;22549:26;:55::i;:::-;22542:62;22156:456;-1:-1:-1;;;;;;22156:456:0:o;23740:597::-;23888:12;23918:7;23913:417;;23942:19;23950:10;23942:7;:19::i;:::-;23913:417;;;24170:17;;:22;:49;;;;-1:-1:-1;;;;;;24196:18:0;;;:23;24170:49;24166:121;;;24247:24;;-1:-1:-1;;;24247:24:0;;-1:-1:-1;;;;;3339:32:1;;24247:24:0;;;3321:51:1;3294:18;;24247:24:0;3175:203:1;24166:121:0;-1:-1:-1;24308:10:0;24301:17;;24915:528;25048:17;;:21;25044:392;;25280:10;25274:17;25337:15;25324:10;25320:2;25316:19;25309:44;25044:392;25407:17;;-1:-1:-1;;;25407:17:0;;;;;;;;;;;357:250:1;442:1;452:113;466:6;463:1;460:13;452:113;;;542:11;;;536:18;523:11;;;516:39;488:2;481:10;452:113;;;-1:-1:-1;;599:1:1;581:16;;574:27;357:250::o;612:396::-;761:2;750:9;743:21;724:4;793:6;787:13;836:6;831:2;820:9;816:18;809:34;852:79;924:6;919:2;908:9;904:18;899:2;891:6;887:15;852:79;:::i;:::-;992:2;971:15;-1:-1:-1;;967:29:1;952:45;;;;999:2;948:54;;612:396;-1:-1:-1;;612:396:1:o;1195:131::-;-1:-1:-1;;;;;1270:31:1;;1260:42;;1250:70;;1316:1;1313;1306:12;1331:315;1399:6;1407;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;1515:9;1502:23;1534:31;1559:5;1534:31;:::i;:::-;1584:5;1636:2;1621:18;;;;1608:32;;-1:-1:-1;;;1331:315:1:o;1843:180::-;1902:6;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;-1:-1:-1;1994:23:1;;1843:180;-1:-1:-1;1843:180:1:o;2028:159::-;2095:20;;2155:6;2144:18;;2134:29;;2124:57;;2177:1;2174;2167:12;2124:57;2028:159;;;:::o;2192:328::-;2266:6;2274;2282;2335:2;2323:9;2314:7;2310:23;2306:32;2303:52;;;2351:1;2348;2341:12;2303:52;2374:28;2392:9;2374:28;:::i;:::-;2364:38;;2421:37;2454:2;2443:9;2439:18;2421:37;:::i;:::-;2411:47;;2477:37;2510:2;2499:9;2495:18;2477:37;:::i;:::-;2467:47;;2192:328;;;;;:::o;2525:456::-;2602:6;2610;2618;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;2726:9;2713:23;2745:31;2770:5;2745:31;:::i;:::-;2795:5;-1:-1:-1;2852:2:1;2837:18;;2824:32;2865:33;2824:32;2865:33;:::i;:::-;2525:456;;2917:7;;-1:-1:-1;;;2971:2:1;2956:18;;;;2943:32;;2525:456::o;3383:255::-;3450:6;3503:2;3491:9;3482:7;3478:23;3474:32;3471:52;;;3519:1;3516;3509:12;3471:52;3558:9;3545:23;3577:31;3602:5;3577:31;:::i;4265:118::-;4351:5;4344:13;4337:21;4330:5;4327:32;4317:60;;4373:1;4370;4363:12;4388:382;4453:6;4461;4514:2;4502:9;4493:7;4489:23;4485:32;4482:52;;;4530:1;4527;4520:12;4482:52;4569:9;4556:23;4588:31;4613:5;4588:31;:::i;:::-;4638:5;-1:-1:-1;4695:2:1;4680:18;;4667:32;4708:30;4667:32;4708:30;:::i;:::-;4757:7;4747:17;;;4388:382;;;;;:::o;5462:241::-;5518:6;5571:2;5559:9;5550:7;5546:23;5542:32;5539:52;;;5587:1;5584;5577:12;5539:52;5626:9;5613:23;5645:28;5667:5;5645:28;:::i;5708:388::-;5776:6;5784;5837:2;5825:9;5816:7;5812:23;5808:32;5805:52;;;5853:1;5850;5843:12;5805:52;5892:9;5879:23;5911:31;5936:5;5911:31;:::i;:::-;5961:5;-1:-1:-1;6018:2:1;6003:18;;5990:32;6031:33;5990:32;6031:33;:::i;6101:380::-;6180:1;6176:12;;;;6223;;;6244:61;;6298:4;6290:6;6286:17;6276:27;;6244:61;6351:2;6343:6;6340:14;6320:18;6317:38;6314:161;;6397:10;6392:3;6388:20;6385:1;6378:31;6432:4;6429:1;6422:15;6460:4;6457:1;6450:15;6314:161;;6101:380;;;:::o;6486:346::-;6688:2;6670:21;;;6727:2;6707:18;;;6700:30;-1:-1:-1;;;6761:2:1;6746:18;;6739:52;6823:2;6808:18;;6486:346::o;6837:127::-;6898:10;6893:3;6889:20;6886:1;6879:31;6929:4;6926:1;6919:15;6953:4;6950:1;6943:15;6969:168;7036:6;7062:10;;;7074;;;7058:27;;7097:11;;;7094:37;;;7111:18;;:::i;:::-;7094:37;6969:168;;;;:::o;7896:347::-;8098:2;8080:21;;;8137:2;8117:18;;;8110:30;8176:25;8171:2;8156:18;;8149:53;8234:2;8219:18;;7896:347::o;8705:217::-;8745:1;8771;8761:132;;8815:10;8810:3;8806:20;8803:1;8796:31;8850:4;8847:1;8840:15;8878:4;8875:1;8868:15;8761:132;-1:-1:-1;8907:9:1;;8705:217::o;9620:184::-;9690:6;9743:2;9731:9;9722:7;9718:23;9714:32;9711:52;;;9759:1;9756;9749:12;9711:52;-1:-1:-1;9782:16:1;;9620:184;-1:-1:-1;9620:184:1:o;10368:128::-;10435:9;;;10456:11;;;10453:37;;;10470:18;;:::i;10501:168::-;10574:9;;;10605;;10622:15;;;10616:22;;10602:37;10592:71;;10643:18;;:::i;10674:125::-;10739:9;;;10760:10;;;10757:36;;;10773:18;;:::i;11488:188::-;11567:13;;-1:-1:-1;;;;;11609:42:1;;11599:53;;11589:81;;11666:1;11663;11656:12;11681:450;11768:6;11776;11784;11837:2;11825:9;11816:7;11812:23;11808:32;11805:52;;;11853:1;11850;11843:12;11805:52;11876:40;11906:9;11876:40;:::i;:::-;11866:50;;11935:49;11980:2;11969:9;11965:18;11935:49;:::i;:::-;11925:59;;12027:2;12016:9;12012:18;12006:25;12071:10;12064:5;12060:22;12053:5;12050:33;12040:61;;12097:1;12094;12087:12;12040:61;12120:5;12110:15;;;11681:450;;;;;:::o;12486:245::-;12553:6;12606:2;12594:9;12585:7;12581:23;12577:32;12574:52;;;12622:1;12619;12612:12;12574:52;12654:9;12648:16;12673:28;12695:5;12673:28;:::i;12868:127::-;12929:10;12924:3;12920:20;12917:1;12910:31;12960:4;12957:1;12950:15;12984:4;12981:1;12974:15;13000:980;13262:4;13310:3;13299:9;13295:19;13341:6;13330:9;13323:25;13367:2;13405:6;13400:2;13389:9;13385:18;13378:34;13448:3;13443:2;13432:9;13428:18;13421:31;13472:6;13507;13501:13;13538:6;13530;13523:22;13576:3;13565:9;13561:19;13554:26;;13615:2;13607:6;13603:15;13589:29;;13636:1;13646:195;13660:6;13657:1;13654:13;13646:195;;;13725:13;;-1:-1:-1;;;;;13721:39:1;13709:52;;13816:15;;;;13781:12;;;;13757:1;13675:9;13646:195;;;-1:-1:-1;;;;;;;13897:32:1;;;;13892:2;13877:18;;13870:60;-1:-1:-1;;;13961:3:1;13946:19;13939:35;13858:3;13000:980;-1:-1:-1;;;13000:980:1:o;14605:306::-;14693:6;14701;14709;14762:2;14750:9;14741:7;14737:23;14733:32;14730:52;;;14778:1;14775;14768:12;14730:52;14807:9;14801:16;14791:26;;14857:2;14846:9;14842:18;14836:25;14826:35;;14901:2;14890:9;14886:18;14880:25;14870:35;;14605:306;;;;;:::o;14916:287::-;15045:3;15083:6;15077:13;15099:66;15158:6;15153:3;15146:4;15138:6;15134:17;15099:66;:::i;:::-;15181:16;;;;;14916:287;-1:-1:-1;;14916:287:1:o
Swarm Source
ipfs://183a02c078f663bcdb2ae338660573d04bf4ed0b31f9d2e2b0a8d0ccfb310c65
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.