More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 72 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 17950883 | 376 days ago | IN | 0 ETH | 0.00285071 | ||||
Approve | 17950866 | 376 days ago | IN | 0 ETH | 0.00071759 | ||||
Transfer | 17950866 | 376 days ago | IN | 0 ETH | 0.00064701 | ||||
Approve | 17950862 | 376 days ago | IN | 0 ETH | 0.00091632 | ||||
Approve | 17950861 | 376 days ago | IN | 0 ETH | 0.00093258 | ||||
Approve | 17950860 | 376 days ago | IN | 0 ETH | 0.00094064 | ||||
Approve | 17950859 | 376 days ago | IN | 0 ETH | 0.00096188 | ||||
Approve | 17950858 | 376 days ago | IN | 0 ETH | 0.00089189 | ||||
Approve | 17950858 | 376 days ago | IN | 0 ETH | 0.00089189 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0007894 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0007894 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.000836 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0008826 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0008826 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0008826 | ||||
Approve | 17950857 | 376 days ago | IN | 0 ETH | 0.0009758 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 | ||||
Approve | 17950856 | 376 days ago | IN | 0 ETH | 0.00079656 |
Loading...
Loading
Contract Name:
EnemyTechERC
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-19 */ // Enemy Tech Chat Group : https://t.me/EnemyTechErcPortal // SPDX-License-Identifier: MIT pragma solidity 0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } ////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) /* pragma solidity ^0.8.0; */ /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } ////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) /* pragma solidity ^0.8.0; */ /* import "../IERC20.sol"; */ /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor() { _name = "Enemy Tech"; _symbol = "ET"; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } ////// src/IUniswapV2Pair.sol /* pragma solidity 0.8.10; */ /* pragma experimental ABIEncoderV2; */ interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract EnemyTechERC is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; address public constant deadAddress = address(0xdead); bool private swapping; address public revShareWallet; address public teamWallet; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; uint256 public buyTotalFees; uint256 public buyRevShareFee; uint256 public buyLiquidityFee; uint256 public buyTeamFee; uint256 public sellTotalFees; uint256 public sellRevShareFee; uint256 public sellLiquidityFee; uint256 public sellTeamFee; uint256 public tokensForRevShare; uint256 public tokensForLiquidity; uint256 public tokensForTeam; /******************/ // exclude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) public automatedMarketMakerPairs; event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event revShareWalletUpdated( address indexed newWallet, address indexed oldWallet ); event teamWalletUpdated( address indexed newWallet, address indexed oldWallet ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity ); constructor() ERC20() { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); isExcludedFromMaxTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); isExcludedFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); uint256 _buyRevShareFee = 1; uint256 _buyLiquidityFee = 0; uint256 _buyTeamFee = 0; uint256 _sellRevShareFee = 1; uint256 _sellLiquidityFee = 0; uint256 _sellTeamFee = 0; uint256 totalSupply = 1000 * 1e18; maxTransactionAmount = totalSupply / 50; // 2% maxWallet = totalSupply / 50; // 2% swapTokensAtAmount = totalSupply / 100; // 1% buyRevShareFee = _buyRevShareFee; buyLiquidityFee = _buyLiquidityFee; buyTeamFee = _buyTeamFee; buyTotalFees = buyRevShareFee + buyLiquidityFee + buyTeamFee; sellRevShareFee = _sellRevShareFee; sellLiquidityFee = _sellLiquidityFee; sellTeamFee = _sellTeamFee; sellTotalFees = sellRevShareFee + sellLiquidityFee + sellTeamFee; revShareWallet = address(0xBF1309Bd876Ba5FA05d500E60Ac628206f9E180f); teamWallet = address(0x1A878e0a2e3F8EF7Df1CE6A240E4b9721B1BC2C0); // exclude from paying fees or having max transaction amount isExcludedFromFees(owner(), true); isExcludedFromFees(address(this), true); isExcludedFromFees(address(0xdead), true); isExcludedFromMaxTransaction(owner(), true); isExcludedFromMaxTransaction(address(this), true); isExcludedFromMaxTransaction(address(0xdead), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(msg.sender, totalSupply); } receive() external payable {} // once enabled, can never be turned off function enableTrading() external onlyOwner { tradingActive = true; swapEnabled = true; } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool) { limitsInEffect = false; return true; } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) { require( newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply." ); require( newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply." ); swapTokensAtAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 5) / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.5%" ); maxTransactionAmount = newNum * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 10) / 1000) / 1e18, "Cannot set maxWallet lower than 1.0%" ); maxWallet = newNum * (10**18); } function isExcludedFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner { swapEnabled = enabled; } function updateBuyFees( uint256 _revShareFee, uint256 _liquidityFee, uint256 _teamFee ) external onlyOwner { buyRevShareFee = _revShareFee; buyLiquidityFee = _liquidityFee; buyTeamFee = _teamFee; buyTotalFees = buyRevShareFee + buyLiquidityFee + buyTeamFee; require(buyTotalFees <= 5, "Buy fees must be <= 5%"); } function updateSellFees( uint256 _revShareFee, uint256 _liquidityFee, uint256 _teamFee ) external onlyOwner { sellRevShareFee = _revShareFee; sellLiquidityFee = _liquidityFee; sellTeamFee = _teamFee; sellTotalFees = sellRevShareFee + sellLiquidityFee + sellTeamFee; require(sellTotalFees <= 5, "Sell fees must be <= 5%."); } function isExcludedFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (amount == 0) { super._transfer(from, to, 0); return; } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping ) { if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } //when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require( amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount." ); require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } //when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require( amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount." ); } else if (!_isExcludedMaxTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = amount.mul(sellTotalFees).div(100); tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees; tokensForTeam += (fees * sellTeamFee) / sellTotalFees; tokensForRevShare += (fees * sellRevShareFee) / sellTotalFees; } // on buy else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = amount.mul(buyTotalFees).div(100); tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees; tokensForTeam += (fees * buyTeamFee) / buyTotalFees; tokensForRevShare += (fees * buyRevShareFee) / buyTotalFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForRevShare + tokensForTeam; bool success; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 20) { contractBalance = swapTokensAtAmount * 20; } // Halve the amount of liquidity tokens uint256 liquidityTokens = (contractBalance * tokensForLiquidity) / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethForRevShare = ethBalance.mul(tokensForRevShare).div(totalTokensToSwap - (tokensForLiquidity / 2)); uint256 ethForTeam = ethBalance.mul(tokensForTeam).div(totalTokensToSwap - (tokensForLiquidity / 2)); uint256 ethForLiquidity = ethBalance - ethForRevShare - ethForTeam; tokensForLiquidity = 0; tokensForRevShare = 0; tokensForTeam = 0; (success, ) = address(teamWallet).call{value: ethForTeam}(""); if (liquidityTokens > 0 && ethForLiquidity > 0) { addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify( amountToSwapForETH, ethForLiquidity, tokensForLiquidity ); } (success, ) = address(revShareWallet).call{value: address(this).balance}(""); } function withdrawStuckUnibot() external onlyOwner { uint256 balance = IERC20(address(this)).balanceOf(address(this)); IERC20(address(this)).transfer(msg.sender, balance); payable(msg.sender).transfer(address(this).balance); } function withdrawStuckToken(address _token, address _to) external onlyOwner { require(_token != address(0), "_token address cannot be 0"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); IERC20(_token).transfer(_to, _contractBalance); } function withdrawStuckEth(address toAddr) external onlyOwner { (bool success, ) = toAddr.call{ value: address(this).balance } (""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"revShareWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"teamWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRevShareFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTeamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"isExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"isExcludedFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revShareWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRevShareFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTeamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRevShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTeam","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revShareFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_teamFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_revShareFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_teamFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckUnibot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052600b805462ffffff191660011790553480156200001f575f80fd5b5060408051808201909152600a81526908adccadaf240a8cac6d60b31b6020820152600390620000509082620006a9565b50604080518082019091526002815261115560f21b6020820152600490620000799082620006a9565b50620000853362000393565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000a7816001620003e4565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620000f0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000116919062000771565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000162573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000188919062000771565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620001d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001f9919062000771565b6001600160a01b031660a081905262000214906001620003e4565b60a051620002249060016200045c565b60015f80828180683635c9adc5dea0000062000242603282620007a0565b60085562000252603282620007a0565b600a5562000262606482620007a0565b600955600d879055600e869055600f85905584620002818789620007c0565b6200028d9190620007c0565b600c5560118490556012839055601382905581620002ac8486620007c0565b620002b89190620007c0565b601055600680546001600160a01b031990811673bf1309bd876ba5fa05d500e60ac628206f9e180f1790915560078054909116731a878e0a2e3f8ef7df1ce6a240e4b9721b1bc2c0179055620003226200031a6005546001600160a01b031690565b6001620004af565b6200032f306001620004af565b6200033e61dead6001620004af565b6200035d620003556005546001600160a01b031690565b6001620003e4565b6200036a306001620003e4565b6200037961dead6001620003e4565b62000385338262000523565b5050505050505050620007e6565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b03163314620004325760405162461bcd60e51b815260206004820181905260248201525f805160206200317483398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6001600160a01b0382165f81815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b03163314620004f95760405162461bcd60e51b815260206004820181905260248201525f8051602062003174833981519152604482015260640162000429565b6001600160a01b03919091165f908152601760205260409020805460ff1916911515919091179055565b6001600160a01b0382166200057b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000429565b8060025f8282546200058e9190620007c0565b90915550506001600160a01b0382165f9081526020819052604081208054839290620005bc908490620007c0565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200063357607f821691505b6020821081036200065257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000605575f81815260208120601f850160051c81016020861015620006805750805b601f850160051c820191505b81811015620006a1578281556001016200068c565b505050505050565b81516001600160401b03811115620006c557620006c56200060a565b620006dd81620006d684546200061e565b8462000658565b602080601f83116001811462000713575f8415620006fb5750858301515b5f19600386901b1c1916600185901b178555620006a1565b5f85815260208120601f198616915b82811015620007435788860151825594840194600190910190840162000722565b50858210156200076157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000782575f80fd5b81516001600160a01b038116811462000799575f80fd5b9392505050565b5f82620007bb57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620007e057634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a051612942620008325f395f81816104e90152610f6201525f81816103bc0152818161229b015281816123520152818161238e01528181612402015261242901526129425ff3fe6080604052600436106102f6575f3560e01c80638a8c523c11610189578063c18bc195116100d8578063e2f4560511610092578063f63743421161006d578063f6374342146108cd578063f8b45b05146108e2578063f99e8d40146108f7578063fde83a3414610916575f80fd5b8063e2f4560514610884578063f11a24d314610899578063f2fde38b146108ae575f80fd5b8063c18bc195146107c3578063c8c8ebe4146107e2578063d257b34f146107f7578063d729715f14610816578063d85ba0631461082b578063dd62ed3e14610840575f80fd5b80639c2e4ac611610143578063b62496f51161011e578063b62496f514610739578063bbc0c74214610767578063bc205ad314610785578063c17b5b8c146107a4575f80fd5b80639c2e4ac6146106e6578063a457c2d7146106fb578063a9059cbb1461071a575f80fd5b80638a8c523c146106445780638da5cb5b14610658578063924de9b71461067557806393252f251461069457806395d89b41146106b35780639a7a23d6146106c7575f80fd5b806339509351116102455780636ddd1713116101ff578063751039fc116101da578063751039fc146105d3578063782c4e99146105e75780637ca8448a146106065780638095d56414610625575f80fd5b80636ddd17131461056c57806370a082311461058b578063715018a6146105bf575f80fd5b806339509351146104b957806349bd5a5e146104d85780634a62bb651461050b57806359927044146105245780635ea92ddd146105435780636a486a8e14610557575f80fd5b806319eab042116102b057806323b872dd1161028b57806323b872dd1461045557806324b9f3c11461047457806327c8f83514610489578063313ce5671461049e575f80fd5b806319eab0421461040a5780631a8145bb1461041f578063203e727e14610434575f80fd5b806306fdde0314610301578063095ea7b31461032b57806310d5de531461035a578063156c2f35146103885780631694505e146103ab57806318160ddd146103f6575f80fd5b366102fd57005b5f80fd5b34801561030c575f80fd5b5061031561092b565b60405161032291906124ff565b60405180910390f35b348015610336575f80fd5b5061034a61034536600461255e565b6109bb565b6040519015158152602001610322565b348015610365575f80fd5b5061034a610374366004612588565b60186020525f908152604090205460ff1681565b348015610393575f80fd5b5061039d600d5481565b604051908152602001610322565b3480156103b6575f80fd5b506103de7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610322565b348015610401575f80fd5b5060025461039d565b348015610415575f80fd5b5061039d60115481565b34801561042a575f80fd5b5061039d60155481565b34801561043f575f80fd5b5061045361044e3660046125a3565b6109d1565b005b348015610460575f80fd5b5061034a61046f3660046125ba565b610ab7565b34801561047f575f80fd5b5061039d60145481565b348015610494575f80fd5b506103de61dead81565b3480156104a9575f80fd5b5060405160128152602001610322565b3480156104c4575f80fd5b5061034a6104d336600461255e565b610b5f565b3480156104e3575f80fd5b506103de7f000000000000000000000000000000000000000000000000000000000000000081565b348015610516575f80fd5b50600b5461034a9060ff1681565b34801561052f575f80fd5b506007546103de906001600160a01b031681565b34801561054e575f80fd5b50610453610b9a565b348015610562575f80fd5b5061039d60105481565b348015610577575f80fd5b50600b5461034a9062010000900460ff1681565b348015610596575f80fd5b5061039d6105a5366004612588565b6001600160a01b03165f9081526020819052604090205490565b3480156105ca575f80fd5b50610453610cb9565b3480156105de575f80fd5b5061034a610cee565b3480156105f2575f80fd5b506006546103de906001600160a01b031681565b348015610611575f80fd5b50610453610620366004612588565b610d2a565b348015610630575f80fd5b5061045361063f3660046125f8565b610daf565b34801561064f575f80fd5b50610453610e50565b348015610663575f80fd5b506005546001600160a01b03166103de565b348015610680575f80fd5b5061045361068f36600461262e565b610e8d565b34801561069f575f80fd5b506104536106ae366004612649565b610ed3565b3480156106be575f80fd5b50610315610f27565b3480156106d2575f80fd5b506104536106e1366004612649565b610f36565b3480156106f1575f80fd5b5061039d600f5481565b348015610706575f80fd5b5061034a61071536600461255e565b611011565b348015610725575f80fd5b5061034a61073436600461255e565b6110a9565b348015610744575f80fd5b5061034a610753366004612588565b60196020525f908152604090205460ff1681565b348015610772575f80fd5b50600b5461034a90610100900460ff1681565b348015610790575f80fd5b5061045361079f366004612680565b6110b5565b3480156107af575f80fd5b506104536107be3660046125f8565b611217565b3480156107ce575f80fd5b506104536107dd3660046125a3565b6112ba565b3480156107ed575f80fd5b5061039d60085481565b348015610802575f80fd5b5061034a6108113660046125a3565b61138b565b348015610821575f80fd5b5061039d60135481565b348015610836575f80fd5b5061039d600c5481565b34801561084b575f80fd5b5061039d61085a366004612680565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088f575f80fd5b5061039d60095481565b3480156108a4575f80fd5b5061039d600e5481565b3480156108b9575f80fd5b506104536108c8366004612588565b6114dc565b3480156108d8575f80fd5b5061039d60125481565b3480156108ed575f80fd5b5061039d600a5481565b348015610902575f80fd5b50610453610911366004612649565b611577565b348015610921575f80fd5b5061039d60165481565b60606003805461093a906126ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610966906126ac565b80156109b15780601f10610988576101008083540402835291602001916109b1565b820191905f5260205f20905b81548152906001019060200180831161099457829003601f168201915b5050505050905090565b5f6109c73384846115cb565b5060015b92915050565b6005546001600160a01b03163314610a045760405162461bcd60e51b81526004016109fb906126e4565b60405180910390fd5b670de0b6b3a76400006103e8610a1960025490565b610a2490600561272d565b610a2e9190612744565b610a389190612744565b811015610a9f5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b60648201526084016109fb565b610ab181670de0b6b3a764000061272d565b60085550565b5f610ac38484846116ee565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610b475760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016109fb565b610b5485338584036115cb565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916109c7918590610b95908690612763565b6115cb565b6005546001600160a01b03163314610bc45760405162461bcd60e51b81526004016109fb906126e4565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015610bff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190612776565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af1158015610c67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8b919061278d565b5060405133904780156108fc02915f818181858888f19350505050158015610cb5573d5f803e3d5ffd5b5050565b6005546001600160a01b03163314610ce35760405162461bcd60e51b81526004016109fb906126e4565b610cec5f611ddc565b565b6005545f906001600160a01b03163314610d1a5760405162461bcd60e51b81526004016109fb906126e4565b50600b805460ff19169055600190565b6005546001600160a01b03163314610d545760405162461bcd60e51b81526004016109fb906126e4565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610d9d576040519150601f19603f3d011682016040523d82523d5f602084013e610da2565b606091505b5050905080610cb5575f80fd5b6005546001600160a01b03163314610dd95760405162461bcd60e51b81526004016109fb906126e4565b600d839055600e829055600f81905580610df38385612763565b610dfd9190612763565b600c81905560051015610e4b5760405162461bcd60e51b81526020600482015260166024820152754275792066656573206d757374206265203c3d20352560501b60448201526064016109fb565b505050565b6005546001600160a01b03163314610e7a5760405162461bcd60e51b81526004016109fb906126e4565b600b805462ffff00191662010100179055565b6005546001600160a01b03163314610eb75760405162461bcd60e51b81526004016109fb906126e4565b600b8054911515620100000262ff000019909216919091179055565b6005546001600160a01b03163314610efd5760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03919091165f908152601760205260409020805460ff1916911515919091179055565b60606004805461093a906126ac565b6005546001600160a01b03163314610f605760405162461bcd60e51b81526004016109fb906126e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036110075760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016109fb565b610cb58282611e2d565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156110925760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109fb565b61109f33858584036115cb565b5060019392505050565b5f6109c73384846116ee565b6005546001600160a01b031633146110df5760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b0382166111355760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109fb565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611179573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119d9190612776565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af11580156111ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611211919061278d565b50505050565b6005546001600160a01b031633146112415760405162461bcd60e51b81526004016109fb906126e4565b6011839055601282905560138190558061125b8385612763565b6112659190612763565b601081905560051015610e4b5760405162461bcd60e51b815260206004820152601860248201527f53656c6c2066656573206d757374206265203c3d2035252e000000000000000060448201526064016109fb565b6005546001600160a01b031633146112e45760405162461bcd60e51b81526004016109fb906126e4565b670de0b6b3a76400006103e86112f960025490565b61130490600a61272d565b61130e9190612744565b6113189190612744565b8110156113735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b60648201526084016109fb565b61138581670de0b6b3a764000061272d565b600a5550565b6005545f906001600160a01b031633146113b75760405162461bcd60e51b81526004016109fb906126e4565b620186a06113c460025490565b6113cf90600161272d565b6113d99190612744565b8210156114465760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016109fb565b6103e861145260025490565b61145d90600561272d565b6114679190612744565b8211156114d35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b60648201526084016109fb565b50600955600190565b6005546001600160a01b031633146115065760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03811661156b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109fb565b61157481611ddc565b50565b6005546001600160a01b031633146115a15760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6001600160a01b03831661162d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109fb565b6001600160a01b03821661168e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109fb565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166117145760405162461bcd60e51b81526004016109fb906127a8565b6001600160a01b03821661173a5760405162461bcd60e51b81526004016109fb906127ed565b805f0361174c57610e4b83835f611e80565b600b5460ff1615611ab9576005546001600160a01b0384811691161480159061178357506005546001600160a01b03838116911614155b801561179757506001600160a01b03821615155b80156117ae57506001600160a01b03821661dead14155b80156117c45750600554600160a01b900460ff16155b15611ab957600b54610100900460ff1661185a576001600160a01b0383165f9081526017602052604090205460ff168061181557506001600160a01b0382165f9081526017602052604090205460ff165b61185a5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016109fb565b6001600160a01b0383165f9081526019602052604090205460ff16801561189957506001600160a01b0382165f9081526018602052604090205460ff16155b1561197c5760085481111561190e5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016109fb565b600a546001600160a01b0383165f908152602081905260409020546119339083612763565b11156119775760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016109fb565b611ab9565b6001600160a01b0382165f9081526019602052604090205460ff1680156119bb57506001600160a01b0383165f9081526018602052604090205460ff16155b15611a31576008548111156119775760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016109fb565b6001600160a01b0382165f9081526018602052604090205460ff16611ab957600a546001600160a01b0383165f90815260208190526040902054611a759083612763565b1115611ab95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016109fb565b305f9081526020819052604090205460095481108015908190611ae45750600b5462010000900460ff165b8015611afa5750600554600160a01b900460ff16155b8015611b1e57506001600160a01b0385165f9081526019602052604090205460ff16155b8015611b4257506001600160a01b0385165f9081526017602052604090205460ff16155b8015611b6657506001600160a01b0384165f9081526017602052604090205460ff16155b15611b94576005805460ff60a01b1916600160a01b179055611b86611fd2565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526017602052604090205460ff600160a01b909204821615911680611be057506001600160a01b0385165f9081526017602052604090205460ff165b15611be857505f5b5f8115611dc8576001600160a01b0386165f9081526019602052604090205460ff168015611c1757505f601054115b15611cd257611c3c6064611c366010548861221e90919063ffffffff16565b90612230565b905060105460125482611c4f919061272d565b611c599190612744565b60155f828254611c699190612763565b9091555050601054601354611c7e908361272d565b611c889190612744565b60165f828254611c989190612763565b9091555050601054601154611cad908361272d565b611cb79190612744565b60145f828254611cc79190612763565b90915550611daa9050565b6001600160a01b0387165f9081526019602052604090205460ff168015611cfa57505f600c54115b15611daa57611d196064611c36600c548861221e90919063ffffffff16565b9050600c54600e5482611d2c919061272d565b611d369190612744565b60155f828254611d469190612763565b9091555050600c54600f54611d5b908361272d565b611d659190612744565b60165f828254611d759190612763565b9091555050600c54600d54611d8a908361272d565b611d949190612744565b60145f828254611da49190612763565b90915550505b8015611dbb57611dbb873083611e80565b611dc58186612830565b94505b611dd3878787611e80565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f81815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611ea65760405162461bcd60e51b81526004016109fb906127a8565b6001600160a01b038216611ecc5760405162461bcd60e51b81526004016109fb906127ed565b6001600160a01b0383165f9081526020819052604090205481811015611f435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109fb565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611f79908490612763565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fc591815260200190565b60405180910390a3611211565b305f9081526020819052604081205490505f601654601454601554611ff79190612763565b6120019190612763565b90505f82158061200f575081155b1561201957505050565b60095461202790601461272d565b83111561203f5760095461203c90601461272d565b92505b5f60028360155486612051919061272d565b61205b9190612744565b6120659190612744565b90505f612072858361223b565b90504761207e82612246565b5f612089478361223b565b90505f6120b6600260155461209e9190612744565b6120a89089612830565b601454611c3690859061221e565b90505f6120e360026015546120cb9190612744565b6120d5908a612830565b601654611c3690869061221e565b90505f816120f18486612830565b6120fb9190612830565b5f6015819055601481905560168190556007546040519293506001600160a01b031691849181818185875af1925050503d805f8114612155576040519150601f19603f3d011682016040523d82523d5f602084013e61215a565b606091505b5090985050861580159061216d57505f81115b156121c05761217c87826123fc565b601554604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f811461220a576040519150601f19603f3d011682016040523d82523d5f602084013e61220f565b606091505b50505050505050505050505050565b5f612229828461272d565b9392505050565b5f6122298284612744565b5f6122298284612830565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061227957612279612843565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190612857565b8160018151811061232c5761232c612843565b60200260200101906001600160a01b031690816001600160a01b031681525050612377307f0000000000000000000000000000000000000000000000000000000000000000846115cb565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906123cb9085905f90869030904290600401612872565b5f604051808303815f87803b1580156123e2575f80fd5b505af11580156123f4573d5f803e3d5ffd5b505050505050565b612427307f0000000000000000000000000000000000000000000000000000000000000000846115cb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f8061246d6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156124d3573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906124f891906128e1565b5050505050565b5f6020808352835180828501525f5b8181101561252a5785810183015185820160400152820161250e565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611574575f80fd5b5f806040838503121561256f575f80fd5b823561257a8161254a565b946020939093013593505050565b5f60208284031215612598575f80fd5b81356122298161254a565b5f602082840312156125b3575f80fd5b5035919050565b5f805f606084860312156125cc575f80fd5b83356125d78161254a565b925060208401356125e78161254a565b929592945050506040919091013590565b5f805f6060848603121561260a575f80fd5b505081359360208301359350604090920135919050565b8015158114611574575f80fd5b5f6020828403121561263e575f80fd5b813561222981612621565b5f806040838503121561265a575f80fd5b82356126658161254a565b9150602083013561267581612621565b809150509250929050565b5f8060408385031215612691575f80fd5b823561269c8161254a565b915060208301356126758161254a565b600181811c908216806126c057607f821691505b6020821081036126de57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109cb576109cb612719565b5f8261275e57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156109cb576109cb612719565b5f60208284031215612786575f80fd5b5051919050565b5f6020828403121561279d575f80fd5b815161222981612621565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156109cb576109cb612719565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612867575f80fd5b81516122298161254a565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156128c05784516001600160a01b03168352938301939183019160010161289b565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128f3575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212203c18cb49b64496749660fc4612c0457e9a9ba947e2270532fbc8c4646e3ef0cf64736f6c634300081400334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106102f6575f3560e01c80638a8c523c11610189578063c18bc195116100d8578063e2f4560511610092578063f63743421161006d578063f6374342146108cd578063f8b45b05146108e2578063f99e8d40146108f7578063fde83a3414610916575f80fd5b8063e2f4560514610884578063f11a24d314610899578063f2fde38b146108ae575f80fd5b8063c18bc195146107c3578063c8c8ebe4146107e2578063d257b34f146107f7578063d729715f14610816578063d85ba0631461082b578063dd62ed3e14610840575f80fd5b80639c2e4ac611610143578063b62496f51161011e578063b62496f514610739578063bbc0c74214610767578063bc205ad314610785578063c17b5b8c146107a4575f80fd5b80639c2e4ac6146106e6578063a457c2d7146106fb578063a9059cbb1461071a575f80fd5b80638a8c523c146106445780638da5cb5b14610658578063924de9b71461067557806393252f251461069457806395d89b41146106b35780639a7a23d6146106c7575f80fd5b806339509351116102455780636ddd1713116101ff578063751039fc116101da578063751039fc146105d3578063782c4e99146105e75780637ca8448a146106065780638095d56414610625575f80fd5b80636ddd17131461056c57806370a082311461058b578063715018a6146105bf575f80fd5b806339509351146104b957806349bd5a5e146104d85780634a62bb651461050b57806359927044146105245780635ea92ddd146105435780636a486a8e14610557575f80fd5b806319eab042116102b057806323b872dd1161028b57806323b872dd1461045557806324b9f3c11461047457806327c8f83514610489578063313ce5671461049e575f80fd5b806319eab0421461040a5780631a8145bb1461041f578063203e727e14610434575f80fd5b806306fdde0314610301578063095ea7b31461032b57806310d5de531461035a578063156c2f35146103885780631694505e146103ab57806318160ddd146103f6575f80fd5b366102fd57005b5f80fd5b34801561030c575f80fd5b5061031561092b565b60405161032291906124ff565b60405180910390f35b348015610336575f80fd5b5061034a61034536600461255e565b6109bb565b6040519015158152602001610322565b348015610365575f80fd5b5061034a610374366004612588565b60186020525f908152604090205460ff1681565b348015610393575f80fd5b5061039d600d5481565b604051908152602001610322565b3480156103b6575f80fd5b506103de7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610322565b348015610401575f80fd5b5060025461039d565b348015610415575f80fd5b5061039d60115481565b34801561042a575f80fd5b5061039d60155481565b34801561043f575f80fd5b5061045361044e3660046125a3565b6109d1565b005b348015610460575f80fd5b5061034a61046f3660046125ba565b610ab7565b34801561047f575f80fd5b5061039d60145481565b348015610494575f80fd5b506103de61dead81565b3480156104a9575f80fd5b5060405160128152602001610322565b3480156104c4575f80fd5b5061034a6104d336600461255e565b610b5f565b3480156104e3575f80fd5b506103de7f000000000000000000000000435ce8345571b36ebb93ba7fcde523d286f4d9e881565b348015610516575f80fd5b50600b5461034a9060ff1681565b34801561052f575f80fd5b506007546103de906001600160a01b031681565b34801561054e575f80fd5b50610453610b9a565b348015610562575f80fd5b5061039d60105481565b348015610577575f80fd5b50600b5461034a9062010000900460ff1681565b348015610596575f80fd5b5061039d6105a5366004612588565b6001600160a01b03165f9081526020819052604090205490565b3480156105ca575f80fd5b50610453610cb9565b3480156105de575f80fd5b5061034a610cee565b3480156105f2575f80fd5b506006546103de906001600160a01b031681565b348015610611575f80fd5b50610453610620366004612588565b610d2a565b348015610630575f80fd5b5061045361063f3660046125f8565b610daf565b34801561064f575f80fd5b50610453610e50565b348015610663575f80fd5b506005546001600160a01b03166103de565b348015610680575f80fd5b5061045361068f36600461262e565b610e8d565b34801561069f575f80fd5b506104536106ae366004612649565b610ed3565b3480156106be575f80fd5b50610315610f27565b3480156106d2575f80fd5b506104536106e1366004612649565b610f36565b3480156106f1575f80fd5b5061039d600f5481565b348015610706575f80fd5b5061034a61071536600461255e565b611011565b348015610725575f80fd5b5061034a61073436600461255e565b6110a9565b348015610744575f80fd5b5061034a610753366004612588565b60196020525f908152604090205460ff1681565b348015610772575f80fd5b50600b5461034a90610100900460ff1681565b348015610790575f80fd5b5061045361079f366004612680565b6110b5565b3480156107af575f80fd5b506104536107be3660046125f8565b611217565b3480156107ce575f80fd5b506104536107dd3660046125a3565b6112ba565b3480156107ed575f80fd5b5061039d60085481565b348015610802575f80fd5b5061034a6108113660046125a3565b61138b565b348015610821575f80fd5b5061039d60135481565b348015610836575f80fd5b5061039d600c5481565b34801561084b575f80fd5b5061039d61085a366004612680565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561088f575f80fd5b5061039d60095481565b3480156108a4575f80fd5b5061039d600e5481565b3480156108b9575f80fd5b506104536108c8366004612588565b6114dc565b3480156108d8575f80fd5b5061039d60125481565b3480156108ed575f80fd5b5061039d600a5481565b348015610902575f80fd5b50610453610911366004612649565b611577565b348015610921575f80fd5b5061039d60165481565b60606003805461093a906126ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610966906126ac565b80156109b15780601f10610988576101008083540402835291602001916109b1565b820191905f5260205f20905b81548152906001019060200180831161099457829003601f168201915b5050505050905090565b5f6109c73384846115cb565b5060015b92915050565b6005546001600160a01b03163314610a045760405162461bcd60e51b81526004016109fb906126e4565b60405180910390fd5b670de0b6b3a76400006103e8610a1960025490565b610a2490600561272d565b610a2e9190612744565b610a389190612744565b811015610a9f5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b60648201526084016109fb565b610ab181670de0b6b3a764000061272d565b60085550565b5f610ac38484846116ee565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610b475760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016109fb565b610b5485338584036115cb565b506001949350505050565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916109c7918590610b95908690612763565b6115cb565b6005546001600160a01b03163314610bc45760405162461bcd60e51b81526004016109fb906126e4565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015610bff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190612776565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af1158015610c67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8b919061278d565b5060405133904780156108fc02915f818181858888f19350505050158015610cb5573d5f803e3d5ffd5b5050565b6005546001600160a01b03163314610ce35760405162461bcd60e51b81526004016109fb906126e4565b610cec5f611ddc565b565b6005545f906001600160a01b03163314610d1a5760405162461bcd60e51b81526004016109fb906126e4565b50600b805460ff19169055600190565b6005546001600160a01b03163314610d545760405162461bcd60e51b81526004016109fb906126e4565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610d9d576040519150601f19603f3d011682016040523d82523d5f602084013e610da2565b606091505b5050905080610cb5575f80fd5b6005546001600160a01b03163314610dd95760405162461bcd60e51b81526004016109fb906126e4565b600d839055600e829055600f81905580610df38385612763565b610dfd9190612763565b600c81905560051015610e4b5760405162461bcd60e51b81526020600482015260166024820152754275792066656573206d757374206265203c3d20352560501b60448201526064016109fb565b505050565b6005546001600160a01b03163314610e7a5760405162461bcd60e51b81526004016109fb906126e4565b600b805462ffff00191662010100179055565b6005546001600160a01b03163314610eb75760405162461bcd60e51b81526004016109fb906126e4565b600b8054911515620100000262ff000019909216919091179055565b6005546001600160a01b03163314610efd5760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03919091165f908152601760205260409020805460ff1916911515919091179055565b60606004805461093a906126ac565b6005546001600160a01b03163314610f605760405162461bcd60e51b81526004016109fb906126e4565b7f000000000000000000000000435ce8345571b36ebb93ba7fcde523d286f4d9e86001600160a01b0316826001600160a01b0316036110075760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016109fb565b610cb58282611e2d565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156110925760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109fb565b61109f33858584036115cb565b5060019392505050565b5f6109c73384846116ee565b6005546001600160a01b031633146110df5760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b0382166111355760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109fb565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611179573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119d9190612776565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af11580156111ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611211919061278d565b50505050565b6005546001600160a01b031633146112415760405162461bcd60e51b81526004016109fb906126e4565b6011839055601282905560138190558061125b8385612763565b6112659190612763565b601081905560051015610e4b5760405162461bcd60e51b815260206004820152601860248201527f53656c6c2066656573206d757374206265203c3d2035252e000000000000000060448201526064016109fb565b6005546001600160a01b031633146112e45760405162461bcd60e51b81526004016109fb906126e4565b670de0b6b3a76400006103e86112f960025490565b61130490600a61272d565b61130e9190612744565b6113189190612744565b8110156113735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b60648201526084016109fb565b61138581670de0b6b3a764000061272d565b600a5550565b6005545f906001600160a01b031633146113b75760405162461bcd60e51b81526004016109fb906126e4565b620186a06113c460025490565b6113cf90600161272d565b6113d99190612744565b8210156114465760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016109fb565b6103e861145260025490565b61145d90600561272d565b6114679190612744565b8211156114d35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b60648201526084016109fb565b50600955600190565b6005546001600160a01b031633146115065760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03811661156b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109fb565b61157481611ddc565b50565b6005546001600160a01b031633146115a15760405162461bcd60e51b81526004016109fb906126e4565b6001600160a01b03919091165f908152601860205260409020805460ff1916911515919091179055565b6001600160a01b03831661162d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109fb565b6001600160a01b03821661168e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109fb565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166117145760405162461bcd60e51b81526004016109fb906127a8565b6001600160a01b03821661173a5760405162461bcd60e51b81526004016109fb906127ed565b805f0361174c57610e4b83835f611e80565b600b5460ff1615611ab9576005546001600160a01b0384811691161480159061178357506005546001600160a01b03838116911614155b801561179757506001600160a01b03821615155b80156117ae57506001600160a01b03821661dead14155b80156117c45750600554600160a01b900460ff16155b15611ab957600b54610100900460ff1661185a576001600160a01b0383165f9081526017602052604090205460ff168061181557506001600160a01b0382165f9081526017602052604090205460ff165b61185a5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b60448201526064016109fb565b6001600160a01b0383165f9081526019602052604090205460ff16801561189957506001600160a01b0382165f9081526018602052604090205460ff16155b1561197c5760085481111561190e5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b60648201526084016109fb565b600a546001600160a01b0383165f908152602081905260409020546119339083612763565b11156119775760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016109fb565b611ab9565b6001600160a01b0382165f9081526019602052604090205460ff1680156119bb57506001600160a01b0383165f9081526018602052604090205460ff16155b15611a31576008548111156119775760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b60648201526084016109fb565b6001600160a01b0382165f9081526018602052604090205460ff16611ab957600a546001600160a01b0383165f90815260208190526040902054611a759083612763565b1115611ab95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b60448201526064016109fb565b305f9081526020819052604090205460095481108015908190611ae45750600b5462010000900460ff165b8015611afa5750600554600160a01b900460ff16155b8015611b1e57506001600160a01b0385165f9081526019602052604090205460ff16155b8015611b4257506001600160a01b0385165f9081526017602052604090205460ff16155b8015611b6657506001600160a01b0384165f9081526017602052604090205460ff16155b15611b94576005805460ff60a01b1916600160a01b179055611b86611fd2565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526017602052604090205460ff600160a01b909204821615911680611be057506001600160a01b0385165f9081526017602052604090205460ff165b15611be857505f5b5f8115611dc8576001600160a01b0386165f9081526019602052604090205460ff168015611c1757505f601054115b15611cd257611c3c6064611c366010548861221e90919063ffffffff16565b90612230565b905060105460125482611c4f919061272d565b611c599190612744565b60155f828254611c699190612763565b9091555050601054601354611c7e908361272d565b611c889190612744565b60165f828254611c989190612763565b9091555050601054601154611cad908361272d565b611cb79190612744565b60145f828254611cc79190612763565b90915550611daa9050565b6001600160a01b0387165f9081526019602052604090205460ff168015611cfa57505f600c54115b15611daa57611d196064611c36600c548861221e90919063ffffffff16565b9050600c54600e5482611d2c919061272d565b611d369190612744565b60155f828254611d469190612763565b9091555050600c54600f54611d5b908361272d565b611d659190612744565b60165f828254611d759190612763565b9091555050600c54600d54611d8a908361272d565b611d949190612744565b60145f828254611da49190612763565b90915550505b8015611dbb57611dbb873083611e80565b611dc58186612830565b94505b611dd3878787611e80565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f81815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611ea65760405162461bcd60e51b81526004016109fb906127a8565b6001600160a01b038216611ecc5760405162461bcd60e51b81526004016109fb906127ed565b6001600160a01b0383165f9081526020819052604090205481811015611f435760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109fb565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290611f79908490612763565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fc591815260200190565b60405180910390a3611211565b305f9081526020819052604081205490505f601654601454601554611ff79190612763565b6120019190612763565b90505f82158061200f575081155b1561201957505050565b60095461202790601461272d565b83111561203f5760095461203c90601461272d565b92505b5f60028360155486612051919061272d565b61205b9190612744565b6120659190612744565b90505f612072858361223b565b90504761207e82612246565b5f612089478361223b565b90505f6120b6600260155461209e9190612744565b6120a89089612830565b601454611c3690859061221e565b90505f6120e360026015546120cb9190612744565b6120d5908a612830565b601654611c3690869061221e565b90505f816120f18486612830565b6120fb9190612830565b5f6015819055601481905560168190556007546040519293506001600160a01b031691849181818185875af1925050503d805f8114612155576040519150601f19603f3d011682016040523d82523d5f602084013e61215a565b606091505b5090985050861580159061216d57505f81115b156121c05761217c87826123fc565b601554604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f811461220a576040519150601f19603f3d011682016040523d82523d5f602084013e61220f565b606091505b50505050505050505050505050565b5f612229828461272d565b9392505050565b5f6122298284612744565b5f6122298284612830565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061227957612279612843565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190612857565b8160018151811061232c5761232c612843565b60200260200101906001600160a01b031690816001600160a01b031681525050612377307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846115cb565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906123cb9085905f90869030904290600401612872565b5f604051808303815f87803b1580156123e2575f80fd5b505af11580156123f4573d5f803e3d5ffd5b505050505050565b612427307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846115cb565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230855f8061246d6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156124d3573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906124f891906128e1565b5050505050565b5f6020808352835180828501525f5b8181101561252a5785810183015185820160400152820161250e565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611574575f80fd5b5f806040838503121561256f575f80fd5b823561257a8161254a565b946020939093013593505050565b5f60208284031215612598575f80fd5b81356122298161254a565b5f602082840312156125b3575f80fd5b5035919050565b5f805f606084860312156125cc575f80fd5b83356125d78161254a565b925060208401356125e78161254a565b929592945050506040919091013590565b5f805f6060848603121561260a575f80fd5b505081359360208301359350604090920135919050565b8015158114611574575f80fd5b5f6020828403121561263e575f80fd5b813561222981612621565b5f806040838503121561265a575f80fd5b82356126658161254a565b9150602083013561267581612621565b809150509250929050565b5f8060408385031215612691575f80fd5b823561269c8161254a565b915060208301356126758161254a565b600181811c908216806126c057607f821691505b6020821081036126de57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109cb576109cb612719565b5f8261275e57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156109cb576109cb612719565b5f60208284031215612786575f80fd5b5051919050565b5f6020828403121561279d575f80fd5b815161222981612621565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156109cb576109cb612719565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612867575f80fd5b81516122298161254a565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156128c05784516001600160a01b03168352938301939183019160010161289b565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128f3575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212203c18cb49b64496749660fc4612c0457e9a9ba947e2270532fbc8c4646e3ef0cf64736f6c63430008140033
Deployed Bytecode Sourcemap
30932:15052:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8891:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11058:169;;;;;;;;;;-1:-1:-1;11058:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;11058:169:0;1023:187:1;32056:63:0;;;;;;;;;;-1:-1:-1;32056:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31548:29;;;;;;;;;;;;;;;;;;;1613:25:1;;;1601:2;1586:18;31548:29:0;1467:177:1;31014:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1840:32:1;;;1822:51;;1810:2;1795:18;31014:51:0;1649:230:1;10011:108:0;;;;;;;;;;-1:-1:-1;10099:12:0;;10011:108;;31690:30;;;;;;;;;;;;;;;;31839:33;;;;;;;;;;;;;;;;36003:275;;;;;;;;;;-1:-1:-1;36003:275:0;;;;;:::i;:::-;;:::i;:::-;;11709:492;;;;;;;;;;-1:-1:-1;11709:492:0;;;;;:::i;:::-;;:::i;31800:32::-;;;;;;;;;;;;;;;;31117:53;;;;;;;;;;;;31163:6;31117:53;;9853:93;;;;;;;;;;-1:-1:-1;9853:93:0;;9936:2;2880:36:1;;2868:2;2853:18;9853:93:0;2738:184:1;12610:215:0;;;;;;;;;;-1:-1:-1;12610:215:0;;;;;:::i;:::-;;:::i;31072:38::-;;;;;;;;;;;;;;;31394:33;;;;;;;;;;-1:-1:-1;31394:33:0;;;;;;;;31245:25;;;;;;;;;;-1:-1:-1;31245:25:0;;;;-1:-1:-1;;;;;31245:25:0;;;45224:257;;;;;;;;;;;;;:::i;31655:28::-;;;;;;;;;;;;;;;;31474:31;;;;;;;;;;-1:-1:-1;31474:31:0;;;;;;;;;;;10182:127;;;;;;;;;;-1:-1:-1;10182:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10283:18:0;10256:7;10283:18;;;;;;;;;;;;10182:127;2446:103;;;;;;;;;;;;;:::i;35307:121::-;;;;;;;;;;;;;:::i;31209:29::-;;;;;;;;;;-1:-1:-1;31209:29:0;;;;-1:-1:-1;;;;;31209:29:0;;;45785:196;;;;;;;;;;-1:-1:-1;45785:196:0;;;;;:::i;:::-;;:::i;36925:395::-;;;;;;;;;;-1:-1:-1;36925:395:0;;;;;:::i;:::-;;:::i;35143:112::-;;;;;;;;;;;;;:::i;1795:87::-;;;;;;;;;;-1:-1:-1;1868:6:0;;-1:-1:-1;;;;;1868:6:0;1795:87;;36817:100;;;;;;;;;;-1:-1:-1;36817:100:0;;;;;:::i;:::-;;:::i;37742:135::-;;;;;;;;;;-1:-1:-1;37742:135:0;;;;;:::i;:::-;;:::i;9110:104::-;;;;;;;;;;;;;:::i;37885:304::-;;;;;;;;;;-1:-1:-1;37885:304:0;;;;;:::i;:::-;;:::i;31621:25::-;;;;;;;;;;;;;;;;13328:413;;;;;;;;;;-1:-1:-1;13328:413:0;;;;;:::i;:::-;;:::i;10522:175::-;;;;;;;;;;-1:-1:-1;10522:175:0;;;;;:::i;:::-;;:::i;32277:57::-;;;;;;;;;;-1:-1:-1;32277:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31434:33;;;;;;;;;;-1:-1:-1;31434:33:0;;;;;;;;;;;45489:288;;;;;;;;;;-1:-1:-1;45489:288:0;;;;;:::i;:::-;;:::i;37328:406::-;;;;;;;;;;-1:-1:-1;37328:406:0;;;;;:::i;:::-;;:::i;36286:257::-;;;;;;;;;;-1:-1:-1;36286:257:0;;;;;:::i;:::-;;:::i;31279:35::-;;;;;;;;;;;;;;;;35498:497;;;;;;;;;;-1:-1:-1;35498:497:0;;;;;:::i;:::-;;:::i;31765:26::-;;;;;;;;;;;;;;;;31514:27;;;;;;;;;;;;;;;;10760:151;;;;;;;;;;-1:-1:-1;10760:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;10876:18:0;;;10849:7;10876:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10760:151;31321:33;;;;;;;;;;;;;;;;31584:30;;;;;;;;;;;;;;;;2704:201;;;;;;;;;;-1:-1:-1;2704:201:0;;;;;:::i;:::-;;:::i;31727:31::-;;;;;;;;;;;;;;;;31361:24;;;;;;;;;;;;;;;;36551:170;;;;;;;;;;-1:-1:-1;36551:170:0;;;;;:::i;:::-;;:::i;31879:28::-;;;;;;;;;;;;;;;;8891:100;8945:13;8978:5;8971:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8891:100;:::o;11058:169::-;11141:4;11158:39;742:10;11181:7;11190:6;11158:8;:39::i;:::-;-1:-1:-1;11215:4:0;11058:169;;;;;:::o;36003:275::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;;;;;;;;;36140:4:::1;36132;36111:13;10099:12:::0;;;10011:108;36111:13:::1;:17;::::0;36127:1:::1;36111:17;:::i;:::-;36110:26;;;;:::i;:::-;36109:35;;;;:::i;:::-;36099:6;:45;;36077:142;;;::::0;-1:-1:-1;;;36077:142:0;;5872:2:1;36077:142:0::1;::::0;::::1;5854:21:1::0;5911:2;5891:18;;;5884:30;5950:34;5930:18;;;5923:62;-1:-1:-1;;;6001:18:1;;;5994:45;6056:19;;36077:142:0::1;5670:411:1::0;36077:142:0::1;36253:17;:6:::0;36263::::1;36253:17;:::i;:::-;36230:20;:40:::0;-1:-1:-1;36003:275:0:o;11709:492::-;11849:4;11866:36;11876:6;11884:9;11895:6;11866:9;:36::i;:::-;-1:-1:-1;;;;;11942:19:0;;11915:24;11942:19;;;:11;:19;;;;;;;;742:10;11942:33;;;;;;;;11994:26;;;;11986:79;;;;-1:-1:-1;;;11986:79:0;;6288:2:1;11986:79:0;;;6270:21:1;6327:2;6307:18;;;6300:30;6366:34;6346:18;;;6339:62;-1:-1:-1;;;6417:18:1;;;6410:38;6465:19;;11986:79:0;6086:404:1;11986:79:0;12101:57;12110:6;742:10;12151:6;12132:16;:25;12101:8;:57::i;:::-;-1:-1:-1;12189:4:0;;11709:492;-1:-1:-1;;;;11709:492:0:o;12610:215::-;742:10;12698:4;12747:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12747:34:0;;;;;;;;;;12698:4;;12715:80;;12738:7;;12747:47;;12784:10;;12747:47;:::i;:::-;12715:8;:80::i;45224:257::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;45303:46:::1;::::0;-1:-1:-1;;;45303:46:0;;45318:4:::1;45303:46;::::0;::::1;1822:51:1::0;;;45285:15:0::1;::::0;45303:31:::1;::::0;1795:18:1;;45303:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45360:51;::::0;-1:-1:-1;;;45360:51:0;;45391:10:::1;45360:51;::::0;::::1;6988::1::0;7055:18;;;7048:34;;;45285:64:0;;-1:-1:-1;45375:4:0::1;::::0;45360:30:::1;::::0;6961:18:1;;45360:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;45422:51:0::1;::::0;45430:10:::1;::::0;45451:21:::1;45422:51:::0;::::1;;;::::0;::::1;::::0;;;45451:21;45430:10;45422:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;45274:207;45224:257::o:0;2446:103::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;2511:30:::1;2538:1;2511:18;:30::i;:::-;2446:103::o:0;35307:121::-;1868:6;;35359:4;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;35376:14:0::1;:22:::0;;-1:-1:-1;;35376:22:0::1;::::0;;;35307:121;:::o;45785:196::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;45858:12:::1;45876:6;-1:-1:-1::0;;;;;45876:11:0::1;45909:21;45876:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45857:89;;;45965:7;45957:16;;;::::0;::::1;36925:395:::0;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;37075:14:::1;:29:::0;;;37115:15:::1;:31:::0;;;37157:10:::1;:21:::0;;;37170:8;37204:32:::1;37133:13:::0;37092:12;37204:32:::1;:::i;:::-;:45;;;;:::i;:::-;37189:12;:60:::0;;;37284:1:::1;-1:-1:-1::0;37268:17:0::1;37260:52;;;::::0;-1:-1:-1;;;37260:52:0;;7755:2:1;37260:52:0::1;::::0;::::1;7737:21:1::0;7794:2;7774:18;;;7767:30;-1:-1:-1;;;7813:18:1;;;7806:52;7875:18;;37260:52:0::1;7553:346:1::0;37260:52:0::1;36925:395:::0;;;:::o;35143:112::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;35198:13:::1;:20:::0;;-1:-1:-1;;35229:18:0;;;;;35143:112::o;36817:100::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;36888:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;36888:21:0;;::::1;::::0;;;::::1;::::0;;36817:100::o;37742:135::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37830:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;37830:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37742:135::o;9110:104::-;9166:13;9199:7;9192:14;;;;;:::i;37885:304::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;38029:13:::1;-1:-1:-1::0;;;;;38021:21:0::1;:4;-1:-1:-1::0;;;;;38021:21:0::1;::::0;37999:128:::1;;;::::0;-1:-1:-1;;;37999:128:0;;8106:2:1;37999:128:0::1;::::0;::::1;8088:21:1::0;8145:2;8125:18;;;8118:30;8184:34;8164:18;;;8157:62;8255:27;8235:18;;;8228:55;8300:19;;37999:128:0::1;7904:421:1::0;37999:128:0::1;38140:41;38169:4;38175:5;38140:28;:41::i;13328:413::-:0;742:10;13421:4;13465:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13465:34:0;;;;;;;;;;13518:35;;;;13510:85;;;;-1:-1:-1;;;13510:85:0;;8532:2:1;13510:85:0;;;8514:21:1;8571:2;8551:18;;;8544:30;8610:34;8590:18;;;8583:62;-1:-1:-1;;;8661:18:1;;;8654:35;8706:19;;13510:85:0;8330:401:1;13510:85:0;13631:67;742:10;13654:7;13682:15;13663:16;:34;13631:8;:67::i;:::-;-1:-1:-1;13729:4:0;;13328:413;-1:-1:-1;;;13328:413:0:o;10522:175::-;10608:4;10625:42;742:10;10649:9;10660:6;10625:9;:42::i;45489:288::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45584:20:0;::::1;45576:59;;;::::0;-1:-1:-1;;;45576:59:0;;8938:2:1;45576:59:0::1;::::0;::::1;8920:21:1::0;8977:2;8957:18;;;8950:30;9016:28;8996:18;;;8989:56;9062:18;;45576:59:0::1;8736:350:1::0;45576:59:0::1;45673:39;::::0;-1:-1:-1;;;45673:39:0;;45706:4:::1;45673:39;::::0;::::1;1822:51:1::0;45646:24:0::1;::::0;-1:-1:-1;;;;;45673:24:0;::::1;::::0;::::1;::::0;1795:18:1;;45673:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45723:46;::::0;-1:-1:-1;;;45723:46:0;;-1:-1:-1;;;;;7006:32:1;;;45723:46:0::1;::::0;::::1;6988:51:1::0;7055:18;;;7048:34;;;45646:66:0;;-1:-1:-1;45723:23:0;;::::1;::::0;::::1;::::0;6961:18:1;;45723:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45565:212;45489:288:::0;;:::o;37328:406::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;37479:15:::1;:30:::0;;;37520:16:::1;:32:::0;;;37563:11:::1;:22:::0;;;37577:8;37612:34:::1;37539:13:::0;37497:12;37612:34:::1;:::i;:::-;:48;;;;:::i;:::-;37596:13;:64:::0;;;37696:1:::1;-1:-1:-1::0;37679:18:0::1;37671:55;;;::::0;-1:-1:-1;;;37671:55:0;;9293:2:1;37671:55:0::1;::::0;::::1;9275:21:1::0;9332:2;9312:18;;;9305:30;9371:26;9351:18;;;9344:54;9415:18;;37671:55:0::1;9091:348:1::0;36286:257:0;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;36427:4:::1;36419;36397:13;10099:12:::0;;;10011:108;36397:13:::1;:18;::::0;36413:2:::1;36397:18;:::i;:::-;36396:27;;;;:::i;:::-;36395:36;;;;:::i;:::-;36385:6;:46;;36363:132;;;::::0;-1:-1:-1;;;36363:132:0;;9646:2:1;36363:132:0::1;::::0;::::1;9628:21:1::0;9685:2;9665:18;;;9658:30;9724:34;9704:18;;;9697:62;-1:-1:-1;;;9775:18:1;;;9768:34;9819:19;;36363:132:0::1;9444:400:1::0;36363:132:0::1;36518:17;:6:::0;36528::::1;36518:17;:::i;:::-;36506:9;:29:::0;-1:-1:-1;36286:257:0:o;35498:497::-;1868:6;;35606:4;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;35685:6:::1;35664:13;10099:12:::0;;;10011:108;35664:13:::1;:17;::::0;35680:1:::1;35664:17;:::i;:::-;35663:28;;;;:::i;:::-;35650:9;:41;;35628:144;;;::::0;-1:-1:-1;;;35628:144:0;;10051:2:1;35628:144:0::1;::::0;::::1;10033:21:1::0;10090:2;10070:18;;;10063:30;10129:34;10109:18;;;10102:62;-1:-1:-1;;;10180:18:1;;;10173:51;10241:19;;35628:144:0::1;9849:417:1::0;35628:144:0::1;35840:4;35819:13;10099:12:::0;;;10011:108;35819:13:::1;:17;::::0;35835:1:::1;35819:17;:::i;:::-;35818:26;;;;:::i;:::-;35805:9;:39;;35783:141;;;::::0;-1:-1:-1;;;35783:141:0;;10473:2:1;35783:141:0::1;::::0;::::1;10455:21:1::0;10512:2;10492:18;;;10485:30;10551:34;10531:18;;;10524:62;-1:-1:-1;;;10602:18:1;;;10595:50;10662:19;;35783:141:0::1;10271:416:1::0;35783:141:0::1;-1:-1:-1::0;35935:18:0::1;:30:::0;35983:4:::1;::::0;35498:497::o;2704:201::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2793:22:0;::::1;2785:73;;;::::0;-1:-1:-1;;;2785:73:0;;10894:2:1;2785:73:0::1;::::0;::::1;10876:21:1::0;10933:2;10913:18;;;10906:30;10972:34;10952:18;;;10945:62;-1:-1:-1;;;11023:18:1;;;11016:36;11069:19;;2785:73:0::1;10692:402:1::0;2785:73:0::1;2869:28;2888:8;2869:18;:28::i;:::-;2704:201:::0;:::o;36551:170::-;1868:6;;-1:-1:-1;;;;;1868:6:0;742:10;2015:23;2007:68;;;;-1:-1:-1;;;2007:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36667:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;36667:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36551:170::o;17012:380::-;-1:-1:-1;;;;;17148:19:0;;17140:68;;;;-1:-1:-1;;;17140:68:0;;11301:2:1;17140:68:0;;;11283:21:1;11340:2;11320:18;;;11313:30;11379:34;11359:18;;;11352:62;-1:-1:-1;;;11430:18:1;;;11423:34;11474:19;;17140:68:0;11099:400:1;17140:68:0;-1:-1:-1;;;;;17227:21:0;;17219:68;;;;-1:-1:-1;;;17219:68:0;;11706:2:1;17219:68:0;;;11688:21:1;11745:2;11725:18;;;11718:30;11784:34;11764:18;;;11757:62;-1:-1:-1;;;11835:18:1;;;11828:32;11877:19;;17219:68:0;11504:398:1;17219:68:0;-1:-1:-1;;;;;17300:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17352:32;;1613:25:1;;;17352:32:0;;1586:18:1;17352:32:0;;;;;;;17012:380;;;:::o;38393:3924::-;-1:-1:-1;;;;;38525:18:0;;38517:68;;;;-1:-1:-1;;;38517:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38604:16:0;;38596:64;;;;-1:-1:-1;;;38596:64:0;;;;;;;:::i;:::-;38677:6;38687:1;38677:11;38673:93;;38705:28;38721:4;38727:2;38731:1;38705:15;:28::i;38673:93::-;38782:14;;;;38778:1694;;;1868:6;;-1:-1:-1;;;;;38835:15:0;;;1868:6;;38835:15;;;;:49;;-1:-1:-1;1868:6:0;;-1:-1:-1;;;;;38871:13:0;;;1868:6;;38871:13;;38835:49;:86;;;;-1:-1:-1;;;;;;38905:16:0;;;;38835:86;:128;;;;-1:-1:-1;;;;;;38942:21:0;;38956:6;38942:21;;38835:128;:158;;;;-1:-1:-1;38985:8:0;;-1:-1:-1;;;38985:8:0;;;;38984:9;38835:158;38813:1648;;;39033:13;;;;;;;39028:223;;-1:-1:-1;;;;;39105:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;39134:23:0;;;;;;:19;:23;;;;;;;;39105:52;39071:160;;;;-1:-1:-1;;;39071:160:0;;12919:2:1;39071:160:0;;;12901:21:1;12958:2;12938:18;;;12931:30;-1:-1:-1;;;12977:18:1;;;12970:52;13039:18;;39071:160:0;12717:346:1;39071:160:0;-1:-1:-1;;;;;39325:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;39382:35:0;;;;;;:31;:35;;;;;;;;39381:36;39325:92;39299:1147;;;39504:20;;39494:6;:30;;39460:169;;;;-1:-1:-1;;;39460:169:0;;13270:2:1;39460:169:0;;;13252:21:1;13309:2;13289:18;;;13282:30;13348:34;13328:18;;;13321:62;-1:-1:-1;;;13399:18:1;;;13392:51;13460:19;;39460:169:0;13068:417:1;39460:169:0;39712:9;;-1:-1:-1;;;;;10283:18:0;;10256:7;10283:18;;;;;;;;;;;39686:22;;:6;:22;:::i;:::-;:35;;39652:140;;;;-1:-1:-1;;;39652:140:0;;13692:2:1;39652:140:0;;;13674:21:1;13731:2;13711:18;;;13704:30;-1:-1:-1;;;13750:18:1;;;13743:49;13809:18;;39652:140:0;13490:343:1;39652:140:0;39299:1147;;;-1:-1:-1;;;;;39890:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;39945:37:0;;;;;;:31;:37;;;;;;;;39944:38;39890:92;39864:582;;;40069:20;;40059:6;:30;;40025:170;;;;-1:-1:-1;;;40025:170:0;;14040:2:1;40025:170:0;;;14022:21:1;14079:2;14059:18;;;14052:30;14118:34;14098:18;;;14091:62;-1:-1:-1;;;14169:18:1;;;14162:52;14231:19;;40025:170:0;13838:418:1;39864:582:0;-1:-1:-1;;;;;40226:35:0;;;;;;:31;:35;;;;;;;;40221:225;;40346:9;;-1:-1:-1;;;;;10283:18:0;;10256:7;10283:18;;;;;;;;;;;40320:22;;:6;:22;:::i;:::-;:35;;40286:140;;;;-1:-1:-1;;;40286:140:0;;13692:2:1;40286:140:0;;;13674:21:1;13731:2;13711:18;;;13704:30;-1:-1:-1;;;13750:18:1;;;13743:49;13809:18;;40286:140:0;13490:343:1;40286:140:0;40533:4;40484:28;10283:18;;;;;;;;;;;40591;;40567:42;;;;;;;40640:35;;-1:-1:-1;40664:11:0;;;;;;;40640:35;:61;;;;-1:-1:-1;40693:8:0;;-1:-1:-1;;;40693:8:0;;;;40692:9;40640:61;:110;;;;-1:-1:-1;;;;;;40719:31:0;;;;;;:25;:31;;;;;;;;40718:32;40640:110;:153;;;;-1:-1:-1;;;;;;40768:25:0;;;;;;:19;:25;;;;;;;;40767:26;40640:153;:194;;;;-1:-1:-1;;;;;;40811:23:0;;;;;;:19;:23;;;;;;;;40810:24;40640:194;40622:326;;;40861:8;:15;;-1:-1:-1;;;;40861:15:0;-1:-1:-1;;;40861:15:0;;;40893:10;:8;:10::i;:::-;40920:8;:16;;-1:-1:-1;;;;40920:16:0;;;40622:326;40976:8;;-1:-1:-1;;;;;41086:25:0;;40960:12;41086:25;;;:19;:25;;;;;;40976:8;-1:-1:-1;;;40976:8:0;;;;;40975:9;;41086:25;;:52;;-1:-1:-1;;;;;;41115:23:0;;;;;;:19;:23;;;;;;;;41086:52;41082:100;;;-1:-1:-1;41165:5:0;41082:100;41194:12;41299:7;41295:969;;;-1:-1:-1;;;;;41351:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;41400:1;41384:13;;:17;41351:50;41347:768;;;41429:34;41459:3;41429:25;41440:13;;41429:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;41422:41;;41532:13;;41512:16;;41505:4;:23;;;;:::i;:::-;41504:41;;;;:::i;:::-;41482:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;41604:13:0;;41589:11;;41582:18;;:4;:18;:::i;:::-;41581:36;;;;:::i;:::-;41564:13;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;41684:13:0;;41665:15;;41658:22;;:4;:22;:::i;:::-;41657:40;;;;:::i;:::-;41636:17;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;41347:768:0;;-1:-1:-1;41347:768:0;;-1:-1:-1;;;;;41759:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;41809:1;41794:12;;:16;41759:51;41755:360;;;41838:33;41867:3;41838:24;41849:12;;41838:6;:10;;:24;;;;:::i;:33::-;41831:40;;41939:12;;41920:15;;41913:4;:22;;;;:::i;:::-;41912:39;;;;:::i;:::-;41890:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;42009:12:0;;41995:10;;41988:17;;:4;:17;:::i;:::-;41987:34;;;;:::i;:::-;41970:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;42087:12:0;;42069:14;;42062:21;;:4;:21;:::i;:::-;42061:38;;;;:::i;:::-;42040:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;41755:360:0;42135:8;;42131:91;;42164:42;42180:4;42194;42201;42164:15;:42::i;:::-;42238:14;42248:4;42238:14;;:::i;:::-;;;41295:969;42276:33;42292:4;42298:2;42302:6;42276:15;:33::i;:::-;38506:3811;;;;38393:3924;;;:::o;3065:191::-;3158:6;;;-1:-1:-1;;;;;3175:17:0;;;-1:-1:-1;;;;;;3175:17:0;;;;;;;3208:40;;3158:6;;;3175:17;3158:6;;3208:40;;3139:16;;3208:40;3128:128;3065:191;:::o;38197:188::-;-1:-1:-1;;;;;38280:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;38280:39:0;;;;;;;;;;38337:40;;38280:39;;:31;38337:40;;;38197:188;;:::o;14231:733::-;-1:-1:-1;;;;;14371:20:0;;14363:70;;;;-1:-1:-1;;;14363:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14452:23:0;;14444:71;;;;-1:-1:-1;;;14444:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14612:17:0;;14588:21;14612:17;;;;;;;;;;;14648:23;;;;14640:74;;;;-1:-1:-1;;;14640:74:0;;14596:2:1;14640:74:0;;;14578:21:1;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;-1:-1:-1;;;14725:18:1;;;14718:36;14771:19;;14640:74:0;14394:402:1;14640:74:0;-1:-1:-1;;;;;14750:17:0;;;:9;:17;;;;;;;;;;;14770:22;;;14750:42;;14814:20;;;;;;;;:30;;14786:6;;14750:9;14814:30;;14786:6;;14814:30;:::i;:::-;;;;;;;;14879:9;-1:-1:-1;;;;;14862:35:0;14871:6;-1:-1:-1;;;;;14862:35:0;;14890:6;14862:35;;;;1613:25:1;;1601:2;1586:18;;1467:177;14862:35:0;;;;;;;;14910:46;36925:395;43443:1773;43526:4;43482:23;10283:18;;;;;;;;;;;43482:50;;43543:25;43638:13;;43605:17;;43571:18;;:51;;;;:::i;:::-;:80;;;;:::i;:::-;43543:108;-1:-1:-1;43662:12:0;43691:20;;;:46;;-1:-1:-1;43715:22:0;;43691:46;43687:85;;;43754:7;;;43443:1773::o;43687:85::-;43806:18;;:23;;43827:2;43806:23;:::i;:::-;43788:15;:41;43784:115;;;43864:18;;:23;;43885:2;43864:23;:::i;:::-;43846:41;;43784:115;43960:23;44073:1;44040:17;44005:18;;43987:15;:36;;;;:::i;:::-;43986:71;;;;:::i;:::-;:88;;;;:::i;:::-;43960:114;-1:-1:-1;44085:26:0;44114:36;:15;43960:114;44114:19;:36::i;:::-;44085:65;-1:-1:-1;44191:21:0;44225:36;44085:65;44225:16;:36::i;:::-;44274:18;44295:44;:21;44321:17;44295:25;:44::i;:::-;44274:65;;44352:22;44377:83;44457:1;44436:18;;:22;;;;:::i;:::-;44415:44;;:17;:44;:::i;:::-;44392:17;;44377:33;;:10;;:14;:33::i;:83::-;44352:108;;44481:18;44502:79;44578:1;44557:18;;:22;;;;:::i;:::-;44536:44;;:17;:44;:::i;:::-;44517:13;;44502:29;;:10;;:14;:29::i;:79::-;44481:100;-1:-1:-1;44594:23:0;44481:100;44620:27;44633:14;44620:10;:27;:::i;:::-;:40;;;;:::i;:::-;44694:1;44673:18;:22;;;44706:17;:21;;;44738:13;:17;;;44790:10;;44782:47;;44594:66;;-1:-1:-1;;;;;;44790:10:0;;44814;;44782:47;44694:1;44782:47;44814:10;44790;44782:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44768:61:0;;-1:-1:-1;;44846:19:0;;;;;:42;;;44887:1;44869:15;:19;44846:42;44842:278;;;44905:46;44918:15;44935;44905:12;:46::i;:::-;45075:18;;44971:137;;;15003:25:1;;;15059:2;15044:18;;15037:34;;;15087:18;;;15080:34;;;;44971:137:0;;;;;;14991:2:1;44971:137:0;;;44842:278;45154:14;;45146:62;;-1:-1:-1;;;;;45154:14:0;;;;45182:21;;45146:62;;;;45182:21;45154:14;45146:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;43443:1773:0:o;22144:98::-;22202:7;22229:5;22233:1;22229;:5;:::i;:::-;22222:12;22144:98;-1:-1:-1;;;22144:98:0:o;22543:::-;22601:7;22628:5;22632:1;22628;:5;:::i;21787:98::-;21845:7;21872:5;21876:1;21872;:5;:::i;42325:589::-;42475:16;;;42489:1;42475:16;;;;;;;;42451:21;;42475:16;;;;;;;;;;-1:-1:-1;42475:16:0;42451:40;;42520:4;42502;42507:1;42502:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;42502:23:0;;;-1:-1:-1;;;;;42502:23:0;;;;;42546:15;-1:-1:-1;;;;;42546:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42536:4;42541:1;42536:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;42536:32:0;;;-1:-1:-1;;;;;42536:32:0;;;;;42581:62;42598:4;42613:15;42631:11;42581:8;:62::i;:::-;42682:224;;-1:-1:-1;;;42682:224:0;;-1:-1:-1;;;;;42682:15:0;:66;;;;:224;;42763:11;;42789:1;;42833:4;;42860;;42880:15;;42682:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42380:534;42325:589;:::o;42922:513::-;43070:62;43087:4;43102:15;43120:11;43070:8;:62::i;:::-;43175:15;-1:-1:-1;;;;;43175:31:0;;43214:9;43247:4;43267:11;43293:1;43336;43379:7;1868:6;;-1:-1:-1;;;;;1868:6:0;;1795:87;43379:7;43175:252;;;;;;-1:-1:-1;;;;;;43175:252:0;;;-1:-1:-1;;;;;16989:15:1;;;43175:252:0;;;16971:34:1;17021:18;;;17014:34;;;;17064:18;;;17057:34;;;;17107:18;;;17100:34;17171:15;;;17150:19;;;17143:44;43401:15:0;17203:19:1;;;17196:35;16905:19;;43175:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42922:513;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:180::-;1943:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:52;;;2012:1;2009;2002:12;1964:52;-1:-1:-1;2035:23:1;;1884:180;-1:-1:-1;1884:180:1:o;2069:456::-;2146:6;2154;2162;2215:2;2203:9;2194:7;2190:23;2186:32;2183:52;;;2231:1;2228;2221:12;2183:52;2270:9;2257:23;2289:31;2314:5;2289:31;:::i;:::-;2339:5;-1:-1:-1;2396:2:1;2381:18;;2368:32;2409:33;2368:32;2409:33;:::i;:::-;2069:456;;2461:7;;-1:-1:-1;;;2515:2:1;2500:18;;;;2487:32;;2069:456::o;2927:316::-;3004:6;3012;3020;3073:2;3061:9;3052:7;3048:23;3044:32;3041:52;;;3089:1;3086;3079:12;3041:52;-1:-1:-1;;3112:23:1;;;3182:2;3167:18;;3154:32;;-1:-1:-1;3233:2:1;3218:18;;;3205:32;;2927:316;-1:-1:-1;2927:316:1:o;3248:118::-;3334:5;3327:13;3320:21;3313:5;3310:32;3300:60;;3356:1;3353;3346:12;3371:241;3427:6;3480:2;3468:9;3459:7;3455:23;3451:32;3448:52;;;3496:1;3493;3486:12;3448:52;3535:9;3522:23;3554:28;3576:5;3554:28;:::i;3617:382::-;3682:6;3690;3743:2;3731:9;3722:7;3718:23;3714:32;3711:52;;;3759:1;3756;3749:12;3711:52;3798:9;3785:23;3817:31;3842:5;3817:31;:::i;:::-;3867:5;-1:-1:-1;3924:2:1;3909:18;;3896:32;3937:30;3896:32;3937:30;:::i;:::-;3986:7;3976:17;;;3617:382;;;;;:::o;4004:388::-;4072:6;4080;4133:2;4121:9;4112:7;4108:23;4104:32;4101:52;;;4149:1;4146;4139:12;4101:52;4188:9;4175:23;4207:31;4232:5;4207:31;:::i;:::-;4257:5;-1:-1:-1;4314:2:1;4299:18;;4286:32;4327:33;4286:32;4327:33;:::i;4397:380::-;4476:1;4472:12;;;;4519;;;4540:61;;4594:4;4586:6;4582:17;4572:27;;4540:61;4647:2;4639:6;4636:14;4616:18;4613:38;4610:161;;4693:10;4688:3;4684:20;4681:1;4674:31;4728:4;4725:1;4718:15;4756:4;4753:1;4746:15;4610:161;;4397:380;;;:::o;4782:356::-;4984:2;4966:21;;;5003:18;;;4996:30;5062:34;5057:2;5042:18;;5035:62;5129:2;5114:18;;4782:356::o;5143:127::-;5204:10;5199:3;5195:20;5192:1;5185:31;5235:4;5232:1;5225:15;5259:4;5256:1;5249:15;5275:168;5348:9;;;5379;;5396:15;;;5390:22;;5376:37;5366:71;;5417:18;;:::i;5448:217::-;5488:1;5514;5504:132;;5558:10;5553:3;5549:20;5546:1;5539:31;5593:4;5590:1;5583:15;5621:4;5618:1;5611:15;5504:132;-1:-1:-1;5650:9:1;;5448:217::o;6495:125::-;6560:9;;;6581:10;;;6578:36;;;6594:18;;:::i;6625:184::-;6695:6;6748:2;6736:9;6727:7;6723:23;6719:32;6716:52;;;6764:1;6761;6754:12;6716:52;-1:-1:-1;6787:16:1;;6625:184;-1:-1:-1;6625:184:1:o;7093:245::-;7160:6;7213:2;7201:9;7192:7;7188:23;7184:32;7181:52;;;7229:1;7226;7219:12;7181:52;7261:9;7255:16;7280:28;7302:5;7280:28;:::i;11907:401::-;12109:2;12091:21;;;12148:2;12128:18;;;12121:30;12187:34;12182:2;12167:18;;12160:62;-1:-1:-1;;;12253:2:1;12238:18;;12231:35;12298:3;12283:19;;11907:401::o;12313:399::-;12515:2;12497:21;;;12554:2;12534:18;;;12527:30;12593:34;12588:2;12573:18;;12566:62;-1:-1:-1;;;12659:2:1;12644:18;;12637:33;12702:3;12687:19;;12313:399::o;14261:128::-;14328:9;;;14349:11;;;14346:37;;;14363:18;;:::i;15257:127::-;15318:10;15313:3;15309:20;15306:1;15299:31;15349:4;15346:1;15339:15;15373:4;15370:1;15363:15;15389:251;15459:6;15512:2;15500:9;15491:7;15487:23;15483:32;15480:52;;;15528:1;15525;15518:12;15480:52;15560:9;15554:16;15579:31;15604:5;15579:31;:::i;15645:980::-;15907:4;15955:3;15944:9;15940:19;15986:6;15975:9;15968:25;16012:2;16050:6;16045:2;16034:9;16030:18;16023:34;16093:3;16088:2;16077:9;16073:18;16066:31;16117:6;16152;16146:13;16183:6;16175;16168:22;16221:3;16210:9;16206:19;16199:26;;16260:2;16252:6;16248:15;16234:29;;16281:1;16291:195;16305:6;16302:1;16299:13;16291:195;;;16370:13;;-1:-1:-1;;;;;16366:39:1;16354:52;;16461:15;;;;16426:12;;;;16402:1;16320:9;16291:195;;;-1:-1:-1;;;;;;;16542:32:1;;;;16537:2;16522:18;;16515:60;-1:-1:-1;;;16606:3:1;16591:19;16584:35;16503:3;15645:980;-1:-1:-1;;;15645:980:1:o;17242:306::-;17330:6;17338;17346;17399:2;17387:9;17378:7;17374:23;17370:32;17367:52;;;17415:1;17412;17405:12;17367:52;17444:9;17438:16;17428:26;;17494:2;17483:9;17479:18;17473:25;17463:35;;17538:2;17527:9;17523:18;17517:25;17507:35;;17242:306;;;;;:::o
Swarm Source
ipfs://3c18cb49b64496749660fc4612c0457e9a9ba947e2270532fbc8c4646e3ef0cf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BASE | 100.00% | $2,530.62 | 0.49 | $1,240.01 |
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.