More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 8,159 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 328686007 | 41 hrs ago | IN | 0 ETH | 0.00000079 | ||||
Approve | 328621490 | 45 hrs ago | IN | 0 ETH | 0.00000049 | ||||
Transfer | 328621141 | 45 hrs ago | IN | 0 ETH | 0.00000093 | ||||
Approve | 327913233 | 3 days ago | IN | 0 ETH | 0.0000005 | ||||
Approve | 327826962 | 4 days ago | IN | 0 ETH | 0.00000049 | ||||
Approve | 327719307 | 4 days ago | IN | 0 ETH | 0.00000143 | ||||
Approve | 327589081 | 4 days ago | IN | 0 ETH | 0.00000105 | ||||
Approve | 327540507 | 5 days ago | IN | 0 ETH | 0.00000097 | ||||
Approve | 327464191 | 5 days ago | IN | 0 ETH | 0.00000047 | ||||
Approve | 327463964 | 5 days ago | IN | 0 ETH | 0.00000047 | ||||
Approve | 327420098 | 5 days ago | IN | 0 ETH | 0.00000225 | ||||
Approve | 327384425 | 5 days ago | IN | 0 ETH | 0.00000176 | ||||
Approve | 327306057 | 5 days ago | IN | 0 ETH | 0.00000091 | ||||
Approve | 327286361 | 5 days ago | IN | 0 ETH | 0.00000108 | ||||
Approve | 327191257 | 6 days ago | IN | 0 ETH | 0.00000126 | ||||
Approve | 327187417 | 6 days ago | IN | 0 ETH | 0.0000013 | ||||
Approve | 326898442 | 6 days ago | IN | 0 ETH | 0.00000026 | ||||
Approve | 324750164 | 13 days ago | IN | 0 ETH | 0.00000028 | ||||
Approve | 324750144 | 13 days ago | IN | 0 ETH | 0.00000028 | ||||
Transfer | 324030855 | 15 days ago | IN | 0 ETH | 0.00000117 | ||||
Approve | 322619934 | 19 days ago | IN | 0 ETH | 0.00000027 | ||||
Transfer | 322293035 | 20 days ago | IN | 0 ETH | 0.00000723 | ||||
Approve | 322292035 | 20 days ago | IN | 0 ETH | 0.00000519 | ||||
Approve | 322128591 | 20 days ago | IN | 0 ETH | 0.00000027 | ||||
Approve | 321824135 | 21 days ago | IN | 0 ETH | 0.00000287 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
145918332 | 539 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
AICodeV2
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2023-11-01 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.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. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `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. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage); } } } pragma solidity ^0.8.0; /** * @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 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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @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); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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.isContract(address(token)); } } pragma solidity >=0.6.2; 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 quote( uint amountA, uint reserveA, uint reserveB ) external pure returns (uint amountB); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; 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; } pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function feeToRate() external view returns (uint256); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity >=0.5.0; interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint) external; } pragma solidity =0.8.19; contract AICodeV2Vault { constructor() {} } contract AICodeV2 is ERC20, Ownable { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; event SwapBack(uint256 burn, uint256 vault, uint256 staking, uint timestamp); event Trade(address user, address pair, uint256 amount, uint side, uint timestamp); event AddLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 timestamp); event SetIsFromFeeExempt(address op, address account, bool isExempt); event SetIsToFeeExempt(address op, address account, bool isExempt); event SetIsSenderFeeExempt(address op, address account, bool isExempt); event SetFees(uint256 burnFee, uint256 vaultFee, uint256 stakingFee, uint256 timestamp); event SetFeeReceivers(address vaultWallet, address stakingWallet); event AddPair(address op, address pair); event RemovePair(address op, address pair); event AddDistributer(address op, address distributer); event RemoveDistributer(address op, address distributer); event Distribute(address distributer, uint256 amount, uint256 timestamp); bool public inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } uint256 public constant FeeDenominator = 10000; uint256 constant public MAX_SUPPLY = 21_000_000 * 1e18; mapping(address => bool) public isFromFeeExempt; mapping(address => bool) public isToFeeExempt; mapping(address => bool) public isSenderFeeExempt; uint256 public burnFee = 200; uint256 public vaultFee = 200; uint256 public stakingFee = 400; uint256 public totalFee = 800; address public vaultWallet; address public stakingWallet; IUniswapV2Router02 public immutable swapRouter; IUniswapV2Factory public immutable swapFactory; IWETH public immutable WETH; IERC20 public immutable oldToken; address private constant DEAD = 0x000000000000000000000000000000000000dEaD; address private constant ZERO = 0x0000000000000000000000000000000000000000; EnumerableSet.AddressSet private _pairs; EnumerableSet.AddressSet private _distributers; AICodeV2Vault public vault; bool public pairInitialized; uint256 public startAt; constructor( address _oldToken, address _swapRouter, address _swapFactory, address _weth, uint256 _startAt ) ERC20("AICODE v2", "AICODE") { isFromFeeExempt[msg.sender] = true; isToFeeExempt[msg.sender] = true; isSenderFeeExempt[msg.sender] = true; isFromFeeExempt[address(this)] = true; isToFeeExempt[address(this)] = true; isSenderFeeExempt[address(this)] = true; // isFromFeeExempt[_swapRouter] = true; isToFeeExempt[_swapRouter] = true; oldToken = IERC20(_oldToken); swapRouter = IUniswapV2Router02(_swapRouter); swapFactory = IUniswapV2Factory(_swapFactory); WETH = IWETH(_weth); vault = new AICodeV2Vault(); _approve(address(vault), address(this), type(uint256).max); _mint(address(vault), MAX_SUPPLY); startAt = _startAt; } function initializePair() external { require(!pairInitialized, "pair already initialized"); address pair = swapFactory.createPair(address(WETH), address(this)); _pairs.add(pair); pairInitialized = true; } function burn(uint256 amount) external { _burn(_msgSender(), amount); } function transfer(address to, uint256 amount) public virtual override returns (bool) { return _doTransfer(_msgSender(), to, amount); } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(sender, spender, amount); return _doTransfer(sender, recipient, amount); } function _doTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { if (inSwap) { _transfer(sender, recipient, amount); return true; } bool shouldTakeFee = !isSenderFeeExempt[msg.sender] && !isFromFeeExempt[sender] && !isToFeeExempt[recipient]; uint side = 0; address user_ = sender; address pair_ = recipient; if (shouldTakeFee) { if (isPair(sender)) { side = 1; user_ = recipient; pair_ = sender; } else if (isPair(recipient)) { side = 2; } } if (shouldSwapBack()) { swapBack(); } uint256 amountReceived = shouldTakeFee ? takeFee(sender, amount) : amount; _transfer(sender, recipient, amountReceived); if (side > 0) { emit Trade(user_, pair_, amount, side, block.timestamp); } return true; } function shouldSwapBack() internal view returns (bool) { return !inSwap && balanceOf(address(this)) > 0 && !isPair(_msgSender()); } function swapBack() internal swapping { uint256 taxAmount = balanceOf(address(this)); if (taxAmount == 0) return; if (totalFee == 0) return; _approve(address(this), address(swapRouter), taxAmount); uint256 amountBurn = taxAmount * burnFee / totalFee; uint256 amountVault = taxAmount * vaultFee / totalFee; uint256 amountStaking = taxAmount * stakingFee / totalFee; if (amountBurn > 0) { _burn(address(this), amountBurn); } if (amountVault > 0) { _transfer(address(this), address(vaultWallet), amountVault); } if (amountStaking > 0) { _transfer(address(this), address(stakingWallet), amountStaking); } emit SwapBack(amountBurn, amountVault, amountStaking, block.timestamp); } function doSwapBack() public { swapBack(); } function takeFee(address sender, uint256 amount) internal returns (uint256) { uint256 feeAmount = (amount * totalFee) / FeeDenominator; _transfer(sender, address(this), feeAmount); return amount - feeAmount; } function getCirculatingSupply() public view returns (uint256) { return totalSupply() - balanceOf(DEAD) - balanceOf(ZERO) - balanceOf(address(vault)); } function distribute(address to, uint256 amount) public onlyDistributer { _transfer(address(vault), to, amount); emit Distribute(to, amount, block.timestamp); } function swapNewToken(uint256 amount) public { require(block.timestamp >= startAt, "AICodeV2: not start"); oldToken.transferFrom(msg.sender, DEAD, amount); _transfer(address(vault), msg.sender, amount*6142927377340197000/1e18); } function setFees( uint256 _burnFee, uint256 _vaultFee, uint256 _stakingFee ) external onlyOwner { burnFee = _burnFee; vaultFee = _vaultFee; stakingFee = _stakingFee; totalFee = _burnFee + _vaultFee + _stakingFee; require(totalFee <= 1500, "Invalid fee"); emit SetFees(burnFee, vaultFee, stakingFee, block.timestamp); } function setFeeReceivers( address _vaultWallet, address _stakingPool ) external onlyOwner { vaultWallet = _vaultWallet; stakingWallet = _stakingPool; emit SetFeeReceivers(_vaultWallet, _stakingPool); } function setStartAt(uint256 _startAt) external onlyOwner { require(_startAt < 1701360000, "bad num"); startAt = _startAt; } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFromFeeExempt[holder] = exempt; isToFeeExempt[holder] = exempt; isSenderFeeExempt[holder] = exempt; emit SetIsFromFeeExempt(msg.sender, holder, exempt); emit SetIsToFeeExempt(msg.sender, holder, exempt); emit SetIsSenderFeeExempt(msg.sender, holder, exempt); } function setIsFromFeeExempt(address holder, bool exempt) external onlyOwner { isFromFeeExempt[holder] = exempt; emit SetIsFromFeeExempt(msg.sender, holder, exempt); } function setIsToFeeExempt(address holder, bool exempt) external onlyOwner { isToFeeExempt[holder] = exempt; emit SetIsToFeeExempt(msg.sender, holder, exempt); } function setIsSenderFeeExempt(address holder, bool exempt) external onlyOwner { isSenderFeeExempt[holder] = exempt; emit SetIsSenderFeeExempt(msg.sender, holder, exempt); } function isPair(address account) public view returns (bool) { return _pairs.contains(account); } function addPair(address pair) public onlyOwner returns (bool) { require(pair != address(0), "AICodeV2: pair is 0"); emit AddPair(msg.sender, pair); return _pairs.add(pair); } function delPair(address pair) public onlyOwner returns (bool) { require(pair != address(0), "AICodeV2: pair is 0"); emit RemovePair(msg.sender, pair); return _pairs.remove(pair); } function getPairsLength() public view returns (uint256) { return _pairs.length(); } function getPair(uint256 index) public view returns (address) { require(index <= _pairs.length() - 1, "AICodeV2: index out of bounds"); return _pairs.at(index); } function clearStuckEthBalance() external onlyOwner { uint256 amountETH = address(this).balance; (bool success, ) = payable(_msgSender()).call{value: amountETH}(new bytes(0)); require(success, 'AICodeV2: ETH_TRANSFER_FAILED'); } modifier onlyDistributer() { require(_distributers.contains(_msgSender()), "AICodeV2: Only distributer"); _; } function addDistributer(address account) public onlyOwner returns (bool) { require(account != address(0), "AICodeV2: distributer is 0"); emit AddDistributer(msg.sender, account); return _distributers.add(account); } function delDistributer(address account) public onlyOwner returns (bool) { require(account != address(0), "AICodeV2: distributer is 0"); emit RemoveDistributer(msg.sender, account); return _distributers.remove(account); } function getDistributers() public view returns (address[] memory) { return _distributers.values(); } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_oldToken","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_swapFactory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_startAt","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"distributer","type":"address"}],"name":"AddDistributer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"AddPair","type":"event"},{"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":"address","name":"distributer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Distribute","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":"op","type":"address"},{"indexed":false,"internalType":"address","name":"distributer","type":"address"}],"name":"RemoveDistributer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"RemovePair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vaultWallet","type":"address"},{"indexed":false,"internalType":"address","name":"stakingWallet","type":"address"}],"name":"SetFeeReceivers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vaultFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SetFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"SetIsFromFeeExempt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"SetIsSenderFeeExempt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"op","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"SetIsToFeeExempt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vault","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"staking","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"side","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addDistributer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckEthBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delDistributer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"delPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDistributers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFromFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSenderFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isToFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultWallet","type":"address"},{"internalType":"address","name":"_stakingPool","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_vaultFee","type":"uint256"},{"internalType":"uint256","name":"_stakingFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFromFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsSenderFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsToFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startAt","type":"uint256"}],"name":"setStartAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"swapNewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"vault","outputs":[{"internalType":"contract AICodeV2Vault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
61010060405260c860095560c8600a55610190600b55610320600c553480156200002857600080fd5b5060405162002d5638038062002d568339810160408190526200004b916200046a565b6040518060400160405280600981526020016820a4a1a7a222903b1960b91b815250604051806040016040528060068152602001654149434f444560d01b81525081600390816200009d919062000575565b506004620000ac828262000575565b505050620000c9620000c3620001f660201b60201c565b620001fa565b3360009081526006602081815260408084208054600160ff19918216811790925560078085528387208054831684179055600880865284882080548416851790553088529585528387208054831684179055808552838720805483168417905594845282862080548216831790556001600160a01b038a8116808852959094529482902080549095161790935587811660e05260809190915284811660a052831660c05251620001799062000440565b604051809103906000f08015801562000196573d6000803e3d6000fd5b50601380546001600160a01b0319166001600160a01b03929092169182179055620001c590306000196200024c565b601354620001e8906001600160a01b03166a115eec47f6cf7e3500000062000378565b601455506200066992505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316620002b45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620003175760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620002ab565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620003d05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620002ab565b8060026000828254620003e4919062000641565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b605c8062002cfa83390190565b80516001600160a01b03811681146200046557600080fd5b919050565b600080600080600060a086880312156200048357600080fd5b6200048e866200044d565b94506200049e602087016200044d565b9350620004ae604087016200044d565b9250620004be606087016200044d565b9150608086015190509295509295909350565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004fc57607f821691505b6020821081036200051d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043b57600081815260208120601f850160051c810160208610156200054c5750805b601f850160051c820191505b818110156200056d5782815560010162000558565b505050505050565b81516001600160401b03811115620005915762000591620004d1565b620005a981620005a28454620004e7565b8462000523565b602080601f831160018114620005e15760008415620005c85750858301515b600019600386901b1c1916600185901b1785556200056d565b600085815260208120601f198616915b828110156200061257888601518255948401946001909101908401620005f1565b5085821015620006315787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200066357634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e05161263b620006bf600039600081816107e0015261164401526000818161077c0152610d490152600081816106280152610d7a0152600081816108890152611d51015261263b6000f3fe6080604052600436106103545760003560e01c806395d89b41116101c6578063cb326316116100f7578063f2fde38b11610095578063fb9321081161006f578063fb93210814610a08578063fbfa77cf14610a28578063fce589d814610a48578063fee2cc5114610a5e57600080fd5b8063f2fde38b146109a8578063f3a133a9146109c8578063f9d0e757146109e857600080fd5b8063dd62ed3e116100d1578063dd62ed3e14610932578063e5e31b1314610952578063ef74339a14610972578063eff988431461099257600080fd5b8063cb326316146108c1578063cec10c11146108f1578063d83067861461091157600080fd5b8063b31c710a11610164578063bfa382b51161013e578063bfa382b514610842578063c2b7bbb614610857578063c31c9c0714610877578063c7446565146108ab57600080fd5b8063b31c710a146107ce578063b898c4d814610802578063bdf391cc1461082257600080fd5b8063a5bc5085116101a0578063a5bc50851461072a578063a9059cbb1461074a578063ad5c46481461076a578063b17dcf2d1461079e57600080fd5b806395d89b41146106d5578063a457c2d7146106ea578063a4b45c001461070a57600080fd5b8063333ef998116102a0578063715018a61161023e5780638da5cb5b116102185780638da5cb5b1461065f5780638fbbd7501461067d578063938e95e41461069257806394d249db146106b457600080fd5b8063715018a6146106015780637944f94414610616578063880e75f21461064a57600080fd5b80634fab9e4c1161027a5780634fab9e4c1461057657806361f1c5ba1461058b578063658d4b7f146105ab57806370a08231146105cb57600080fd5b8063333ef99814610506578063395093511461053657806342966c681461055657600080fd5b806319c0aa0f1161030d5780632b112e49116102e75780632b112e49146104a05780632e0b16d2146104b5578063313ce567146104cb57806332cb6b0c146104e757600080fd5b806319c0aa0f1461044a5780631df4ccfc1461046a57806323b872dd1461048057600080fd5b806301ac145b1461036057806306ee6ad81461038957806306fdde03146103c1578063095ea7b3146103e357806312e670941461041357806318160ddd1461043557600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b50610376600a5481565b6040519081526020015b60405180910390f35b34801561039557600080fd5b50600e546103a9906001600160a01b031681565b6040516001600160a01b039091168152602001610380565b3480156103cd57600080fd5b506103d6610a7e565b60405161038091906122d7565b3480156103ef57600080fd5b506104036103fe36600461231f565b610b10565b6040519015158152602001610380565b34801561041f57600080fd5b5061043361042e366004612359565b610b2a565b005b34801561044157600080fd5b50600254610376565b34801561045657600080fd5b50610433610465366004612359565b610b96565b34801561047657600080fd5b50610376600c5481565b34801561048c57600080fd5b5061040361049b366004612392565b610bf6565b3480156104ac57600080fd5b50610376610c1a565b3480156104c157600080fd5b5061037661271081565b3480156104d757600080fd5b5060405160128152602001610380565b3480156104f357600080fd5b506103766a115eec47f6cf7e3500000081565b34801561051257600080fd5b506104036105213660046123d3565b60076020526000908152604090205460ff1681565b34801561054257600080fd5b5061040361055136600461231f565b610ca4565b34801561056257600080fd5b506104336105713660046123f0565b610cc6565b34801561058257600080fd5b50610433610cd3565b34801561059757600080fd5b50600d546103a9906001600160a01b031681565b3480156105b757600080fd5b506104336105c6366004612359565b610e0d565b3480156105d757600080fd5b506103766105e63660046123d3565b6001600160a01b031660009081526020819052604090205490565b34801561060d57600080fd5b50610433610f0a565b34801561062257600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b34801561065657600080fd5b50610376610f1e565b34801561066b57600080fd5b506005546001600160a01b03166103a9565b34801561068957600080fd5b50610433610f2a565b34801561069e57600080fd5b506106a7610f32565b6040516103809190612409565b3480156106c057600080fd5b5060135461040390600160a01b900460ff1681565b3480156106e157600080fd5b506103d6610f3e565b3480156106f657600080fd5b5061040361070536600461231f565b610f4d565b34801561071657600080fd5b50610433610725366004612456565b610fd3565b34801561073657600080fd5b506104036107453660046123d3565b611042565b34801561075657600080fd5b5061040361076536600461231f565b6110e4565b34801561077657600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b3480156107aa57600080fd5b506104036107b93660046123d3565b60066020526000908152604090205460ff1681565b3480156107da57600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b34801561080e57600080fd5b5061040361081d3660046123d3565b6110f1565b34801561082e57600080fd5b506103a961083d3660046123f0565b61119d565b34801561084e57600080fd5b5061043361120f565b34801561086357600080fd5b506104036108723660046123d3565b6112d0565b34801561088357600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b3480156108b757600080fd5b5061037660145481565b3480156108cd57600080fd5b506104036108dc3660046123d3565b60086020526000908152604090205460ff1681565b3480156108fd57600080fd5b5061043361090c366004612484565b611372565b34801561091d57600080fd5b5060055461040390600160a01b900460ff1681565b34801561093e57600080fd5b5061037661094d366004612456565b611434565b34801561095e57600080fd5b5061040361096d3660046123d3565b61145f565b34801561097e57600080fd5b5061040361098d3660046123d3565b61146c565b34801561099e57600080fd5b50610376600b5481565b3480156109b457600080fd5b506104336109c33660046123d3565b611518565b3480156109d457600080fd5b506104336109e33660046123f0565b61158e565b3480156109f457600080fd5b50610433610a033660046123f0565b6115d8565b348015610a1457600080fd5b50610433610a2336600461231f565b6116f5565b348015610a3457600080fd5b506013546103a9906001600160a01b031681565b348015610a5457600080fd5b5061037660095481565b348015610a6a57600080fd5b50610433610a79366004612359565b6117ac565b606060038054610a8d906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab9906124b0565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b600033610b1e81858561180c565b60019150505b92915050565b610b32611931565b6001600160a01b03821660009081526006602052604090819020805460ff1916831515179055517fb85d1f479dc1239532569c7df02821f97fe28e8d4100e6cff3c474305535090790610b8a903390859085906124ea565b60405180910390a15050565b610b9e611931565b6001600160a01b03821660009081526007602052604090819020805460ff1916831515179055517f48dc5c14208f483faabc461efc35952ca3a0665c7d590773ed7c29359f98651190610b8a903390859085906124ea565b600033610c0485828561198b565b610c0f858585611a05565b9150505b9392505050565b6013546001600160a01b03166000908152602081905260408120547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead83527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf8354600254610c8b9190612524565b610c959190612524565b610c9f9190612524565b905090565b600033610b1e818585610cb78383611434565b610cc19190612537565b61180c565b610cd03382611b6d565b50565b601354600160a01b900460ff1615610d325760405162461bcd60e51b815260206004820152601860248201527f7061697220616c726561647920696e697469616c697a6564000000000000000060448201526064015b60405180910390fd5b6040516364e329cb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063c9c65396906044016020604051808303816000875af1158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de9919061254a565b9050610df6600f82611c97565b50506013805460ff60a01b1916600160a01b179055565b610e15611931565b6001600160a01b0382166000908152600660209081526040808320805485151560ff19918216811790925560078452828520805482168317905560089093529281902080549092169092179055517fb85d1f479dc1239532569c7df02821f97fe28e8d4100e6cff3c474305535090790610e94903390859085906124ea565b60405180910390a17f48dc5c14208f483faabc461efc35952ca3a0665c7d590773ed7c29359f986511338383604051610ecf939291906124ea565b60405180910390a17f3a2f5008966af518c2ae3ad2e064905093aafdcaed1d7bb3a74f1f77db6814aa338383604051610b8a939291906124ea565b610f12611931565b610f1c6000611cac565b565b6000610c9f600f611cfe565b610f1c611d08565b6060610c9f6011611e7a565b606060048054610a8d906124b0565b60003381610f5b8286611434565b905083811015610fbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d29565b610fc8828686840361180c565b506001949350505050565b610fdb611931565b600d80546001600160a01b038481166001600160a01b03199283168117909355600e80549185169190921681179091556040805192835260208301919091527f47ec85e81d360aa633283cd807a941b837e1ab4ef05f76bee8ef71f627cd661b9101610b8a565b600061104c611931565b6001600160a01b0382166110985760405162461bcd60e51b815260206004820152601360248201527204149436f646556323a2070616972206973203606c1b6044820152606401610d29565b604080513381526001600160a01b03841660208201527ff8846cbe66fa5bf657d787c9d1fa1e0c49d164118e743861a349b498d21f9152910160405180910390a1610b24600f83611e87565b6000610c13338484611a05565b60006110fb611931565b6001600160a01b0382166111515760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a20646973747269627574657220697320300000000000006044820152606401610d29565b604080513381526001600160a01b03841660208201527ff4babdc74f5fd5acfb4c25c53b070dbaccf723018220335b004d55406ad61501910160405180910390a1610b24601183611c97565b600060016111ab600f611cfe565b6111b59190612524565b8211156112045760405162461bcd60e51b815260206004820152601d60248201527f4149436f646556323a20696e646578206f7574206f6620626f756e64730000006044820152606401610d29565b610b24600f83611e9c565b611217611931565b6040805160008082526020820192839052479290913391849161123991612567565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50509050806112cc5760405162461bcd60e51b815260206004820152601d60248201527f4149436f646556323a204554485f5452414e534645525f4641494c45440000006044820152606401610d29565b5050565b60006112da611931565b6001600160a01b0382166113265760405162461bcd60e51b815260206004820152601360248201527204149436f646556323a2070616972206973203606c1b6044820152606401610d29565b604080513381526001600160a01b03841660208201527fc185c2e07c96a12ccdeaba3948d6a6699b41f26f5d9ea4f94f13991707f5915a910160405180910390a1610b24600f83611c97565b61137a611931565b6009839055600a829055600b819055806113948385612537565b61139e9190612537565b600c8190556105dc10156113e25760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610d29565b600954600a54600b5460408051938452602084019290925282820152426060830152517f747eaccb30a9769474f1620ae0dd833b1ffb89520dcac6833b33df942b7c0c499181900360800190a1505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610b24600f83611ea8565b6000611476611931565b6001600160a01b0382166114cc5760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a20646973747269627574657220697320300000000000006044820152606401610d29565b604080513381526001600160a01b03841660208201527f5e1b7f77208b8b0c23cc57a73bf53f771af3bffe3fc773ea472bec05bab039f8910160405180910390a1610b24601183611e87565b611520611931565b6001600160a01b0381166115855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d29565b610cd081611cac565b611596611931565b636568b18081106115d35760405162461bcd60e51b8152602060048201526007602482015266626164206e756d60c81b6044820152606401610d29565b601455565b6014544210156116205760405162461bcd60e51b8152602060048201526013602482015272105250dbd919558c8e881b9bdd081cdd185c9d606a1b6044820152606401610d29565b6040516323b872dd60e01b815233600482015261dead6024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b99190612583565b50601354610cd0906001600160a01b031633670de0b6b3a76400006116e6856755400fe72f6268886125a0565b6116f091906125b7565b611eca565b611700601133611ea8565b61174c5760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a204f6e6c792064697374726962757465720000000000006044820152606401610d29565b601354611763906001600160a01b03168383611eca565b604080516001600160a01b03841681526020810183905242918101919091527f7b6bd1e44b882fc3c6db03de18818ba27f347f200076803dce3e72303b0ca71690606001610b8a565b6117b4611931565b6001600160a01b03821660009081526008602052604090819020805460ff1916831515179055517f3a2f5008966af518c2ae3ad2e064905093aafdcaed1d7bb3a74f1f77db6814aa90610b8a903390859085906124ea565b6001600160a01b03831661186e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d29565b6001600160a01b0382166118cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d29565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314610f1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d29565b60006119978484611434565b905060001981146119ff57818110156119f25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d29565b6119ff848484840361180c565b50505050565b600554600090600160a01b900460ff1615611a2d57611a25848484611eca565b506001610c13565b3360009081526008602052604081205460ff16158015611a6657506001600160a01b03851660009081526006602052604090205460ff16155b8015611a8b57506001600160a01b03841660009081526007602052604090205460ff16155b9050600085858315611ac657611aa08861145f565b15611ab357506001915085905086611ac6565b611abc8761145f565b15611ac657600292505b611ace61206e565b15611adb57611adb611d08565b600084611ae85786611af2565b611af289886120ae565b9050611aff898983611eca565b8315611b5e57604080516001600160a01b03808616825284166020820152908101889052606081018590524260808201527fe0c1b141a85ba7f8df7ded19a02a004b049d9e0a67f9dea87186c07bce3923b09060a00160405180910390a15b50600198975050505050505050565b6001600160a01b038216611bcd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d29565b6001600160a01b03821660009081526020819052604090205481811015611c415760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d29565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611924565b6000610c13836001600160a01b0384166120eb565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610b24825490565b6005805460ff60a01b1916600160a01b17905530600090815260208190526040812054905080600003611d3b5750611e6b565b600c54600003611d4b5750611e6b565b611d76307f00000000000000000000000000000000000000000000000000000000000000008361180c565b6000600c5460095483611d8991906125a0565b611d9391906125b7565b90506000600c54600a5484611da891906125a0565b611db291906125b7565b90506000600c54600b5485611dc791906125a0565b611dd191906125b7565b90508215611de357611de33084611b6d565b8115611e0157600d54611e019030906001600160a01b031684611eca565b8015611e1f57600e54611e1f9030906001600160a01b031683611eca565b60408051848152602081018490529081018290524260608201527fa4903880285538fa6ffa51cad044f25c39cc7f89aa6cbbda844135ff94827edf9060800160405180910390a1505050505b6005805460ff60a01b19169055565b60606000610c138361213a565b6000610c13836001600160a01b038416612196565b6000610c138383612289565b6001600160a01b03811660009081526001830160205260408120541515610c13565b6001600160a01b038316611f2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d29565b6001600160a01b038216611f905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d29565b6001600160a01b038316600090815260208190526040902054818110156120085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d29565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119ff565b600554600090600160a01b900460ff16158015612098575030600090815260208190526040812054115b8015610c9f57506120a83361145f565b15905090565b600080612710600c54846120c291906125a0565b6120cc91906125b7565b90506120d9843083611eca565b6120e38184612524565b949350505050565b600081815260018301602052604081205461213257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b24565b506000610b24565b60608160000180548060200260200160405190810160405280929190818152602001828054801561218a57602002820191906000526020600020905b815481526020019060010190808311612176575b50505050509050919050565b6000818152600183016020526040812054801561227f5760006121ba600183612524565b85549091506000906121ce90600190612524565b90508181146122335760008660000182815481106121ee576121ee6125d9565b9060005260206000200154905080876000018481548110612211576122116125d9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612244576122446125ef565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b24565b6000915050610b24565b60008260000182815481106122a0576122a06125d9565b9060005260206000200154905092915050565b60005b838110156122ce5781810151838201526020016122b6565b50506000910152565b60208152600082518060208401526122f68160408501602087016122b3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610cd057600080fd5b6000806040838503121561233257600080fd5b823561233d8161230a565b946020939093013593505050565b8015158114610cd057600080fd5b6000806040838503121561236c57600080fd5b82356123778161230a565b915060208301356123878161234b565b809150509250929050565b6000806000606084860312156123a757600080fd5b83356123b28161230a565b925060208401356123c28161230a565b929592945050506040919091013590565b6000602082840312156123e557600080fd5b8135610c138161230a565b60006020828403121561240257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561244a5783516001600160a01b031683529284019291840191600101612425565b50909695505050505050565b6000806040838503121561246957600080fd5b82356124748161230a565b915060208301356123878161230a565b60008060006060848603121561249957600080fd5b505081359360208301359350604090920135919050565b600181811c908216806124c457607f821691505b6020821081036124e457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b2457610b2461250e565b80820180821115610b2457610b2461250e565b60006020828403121561255c57600080fd5b8151610c138161230a565b600082516125798184602087016122b3565b9190910192915050565b60006020828403121561259557600080fd5b8151610c138161234b565b8082028115828204841417610b2457610b2461250e565b6000826125d457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea264697066735822122098b85e66f8f7bb156ea77f0e047dd8da8173394a4f5de8540e45516a2ef8c60264736f6c634300081300336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220125621c385282cc44d28b451f6152ea352b590244ac4308994697860301c260364736f6c634300081300330000000000000000000000007c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a59000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d0000000000000000000000006eccab422d763ac031210895c81787e87b43a65200000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000000000000000000000000000000000065463240
Deployed Bytecode
0x6080604052600436106103545760003560e01c806395d89b41116101c6578063cb326316116100f7578063f2fde38b11610095578063fb9321081161006f578063fb93210814610a08578063fbfa77cf14610a28578063fce589d814610a48578063fee2cc5114610a5e57600080fd5b8063f2fde38b146109a8578063f3a133a9146109c8578063f9d0e757146109e857600080fd5b8063dd62ed3e116100d1578063dd62ed3e14610932578063e5e31b1314610952578063ef74339a14610972578063eff988431461099257600080fd5b8063cb326316146108c1578063cec10c11146108f1578063d83067861461091157600080fd5b8063b31c710a11610164578063bfa382b51161013e578063bfa382b514610842578063c2b7bbb614610857578063c31c9c0714610877578063c7446565146108ab57600080fd5b8063b31c710a146107ce578063b898c4d814610802578063bdf391cc1461082257600080fd5b8063a5bc5085116101a0578063a5bc50851461072a578063a9059cbb1461074a578063ad5c46481461076a578063b17dcf2d1461079e57600080fd5b806395d89b41146106d5578063a457c2d7146106ea578063a4b45c001461070a57600080fd5b8063333ef998116102a0578063715018a61161023e5780638da5cb5b116102185780638da5cb5b1461065f5780638fbbd7501461067d578063938e95e41461069257806394d249db146106b457600080fd5b8063715018a6146106015780637944f94414610616578063880e75f21461064a57600080fd5b80634fab9e4c1161027a5780634fab9e4c1461057657806361f1c5ba1461058b578063658d4b7f146105ab57806370a08231146105cb57600080fd5b8063333ef99814610506578063395093511461053657806342966c681461055657600080fd5b806319c0aa0f1161030d5780632b112e49116102e75780632b112e49146104a05780632e0b16d2146104b5578063313ce567146104cb57806332cb6b0c146104e757600080fd5b806319c0aa0f1461044a5780631df4ccfc1461046a57806323b872dd1461048057600080fd5b806301ac145b1461036057806306ee6ad81461038957806306fdde03146103c1578063095ea7b3146103e357806312e670941461041357806318160ddd1461043557600080fd5b3661035b57005b600080fd5b34801561036c57600080fd5b50610376600a5481565b6040519081526020015b60405180910390f35b34801561039557600080fd5b50600e546103a9906001600160a01b031681565b6040516001600160a01b039091168152602001610380565b3480156103cd57600080fd5b506103d6610a7e565b60405161038091906122d7565b3480156103ef57600080fd5b506104036103fe36600461231f565b610b10565b6040519015158152602001610380565b34801561041f57600080fd5b5061043361042e366004612359565b610b2a565b005b34801561044157600080fd5b50600254610376565b34801561045657600080fd5b50610433610465366004612359565b610b96565b34801561047657600080fd5b50610376600c5481565b34801561048c57600080fd5b5061040361049b366004612392565b610bf6565b3480156104ac57600080fd5b50610376610c1a565b3480156104c157600080fd5b5061037661271081565b3480156104d757600080fd5b5060405160128152602001610380565b3480156104f357600080fd5b506103766a115eec47f6cf7e3500000081565b34801561051257600080fd5b506104036105213660046123d3565b60076020526000908152604090205460ff1681565b34801561054257600080fd5b5061040361055136600461231f565b610ca4565b34801561056257600080fd5b506104336105713660046123f0565b610cc6565b34801561058257600080fd5b50610433610cd3565b34801561059757600080fd5b50600d546103a9906001600160a01b031681565b3480156105b757600080fd5b506104336105c6366004612359565b610e0d565b3480156105d757600080fd5b506103766105e63660046123d3565b6001600160a01b031660009081526020819052604090205490565b34801561060d57600080fd5b50610433610f0a565b34801561062257600080fd5b506103a97f0000000000000000000000006eccab422d763ac031210895c81787e87b43a65281565b34801561065657600080fd5b50610376610f1e565b34801561066b57600080fd5b506005546001600160a01b03166103a9565b34801561068957600080fd5b50610433610f2a565b34801561069e57600080fd5b506106a7610f32565b6040516103809190612409565b3480156106c057600080fd5b5060135461040390600160a01b900460ff1681565b3480156106e157600080fd5b506103d6610f3e565b3480156106f657600080fd5b5061040361070536600461231f565b610f4d565b34801561071657600080fd5b50610433610725366004612456565b610fd3565b34801561073657600080fd5b506104036107453660046123d3565b611042565b34801561075657600080fd5b5061040361076536600461231f565b6110e4565b34801561077657600080fd5b506103a97f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156107aa57600080fd5b506104036107b93660046123d3565b60066020526000908152604090205460ff1681565b3480156107da57600080fd5b506103a97f0000000000000000000000007c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a5981565b34801561080e57600080fd5b5061040361081d3660046123d3565b6110f1565b34801561082e57600080fd5b506103a961083d3660046123f0565b61119d565b34801561084e57600080fd5b5061043361120f565b34801561086357600080fd5b506104036108723660046123d3565b6112d0565b34801561088357600080fd5b506103a97f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d81565b3480156108b757600080fd5b5061037660145481565b3480156108cd57600080fd5b506104036108dc3660046123d3565b60086020526000908152604090205460ff1681565b3480156108fd57600080fd5b5061043361090c366004612484565b611372565b34801561091d57600080fd5b5060055461040390600160a01b900460ff1681565b34801561093e57600080fd5b5061037661094d366004612456565b611434565b34801561095e57600080fd5b5061040361096d3660046123d3565b61145f565b34801561097e57600080fd5b5061040361098d3660046123d3565b61146c565b34801561099e57600080fd5b50610376600b5481565b3480156109b457600080fd5b506104336109c33660046123d3565b611518565b3480156109d457600080fd5b506104336109e33660046123f0565b61158e565b3480156109f457600080fd5b50610433610a033660046123f0565b6115d8565b348015610a1457600080fd5b50610433610a2336600461231f565b6116f5565b348015610a3457600080fd5b506013546103a9906001600160a01b031681565b348015610a5457600080fd5b5061037660095481565b348015610a6a57600080fd5b50610433610a79366004612359565b6117ac565b606060038054610a8d906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab9906124b0565b8015610b065780601f10610adb57610100808354040283529160200191610b06565b820191906000526020600020905b815481529060010190602001808311610ae957829003601f168201915b5050505050905090565b600033610b1e81858561180c565b60019150505b92915050565b610b32611931565b6001600160a01b03821660009081526006602052604090819020805460ff1916831515179055517fb85d1f479dc1239532569c7df02821f97fe28e8d4100e6cff3c474305535090790610b8a903390859085906124ea565b60405180910390a15050565b610b9e611931565b6001600160a01b03821660009081526007602052604090819020805460ff1916831515179055517f48dc5c14208f483faabc461efc35952ca3a0665c7d590773ed7c29359f98651190610b8a903390859085906124ea565b600033610c0485828561198b565b610c0f858585611a05565b9150505b9392505050565b6013546001600160a01b03166000908152602081905260408120547fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb55461dead83527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf8354600254610c8b9190612524565b610c959190612524565b610c9f9190612524565b905090565b600033610b1e818585610cb78383611434565b610cc19190612537565b61180c565b610cd03382611b6d565b50565b601354600160a01b900460ff1615610d325760405162461bcd60e51b815260206004820152601860248201527f7061697220616c726561647920696e697469616c697a6564000000000000000060448201526064015b60405180910390fd5b6040516364e329cb60e11b81526001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1811660048301523060248301526000917f0000000000000000000000006eccab422d763ac031210895c81787e87b43a6529091169063c9c65396906044016020604051808303816000875af1158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de9919061254a565b9050610df6600f82611c97565b50506013805460ff60a01b1916600160a01b179055565b610e15611931565b6001600160a01b0382166000908152600660209081526040808320805485151560ff19918216811790925560078452828520805482168317905560089093529281902080549092169092179055517fb85d1f479dc1239532569c7df02821f97fe28e8d4100e6cff3c474305535090790610e94903390859085906124ea565b60405180910390a17f48dc5c14208f483faabc461efc35952ca3a0665c7d590773ed7c29359f986511338383604051610ecf939291906124ea565b60405180910390a17f3a2f5008966af518c2ae3ad2e064905093aafdcaed1d7bb3a74f1f77db6814aa338383604051610b8a939291906124ea565b610f12611931565b610f1c6000611cac565b565b6000610c9f600f611cfe565b610f1c611d08565b6060610c9f6011611e7a565b606060048054610a8d906124b0565b60003381610f5b8286611434565b905083811015610fbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610d29565b610fc8828686840361180c565b506001949350505050565b610fdb611931565b600d80546001600160a01b038481166001600160a01b03199283168117909355600e80549185169190921681179091556040805192835260208301919091527f47ec85e81d360aa633283cd807a941b837e1ab4ef05f76bee8ef71f627cd661b9101610b8a565b600061104c611931565b6001600160a01b0382166110985760405162461bcd60e51b815260206004820152601360248201527204149436f646556323a2070616972206973203606c1b6044820152606401610d29565b604080513381526001600160a01b03841660208201527ff8846cbe66fa5bf657d787c9d1fa1e0c49d164118e743861a349b498d21f9152910160405180910390a1610b24600f83611e87565b6000610c13338484611a05565b60006110fb611931565b6001600160a01b0382166111515760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a20646973747269627574657220697320300000000000006044820152606401610d29565b604080513381526001600160a01b03841660208201527ff4babdc74f5fd5acfb4c25c53b070dbaccf723018220335b004d55406ad61501910160405180910390a1610b24601183611c97565b600060016111ab600f611cfe565b6111b59190612524565b8211156112045760405162461bcd60e51b815260206004820152601d60248201527f4149436f646556323a20696e646578206f7574206f6620626f756e64730000006044820152606401610d29565b610b24600f83611e9c565b611217611931565b6040805160008082526020820192839052479290913391849161123991612567565b60006040518083038185875af1925050503d8060008114611276576040519150601f19603f3d011682016040523d82523d6000602084013e61127b565b606091505b50509050806112cc5760405162461bcd60e51b815260206004820152601d60248201527f4149436f646556323a204554485f5452414e534645525f4641494c45440000006044820152606401610d29565b5050565b60006112da611931565b6001600160a01b0382166113265760405162461bcd60e51b815260206004820152601360248201527204149436f646556323a2070616972206973203606c1b6044820152606401610d29565b604080513381526001600160a01b03841660208201527fc185c2e07c96a12ccdeaba3948d6a6699b41f26f5d9ea4f94f13991707f5915a910160405180910390a1610b24600f83611c97565b61137a611931565b6009839055600a829055600b819055806113948385612537565b61139e9190612537565b600c8190556105dc10156113e25760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610d29565b600954600a54600b5460408051938452602084019290925282820152426060830152517f747eaccb30a9769474f1620ae0dd833b1ffb89520dcac6833b33df942b7c0c499181900360800190a1505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610b24600f83611ea8565b6000611476611931565b6001600160a01b0382166114cc5760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a20646973747269627574657220697320300000000000006044820152606401610d29565b604080513381526001600160a01b03841660208201527f5e1b7f77208b8b0c23cc57a73bf53f771af3bffe3fc773ea472bec05bab039f8910160405180910390a1610b24601183611e87565b611520611931565b6001600160a01b0381166115855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d29565b610cd081611cac565b611596611931565b636568b18081106115d35760405162461bcd60e51b8152602060048201526007602482015266626164206e756d60c81b6044820152606401610d29565b601455565b6014544210156116205760405162461bcd60e51b8152602060048201526013602482015272105250dbd919558c8e881b9bdd081cdd185c9d606a1b6044820152606401610d29565b6040516323b872dd60e01b815233600482015261dead6024820152604481018290527f0000000000000000000000007c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a596001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b99190612583565b50601354610cd0906001600160a01b031633670de0b6b3a76400006116e6856755400fe72f6268886125a0565b6116f091906125b7565b611eca565b611700601133611ea8565b61174c5760405162461bcd60e51b815260206004820152601a60248201527f4149436f646556323a204f6e6c792064697374726962757465720000000000006044820152606401610d29565b601354611763906001600160a01b03168383611eca565b604080516001600160a01b03841681526020810183905242918101919091527f7b6bd1e44b882fc3c6db03de18818ba27f347f200076803dce3e72303b0ca71690606001610b8a565b6117b4611931565b6001600160a01b03821660009081526008602052604090819020805460ff1916831515179055517f3a2f5008966af518c2ae3ad2e064905093aafdcaed1d7bb3a74f1f77db6814aa90610b8a903390859085906124ea565b6001600160a01b03831661186e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d29565b6001600160a01b0382166118cf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d29565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314610f1c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d29565b60006119978484611434565b905060001981146119ff57818110156119f25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610d29565b6119ff848484840361180c565b50505050565b600554600090600160a01b900460ff1615611a2d57611a25848484611eca565b506001610c13565b3360009081526008602052604081205460ff16158015611a6657506001600160a01b03851660009081526006602052604090205460ff16155b8015611a8b57506001600160a01b03841660009081526007602052604090205460ff16155b9050600085858315611ac657611aa08861145f565b15611ab357506001915085905086611ac6565b611abc8761145f565b15611ac657600292505b611ace61206e565b15611adb57611adb611d08565b600084611ae85786611af2565b611af289886120ae565b9050611aff898983611eca565b8315611b5e57604080516001600160a01b03808616825284166020820152908101889052606081018590524260808201527fe0c1b141a85ba7f8df7ded19a02a004b049d9e0a67f9dea87186c07bce3923b09060a00160405180910390a15b50600198975050505050505050565b6001600160a01b038216611bcd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610d29565b6001600160a01b03821660009081526020819052604090205481811015611c415760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610d29565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611924565b6000610c13836001600160a01b0384166120eb565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610b24825490565b6005805460ff60a01b1916600160a01b17905530600090815260208190526040812054905080600003611d3b5750611e6b565b600c54600003611d4b5750611e6b565b611d76307f000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d8361180c565b6000600c5460095483611d8991906125a0565b611d9391906125b7565b90506000600c54600a5484611da891906125a0565b611db291906125b7565b90506000600c54600b5485611dc791906125a0565b611dd191906125b7565b90508215611de357611de33084611b6d565b8115611e0157600d54611e019030906001600160a01b031684611eca565b8015611e1f57600e54611e1f9030906001600160a01b031683611eca565b60408051848152602081018490529081018290524260608201527fa4903880285538fa6ffa51cad044f25c39cc7f89aa6cbbda844135ff94827edf9060800160405180910390a1505050505b6005805460ff60a01b19169055565b60606000610c138361213a565b6000610c13836001600160a01b038416612196565b6000610c138383612289565b6001600160a01b03811660009081526001830160205260408120541515610c13565b6001600160a01b038316611f2e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d29565b6001600160a01b038216611f905760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d29565b6001600160a01b038316600090815260208190526040902054818110156120085760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610d29565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119ff565b600554600090600160a01b900460ff16158015612098575030600090815260208190526040812054115b8015610c9f57506120a83361145f565b15905090565b600080612710600c54846120c291906125a0565b6120cc91906125b7565b90506120d9843083611eca565b6120e38184612524565b949350505050565b600081815260018301602052604081205461213257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b24565b506000610b24565b60608160000180548060200260200160405190810160405280929190818152602001828054801561218a57602002820191906000526020600020905b815481526020019060010190808311612176575b50505050509050919050565b6000818152600183016020526040812054801561227f5760006121ba600183612524565b85549091506000906121ce90600190612524565b90508181146122335760008660000182815481106121ee576121ee6125d9565b9060005260206000200154905080876000018481548110612211576122116125d9565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612244576122446125ef565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610b24565b6000915050610b24565b60008260000182815481106122a0576122a06125d9565b9060005260206000200154905092915050565b60005b838110156122ce5781810151838201526020016122b6565b50506000910152565b60208152600082518060208401526122f68160408501602087016122b3565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610cd057600080fd5b6000806040838503121561233257600080fd5b823561233d8161230a565b946020939093013593505050565b8015158114610cd057600080fd5b6000806040838503121561236c57600080fd5b82356123778161230a565b915060208301356123878161234b565b809150509250929050565b6000806000606084860312156123a757600080fd5b83356123b28161230a565b925060208401356123c28161230a565b929592945050506040919091013590565b6000602082840312156123e557600080fd5b8135610c138161230a565b60006020828403121561240257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561244a5783516001600160a01b031683529284019291840191600101612425565b50909695505050505050565b6000806040838503121561246957600080fd5b82356124748161230a565b915060208301356123878161230a565b60008060006060848603121561249957600080fd5b505081359360208301359350604090920135919050565b600181811c908216806124c457607f821691505b6020821081036124e457634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b2457610b2461250e565b80820180821115610b2457610b2461250e565b60006020828403121561255c57600080fd5b8151610c138161230a565b600082516125798184602087016122b3565b9190910192915050565b60006020828403121561259557600080fd5b8151610c138161234b565b8082028115828204841417610b2457610b2461250e565b6000826125d457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea264697066735822122098b85e66f8f7bb156ea77f0e047dd8da8173394a4f5de8540e45516a2ef8c60264736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a59000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d0000000000000000000000006eccab422d763ac031210895c81787e87b43a65200000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab10000000000000000000000000000000000000000000000000000000065463240
-----Decoded View---------------
Arg [0] : _oldToken (address): 0x7C8a1A80FDd00C9Cccd6EbD573E9EcB49BFa2a59
Arg [1] : _swapRouter (address): 0xc873fEcbd354f5A56E00E710B90EF4201db2448d
Arg [2] : _swapFactory (address): 0x6EcCab422D763aC031210895C81787E87B43A652
Arg [3] : _weth (address): 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
Arg [4] : _startAt (uint256): 1699099200
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000007c8a1a80fdd00c9cccd6ebd573e9ecb49bfa2a59
Arg [1] : 000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d
Arg [2] : 0000000000000000000000006eccab422d763ac031210895c81787e87b43a652
Arg [3] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [4] : 0000000000000000000000000000000000000000000000000000000065463240
Deployed Bytecode Sourcemap
56743:10745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58257:29;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;58257:29:0;;;;;;;;58402:28;;;;;;;;;;-1:-1:-1;58402:28:0;;;;-1:-1:-1;;;;;58402:28:0;;;;;;-1:-1:-1;;;;;360:32:1;;;342:51;;330:2;315:18;58402:28:0;196:203:1;8732:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11092:201::-;;;;;;;;;;-1:-1:-1;11092:201:0;;;;;:::i;:::-;;:::i;:::-;;;1681:14:1;;1674:22;1656:41;;1644:2;1629:18;11092:201:0;1516:187:1;64967:189:0;;;;;;;;;;-1:-1:-1;64967:189:0;;;;;:::i;:::-;;:::i;:::-;;9861:108;;;;;;;;;;-1:-1:-1;9949:12:0;;9861:108;;65164:183;;;;;;;;;;-1:-1:-1;65164:183:0;;;;;:::i;:::-;;:::i;58331:29::-;;;;;;;;;;;;;;;;60431:268;;;;;;;;;;-1:-1:-1;60431:268:0;;;;;:::i;:::-;;:::i;63095:165::-;;;;;;;;;;;;;:::i;57944:46::-;;;;;;;;;;;;57985:5;57944:46;;9703:93;;;;;;;;;;-1:-1:-1;9703:93:0;;9786:2;2821:36:1;;2809:2;2794:18;9703:93:0;2679:184:1;57997:54:0;;;;;;;;;;;;58034:17;57997:54;;58112:45;;;;;;;;;;-1:-1:-1;58112:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12543:238;;;;;;;;;;-1:-1:-1;12543:238:0;;;;;:::i;:::-;;:::i;60182:85::-;;;;;;;;;;-1:-1:-1;60182:85:0;;;;;:::i;:::-;;:::i;59929:245::-;;;;;;;;;;;;;:::i;58369:26::-;;;;;;;;;;-1:-1:-1;58369:26:0;;;;-1:-1:-1;;;;;58369:26:0;;;64564:395;;;;;;;;;;-1:-1:-1;64564:395:0;;;;;:::i;:::-;;:::i;10032:127::-;;;;;;;;;;-1:-1:-1;10032:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10133:18:0;10106:7;10133:18;;;;;;;;;;;;10032:127;2617:103;;;;;;;;;;;;;:::i;58496:46::-;;;;;;;;;;;;;;;66112:97;;;;;;;;;;;;;:::i;1976:87::-;;;;;;;;;;-1:-1:-1;2049:6:0;;-1:-1:-1;;;;;2049:6:0;1976:87;;62780:58;;;;;;;;;;;;;:::i;67334:114::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;58924:27::-;;;;;;;;;;-1:-1:-1;58924:27:0;;;;-1:-1:-1;;;58924:27:0;;;;;;8951:104;;;;;;;;;;;;;:::i;13284:436::-;;;;;;;;;;-1:-1:-1;13284:436:0;;;;;:::i;:::-;;:::i;64146:256::-;;;;;;;;;;-1:-1:-1;64146:256:0;;;;;:::i;:::-;;:::i;65891:213::-;;;;;;;;;;-1:-1:-1;65891:213:0;;;;;:::i;:::-;;:::i;60275:148::-;;;;;;;;;;-1:-1:-1;60275:148:0;;;;;:::i;:::-;;:::i;58549:27::-;;;;;;;;;;;;;;;58058:47;;;;;;;;;;-1:-1:-1;58058:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58583:32;;;;;;;;;;;;;;;66818:247;;;;;;;;;;-1:-1:-1;66818:247:0;;;;;:::i;:::-;;:::i;66217:185::-;;;;;;;;;;-1:-1:-1;66217:185:0;;;;;:::i;:::-;;:::i;66410:259::-;;;;;;;;;;;;;:::i;65676:207::-;;;;;;;;;;-1:-1:-1;65676:207:0;;;;;:::i;:::-;;:::i;58443:46::-;;;;;;;;;;;;;;;58958:22;;;;;;;;;;;;;;;;58164:49;;;;;;;;;;-1:-1:-1;58164:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63729:409;;;;;;;;;;-1:-1:-1;63729:409:0;;;;;:::i;:::-;;:::i;57822:18::-;;;;;;;;;;-1:-1:-1;57822:18:0;;;;-1:-1:-1;;;57822:18:0;;;;;;10621:151;;;;;;;;;;-1:-1:-1;10621:151:0;;;;;:::i;:::-;;:::i;65558:110::-;;;;;;;;;;-1:-1:-1;65558:110:0;;;;;:::i;:::-;;:::i;67073:253::-;;;;;;;;;;-1:-1:-1;67073:253:0;;;;;:::i;:::-;;:::i;58293:31::-;;;;;;;;;;;;;;;;2875:201;;;;;;;;;;-1:-1:-1;2875:201:0;;;;;:::i;:::-;;:::i;64410:146::-;;;;;;;;;;-1:-1:-1;64410:146:0;;;;;:::i;:::-;;:::i;63458:263::-;;;;;;;;;;-1:-1:-1;63458:263:0;;;;;:::i;:::-;;:::i;63268:182::-;;;;;;;;;;-1:-1:-1;63268:182:0;;;;;:::i;:::-;;:::i;58891:26::-;;;;;;;;;;-1:-1:-1;58891:26:0;;;;-1:-1:-1;;;;;58891:26:0;;;58222:28;;;;;;;;;;;;;;;;65355:195;;;;;;;;;;-1:-1:-1;65355:195:0;;;;;:::i;:::-;;:::i;8732:100::-;8786:13;8819:5;8812:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8732:100;:::o;11092:201::-;11175:4;736:10;11231:32;736:10;11247:7;11256:6;11231:8;:32::i;:::-;11281:4;11274:11;;;11092:201;;;;;:::o;64967:189::-;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;65054:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;:32;;-1:-1:-1;;65054:32:0::1;::::0;::::1;;;::::0;;65102:46;::::1;::::0;::::1;::::0;65121:10:::1;::::0;65054:23;;:32;;65102:46:::1;:::i;:::-;;;;;;;;64967:189:::0;;:::o;65164:183::-;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;65249:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;:30;;-1:-1:-1;;65249:30:0::1;::::0;::::1;;;::::0;;65295:44;::::1;::::0;::::1;::::0;65312:10:::1;::::0;65249:21;;:30;;65295:44:::1;:::i;60431:268::-:0;60537:4;736:10;60595:40;60611:6;736:10;60628:6;60595:15;:40::i;:::-;60653:38;60665:6;60673:9;60684:6;60653:11;:38::i;:::-;60646:45;;;60431:268;;;;;;:::o;63095:165::-;63245:5;;-1:-1:-1;;;;;63245:5:0;63148:7;10133:18;;;;;;;;;;;;;58660:42;10133:18;;;;9949:12;;63175:31;;10133:18;63175:31;:::i;:::-;:49;;;;:::i;:::-;:77;;;;:::i;:::-;63168:84;;63095:165;:::o;12543:238::-;12631:4;736:10;12687:64;736:10;12703:7;12740:10;12712:25;736:10;12703:7;12712:9;:25::i;:::-;:38;;;;:::i;:::-;12687:8;:64::i;60182:85::-;60232:27;736:10;60252:6;60232:5;:27::i;:::-;60182:85;:::o;59929:245::-;59984:15;;-1:-1:-1;;;59984:15:0;;;;59983:16;59975:53;;;;-1:-1:-1;;;59975:53:0;;7197:2:1;59975:53:0;;;7179:21:1;7236:2;7216:18;;;7209:30;7275:26;7255:18;;;7248:54;7319:18;;59975:53:0;;;;;;;;;60054:52;;-1:-1:-1;;;60054:52:0;;-1:-1:-1;;;;;60085:4:0;7578:15:1;;60054:52:0;;;7560:34:1;60100:4:0;7610:18:1;;;7603:43;-1:-1:-1;;60054:11:0;:22;;;;;;7495:18:1;;60054:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60039:67;-1:-1:-1;60117:16:0;:6;60039:67;60117:10;:16::i;:::-;-1:-1:-1;;60144:15:0;:22;;-1:-1:-1;;;;60144:22:0;-1:-1:-1;;;60144:22:0;;;59929:245::o;64564:395::-;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;64647:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;;;;:32;;;::::1;;-1:-1:-1::0;;64647:32:0;;::::1;::::0;::::1;::::0;;;64690:13:::1;:21:::0;;;;;:30;;;::::1;::::0;::::1;::::0;;64731:17:::1;:25:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;64781:46;::::1;::::0;::::1;::::0;64800:10:::1;::::0;64663:6;;64673;;64781:46:::1;:::i;:::-;;;;;;;;64843:44;64860:10;64872:6;64880;64843:44;;;;;;;;:::i;:::-;;;;;;;;64903:48;64924:10;64936:6;64944;64903:48;;;;;;;;:::i;2617:103::-:0;1862:13;:11;:13::i;:::-;2682:30:::1;2709:1;2682:18;:30::i;:::-;2617:103::o:0;66112:97::-;66159:7;66186:15;:6;:13;:15::i;62780:58::-;62820:10;:8;:10::i;67334:114::-;67382:16;67418:22;:13;:20;:22::i;8951:104::-;9007:13;9040:7;9033:14;;;;;:::i;13284:436::-;13377:4;736:10;13377:4;13460:25;736:10;13477:7;13460:9;:25::i;:::-;13433:52;;13524:15;13504:16;:35;;13496:85;;;;-1:-1:-1;;;13496:85:0;;8115:2:1;13496:85:0;;;8097:21:1;8154:2;8134:18;;;8127:30;8193:34;8173:18;;;8166:62;-1:-1:-1;;;8244:18:1;;;8237:35;8289:19;;13496:85:0;7913:401:1;13496:85:0;13617:60;13626:5;13633:7;13661:15;13642:16;:34;13617:8;:60::i;:::-;-1:-1:-1;13708:4:0;;13284:436;-1:-1:-1;;;;13284:436:0:o;64146:256::-;1862:13;:11;:13::i;:::-;64270:11:::1;:26:::0;;-1:-1:-1;;;;;64270:26:0;;::::1;-1:-1:-1::0;;;;;;64270:26:0;;::::1;::::0;::::1;::::0;;;64307:13:::1;:28:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;64351:43:::1;::::0;;7560:34:1;;;7625:2;7610:18;;7603:43;;;;64351::0::1;::::0;7495:18:1;64351:43:0::1;7348:304:1::0;65891:213:0;65948:4;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;65973:18:0;::::1;65965:50;;;::::0;-1:-1:-1;;;65965:50:0;;8521:2:1;65965:50:0::1;::::0;::::1;8503:21:1::0;8560:2;8540:18;;;8533:30;-1:-1:-1;;;8579:18:1;;;8572:49;8638:18;;65965:50:0::1;8319:343:1::0;65965:50:0::1;66031:28;::::0;;66042:10:::1;7560:34:1::0;;-1:-1:-1;;;;;7630:15:1;;7625:2;7610:18;;7603:43;66031:28:0::1;::::0;7495:18:1;66031:28:0::1;;;;;;;66077:19;:6;66091:4:::0;66077:13:::1;:19::i;60275:148::-:0;60354:4;60378:37;736:10;60404:2;60408:6;60378:11;:37::i;66818:247::-;66885:4;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;66910:21:0;::::1;66902:60;;;::::0;-1:-1:-1;;;66902:60:0;;8869:2:1;66902:60:0::1;::::0;::::1;8851:21:1::0;8908:2;8888:18;;;8881:30;8947:28;8927:18;;;8920:56;8993:18;;66902:60:0::1;8667:350:1::0;66902:60:0::1;66978:35;::::0;;66993:10:::1;7560:34:1::0;;-1:-1:-1;;;;;7630:15:1;;7625:2;7610:18;;7603:43;66978:35:0::1;::::0;7495:18:1;66978:35:0::1;;;;;;;67031:26;:13;67049:7:::0;67031:17:::1;:26::i;66217:185::-:0;66270:7;66325:1;66307:15;:6;:13;:15::i;:::-;:19;;;;:::i;:::-;66298:5;:28;;66290:70;;;;-1:-1:-1;;;66290:70:0;;9224:2:1;66290:70:0;;;9206:21:1;9263:2;9243:18;;;9236:30;9302:31;9282:18;;;9275:59;9351:18;;66290:70:0;9022:353:1;66290:70:0;66378:16;:6;66388:5;66378:9;:16::i;66410:259::-;1862:13;:11;:13::i;:::-;66588:12:::1;::::0;;66472:17:::1;66588:12:::0;;;::::1;::::0;::::1;::::0;;;;66492:21:::1;::::0;66472:17;;736:10;;66492:21;;66543:58:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66524:77;;;66620:7;66612:49;;;::::0;-1:-1:-1;;;66612:49:0;;10006:2:1;66612:49:0::1;::::0;::::1;9988:21:1::0;10045:2;10025:18;;;10018:30;10084:31;10064:18;;;10057:59;10133:18;;66612:49:0::1;9804:353:1::0;66612:49:0::1;66461:208;;66410:259::o:0;65676:207::-;65733:4;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;65758:18:0;::::1;65750:50;;;::::0;-1:-1:-1;;;65750:50:0;;8521:2:1;65750:50:0::1;::::0;::::1;8503:21:1::0;8560:2;8540:18;;;8533:30;-1:-1:-1;;;8579:18:1;;;8572:49;8638:18;;65750:50:0::1;8319:343:1::0;65750:50:0::1;65816:25;::::0;;65824:10:::1;7560:34:1::0;;-1:-1:-1;;;;;7630:15:1;;7625:2;7610:18;;7603:43;65816:25:0::1;::::0;7495:18:1;65816:25:0::1;;;;;;;65859:16;:6;65870:4:::0;65859:10:::1;:16::i;63729:409::-:0;1862:13;:11;:13::i;:::-;63868:7:::1;:18:::0;;;63897:8:::1;:20:::0;;;63928:10:::1;:24:::0;;;63941:11;63974:20:::1;63908:9:::0;63878:8;63974:20:::1;:::i;:::-;:34;;;;:::i;:::-;63963:8;:45:::0;;;64039:4:::1;-1:-1:-1::0;64027:16:0::1;64019:40;;;::::0;-1:-1:-1;;;64019:40:0;;10364:2:1;64019:40:0::1;::::0;::::1;10346:21:1::0;10403:2;10383:18;;;10376:30;-1:-1:-1;;;10422:18:1;;;10415:41;10473:18;;64019:40:0::1;10162:335:1::0;64019:40:0::1;64083:7;::::0;64092:8:::1;::::0;64102:10:::1;::::0;64075:55:::1;::::0;;10733:25:1;;;10789:2;10774:18;;10767:34;;;;10817:18;;;10810:34;64114:15:0::1;10875:2:1::0;10860:18;;10853:34;64075:55:0;::::1;::::0;;;;10720:3:1;64075:55:0;;::::1;63729:409:::0;;;:::o;10621:151::-;-1:-1:-1;;;;;10737:18:0;;;10710:7;10737:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10621:151::o;65558:110::-;65612:4;65636:24;:6;65652:7;65636:15;:24::i;67073:253::-;67140:4;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;67165:21:0;::::1;67157:60;;;::::0;-1:-1:-1;;;67157:60:0;;8869:2:1;67157:60:0::1;::::0;::::1;8851:21:1::0;8908:2;8888:18;;;8881:30;8947:28;8927:18;;;8920:56;8993:18;;67157:60:0::1;8667:350:1::0;67157:60:0::1;67233:38;::::0;;67251:10:::1;7560:34:1::0;;-1:-1:-1;;;;;7630:15:1;;7625:2;7610:18;;7603:43;67233:38:0::1;::::0;7495:18:1;67233:38:0::1;;;;;;;67289:29;:13;67310:7:::0;67289:20:::1;:29::i;2875:201::-:0;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;2964:22:0;::::1;2956:73;;;::::0;-1:-1:-1;;;2956:73:0;;11100:2:1;2956:73:0::1;::::0;::::1;11082:21:1::0;11139:2;11119:18;;;11112:30;11178:34;11158:18;;;11151:62;-1:-1:-1;;;11229:18:1;;;11222:36;11275:19;;2956:73:0::1;10898:402:1::0;2956:73:0::1;3040:28;3059:8;3040:18;:28::i;64410:146::-:0;1862:13;:11;:13::i;:::-;64497:10:::1;64486:8;:21;64478:41;;;::::0;-1:-1:-1;;;64478:41:0;;11507:2:1;64478:41:0::1;::::0;::::1;11489:21:1::0;11546:1;11526:18;;;11519:29;-1:-1:-1;;;11564:18:1;;;11557:37;11611:18;;64478:41:0::1;11305:330:1::0;64478:41:0::1;64530:7;:18:::0;64410:146::o;63458:263::-;63541:7;;63522:15;:26;;63514:58;;;;-1:-1:-1;;;63514:58:0;;11842:2:1;63514:58:0;;;11824:21:1;11881:2;11861:18;;;11854:30;-1:-1:-1;;;11900:18:1;;;11893:49;11959:18;;63514:58:0;11640:343:1;63514:58:0;63585:47;;-1:-1:-1;;;63585:47:0;;63607:10;63585:47;;;12228:34:1;58660:42:0;12278:18:1;;;12271:43;12330:18;;;12323:34;;;63585:8:0;-1:-1:-1;;;;;63585:21:0;;;;12163:18:1;;63585:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63661:5:0;;63643:70;;-1:-1:-1;;;;;63661:5:0;63669:10;63708:4;63681:26;:6;63688:19;63681:26;:::i;:::-;:31;;;;:::i;:::-;63643:9;:70::i;63268:182::-;66723:36;:13;736:10;66723:22;:36::i;:::-;66715:75;;;;-1:-1:-1;;;66715:75:0;;13215:2:1;66715:75:0;;;13197:21:1;13254:2;13234:18;;;13227:30;13293:28;13273:18;;;13266:56;13339:18;;66715:75:0;13013:350:1;66715:75:0;63368:5:::1;::::0;63350:37:::1;::::0;-1:-1:-1;;;;;63368:5:0::1;63376:2:::0;63380:6;63350:9:::1;:37::i;:::-;63403:39;::::0;;-1:-1:-1;;;;;13588:32:1;;13570:51;;13652:2;13637:18;;13630:34;;;63426:15:0::1;13680:18:1::0;;;13673:34;;;;63403:39:0::1;::::0;13558:2:1;13543:18;63403:39:0::1;13368:345:1::0;65355:195:0;1862:13;:11;:13::i;:::-;-1:-1:-1;;;;;65444:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;:34;;-1:-1:-1;;65444:34:0::1;::::0;::::1;;;::::0;;65494:48;::::1;::::0;::::1;::::0;65515:10:::1;::::0;65444:25;;:34;;65494:48:::1;:::i;17277:346::-:0;-1:-1:-1;;;;;17379:19:0;;17371:68;;;;-1:-1:-1;;;17371:68:0;;13920:2:1;17371:68:0;;;13902:21:1;13959:2;13939:18;;;13932:30;13998:34;13978:18;;;13971:62;-1:-1:-1;;;14049:18:1;;;14042:34;14093:19;;17371:68:0;13718:400:1;17371:68:0;-1:-1:-1;;;;;17458:21:0;;17450:68;;;;-1:-1:-1;;;17450:68:0;;14325:2:1;17450:68:0;;;14307:21:1;14364:2;14344:18;;;14337:30;14403:34;14383:18;;;14376:62;-1:-1:-1;;;14454:18:1;;;14447:32;14496:19;;17450:68:0;14123:398:1;17450:68:0;-1:-1:-1;;;;;17531:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17583:32;;160:25:1;;;17583:32:0;;133:18:1;17583:32:0;;;;;;;;17277:346;;;:::o;2141:132::-;2049:6;;-1:-1:-1;;;;;2049:6:0;736:10;2205:23;2197:68;;;;-1:-1:-1;;;2197:68:0;;14728:2:1;2197:68:0;;;14710:21:1;;;14747:18;;;14740:30;14806:34;14786:18;;;14779:62;14858:18;;2197:68:0;14526:356:1;17914:419:0;18015:24;18042:25;18052:5;18059:7;18042:9;:25::i;:::-;18015:52;;-1:-1:-1;;18082:16:0;:37;18078:248;;18164:6;18144:16;:26;;18136:68;;;;-1:-1:-1;;;18136:68:0;;15089:2:1;18136:68:0;;;15071:21:1;15128:2;15108:18;;;15101:30;15167:31;15147:18;;;15140:59;15216:18;;18136:68:0;14887:353:1;18136:68:0;18248:51;18257:5;18264:7;18292:6;18273:16;:25;18248:8;:51::i;:::-;18004:329;17914:419;;;:::o;60707:1032::-;60818:6;;60797:4;;-1:-1:-1;;;60818:6:0;;;;60814:101;;;60841:36;60851:6;60859:9;60870:6;60841:9;:36::i;:::-;-1:-1:-1;60899:4:0;60892:11;;60814:101;60967:10;60927:18;60949:29;;;:17;:29;;;;;;;;60948:30;:58;;;;-1:-1:-1;;;;;;60983:23:0;;;;;;:15;:23;;;;;;;;60982:24;60948:58;:87;;;;-1:-1:-1;;;;;;61011:24:0;;;;;;:13;:24;;;;;;;;61010:25;60948:87;60927:108;-1:-1:-1;61046:9:0;61086:6;61119:9;61141:249;;;;61179:14;61186:6;61179;:14::i;:::-;61175:204;;;-1:-1:-1;61221:1:0;;-1:-1:-1;61249:9:0;;-1:-1:-1;61285:6:0;61175:204;;;61317:17;61324:9;61317:6;:17::i;:::-;61313:66;;;61362:1;61355:8;;61313:66;61406:16;:14;:16::i;:::-;61402:59;;;61439:10;:8;:10::i;:::-;61473:22;61498:13;:48;;61540:6;61498:48;;;61514:23;61522:6;61530;61514:7;:23::i;:::-;61473:73;;61557:44;61567:6;61575:9;61586:14;61557:9;:44::i;:::-;61618:8;;61614:96;;61648:50;;;-1:-1:-1;;;;;15560:15:1;;;15542:34;;15612:15;;15607:2;15592:18;;15585:43;15644:18;;;15637:34;;;15702:2;15687:18;;15680:34;;;61682:15:0;15745:3:1;15730:19;;15723:35;61648:50:0;;15491:3:1;15476:19;61648:50:0;;;;;;;61614:96;-1:-1:-1;61727:4:0;;60707:1032;-1:-1:-1;;;;;;;;60707:1032:0:o;16164:675::-;-1:-1:-1;;;;;16248:21:0;;16240:67;;;;-1:-1:-1;;;16240:67:0;;15971:2:1;16240:67:0;;;15953:21:1;16010:2;15990:18;;;15983:30;16049:34;16029:18;;;16022:62;-1:-1:-1;;;16100:18:1;;;16093:31;16141:19;;16240:67:0;15769:397:1;16240:67:0;-1:-1:-1;;;;;16407:18:0;;16382:22;16407:18;;;;;;;;;;;16444:24;;;;16436:71;;;;-1:-1:-1;;;16436:71:0;;16373:2:1;16436:71:0;;;16355:21:1;16412:2;16392:18;;;16385:30;16451:34;16431:18;;;16424:62;-1:-1:-1;;;16502:18:1;;;16495:32;16544:19;;16436:71:0;16171:398:1;16436:71:0;-1:-1:-1;;;;;16543:18:0;;:9;:18;;;;;;;;;;;16564:23;;;16543:44;;16682:12;:22;;;;;;;16733:37;160:25:1;;;16543:9:0;;:18;16733:37;;133:18:1;16733:37:0;14:177:1;50530:152:0;50600:4;50624:50;50629:3;-1:-1:-1;;;;;50649:23:0;;50624:4;:50::i;3236:191::-;3329:6;;;-1:-1:-1;;;;;3346:17:0;;;-1:-1:-1;;;;;;3346:17:0;;;;;;;3379:40;;3329:6;;;3346:17;3329:6;;3379:40;;3310:16;;3379:40;3299:128;3236:191;:::o;51355:117::-;51418:7;51445:19;51453:3;46655:18;;46572:109;61900:872;57878:6;:13;;-1:-1:-1;;;;57878:13:0;-1:-1:-1;;;57878:13:0;;;61987:4:::1;-1:-1:-1::0;10133:18:0;;;;;;;;;;;61949:44:::1;;62008:9;62021:1;62008:14:::0;62004:27:::1;;62024:7;;;62004:27;62045:8;;62057:1;62045:13:::0;62041:26:::1;;62060:7;;;62041:26;62079:55;62096:4;62111:10;62124:9;62079:8;:55::i;:::-;62147:18;62190:8;;62180:7;;62168:9;:19;;;;:::i;:::-;:30;;;;:::i;:::-;62147:51;;62209:19;62254:8;;62243;;62231:9;:20;;;;:::i;:::-;:31;;;;:::i;:::-;62209:53;;62273:21;62322:8;;62309:10;;62297:9;:22;;;;:::i;:::-;:33;;;;:::i;:::-;62273:57:::0;-1:-1:-1;62355:14:0;;62351:79:::1;;62386:32;62400:4;62407:10;62386:5;:32::i;:::-;62446:15:::0;;62442:107:::1;;62511:11;::::0;62478:59:::1;::::0;62496:4:::1;::::0;-1:-1:-1;;;;;62511:11:0::1;62525::::0;62478:9:::1;:59::i;:::-;62565:17:::0;;62561:113:::1;;62632:13;::::0;62599:63:::1;::::0;62617:4:::1;::::0;-1:-1:-1;;;;;62632:13:0::1;62648::::0;62599:9:::1;:63::i;:::-;62699:65;::::0;;10733:25:1;;;10789:2;10774:18;;10767:34;;;10817:18;;;10810:34;;;62748:15:0::1;10875:2:1::0;10860:18;;10853:34;62699:65:0::1;::::0;10720:3:1;10705:19;62699:65:0::1;;;;;;;61938:834;;;;57902:1;57914:6:::0;:14;;-1:-1:-1;;;;57914:14:0;;;61900:872::o;52534:310::-;52597:16;52626:22;52651:19;52659:3;52651:7;:19::i;50858:158::-;50931:4;50955:53;50963:3;-1:-1:-1;;;;;50983:23:0;;50955:7;:53::i;51826:158::-;51900:7;51951:22;51955:3;51967:5;51951:3;:22::i;51102:167::-;-1:-1:-1;;;;;51236:23:0;;51182:4;46454:19;;;:12;;;:19;;;;;;:24;;51206:55;46357:129;14190:806;-1:-1:-1;;;;;14287:18:0;;14279:68;;;;-1:-1:-1;;;14279:68:0;;16776:2:1;14279:68:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:34;16834:18;;;16827:62;-1:-1:-1;;;16905:18:1;;;16898:35;16950:19;;14279:68:0;16574:401:1;14279:68:0;-1:-1:-1;;;;;14366:16:0;;14358:64;;;;-1:-1:-1;;;14358:64:0;;17182:2:1;14358:64:0;;;17164:21:1;17221:2;17201:18;;;17194:30;17260:34;17240:18;;;17233:62;-1:-1:-1;;;17311:18:1;;;17304:33;17354:19;;14358:64:0;16980:399:1;14358:64:0;-1:-1:-1;;;;;14508:15:0;;14486:19;14508:15;;;;;;;;;;;14542:21;;;;14534:72;;;;-1:-1:-1;;;14534:72:0;;17586:2:1;14534:72:0;;;17568:21:1;17625:2;17605:18;;;17598:30;17664:34;17644:18;;;17637:62;-1:-1:-1;;;17715:18:1;;;17708:36;17761:19;;14534:72:0;17384:402:1;14534:72:0;-1:-1:-1;;;;;14642:15:0;;;:9;:15;;;;;;;;;;;14660:20;;;14642:38;;14860:13;;;;;;;;;;:23;;;;;;14912:26;;160:25:1;;;14860:13:0;;14912:26;;133:18:1;14912:26:0;;;;;;;14951:37;16164:675;61747:145;61821:6;;61796:4;;-1:-1:-1;;;61821:6:0;;;;61820:7;:39;;;;-1:-1:-1;61849:4:0;61858:1;10133:18;;;;;;;;;;;61831:28;61820:39;:64;;;;-1:-1:-1;61864:20:0;736:10;65558:110;:::i;61864:20::-;61863:21;61813:71;;61747:145;:::o;62846:241::-;62913:7;62933:17;57985:5;62963:8;;62954:6;:17;;;;:::i;:::-;62953:36;;;;:::i;:::-;62933:56;;63000:43;63010:6;63026:4;63033:9;63000;:43::i;:::-;63061:18;63070:9;63061:6;:18;:::i;:::-;63054:25;62846:241;-1:-1:-1;;;;62846:241:0:o;44261:414::-;44324:4;46454:19;;;:12;;;:19;;;;;;44341:327;;-1:-1:-1;44384:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;44567:18;;44545:19;;;:12;;;:19;;;;;;:40;;;;44600:11;;44341:327;-1:-1:-1;44651:5:0;44644:12;;47705:111;47761:16;47797:3;:11;;47790:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47705:111;;;:::o;44851:1420::-;44917:4;45056:19;;;:12;;;:19;;;;;;45092:15;;45088:1176;;45467:21;45491:14;45504:1;45491:10;:14;:::i;:::-;45540:18;;45467:38;;-1:-1:-1;45520:17:0;;45540:22;;45561:1;;45540:22;:::i;:::-;45520:42;;45596:13;45583:9;:26;45579:405;;45630:17;45650:3;:11;;45662:9;45650:22;;;;;;;;:::i;:::-;;;;;;;;;45630:42;;45804:9;45775:3;:11;;45787:13;45775:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;45889:23;;;:12;;;:23;;;;;:36;;;45579:405;46065:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;46160:3;:12;;:19;46173:5;46160:19;;;;;;;;;;;46153:26;;;46203:4;46196:11;;;;;;;45088:1176;46247:5;46240:12;;;;;47035:120;47102:7;47129:3;:11;;47141:5;47129:18;;;;;;;;:::i;:::-;;;;;;;;;47122:25;;47035:120;;;;:::o;404:250:1:-;489:1;499:113;513:6;510:1;507:13;499:113;;;589:11;;;583:18;570:11;;;563:39;535:2;528:10;499:113;;;-1:-1:-1;;646:1:1;628:16;;621:27;404:250::o;659:396::-;808:2;797:9;790:21;771:4;840:6;834:13;883:6;878:2;867:9;863:18;856:34;899:79;971:6;966:2;955:9;951:18;946:2;938:6;934:15;899:79;:::i;:::-;1039:2;1018:15;-1:-1:-1;;1014:29:1;999:45;;;;1046:2;995:54;;659:396;-1:-1:-1;;659:396:1:o;1060:131::-;-1:-1:-1;;;;;1135:31:1;;1125:42;;1115:70;;1181:1;1178;1171:12;1196:315;1264:6;1272;1325:2;1313:9;1304:7;1300:23;1296:32;1293:52;;;1341:1;1338;1331:12;1293:52;1380:9;1367:23;1399:31;1424:5;1399:31;:::i;:::-;1449:5;1501:2;1486:18;;;;1473:32;;-1:-1:-1;;;1196:315:1:o;1708:118::-;1794:5;1787:13;1780:21;1773:5;1770:32;1760:60;;1816:1;1813;1806:12;1831:382;1896:6;1904;1957:2;1945:9;1936:7;1932:23;1928:32;1925:52;;;1973:1;1970;1963:12;1925:52;2012:9;1999:23;2031:31;2056:5;2031:31;:::i;:::-;2081:5;-1:-1:-1;2138:2:1;2123:18;;2110:32;2151:30;2110:32;2151:30;:::i;:::-;2200:7;2190:17;;;1831:382;;;;;:::o;2218:456::-;2295:6;2303;2311;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;2419:9;2406:23;2438:31;2463:5;2438:31;:::i;:::-;2488:5;-1:-1:-1;2545:2:1;2530:18;;2517:32;2558:33;2517:32;2558:33;:::i;:::-;2218:456;;2610:7;;-1:-1:-1;;;2664:2:1;2649:18;;;;2636:32;;2218:456::o;2868:247::-;2927:6;2980:2;2968:9;2959:7;2955:23;2951:32;2948:52;;;2996:1;2993;2986:12;2948:52;3035:9;3022:23;3054:31;3079:5;3054:31;:::i;3120:180::-;3179:6;3232:2;3220:9;3211:7;3207:23;3203:32;3200:52;;;3248:1;3245;3238:12;3200:52;-1:-1:-1;3271:23:1;;3120:180;-1:-1:-1;3120:180:1:o;3539:658::-;3710:2;3762:21;;;3832:13;;3735:18;;;3854:22;;;3681:4;;3710:2;3933:15;;;;3907:2;3892:18;;;3681:4;3976:195;3990:6;3987:1;3984:13;3976:195;;;4055:13;;-1:-1:-1;;;;;4051:39:1;4039:52;;4146:15;;;;4111:12;;;;4087:1;4005:9;3976:195;;;-1:-1:-1;4188:3:1;;3539:658;-1:-1:-1;;;;;;3539:658:1:o;4202:388::-;4270:6;4278;4331:2;4319:9;4310:7;4306:23;4302:32;4299:52;;;4347:1;4344;4337:12;4299:52;4386:9;4373:23;4405:31;4430:5;4405:31;:::i;:::-;4455:5;-1:-1:-1;4512:2:1;4497:18;;4484:32;4525:33;4484:32;4525:33;:::i;5274:316::-;5351:6;5359;5367;5420:2;5408:9;5399:7;5395:23;5391:32;5388:52;;;5436:1;5433;5426:12;5388:52;-1:-1:-1;;5459:23:1;;;5529:2;5514:18;;5501:32;;-1:-1:-1;5580:2:1;5565:18;;;5552:32;;5274:316;-1:-1:-1;5274:316:1:o;5825:380::-;5904:1;5900:12;;;;5947;;;5968:61;;6022:4;6014:6;6010:17;6000:27;;5968:61;6075:2;6067:6;6064:14;6044:18;6041:38;6038:161;;6121:10;6116:3;6112:20;6109:1;6102:31;6156:4;6153:1;6146:15;6184:4;6181:1;6174:15;6038:161;;5825:380;;;:::o;6210:385::-;-1:-1:-1;;;;;6462:15:1;;;6444:34;;6514:15;;;;6509:2;6494:18;;6487:43;6573:14;;6566:22;6561:2;6546:18;;6539:50;6394:2;6379:18;;6210:385::o;6600:127::-;6661:10;6656:3;6652:20;6649:1;6642:31;6692:4;6689:1;6682:15;6716:4;6713:1;6706:15;6732:128;6799:9;;;6820:11;;;6817:37;;;6834:18;;:::i;6865:125::-;6930:9;;;6951:10;;;6948:36;;;6964:18;;:::i;7657:251::-;7727:6;7780:2;7768:9;7759:7;7755:23;7751:32;7748:52;;;7796:1;7793;7786:12;7748:52;7828:9;7822:16;7847:31;7872:5;7847:31;:::i;9512:287::-;9641:3;9679:6;9673:13;9695:66;9754:6;9749:3;9742:4;9734:6;9730:17;9695:66;:::i;:::-;9777:16;;;;;9512:287;-1:-1:-1;;9512:287:1:o;12368:245::-;12435:6;12488:2;12476:9;12467:7;12463:23;12459:32;12456:52;;;12504:1;12501;12494:12;12456:52;12536:9;12530:16;12555:28;12577:5;12555:28;:::i;12618:168::-;12691:9;;;12722;;12739:15;;;12733:22;;12719:37;12709:71;;12760:18;;:::i;12791:217::-;12831:1;12857;12847:132;;12901:10;12896:3;12892:20;12889:1;12882:31;12936:4;12933:1;12926:15;12964:4;12961:1;12954:15;12847:132;-1:-1:-1;12993:9:1;;12791:217::o;17791:127::-;17852:10;17847:3;17843:20;17840:1;17833:31;17883:4;17880:1;17873:15;17907:4;17904:1;17897:15;17923:127;17984:10;17979:3;17975:20;17972:1;17965:31;18015:4;18012:1;18005:15;18039:4;18036:1;18029:15
Swarm Source
ipfs://125621c385282cc44d28b451f6152ea352b590244ac4308994697860301c2603
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ARB | 100.00% | $1,805.9 | 0.0057375 | $10.36 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.