Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Social Media
Overview
Max Total Supply
10,000,000 XTRACK
Holders
420 (0.00%)
Market
Price
$0.00 @ 0.000001 ETH
Onchain Market Cap
$30,782.90
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | ![]() | 0XEE372D2B7E7C83DE7E345267B5E4EFC1899A4FAB-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2 | $0.003 0.0000012 Eth | $9.94 3,304.118 0XEE372D2B7E7C83DE7E345267B5E4EFC1899A4FAB | 100.0000% |
Contract Source Code Verified (Exact Match)
Contract Name:
XTrack
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-08 */ /* https://twitter.com/XtrackERC https://t.me/XtrackERC https://linktr.ee/xtracktech Website: https://xtrackerc.com/ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@%%%%%%####*#*##=++***+*+*+=+====================--------------------------------------------------------=:=------ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@%@#*@%%%#*# **%%##%=#%%%%#%%#########***********+****++=+++++=+====================================- @@@@@@@@+=+*%=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@=%%%%%@#@@@%%%#%%=*%#######%###%@@@##+*********++*+*++++*=++++++++==+=====+=======================- @@*#*%#@@@@@@%%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++%@%%%@@%%%%%@#-%%%%##%####%#%--@*#*##+********++***+++++++++++++++=============================- @*%@###%%%%%#%%#%+=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@+*@%%%%%%%%%#-%@%%%%%##%%#%#%@*%#######**********+****++****+++++++++++++======================- @=@#%%@@@@@@@@%%%@%*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@#=%@###+=++#%@%%%%%%%%#%##############+***********+*++++++++++++++============================- @=@@%%@@@@@@@@@@%@#@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%@@@@@@@@#=#%%@@@@@@%%%@%%%%%%#%%#%%%%%#####*###+*****+++==+*****+*++*=++++=+==+==+==================- @%@#@@@@@ @@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@%@@@%%%%%%%%%%%%#%%%%%%#######%###########***######****++++++++*+++++**+++++++==+============- -@@%@@@@@@@@@@@@%%@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%%@%%%%@%%%%%%%%@%%%%%%%###########%#####***********+*****++++++=++++==+===+================- =@@@%#%%@@@@@@@%#%#@@@@@@@@@@@@@@@@--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%%%%%%##%%%%%%%%%##%###%######**+*+****++*++++*+*+++++++++=*==+====================- @#=@@%@%%%%%%*#%@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@%@%%@@@@@@@@%%%@%%%%%%%@%%%%%%%%%%%%#%#############*********+*++*++++++++*++**+++==============+++=- @@@@=#%@%%@@@@%++-*@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@*#%@@@@@@@@@@@@@@@@@%%@@%%%%%%@%%%%%%%%%%%%%%%#%########*+*****+***+++***++++++++++++++++=+++========+::=- @@@@@@-##*+===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%%@@@@@@%@@@@@@%%%%#%%%%%%%%%#####*#%#########*****##*****++*****++++++++++++++==========**#+- @@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@+.@@%@@%%%%#%%%%%%%####%%%##########*#*****#***+*+*++++++++++++++=+++=============- =@@@@@@@@@@@@@@@@@@@#-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@#%@%@%%##%%%%%%%%%@@@@@#%%#####*#+******++***+++**+++++++++++##%###+=+=========- @#-+@@@@@@@@@@@+=-+%@@@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@%@@%%%%%%%%%%%%%= =@####%####*##+*******+****++***++##@@#+=====%**==+=======- %@@@-@@@@@@--*@@@@@@@%@@@-=@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@%%%%@%%@#%%%%%%%@@@%%####%########***@@@#*****++****%=======*+*==%*++=+=====- %@@@-@@@@@@=@@@@@@@@%@@@@@@=-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@%@%@@@@%%@%%%%%%%@@@@@@%%%%%%%%%%%%%%###%##%#########*@:=#***+**++++#==++=======+==@%*++++===- %@@=%@@@@@+=@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@%@@@@@@@%%%%@@@@@%%##%%@%%%%%%%%%%%%@%%##%%%%%%%#%#############%@@#***#***+*%#=+*++*##*+=++*==#+=++*++- %@@-@@@@@@-@@@@@@@# *#@@@@@@-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@%%%%%%#@@@@@@@@@%%%#%###%############*********#@=#*++=# =#+===#==#+++==++- %@@-@@@@@@-@@@@@@%= =%@@@@@@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@%@%@@@@@@%@ @%%%%%@@@@%%@@@ @@%#########%#%########+*******%==#++*+@ **+=++=**=++++++- @@%-@@@@@*@@@@@@@@@@@@@@@@@%-@@@@@@@@@@@@@@%+%@@@@@@@@@%@ @@@ @@%@@@@@@@@@@@ @@%@@@%%@@%%@ @@@ @#%%%%###%%###############****%==++=++##%#+==+=+#*++++++=- -=%@@@@@@@-#@@@@@@@@@@@@%@@=@@@@@@@@@@@@@@@@%@@@@@@@@@@@@ @@@@@ =@@@@@@@@@@@%@@ =@@@%%%%@%%%%#@ @@@@@ @@%%%%%%####%##%%%#######*#+**%@@==#+=+++===%==%**+**=+++- @@@@@@@@@@@@-=@@@%@%@@@@@@--@@@@@@@@%@@@@@@@@@@@@@@@@@%%@% @@ @=+@@@@@@@%@@%@ @@@@@@@%%%%@#@@@ @@ @%%%%#%%%%%##%####%##@@@@@@@@@%##@==+*#===++==@*+++++++*+- @@@@@@@@@@@@@@=-@@@@*=--=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@ @@@@@@@%@@@@%@ @@@@@%@@@@%@@@ @@@%%%%%%%%%%%###%##@@@%-----=-=@%##@@=====++%%@%**++++++++- @@@@@@@@@@@@@@@@*--=@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%%@@%@@@@@@@@ @@@@@@@%@@@@ %@@%@%@-+@@@ @@@@@@@@@%%@@@@%%%%%%####%@--=*##%#*#*=*@%*%@@@%%***%@@@@%*++++++- @@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@ @@@@@@@@%@ %@@%@@@@@@+ @@@@@@%%%%%@@@=@@@%%%%%%%#%@-=##*#%%##*#+#=+%**+#@@@@@+=====%#*++++- @@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@%%@@@ @@@%@@%@ @@@%@@@@@ @@@@@%%%%%@%%@ @@%%%%%%%%@=##+#+**==+#+*@=%*#+@=:=%@%%=-+@=@%*+*+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@ @%%@@@@@%@@@%@@@ @@@@@%@ @@@@@%@ @@@@@%@@@@@@%%@@ @@%%%%@%#@==#*#*= ==-*+#%=%+#@@=@---------@==@%*+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@ @%@@%@@@@@@@@@@@@ @@@@@%@ @@@%@%@ @@@@@@@@@@@@%@@%@ @@%%%##%%@-@*#*==**+==#+#=@@+%@=@=-=@@@@@=--=#=%#*- @@@#=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%@@@= @@%@@@@@@@@@@@@@#@ @@@@@%@ %@@@%%@ @@%@@@@@%%%%%%@%@@@ @@@%%%##%%@-+@###*++***+%==%##%==*-=@+ #=@=--@=#++- @@@#=@@@@@@@@@@@@@@@@%@@@@@@*+@@@@@@@%@@@@@%@@@@@%@ @@@@%@@%@@@@@@@%%@ @@@@@%@ %@%@@%@ @@%@@@@@%@%%%%%%%@@ @@%%%%%%%@@@@-=%%*##%@@%%-@@##%=%--=@*#=#=@--%=%#**- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@%@ @%%@@@@@@@@@%@@%#@ @@#%%@@ @@@###@ @@%@@@@@@@@%%%%%%@@ @%%%%%%%%%%%%@*=*%++----%@@###@-%#--=@@@@@=-=+=@*#+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@%@ @%@%@@@ +@@@@@@@@@ @@@@@@@ =@@@@@@ @@@%%@@* @@%%%%%%@@ @%%%%%%%%%%%%%@@--#@@@@@@%%%%%@@*=@=-------=@=%#**+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@%%@@%@ @%@%%@ @@@@@@@@@ @@@@@@ @%%%%%%@@ @%%%%%%%%%%%%%%@@@@%%%%%#######%@@-=%=*%@@===@%*+*+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@%@ @%%%@@@ @@ =@@@@%%%@@ @@%%%%%%%%%%%%@%@@@%%%%%%%#%%###%%@#---*#%@@%*###**- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@ @@@@@@@@@@%@ @@@@@@ +@= @@@@@@@@ @@ @@@@@@@ @%@@@@@%%%%%@@@@@%#%%%%%%%%%%####%#@@@@@%%##*#####+- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%@%@ @@%@@@@@@@%@ @@ =@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@ @%%@%-@%%%@@@ @%%%%%%%%%%%%%##%#%%#########%#*#*#= @@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%@ @@@@@@@@%@@@= @@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@= @@@%@@@%%%%%@= @%#@%%%%%#%%%%%##%###%#############= %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@%%%%@+ @%#%#%##%*#%%%%%###%%%#%###%@@#####= %@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@%%@@@@@@@@ =@@@@@@@@@@@ @@@@@@@@ @@@@@@@@# @@@@@@@@@@@ @@@@@@@= @##%%%@##%%%%%%%%%#%##%###%%-+%####= %@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@@@@@@ @@ @@@@@@@@@%%%%%%%%%%%##%####@=@#####= #@@@@@%@%@@@@@ +@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@@@@@@@ @@%%@#%%%%%%%%##%%%########= #%%%%@%@%%%@@@@@@@@@@@@@@@@= @@@@@@@@@@@@@@ @@@@@@ @@@@@@@ @@@@@@@@@@@@@ @%%%%%%%%#%%%%%%##%#%%#####= #@@@@@@@@@%%%@@@@@%%@@@@@@@ @@@@@@@@@@@@@ @@@@@@% @@@@@@@ @@@@@@@@@@@@@@ @%%%%%%%%%%%%%%%%%%#%%%#%%#= #@@@@@@@@@@@@@@%@@%@@@%@@@@@@@@@@@@@ @ @@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@%%%%%%%%%%%%%%%%%%##%#####= #@%@@%%%%@@@@%%@@@@@@@%@%%@@@@@@@%@@ @@@@@@@ @@@@@@@@@@@@ @@@@@@@@ +@@@@@@@@ @@@@@@@@@@@ +@@@@@@@@@@@@%%%%%%%%%%%%%%%%%%#%%%%%%%###%%%+ =@@@%@%@@%%@@@%@%@@%@@@@@@@@%%%%@%@% @%@%@@@@@@@ =@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@%#@ @@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##+ =*--@@@@@%%%%%%%@%@@@@@@@-@@@@@@@@@# @%@@@@@@%@@@@= =@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @@@@%%%%%@#@ @@%%%%%%%%%%%%%%%%%@%%%%@%%%%%%%%%+ =#%%+--#@@@@@%%@@@@@@---+##--@@@@%@= @#@@@@@@%%%%@ @@ #@@@@* @@@@@@@@@@@@@@@@ @@@@@ =@@ @@%@@%%%%%#@ @@%%%%%%%%%%%%%%%%%%%%%%%#%%%%%@@@% =****%+%-#@#%%@@@---=%*+==#%%%--@@@@@@@%@@@%%%@@%#@ @@@@@@ @@ @@@@@@@@@@ @@@ =@@@@@@ @%%%%%%%@%%@@@@@@@@@%%%%%%%%%%%%%%%%%%%%%%@#%%%%%--* *@%%###%=*@#@%@%-@@%%##%%%##*@@@=%@@@@@@@@@@@@@@@%@ @%%#@@@ @ =@@@@@@%@@ @@@@%%%%@@@@@%%%%%%%%@@%%%%%@@@@@@@@@@@%%%@#@%%%@@@# =@%%%#*%-*@@%@@+-#####@%@%%%###%--@@@@@@@@@@@@@@%@@ @%@%@@% @@@@@@@ @@@@@ @%@@@@@%@ @@@@%%%%%%%%%%@%@@@@@%%@%%@%%%%%%%%@%%%%%%%#%%#%%%@* %%%%##@-#@%%%@+*%##%#%- %%%%##%+%@@@@@@@@@@@@@@@@@ @%@%@@# @@@@%%@@@ @@@@@=# =+#@@@@ @@@@%#@ @%%%%%@@@ @@%%%@@@@@@@@@@@@#+=#@@@@%%@@%%%%@%%%%%%%%%%%%%#%%%+ +@%%#%#%-@@%%%@-####%%%%%@%%%%#%-@@@@@@@@@@@@@@@@%@ @%@@%@# @@@@@%@%@ @@@@@@@ @@@@@%@ @@@@@%@ @%%%%@%@@ @@%%%%@@@@@@%#+=##%%%*+@@@@@%%@%%%%%%%%%%%%%%%%%%%%* =%##*###-@@%%@@-@###%%@@@@@%###%-@@@@@@@@@@@@@@@@@@ @@@@@@ @@%@@@%%@ @@@@@%@ #@@@@%@ @@%%@%@ @%@%%%%@@ @@@@%@@@@@%+*@@@@%%%%%%*=%@@%%%%@@@%%%%%%%%%%%%%%@@# =###=---@@%%%%@-=%%###%######%*-*@@@@@@@@@@@@@@@@@@= @@%@@@@@@@@@@@@@@@ @@@@@%@ #@@@@@@ @@%@@@@@@@@@@@@@@@@ @@@@@@@@@@@%@%%%@@@@@%@%%%#@@@@@@@@%@@@%%%%%%%%%@@%= ==--%@@@@@%%%%@@@--*%%###%#*--#@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@ #@@@@%@ @@@@@@@@@@@%@@@@@ @@@@%@@@@*#@%%@@+*%@%%%%#%@%%%%%%%%@@%%@%%%%%%@@-== =%@@@@%@@@@@@@%%@@@@--**=-=@@@@@@@@@@@@@@@@@@@@@%@ @@%@@@@@@@@@@@@@# @@@@@@@ %@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@*@%@@@#--#%%@%#%%%@@@@@@@%%%@%%@@%%%%@=-@- +@%%%@@@+-+--#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @%@@@@@@@@@@@@@ @@@@@@@@ %@@@@@@@* @@@@@@@%@@@@@@ +@@@@@@@%#@%@%@@@@@@@@%#%@@@@@@@@@@%%%%%@%@@@@@-*@- +@@@*=-+%@@@@@+-*@@@@%%@@@@@@@@@%@%%@@@@@@@@@@@@@@@@@@@@%%%%@@@@@@@@ @@@@@@@@@@ %@@@@@@@@@ =@@@@@@@@@@@@@@@@@@@@@@@@@@*=%@@%@%%%%%%%*%@@@@@@@@@@@@@@%%%%@%@@-%@- **-+%%%%%%%%%%@@#+=#@@@@@@@@@@@@@%%%@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ #@@@@@@@@@@@ #@@@@@@@@@@@@@@@@@@@@@@@@@@@##%%%####*#@@@@@%%@@@@@@@@@@@%%%%@-@#@- #-#%%%##%####%%%@@**@@@@@%@@@@@@@@@@@%@@@@@@%@@@@@@@@@#%%@@= =@@@@@@@@@@@@@ #@@@@@@@@@@@@@ @@@@@@@@@@@%+==-+@@@@@%%#%%@@@@@@@@@@@@%%%@@@@%%@@%@@@@@--@+ #-%%###%%%%#*#%%%@*%@%@@%%@@@@@@@@@@@@@@@@@@@@@@%@@%%%@@@@ = @@@@@@@@@@@@@@@ *@@@@@@@@@@@%@@@ : @@@@@*===***##+-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@-- *-%%##%*% ####%@%=%@%%%%%@%%@@%@@@@@@@@@@@@@@@@@@@%%@@ @ @@@@@ =@@@@@@@%@@@@@@ @@@@@@@@@@@@@@@ #@@@@ @@@@+######%%####==@@@@@@@@@@@@@@@@@@@@@@@@@@@*--**--@@@@% +=@#%%##%@@@##%@@@*%@@@@@%@@@%%@@%%%@@@@@@@@@@@@@@%%@@@@@ @@@ @@@@@@@@@@%-@@ @@@@@@@@@@@@@ @@@= @@@@+###@@@@@@%#*%+@@@@@@@@@@@@@@@@@@@@@@@*-=#@@@@@@@-=%@@ --@#%##%%#%#%%%@@#*%%%%%%%@@@@@@%%@@@@@@@@@@@@@@@@@%%@%%@@= @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@= @@@@#*#%@@@ @@@#%%-@@%@@@@@@@@@@@@@@@@@@@@=@@@@%#*#%@%@#=% =-#*%@%%%%@%%%%%**#@%@@%%%%%%%@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#%%@@@@@@@##*@@@@@@@@@@@##@@@@@@@@@@%-@@#*#@@+-=*%%-% *@@%=-##%%%####%%@@@%%@@@@%%%%%@@@@@@%@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%#@%%%%%%%##%=@@@@%%@@@@@@@@@@@@@@@@@%@@%*+# *+##%-#% +%%%%@%*++*#%%%@#@@@%%%@@@@@%%%%@@@@@@@@@@%+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=+%######+==+@%@@@@@@@@@@@@@@@@@@@@@-@@%*-%%%+:##* @+ +##%%%#@@@@%%%%%%%%%%@%%%%%@@%@@@@@%@@@+-*%*#@==@@@@@@@@@@@@@@==#@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=+**+=+#@@@@@@@@@@@@@@@@@@@@@@@@@@=-@@@@=+@@@+: =: +%%#%%#%%%%%%%%%%%%%%%%%%@%%%@@%@@@%**%@#+++*++%@+=@@@@@@@%=+@@@@@@@@=+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@%%@@@@@@*==@@@@@@@@@@@@@@@@@@@@@@@=-*%%@*. =- +##%%%#%%%%%%%%%%%%%%%%%%%@@%%%@@@@*@#=-*#%@%%#-=-*=@@@@+*@@@%+-=--#@@@#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@===*#**-+@@@@@@@@@@@@=---+%@@@@%--= +#@@@%- =##%%%%####%%%%%%%%@@@%%%%%%%%%%%@=@=++%@@@@@@@#*+@*@%%@=@@*-*@@@@@@-*@%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@==+*##******-=@@@@@@@#=+@@@@@%@#%@@@@@@@@@%%%#- =######%#%####%%%%%+-@%%%%%%%%%%%@*@-*+@%@ @%%*=*==@%@@+@@+-@@ @%@**@##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*-###%@@@@%##+=+@@@#%##%%#***####%#@@%%%%%%%%%#- =###*####%#%%#####%@@@%%%%%%%%%%%@-@-+*@@@@@@@%==@@@@@@@=@@-=@%@@@%@-*@#@@@@@@@@@@@@*-@@@@@@@@@@@@@@@%@@- @@%%@@@%%@@--#*%#% @###===-@%%#%####%@@@#%%##*%%%%%%%%%%%%- -+**#######%%#%#%###%%%%%@%%%%%%%@+@-==+%%@%%+-=-@=%%@@@=@@--#@@@%+--@@=*@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+#%#@@@ @@@%##=%@%%%##*##@ @**####%@#%%%%@%%#%- -******###*###%%%%#%%####%%%#@%%#@--@@-------=+@#-@@@%@%-#@@@@----@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-###%%@@@%##*#=@@%#%@#*##%@@@**%*##%@%%%%%%#==%- -#******+#######%%%#%%%%%%##%%%%%@@@%+-%%*+#@+-@@@@@@@@@@@+-*@@@@@@+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=-=+++=#**+++--@@%%*%%%###%%##%@+#%%%%%%%%#*=+*= -+++**#*#*+*+##**##%#%%%%%#%#%##%%##%%@@*--=%@@@@@#=--%@@@@@@*---+@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%--**++---@@@@@@@@=-#@@%%%@@% =@%%%%%%###*#%*: -+++++++*+##*****##***######%%%%%%%%%###@@@@@@@%--++*+++--@@@@@@@@@@@@@%%%%@%@@@%@%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=--#@@@@@=-+@@@@@%-#@%# #@@@@%%%%##%%%##*: -++++++**+*************##*###*##%%#%%%%###%@%=-=+=++++++=++-@@%@%%%%%%%%%%@@%%%%%@@@@@@@@@@@@@@%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#--*@@%+-#@@@@@--@@@@@%%%%%%##%%##+*+. -++++++++++++++*+***********########%%%%%%@=====+**###**+=*-%@%%%%%%%@@%%%%%%%%@%%%%%%%%%%%%%%%%@@@@%%%@@@@@@@@@@@@@@@@@@@@@--*#@@%%%%@%%--@%@@@@%%%%%%%%%#%%%###*#*. -===+++*++++++++**+++*******+@@%*+#*#*####@-=+=+**@%@%#*+++-%%%@%%%%%%%@@@%%%%%%@@%@@@@%%@@@@@@@%%%%@@@@%%%%%%@@@@@@@@@@@%@@-@@%%%@%@%%%%@*@@@%%%%%%%%%#%%#%%#%####*. -========+*++++++++++*+*****#=:@*****#+###@##=++**@ #%#++#*@%%%%%%@%%%%=*@%%%%%%%%%%@@@%%@@=-@@@@%%%@@@@@@%@%%%*%@@@@@@@@@@-%%%%@@#%@%%#@-@%@%%%%%%%%@%%%#%######## -==+========++++++++++++++++#@@%********++%==+==**@@@@*+==*=#@%##%#%%%%%@%%@%%%%%%#%%%%%%%%@@@@%%%%@@@%@%@@%@%@@@%@@@@@@@@%@-@#%%%@ @@%##@-@%%%%%%%%%%#%%########### -================+++++++++=++++++++*++****%==++===++=+====*-@%#%#%%#%%%%%##%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%%@@@@@@%%%%%%%@@-@%##%%%%%%#%@-@%%%#%%%%%%%%#%%######+#: -=================+=+++++++++++=++*++*****%#==============@@@#*#######%#%#%%####%%%%%%#%%#%%%%#%%%%#%%%%%%%%%%%%%%%%%%%%%@@@-=@@@%%#%@%%#--@@%%#%%%%%###%%%#%#*##+-: -=======================+=++++=++++=++++++++%##========%@%#*****+##**########%%%######@%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%@@@--+@@%%---@@@@%%%@%%%%#%%%%%%%*#**#*: -------------------------------------------------------------------===-==================+++*****+*******++++****************#%@@---=%%%%#*#**++++=++++====-----: */ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance( address owner, address spender ) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.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); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf( address account ) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer( address to, uint256 amount ) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance( address owner, address spender ) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address spender, uint256 amount ) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance( address spender, uint256 addedValue ) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance( address spender, uint256 subtractedValue ) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero' ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), 'ERC20: transfer from the zero address'); require(to != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, 'ERC20: transfer amount exceeds balance'); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, 'ERC20: burn amount exceeds balance'); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, 'ERC20: insufficient allowance'); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IUniswapV2Factory { function createPair( address tokenA, address tokenB ) external returns (address pair); } interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ 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 subtraction of two unsigned integers, with an overflow flag. */ 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. */ 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. */ 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. */ 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 largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED if (_status == _ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } contract XTrack is Ownable, ERC20, ReentrancyGuard { error TradingClosed(); error TransactionTooLarge(); error MaxBalanceExceeded(); error PercentOutOfRange(); error NotExternalToken(); error TransferFailed(); bool public tradingOpen; bool private _inSwap; address public marketingFeeReceiver; uint256 public maxTxAmount; uint256 public maxWalletBalance; mapping(address => bool) public _authorizations; mapping(address => bool) public _isExcludedFromFees; address public constant _ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public immutable uniswapV2Pair; uint256 public swapThreshold; uint256 public sellTax; uint256 public buyTax; address private constant airdropContract = 0xD152f549545093347A162Dce210e7293f1452150; modifier swapping() { _inSwap = true; _; _inSwap = false; } constructor( ) ERC20("XTrack", "XTRACK") { uint256 supply = 10_000_000 * 1 ether; swapThreshold = Math.mulDiv(supply, 6, 1000); marketingFeeReceiver = msg.sender; buyTax = 5; sellTax = 5; maxWalletBalance = Math.mulDiv(supply, 5, 100); maxTxAmount = Math.mulDiv(supply, 5, 100); IUniswapV2Router02 router = IUniswapV2Router02(_ROUTER); address pair = IUniswapV2Factory(router.factory()).createPair( router.WETH(), address(this) ); uniswapV2Pair = pair; _authorizations[msg.sender] = true; _authorizations[address(this)] = true; _authorizations[address(0xdead)] = true; _authorizations[address(0)] = true; _authorizations[pair] = true; _authorizations[address(router)] = true; _authorizations[address(airdropContract)] = true; _isExcludedFromFees[msg.sender] = true; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[address(airdropContract)] = true; _approve(msg.sender, _ROUTER, type(uint256).max); _approve(msg.sender, pair, type(uint256).max); _approve(address(this), _ROUTER, type(uint256).max); _approve(address(this), pair, type(uint256).max); _mint(msg.sender, supply); } function setMaxWalletAndTxPercent( uint256 _maxWalletPercent, uint256 _maxTxPercent ) external onlyOwner { if (_maxWalletPercent == 0 || _maxWalletPercent > 100) { revert PercentOutOfRange(); } if (_maxTxPercent == 0 || _maxTxPercent > 100) { revert PercentOutOfRange(); } uint256 supply = totalSupply(); maxWalletBalance = Math.mulDiv(supply, _maxWalletPercent, 100); maxTxAmount = Math.mulDiv(supply, _maxTxPercent, 100); } function setExemptFromMaxTx(address addr, bool value) public onlyOwner { _authorizations[addr] = value; } function setExemptFromFee(address addr, bool value) public onlyOwner { _isExcludedFromFees[addr] = value; } function _transfer( address _from, address _to, uint256 _amount ) internal override { if (_shouldSwapBack()) { _swapBack(); } if (_inSwap) { return super._transfer(_from, _to, _amount); } uint256 fee = (_isExcludedFromFees[_from] || _isExcludedFromFees[_to]) ? 0 : _calculateFee(_from, _to, _amount); if (fee != 0) { super._transfer(_from, address(this), fee); _amount -= fee; } super._transfer(_from, _to, _amount); } function _swapBack() internal swapping nonReentrant { IUniswapV2Router02 router = IUniswapV2Router02(_ROUTER); address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( swapThreshold, 0, path, address(this), block.timestamp ); uint256 balance = address(this).balance; (bool success, ) = payable(marketingFeeReceiver).call{value: balance}(''); if (!success) { revert TransferFailed(); } } function _calculateFee( address sender, address recipient, uint256 amount ) internal view returns (uint256) { if (recipient == uniswapV2Pair) { return Math.mulDiv(amount, sellTax, 100); } else if (sender == uniswapV2Pair) { return Math.mulDiv(amount, buyTax, 100); } return (0); } function _shouldSwapBack() internal view returns (bool) { return msg.sender != uniswapV2Pair && !_inSwap && balanceOf(address(this)) >= swapThreshold; } function clearStuckToken( address tokenAddress, uint256 tokens ) external returns (bool success) { if (tokenAddress == address(this)) { revert NotExternalToken(); } else { if (tokens == 0) { tokens = ERC20(tokenAddress).balanceOf(address(this)); return ERC20(tokenAddress).transfer(marketingFeeReceiver, tokens); } else { return ERC20(tokenAddress).transfer(marketingFeeReceiver, tokens); } } } function setTaxes(uint256 _buyTax, uint256 _sellTax) external onlyOwner { sellTax = _sellTax; buyTax = _buyTax; } function openTrading() public onlyOwner { tradingOpen = true; } function setMarketingWallet( address _marketingFeeReceiver ) external onlyOwner { marketingFeeReceiver = _marketingFeeReceiver; } function setSwapBackSettings(uint256 _amount) public onlyOwner{ uint256 total = totalSupply(); uint newAmount = _amount * 1 ether; require( newAmount >= total / 1000 && newAmount <= total / 20, 'The amount should be between 0.1% and 5% of total supply' ); swapThreshold = newAmount; } function isAuthorized(address addr) public view returns (bool) { return _authorizations[addr]; } function _beforeTokenTransfer( address _from, address _to, uint256 _amount ) internal view override { if (!tradingOpen) { if (_from != owner() && _from != airdropContract) { if (!_authorizations[_from] || !_authorizations[_to]) { revert TradingClosed(); } } } if (!_authorizations[_to]) { if ((balanceOf(_to) + _amount) > maxWalletBalance) { revert MaxBalanceExceeded(); } } if (!_authorizations[_from]) { if (_amount > maxTxAmount) { revert TransactionTooLarge(); } } } receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MathOverflowedMulDiv","type":"error"},{"inputs":[],"name":"MaxBalanceExceeded","type":"error"},{"inputs":[],"name":"NotExternalToken","type":"error"},{"inputs":[],"name":"PercentOutOfRange","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"TradingClosed","type":"error"},{"inputs":[],"name":"TransactionTooLarge","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_authorizations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"clearStuckToken","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"addr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","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":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExemptFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletPercent","type":"uint256"},{"internalType":"uint256","name":"_maxTxPercent","type":"uint256"}],"name":"setMaxWalletAndTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405234801562000010575f80fd5b506040518060400160405280600681526020016558547261636b60d01b8152506040518060400160405280600681526020016558545241434b60d01b81525062000069620000636200040d60201b60201c565b62000411565b600462000077838262000925565b50600562000086828262000925565b5050600160069081556a084595161401484a0000009150620000ad9082906103e862000460565b600c556007805462010000600160b01b0319163362010000021790556005600e819055600d819055620000e4908290606462000460565b600955620000f6816005606462000460565b6008819055505f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000152573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001789190620009f1565b6001600160a01b031663c9c65396836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e99190620009f1565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303815f875af115801562000233573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002599190620009f1565b6001600160a01b038181166080819052335f818152600a602090815260408083208054600160ff1991821681179092553080865283862080548316841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548316841790557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380548316841790559685528285208054821683179055968a16845281842080548816821790557f9e77a9a201b3b006bd3bb3677f52d427a7c674998a96cd9f17acf8571dba7ca48054881682179055848452600b9092528083208054871683179055938252928120805485168417905573d152f549545093347a162dce210e7293f145215090527f08bc593fcefc1774598e2e9929ac2a4cb1af67ff962e569545ad9f5b5171155b8054909316909117909155909150620003ba90737a250d5630b4cf539739df2c5dacb4c659f2488d5f196200052a565b620003c833825f196200052a565b620003ea30737a250d5630b4cf539739df2c5dacb4c659f2488d5f196200052a565b620003f830825f196200052a565b62000404338462000655565b50505062000a53565b3390565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f80805f19858709858702925082811083820303915050805f036200049c5783828162000491576200049162000a19565b049250505062000523565b808411620004bd5760405163227bc15360e01b815260040160405180910390fd5b5f848688098519600190810187169687900496828603819004959092119093035f82900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6001600160a01b038316620005925760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005f55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000589565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620006ad5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000589565b620006ba5f838362000725565b8060035f828254620006cd919062000a2d565b90915550506001600160a01b0382165f818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60075460ff16620007d0575f546001600160a01b038481169116148015906200076b57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b15620007d0576001600160a01b0383165f908152600a602052604090205460ff161580620007b157506001600160a01b0382165f908152600a602052604090205460ff16155b15620007d05760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff166200083f576009548162000813846001600160a01b03165f9081526001602052604090205490565b6200081f919062000a2d565b11156200083f576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff166200088357600854811115620008835760405163973ec46f60e01b815260040160405180910390fd5b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620008b157607f821691505b602082108103620008d057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200088357805f5260205f20601f840160051c81016020851015620008fd5750805b601f840160051c820191505b818110156200091e575f815560010162000909565b5050505050565b81516001600160401b0381111562000941576200094162000888565b62000959816200095284546200089c565b84620008d6565b602080601f8311600181146200098f575f8415620009775750858301515b5f19600386901b1c1916600185901b178555620009e9565b5f85815260208120601f198616915b82811015620009bf578886015182559484019460019091019084016200099e565b5085821015620009dd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562000a02575f80fd5b81516001600160a01b038116811462000523575f80fd5b634e487b7160e01b5f52601260045260245ffd5b8082018082111562000a4d57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051611a3c62000a815f395f81816102e301528181611094015281816114a101526114ef0152611a3c5ff3fe6080604052600436106101e4575f3560e01c80638da5cb5b11610100578063c9567bf911610099578063e7cb12201161006b578063e7cb122014610588578063e96fada2146105b6578063f2fde38b146105db578063fe9fbb80146105fa578063ffb54a991461063157005b8063c9567bf914610512578063cc1776d314610526578063dd62ed3e1461053b578063e0bf7fd11461055a57005b8063a9059cbb116100d2578063a9059cbb146104a0578063bbde77c1146104bf578063bedafd01146104d4578063c647b20e146104f357005b80638da5cb5b1461042a57806395d89b411461044657806398e4439a1461045a578063a457c2d71461048157005b80634ab7cb581161017d578063715018a61161014f578063715018a6146103a457806377b54bad146103b8578063796431d0146103d757806384486604146103f65780638c0b5e221461041557005b80634ab7cb581461031d5780634f7041a51461033c5780635d098b381461035157806370a082311461037057005b806323b872dd116101b657806323b872dd14610279578063313ce5671461029857806339509351146102b357806349bd5a5e146102d257005b80630445b667146101ed57806306fdde0314610215578063095ea7b31461023657806318160ddd1461026557005b366101eb57005b005b3480156101f8575f80fd5b50610202600c5481565b6040519081526020015b60405180910390f35b348015610220575f80fd5b5061022961064a565b60405161020c91906116b9565b348015610241575f80fd5b50610255610250366004611719565b6106da565b604051901515815260200161020c565b348015610270575f80fd5b50600354610202565b348015610284575f80fd5b50610255610293366004611743565b6106f3565b3480156102a3575f80fd5b506040516012815260200161020c565b3480156102be575f80fd5b506102556102cd366004611719565b610718565b3480156102dd575f80fd5b506103057f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161020c565b348015610328575f80fd5b506101eb610337366004611781565b610739565b348015610347575f80fd5b50610202600e5481565b34801561035c575f80fd5b506101eb61036b3660046117a1565b6107f0565b34801561037b575f80fd5b5061020261038a3660046117a1565b6001600160a01b03165f9081526001602052604090205490565b3480156103af575f80fd5b506101eb610843565b3480156103c3575f80fd5b506102556103d2366004611719565b610877565b3480156103e2575f80fd5b506101eb6103f13660046117bc565b6109d1565b348015610401575f80fd5b506101eb6104103660046117e0565b610ab9565b348015610420575f80fd5b5061020260085481565b348015610435575f80fd5b505f546001600160a01b0316610305565b348015610451575f80fd5b50610229610b0c565b348015610465575f80fd5b50610305737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561048c575f80fd5b5061025561049b366004611719565b610b1b565b3480156104ab575f80fd5b506102556104ba366004611719565b610ba0565b3480156104ca575f80fd5b5061020260095481565b3480156104df575f80fd5b506101eb6104ee3660046117e0565b610bad565b3480156104fe575f80fd5b506101eb61050d366004611781565b610c00565b34801561051d575f80fd5b506101eb610c31565b348015610531575f80fd5b50610202600d5481565b348015610546575f80fd5b50610202610555366004611817565b610c69565b348015610565575f80fd5b506102556105743660046117a1565b600b6020525f908152604090205460ff1681565b348015610593575f80fd5b506102556105a23660046117a1565b600a6020525f908152604090205460ff1681565b3480156105c1575f80fd5b50600754610305906201000090046001600160a01b031681565b3480156105e6575f80fd5b506101eb6105f53660046117a1565b610c93565b348015610605575f80fd5b506102556106143660046117a1565b6001600160a01b03165f908152600a602052604090205460ff1690565b34801561063c575f80fd5b506007546102559060ff1681565b60606004805461065990611843565b80601f016020809104026020016040519081016040528092919081815260200182805461068590611843565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e7818585610d2d565b60019150505b92915050565b5f33610700858285610e50565b61070b858585610ec8565b60019150505b9392505050565b5f336106e781858561072a8383610c69565b610734919061188f565b610d2d565b5f546001600160a01b0316331461076b5760405162461bcd60e51b8152600401610762906118a2565b60405180910390fd5b8115806107785750606482115b1561079657604051636ac4115560e11b815260040160405180910390fd5b8015806107a35750606481115b156107c157604051636ac4115560e11b815260040160405180910390fd5b5f6107cb60035490565b90506107d981846064610f7b565b6009556107e881836064610f7b565b600855505050565b5f546001600160a01b031633146108195760405162461bcd60e51b8152600401610762906118a2565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b5f546001600160a01b0316331461086c5760405162461bcd60e51b8152600401610762906118a2565b6108755f611039565b565b5f306001600160a01b038416036108a1576040516334131c8560e01b815260040160405180910390fd5b815f03610992576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e91906118d7565b60075460405163a9059cbb60e01b81526001600160a01b0362010000909204821660048201526024810183905291935084169063a9059cbb906044015b6020604051808303815f875af1158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b91906118ee565b90506106ed565b60075460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820184905284169063a9059cbb9060440161094b565b5f546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610762906118a2565b5f610a0460035490565b90505f610a1983670de0b6b3a7640000611909565b9050610a276103e883611934565b8110158015610a405750610a3c601483611934565b8111155b610ab25760405162461bcd60e51b815260206004820152603860248201527f54686520616d6f756e742073686f756c64206265206265747765656e20302e3160448201527f2520616e64203525206f6620746f74616c20737570706c7900000000000000006064820152608401610762565b600c555050565b5f546001600160a01b03163314610ae25760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60606005805461065990611843565b5f3381610b288286610c69565b905083811015610b885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610762565b610b958286868403610d2d565b506001949350505050565b5f336106e7818585610ec8565b5f546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610c295760405162461bcd60e51b8152600401610762906118a2565b600d55600e55565b5f546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610762906118a2565b6007805460ff19166001179055565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314610cbc5760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b038116610d215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b610d2a81611039565b50565b6001600160a01b038316610d8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610762565b6001600160a01b038216610df05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610762565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e5b8484610c69565b90505f198114610ec25781811015610eb55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610762565b610ec28484848403610d2d565b50505050565b610ed0611088565b15610edd57610edd6110eb565b600754610100900460ff1615610efd57610ef88383836112ea565b505050565b6001600160a01b0383165f908152600b602052604081205460ff1680610f3a57506001600160a01b0383165f908152600b602052604090205460ff165b610f4e57610f4984848461149e565b610f50565b5f5b90508015610f7057610f638430836112ea565b610f6d8183611953565b91505b610ec28484846112ea565b5f80805f19858709858702925082811083820303915050805f03610fb257838281610fa857610fa8611920565b0492505050610711565b808411610fd25760405163227bc15360e01b815260040160405180910390fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906110ca5750600754610100900460ff16155b80156110e65750600c54305f9081526001602052604090205410155b905090565b6007805461ff00191661010017905561110261153d565b604080516002808252606082018352737a250d5630b4cf539739df2c5dacb4c659f2488d925f92919060208301908036833701905050905030815f8151811061114d5761114d611966565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cd919061197a565b816001815181106111e0576111e0611966565b6001600160a01b039283166020918202929092010152600c5460405163791ac94760e01b81529184169163791ac94791611224915f90869030904290600401611995565b5f604051808303815f87803b15801561123b575f80fd5b505af115801561124d573d5f803e3d5ffd5b50506007546040514793505f9250620100009091046001600160a01b03169083905f6040518083038185875af1925050503d805f81146112a8576040519150601f19603f3d011682016040523d82523d5f602084013e6112ad565b606091505b50509050806112cf576040516312171d8360e31b815260040160405180910390fd5b505050506112dd6001600655565b6007805461ff0019169055565b6001600160a01b03831661134e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610762565b6001600160a01b0382166113b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610762565b6113bb838383611567565b6001600160a01b0383165f90815260016020526040902054818110156114325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610762565b6001600160a01b038085165f8181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114919086815260200190565b60405180910390a3610ec2565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036114ed576114e682600d546064610f7b565b9050610711565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603611534576114e682600e546064610f7b565b505f9392505050565b60026006540361156057604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b60075460ff1661160d575f546001600160a01b038481169116148015906115ab57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b1561160d576001600160a01b0383165f908152600a602052604090205460ff1615806115ef57506001600160a01b0382165f908152600a602052604090205460ff16155b1561160d5760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff16611677576009548161164e846001600160a01b03165f9081526001602052604090205490565b611658919061188f565b1115611677576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff16610ef857600854811115610ef85760405163973ec46f60e01b815260040160405180910390fd5b5f602080835283518060208501525f5b818110156116e5578581018301518582016040015282016116c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d2a575f80fd5b5f806040838503121561172a575f80fd5b823561173581611705565b946020939093013593505050565b5f805f60608486031215611755575f80fd5b833561176081611705565b9250602084013561177081611705565b929592945050506040919091013590565b5f8060408385031215611792575f80fd5b50508035926020909101359150565b5f602082840312156117b1575f80fd5b813561071181611705565b5f602082840312156117cc575f80fd5b5035919050565b8015158114610d2a575f80fd5b5f80604083850312156117f1575f80fd5b82356117fc81611705565b9150602083013561180c816117d3565b809150509250929050565b5f8060408385031215611828575f80fd5b823561183381611705565b9150602083013561180c81611705565b600181811c9082168061185757607f821691505b60208210810361187557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61187b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156118e7575f80fd5b5051919050565b5f602082840312156118fe575f80fd5b8151610711816117d3565b80820281158282048414176106ed576106ed61187b565b634e487b7160e01b5f52601260045260245ffd5b5f8261194e57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106ed576106ed61187b565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561198a575f80fd5b815161071181611705565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156119e55784516001600160a01b0316835293830193918301916001016119c0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122076ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f64736f6c63430008170033
Deployed Bytecode
0x6080604052600436106101e4575f3560e01c80638da5cb5b11610100578063c9567bf911610099578063e7cb12201161006b578063e7cb122014610588578063e96fada2146105b6578063f2fde38b146105db578063fe9fbb80146105fa578063ffb54a991461063157005b8063c9567bf914610512578063cc1776d314610526578063dd62ed3e1461053b578063e0bf7fd11461055a57005b8063a9059cbb116100d2578063a9059cbb146104a0578063bbde77c1146104bf578063bedafd01146104d4578063c647b20e146104f357005b80638da5cb5b1461042a57806395d89b411461044657806398e4439a1461045a578063a457c2d71461048157005b80634ab7cb581161017d578063715018a61161014f578063715018a6146103a457806377b54bad146103b8578063796431d0146103d757806384486604146103f65780638c0b5e221461041557005b80634ab7cb581461031d5780634f7041a51461033c5780635d098b381461035157806370a082311461037057005b806323b872dd116101b657806323b872dd14610279578063313ce5671461029857806339509351146102b357806349bd5a5e146102d257005b80630445b667146101ed57806306fdde0314610215578063095ea7b31461023657806318160ddd1461026557005b366101eb57005b005b3480156101f8575f80fd5b50610202600c5481565b6040519081526020015b60405180910390f35b348015610220575f80fd5b5061022961064a565b60405161020c91906116b9565b348015610241575f80fd5b50610255610250366004611719565b6106da565b604051901515815260200161020c565b348015610270575f80fd5b50600354610202565b348015610284575f80fd5b50610255610293366004611743565b6106f3565b3480156102a3575f80fd5b506040516012815260200161020c565b3480156102be575f80fd5b506102556102cd366004611719565b610718565b3480156102dd575f80fd5b506103057f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf2481565b6040516001600160a01b03909116815260200161020c565b348015610328575f80fd5b506101eb610337366004611781565b610739565b348015610347575f80fd5b50610202600e5481565b34801561035c575f80fd5b506101eb61036b3660046117a1565b6107f0565b34801561037b575f80fd5b5061020261038a3660046117a1565b6001600160a01b03165f9081526001602052604090205490565b3480156103af575f80fd5b506101eb610843565b3480156103c3575f80fd5b506102556103d2366004611719565b610877565b3480156103e2575f80fd5b506101eb6103f13660046117bc565b6109d1565b348015610401575f80fd5b506101eb6104103660046117e0565b610ab9565b348015610420575f80fd5b5061020260085481565b348015610435575f80fd5b505f546001600160a01b0316610305565b348015610451575f80fd5b50610229610b0c565b348015610465575f80fd5b50610305737a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561048c575f80fd5b5061025561049b366004611719565b610b1b565b3480156104ab575f80fd5b506102556104ba366004611719565b610ba0565b3480156104ca575f80fd5b5061020260095481565b3480156104df575f80fd5b506101eb6104ee3660046117e0565b610bad565b3480156104fe575f80fd5b506101eb61050d366004611781565b610c00565b34801561051d575f80fd5b506101eb610c31565b348015610531575f80fd5b50610202600d5481565b348015610546575f80fd5b50610202610555366004611817565b610c69565b348015610565575f80fd5b506102556105743660046117a1565b600b6020525f908152604090205460ff1681565b348015610593575f80fd5b506102556105a23660046117a1565b600a6020525f908152604090205460ff1681565b3480156105c1575f80fd5b50600754610305906201000090046001600160a01b031681565b3480156105e6575f80fd5b506101eb6105f53660046117a1565b610c93565b348015610605575f80fd5b506102556106143660046117a1565b6001600160a01b03165f908152600a602052604090205460ff1690565b34801561063c575f80fd5b506007546102559060ff1681565b60606004805461065990611843565b80601f016020809104026020016040519081016040528092919081815260200182805461068590611843565b80156106d05780601f106106a7576101008083540402835291602001916106d0565b820191905f5260205f20905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b5f336106e7818585610d2d565b60019150505b92915050565b5f33610700858285610e50565b61070b858585610ec8565b60019150505b9392505050565b5f336106e781858561072a8383610c69565b610734919061188f565b610d2d565b5f546001600160a01b0316331461076b5760405162461bcd60e51b8152600401610762906118a2565b60405180910390fd5b8115806107785750606482115b1561079657604051636ac4115560e11b815260040160405180910390fd5b8015806107a35750606481115b156107c157604051636ac4115560e11b815260040160405180910390fd5b5f6107cb60035490565b90506107d981846064610f7b565b6009556107e881836064610f7b565b600855505050565b5f546001600160a01b031633146108195760405162461bcd60e51b8152600401610762906118a2565b600780546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b5f546001600160a01b0316331461086c5760405162461bcd60e51b8152600401610762906118a2565b6108755f611039565b565b5f306001600160a01b038416036108a1576040516334131c8560e01b815260040160405180910390fd5b815f03610992576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156108ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090e91906118d7565b60075460405163a9059cbb60e01b81526001600160a01b0362010000909204821660048201526024810183905291935084169063a9059cbb906044015b6020604051808303815f875af1158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b91906118ee565b90506106ed565b60075460405163a9059cbb60e01b8152620100009091046001600160a01b0390811660048301526024820184905284169063a9059cbb9060440161094b565b5f546001600160a01b031633146109fa5760405162461bcd60e51b8152600401610762906118a2565b5f610a0460035490565b90505f610a1983670de0b6b3a7640000611909565b9050610a276103e883611934565b8110158015610a405750610a3c601483611934565b8111155b610ab25760405162461bcd60e51b815260206004820152603860248201527f54686520616d6f756e742073686f756c64206265206265747765656e20302e3160448201527f2520616e64203525206f6620746f74616c20737570706c7900000000000000006064820152608401610762565b600c555050565b5f546001600160a01b03163314610ae25760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60606005805461065990611843565b5f3381610b288286610c69565b905083811015610b885760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610762565b610b958286868403610d2d565b506001949350505050565b5f336106e7818585610ec8565b5f546001600160a01b03163314610bd65760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f546001600160a01b03163314610c295760405162461bcd60e51b8152600401610762906118a2565b600d55600e55565b5f546001600160a01b03163314610c5a5760405162461bcd60e51b8152600401610762906118a2565b6007805460ff19166001179055565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314610cbc5760405162461bcd60e51b8152600401610762906118a2565b6001600160a01b038116610d215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b610d2a81611039565b50565b6001600160a01b038316610d8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610762565b6001600160a01b038216610df05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610762565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f610e5b8484610c69565b90505f198114610ec25781811015610eb55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610762565b610ec28484848403610d2d565b50505050565b610ed0611088565b15610edd57610edd6110eb565b600754610100900460ff1615610efd57610ef88383836112ea565b505050565b6001600160a01b0383165f908152600b602052604081205460ff1680610f3a57506001600160a01b0383165f908152600b602052604090205460ff165b610f4e57610f4984848461149e565b610f50565b5f5b90508015610f7057610f638430836112ea565b610f6d8183611953565b91505b610ec28484846112ea565b5f80805f19858709858702925082811083820303915050805f03610fb257838281610fa857610fa8611920565b0492505050610711565b808411610fd25760405163227bc15360e01b815260040160405180910390fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f336001600160a01b037f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf2416148015906110ca5750600754610100900460ff16155b80156110e65750600c54305f9081526001602052604090205410155b905090565b6007805461ff00191661010017905561110261153d565b604080516002808252606082018352737a250d5630b4cf539739df2c5dacb4c659f2488d925f92919060208301908036833701905050905030815f8151811061114d5761114d611966565b60200260200101906001600160a01b031690816001600160a01b031681525050816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cd919061197a565b816001815181106111e0576111e0611966565b6001600160a01b039283166020918202929092010152600c5460405163791ac94760e01b81529184169163791ac94791611224915f90869030904290600401611995565b5f604051808303815f87803b15801561123b575f80fd5b505af115801561124d573d5f803e3d5ffd5b50506007546040514793505f9250620100009091046001600160a01b03169083905f6040518083038185875af1925050503d805f81146112a8576040519150601f19603f3d011682016040523d82523d5f602084013e6112ad565b606091505b50509050806112cf576040516312171d8360e31b815260040160405180910390fd5b505050506112dd6001600655565b6007805461ff0019169055565b6001600160a01b03831661134e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610762565b6001600160a01b0382166113b05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610762565b6113bb838383611567565b6001600160a01b0383165f90815260016020526040902054818110156114325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610762565b6001600160a01b038085165f8181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114919086815260200190565b60405180910390a3610ec2565b5f7f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf246001600160a01b0316836001600160a01b0316036114ed576114e682600d546064610f7b565b9050610711565b7f0000000000000000000000004d8da3fc4bbdf8c12d63217b423d1daa4313bf246001600160a01b0316846001600160a01b031603611534576114e682600e546064610f7b565b505f9392505050565b60026006540361156057604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b60075460ff1661160d575f546001600160a01b038481169116148015906115ab57506001600160a01b03831673d152f549545093347a162dce210e7293f145215014155b1561160d576001600160a01b0383165f908152600a602052604090205460ff1615806115ef57506001600160a01b0382165f908152600a602052604090205460ff16155b1561160d5760405163e2c865df60e01b815260040160405180910390fd5b6001600160a01b0382165f908152600a602052604090205460ff16611677576009548161164e846001600160a01b03165f9081526001602052604090205490565b611658919061188f565b1115611677576040516324691f6b60e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a602052604090205460ff16610ef857600854811115610ef85760405163973ec46f60e01b815260040160405180910390fd5b5f602080835283518060208501525f5b818110156116e5578581018301518582016040015282016116c9565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610d2a575f80fd5b5f806040838503121561172a575f80fd5b823561173581611705565b946020939093013593505050565b5f805f60608486031215611755575f80fd5b833561176081611705565b9250602084013561177081611705565b929592945050506040919091013590565b5f8060408385031215611792575f80fd5b50508035926020909101359150565b5f602082840312156117b1575f80fd5b813561071181611705565b5f602082840312156117cc575f80fd5b5035919050565b8015158114610d2a575f80fd5b5f80604083850312156117f1575f80fd5b82356117fc81611705565b9150602083013561180c816117d3565b809150509250929050565b5f8060408385031215611828575f80fd5b823561183381611705565b9150602083013561180c81611705565b600181811c9082168061185757607f821691505b60208210810361187557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ed576106ed61187b565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b5f602082840312156118e7575f80fd5b5051919050565b5f602082840312156118fe575f80fd5b8151610711816117d3565b80820281158282048414176106ed576106ed61187b565b634e487b7160e01b5f52601260045260245ffd5b5f8261194e57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106ed576106ed61187b565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561198a575f80fd5b815161071181611705565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156119e55784516001600160a01b0316835293830193918301916001016119c0565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122076ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f64736f6c63430008170033
Deployed Bytecode Sourcemap
49423:6524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50054:28;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;50054:28:0;;;;;;;;21292:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23531:202::-;;;;;;;;;;-1:-1:-1;23531:202:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;23531:202:0;1205:187:1;22348:102:0;;;;;;;;;;-1:-1:-1;22432:12:0;;22348:102;;24279:263;;;;;;;;;;-1:-1:-1;24279:263:0;;;;;:::i;:::-;;:::i;22204:87::-;;;;;;;;;;-1:-1:-1;22204:87:0;;22283:2;2000:36:1;;1988:2;1973:18;22204:87:0;1858:184:1;24925:239:0;;;;;;;;;;-1:-1:-1;24925:239:0;;;;;:::i;:::-;;:::i;50009:38::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2211:32:1;;;2193:51;;2181:2;2166:18;50009:38:0;2047:203:1;51587:492:0;;;;;;;;;;-1:-1:-1;51587:492:0;;;;;:::i;:::-;;:::i;50114:21::-;;;;;;;;;;;;;;;;54670:145;;;;;;;;;;-1:-1:-1;54670:145:0;;;;;:::i;:::-;;:::i;22505:131::-;;;;;;;;;;-1:-1:-1;22505:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;22612:18:0;22589:7;22612:18;;;:9;:18;;;;;;;22505:131;32251:103;;;;;;;;;;;;;:::i;53975:480::-;;;;;;;;;;-1:-1:-1;53975:480:0;;;;;:::i;:::-;;:::i;54821:326::-;;;;;;;;;;-1:-1:-1;54821:326:0;;;;;:::i;:::-;;:::i;52085:113::-;;;;;;;;;;-1:-1:-1;52085:113:0;;;;;:::i;:::-;;:::i;49751:26::-;;;;;;;;;;;;;;;;32028:87;;;;;;;;;;-1:-1:-1;32074:7:0;32101:6;-1:-1:-1;;;;;32101:6:0;32028:87;;21495:98;;;;;;;;;;;;;:::i;49928:76::-;;;;;;;;;;;;49962:42;49928:76;;25637:440;;;;;;;;;;-1:-1:-1;25637:440:0;;;;;:::i;:::-;;:::i;22824:194::-;;;;;;;;;;-1:-1:-1;22824:194:0;;;;;:::i;:::-;;:::i;49782:31::-;;;;;;;;;;;;;;;;52204:115;;;;;;;;;;-1:-1:-1;52204:115:0;;;;;:::i;:::-;;:::i;54461:126::-;;;;;;;;;;-1:-1:-1;54461:126:0;;;;;:::i;:::-;;:::i;54593:71::-;;;;;;;;;;;;;:::i;50087:22::-;;;;;;;;;;;;;;;;23073:160;;;;;;;;;;-1:-1:-1;23073:160:0;;;;;:::i;:::-;;:::i;49870:51::-;;;;;;;;;;-1:-1:-1;49870:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49818:47;;;;;;;;;;-1:-1:-1;49818:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49711:35;;;;;;;;;;-1:-1:-1;49711:35:0;;;;;;;-1:-1:-1;;;;;49711:35:0;;;32362:201;;;;;;;;;;-1:-1:-1;32362:201:0;;;;;:::i;:::-;;:::i;55153:104::-;;;;;;;;;;-1:-1:-1;55153:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;55230:21:0;55210:4;55230:21;;;:15;:21;;;;;;;;;55153:104;49656:23;;;;;;;;;;-1:-1:-1;49656:23:0;;;;;;;;21292:94;21346:13;21375:5;21368:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21292:94;:::o;23531:202::-;23629:4;15833:10;23677:32;15833:10;23693:7;23702:6;23677:8;:32::i;:::-;23723:4;23716:11;;;23531:202;;;;;:::o;24279:263::-;24396:4;15833:10;24446:38;24462:4;15833:10;24477:6;24446:15;:38::i;:::-;24491:27;24501:4;24507:2;24511:6;24491:9;:27::i;:::-;24532:4;24525:11;;;24279:263;;;;;;:::o;24925:239::-;25028:4;15833:10;25076:64;15833:10;25092:7;25129:10;25101:25;15833:10;25092:7;25101:9;:25::i;:::-;:38;;;;:::i;:::-;25076:8;:64::i;51587:492::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;;;;;;;;;51716:22;;;:49:::1;;;51762:3;51742:17;:23;51716:49;51712:98;;;51783:19;;-1:-1:-1::0;;;51783:19:0::1;;;;;;;;;;;51712:98;51820:18:::0;;;:41:::1;;;51858:3;51842:13;:19;51820:41;51816:90;;;51879:19;;-1:-1:-1::0;;;51879:19:0::1;;;;;;;;;;;51816:90;51912:14;51929:13;22432:12:::0;;;22348:102;51929:13:::1;51912:30;;51970:43;51982:6;51990:17;52009:3;51970:11;:43::i;:::-;51951:16;:62:::0;52034:39:::1;52046:6:::0;52054:13;52069:3:::1;52034:11;:39::i;:::-;52020:11;:53:::0;-1:-1:-1;;;51587:492:0:o;54670:145::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54765:20:::1;:44:::0;;-1:-1:-1;;;;;54765:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;54765:44:0;;::::1;::::0;;;::::1;::::0;;54670:145::o;32251:103::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;32316:30:::1;32343:1;32316:18;:30::i;:::-;32251:103::o:0;53975:480::-;54071:12;54120:4;-1:-1:-1;;;;;54096:29:0;;;54092:358;;54143:18;;-1:-1:-1;;;54143:18:0;;;;;;;;;;;54092:358;54188:6;54198:1;54188:11;54184:259;;54221:44;;-1:-1:-1;;;54221:44:0;;54259:4;54221:44;;;2193:51:1;-1:-1:-1;;;;;54221:29:0;;;;;2166:18:1;;54221:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54312:20;;54283:58;;-1:-1:-1;;;54283:58:0;;-1:-1:-1;;;;;54312:20:0;;;;;;54283:58;;;5219:51:1;5286:18;;;5279:34;;;;;-1:-1:-1;54283:28:0;;;;;5192:18:1;;54283:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54276:65;;;;54184:259;54404:20;;54375:58;;-1:-1:-1;;;54375:58:0;;54404:20;;;;-1:-1:-1;;;;;54404:20:0;;;54375:58;;;5219:51:1;5286:18;;;5279:34;;;54375:28:0;;;;;5192:18:1;;54375:58:0;5045:274:1;54821:326:0;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54890:13:::1;54906;22432:12:::0;;;22348:102;54906:13:::1;54890:29:::0;-1:-1:-1;54926:14:0::1;54943:17;:7:::0;54953::::1;54943:17;:::i;:::-;54926:34:::0;-1:-1:-1;54996:12:0::1;55004:4;54996:5:::0;:12:::1;:::i;:::-;54983:9;:25;;:52;;;;-1:-1:-1::0;55025:10:0::1;55033:2;55025:5:::0;:10:::1;:::i;:::-;55012:9;:23;;54983:52;54967:142;;;::::0;-1:-1:-1;;;54967:142:0;;6303:2:1;54967:142:0::1;::::0;::::1;6285:21:1::0;6342:2;6322:18;;;6315:30;6381:34;6361:18;;;6354:62;6452:26;6432:18;;;6425:54;6496:19;;54967:142:0::1;6101:420:1::0;54967:142:0::1;55116:13;:25:::0;-1:-1:-1;;54821:326:0:o;52085:113::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52163:21:0;;;::::1;;::::0;;;:15:::1;:21;::::0;;;;:29;;-1:-1:-1;;52163:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52085:113::o;21495:98::-;21551:13;21580:7;21573:14;;;;;:::i;25637:440::-;25745:4;15833:10;25745:4;25820:25;15833:10;25837:7;25820:9;:25::i;:::-;25793:52;;25888:15;25868:16;:35;;25852:106;;;;-1:-1:-1;;;25852:106:0;;6728:2:1;25852:106:0;;;6710:21:1;6767:2;6747:18;;;6740:30;6806:34;6786:18;;;6779:62;-1:-1:-1;;;6857:18:1;;;6850:35;6902:19;;25852:106:0;6526:401:1;25852:106:0;25984:60;25993:5;26000:7;26028:15;26009:16;:34;25984:8;:60::i;:::-;-1:-1:-1;26067:4:0;;25637:440;-1:-1:-1;;;;25637:440:0:o;22824:194::-;22918:4;15833:10;22966:28;15833:10;22983:2;22987:6;22966:9;:28::i;52204:115::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52280:25:0;;;::::1;;::::0;;;:19:::1;:25;::::0;;;;:33;;-1:-1:-1;;52280:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52204:115::o;54461:126::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54540:7:::1;:18:::0;54565:6:::1;:16:::0;54461:126::o;54593:71::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;54640:11:::1;:18:::0;;-1:-1:-1;;54640:18:0::1;54654:4;54640:18;::::0;;54593:71::o;23073:160::-;-1:-1:-1;;;;;23200:18:0;;;23177:7;23200:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23073:160::o;32362:201::-;32074:7;32101:6;-1:-1:-1;;;;;32101:6:0;15833:10;32163:23;32155:68;;;;-1:-1:-1;;;32155:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32451:22:0;::::1;32443:73;;;::::0;-1:-1:-1;;;32443:73:0;;7134:2:1;32443:73:0::1;::::0;::::1;7116:21:1::0;7173:2;7153:18;;;7146:30;7212:34;7192:18;;;7185:62;-1:-1:-1;;;7263:18:1;;;7256:36;7309:19;;32443:73:0::1;6932:402:1::0;32443:73:0::1;32527:28;32546:8;32527:18;:28::i;:::-;32362:201:::0;:::o;29396:348::-;-1:-1:-1;;;;;29514:19:0;;29506:68;;;;-1:-1:-1;;;29506:68:0;;7541:2:1;29506:68:0;;;7523:21:1;7580:2;7560:18;;;7553:30;7619:34;7599:18;;;7592:62;-1:-1:-1;;;7670:18:1;;;7663:34;7714:19;;29506:68:0;7339:400:1;29506:68:0;-1:-1:-1;;;;;29589:21:0;;29581:68;;;;-1:-1:-1;;;29581:68:0;;7946:2:1;29581:68:0;;;7928:21:1;7985:2;7965:18;;;7958:30;8024:34;8004:18;;;7997:62;-1:-1:-1;;;8075:18:1;;;8068:32;8117:19;;29581:68:0;7744:398:1;29581:68:0;-1:-1:-1;;;;;29658:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29706:32;;160:25:1;;;29706:32:0;;133:18:1;29706:32:0;;;;;;;29396:348;;;:::o;30017:399::-;30134:24;30161:25;30171:5;30178:7;30161:9;:25::i;:::-;30134:52;;-1:-1:-1;;30197:16:0;:37;30193:218;;30273:6;30253:16;:26;;30245:68;;;;-1:-1:-1;;;30245:68:0;;8349:2:1;30245:68:0;;;8331:21:1;8388:2;8368:18;;;8361:30;8427:31;8407:18;;;8400:59;8476:18;;30245:68:0;8147:353:1;30245:68:0;30343:51;30352:5;30359:7;30387:6;30368:16;:25;30343:8;:51::i;:::-;30127:289;30017:399;;;:::o;52325:527::-;52438:17;:15;:17::i;:::-;52434:51;;;52466:11;:9;:11::i;:::-;52495:7;;;;;;;52491:73;;;52520:36;52536:5;52543:3;52548:7;52520:15;:36::i;:::-;52325:527;;;:::o;52491:73::-;-1:-1:-1;;;;;52587:26:0;;52572:11;52587:26;;;:19;:26;;;;;;;;;:54;;-1:-1:-1;;;;;;52617:24:0;;;;;;:19;:24;;;;;;;;52587:54;52586:111;;52663:34;52677:5;52684:3;52689:7;52663:13;:34::i;:::-;52586:111;;;52652:1;52586:111;52572:125;-1:-1:-1;52710:8:0;;52706:96;;52729:42;52745:5;52760:4;52767:3;52729:15;:42::i;:::-;52780:14;52791:3;52780:14;;:::i;:::-;;;52706:96;52810:36;52826:5;52833:3;52838:7;52810:15;:36::i;36632:3910::-;36734:14;;;-1:-1:-1;;37231:1:0;37228;37221:20;37267:1;37264;37260:9;37251:18;;37315:5;37311:2;37308:13;37300:5;37296:2;37292:14;37288:34;37279:43;;;37403:5;37412:1;37403:10;37399:335;;37713:11;37705:5;:19;;;;;:::i;:::-;;37698:26;;;;;;37399:335;37846:5;37831:11;:20;37827:76;;37871:22;;-1:-1:-1;;;37871:22:0;;;;;;;;;;;37827:76;38135:17;38251:11;38248:1;38245;38238:25;39508:1;38756;38741:12;;:16;;38726:32;;38842:22;;;;39489:1;:15;;39488:21;;39727;;;39723:25;;39712:36;39791:21;;;39787:25;;39776:36;39856:21;;;39852:25;;39841:36;39921:21;;;39917:25;;39906:36;39986:21;;;39982:25;;39971:36;40052:21;;;40048:25;;;40037:36;;;38711:12;39061;;;39057:23;;;39053:31;;;38352:20;;;38341:32;;;39159:12;;;;38392:21;;38927:16;;;;39150:21;;;;40492:15;;;-1:-1:-1;;;;36632:3910:0:o;32571:191::-;32645:16;32664:6;;-1:-1:-1;;;;;32681:17:0;;;-1:-1:-1;;;;;;32681:17:0;;;;;;32714:40;;32664:6;;;;;;;32714:40;;32645:16;32714:40;32634:128;32571:191;:::o;53788:181::-;53838:4;53865:10;-1:-1:-1;;;;;53879:13:0;53865:27;;;;;:46;;-1:-1:-1;53904:7:0;;;;;;;53903:8;53865:46;:98;;;;-1:-1:-1;53950:13:0;;53940:4;22589:7;22612:18;;;:9;:18;;;;;;53922:41;;53865:98;53851:112;;53788:181;:::o;52858:581::-;50266:7;:14;;-1:-1:-1;;50266:14:0;;;;;48575:21:::1;:19;:21::i;:::-;53003:16:::2;::::0;;53017:1:::2;53003:16:::0;;;;;::::2;::::0;;49962:42:::2;::::0;52917:25:::2;::::0;53003:16;53017:1;53003:16:::2;::::0;::::2;::::0;;::::2;::::0;::::2;;::::0;-1:-1:-1;53003:16:0::2;52979:40;;53044:4;53026;53031:1;53026:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;53026:23:0::2;;;-1:-1:-1::0;;;;;53026:23:0::2;;;::::0;::::2;53066:6;-1:-1:-1::0;;;;;53066:11:0::2;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53056:4;53061:1;53056:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53056:23:0;;::::2;:7;::::0;;::::2;::::0;;;;;:23;53154:13:::2;::::0;53088:155:::2;::::0;-1:-1:-1;;;53088:155:0;;:57;;::::2;::::0;::::2;::::0;:155:::2;::::0;53176:1:::2;::::0;53186:4;;53207::::2;::::0;53221:15:::2;::::0;53088:155:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;53327:20:0::2;::::0;53319:54:::2;::::0;53270:21:::2;::::0;-1:-1:-1;53252:15:0::2;::::0;-1:-1:-1;53327:20:0;;;::::2;-1:-1:-1::0;;;;;53327:20:0::2;::::0;53270:21;;53319:54:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53300:73;;;53385:7;53380:54;;53410:16;;-1:-1:-1::0;;;53410:16:0::2;;;;;;;;;;;53380:54;52910:529;;;;48611:20:::1;47948:1:::0;49110:7;:22;48939:199;48611:20:::1;50295:7:::0;:15;;-1:-1:-1;;50295:15:0;;;52858:581::o;26517:764::-;-1:-1:-1;;;;;26630:18:0;;26622:68;;;;-1:-1:-1;;;26622:68:0;;10555:2:1;26622:68:0;;;10537:21:1;10594:2;10574:18;;;10567:30;10633:34;10613:18;;;10606:62;-1:-1:-1;;;10684:18:1;;;10677:35;10729:19;;26622:68:0;10353:401:1;26622:68:0;-1:-1:-1;;;;;26705:16:0;;26697:64;;;;-1:-1:-1;;;26697:64:0;;10961:2:1;26697:64:0;;;10943:21:1;11000:2;10980:18;;;10973:30;11039:34;11019:18;;;11012:62;-1:-1:-1;;;11090:18:1;;;11083:33;11133:19;;26697:64:0;10759:399:1;26697:64:0;26770:38;26791:4;26797:2;26801:6;26770:20;:38::i;:::-;-1:-1:-1;;;;;26839:15:0;;26817:19;26839:15;;;:9;:15;;;;;;26869:21;;;;26861:72;;;;-1:-1:-1;;;26861:72:0;;11365:2:1;26861:72:0;;;11347:21:1;11404:2;11384:18;;;11377:30;11443:34;11423:18;;;11416:62;-1:-1:-1;;;11494:18:1;;;11487:36;11540:19;;26861:72:0;11163:402:1;26861:72:0;-1:-1:-1;;;;;26959:15:0;;;;;;;:9;:15;;;;;;26977:20;;;26959:38;;27159:13;;;;;;;;;;:23;;;;;;27203:26;;;;;;26991:6;160:25:1;;148:2;133:18;;14:177;27203:26:0;;;;;;;;27238:37;52325:527;53445:337;53562:7;53595:13;-1:-1:-1;;;;;53582:26:0;:9;-1:-1:-1;;;;;53582:26:0;;53578:180;;53626:33;53638:6;53646:7;;53655:3;53626:11;:33::i;:::-;53619:40;;;;53578:180;53687:13;-1:-1:-1;;;;;53677:23:0;:6;-1:-1:-1;;;;;53677:23:0;;53673:85;;53718:32;53730:6;53738;;53746:3;53718:11;:32::i;53673:85::-;-1:-1:-1;53774:1:0;53445:337;;;;;:::o;48643:290::-;47990:1;48765:7;;:19;48761:79;;48802:30;;-1:-1:-1;;;48802:30:0;;;;;;;;;;;48761:79;47990:1;48909:7;:18;48643:290::o;55263:610::-;55393:11;;;;55388:205;;32074:7;32101:6;-1:-1:-1;;;;;55419:16:0;;;32101:6;;55419:16;;;;:44;;-1:-1:-1;;;;;;55439:24:0;;50190:42;55439:24;;55419:44;55415:171;;;-1:-1:-1;;;;;55481:22:0;;;;;;:15;:22;;;;;;;;55480:23;;:48;;-1:-1:-1;;;;;;55508:20:0;;;;;;:15;:20;;;;;;;;55507:21;55480:48;55476:101;;;55550:15;;-1:-1:-1;;;55550:15:0;;;;;;;;;;;55476:101;-1:-1:-1;;;;;55604:20:0;;;;;;:15;:20;;;;;;;;55599:142;;55668:16;;55657:7;55640:14;55650:3;-1:-1:-1;;;;;22612:18:0;22589:7;22612:18;;;:9;:18;;;;;;;22505:131;55640:14;:24;;;;:::i;:::-;55639:45;55635:99;;;55704:20;;-1:-1:-1;;;55704:20:0;;;;;;;;;;;55635:99;-1:-1:-1;;;;;55752:22:0;;;;;;:15;:22;;;;;;;;55747:121;;55799:11;;55789:7;:21;55785:76;;;55830:21;;-1:-1:-1;;;55830:21:0;;;;;;;;;;;196:548:1;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:456::-;1474:6;1482;1490;1543:2;1531:9;1522:7;1518:23;1514:32;1511:52;;;1559:1;1556;1549:12;1511:52;1598:9;1585:23;1617:31;1642:5;1617:31;:::i;:::-;1667:5;-1:-1:-1;1724:2:1;1709:18;;1696:32;1737:33;1696:32;1737:33;:::i;:::-;1397:456;;1789:7;;-1:-1:-1;;;1843:2:1;1828:18;;;;1815:32;;1397:456::o;2255:248::-;2323:6;2331;2384:2;2372:9;2363:7;2359:23;2355:32;2352:52;;;2400:1;2397;2390:12;2352:52;-1:-1:-1;;2423:23:1;;;2493:2;2478:18;;;2465:32;;-1:-1:-1;2255:248:1:o;2508:247::-;2567:6;2620:2;2608:9;2599:7;2595:23;2591:32;2588:52;;;2636:1;2633;2626:12;2588:52;2675:9;2662:23;2694:31;2719:5;2694:31;:::i;2760:180::-;2819:6;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;-1:-1:-1;2911:23:1;;2760:180;-1:-1:-1;2760:180:1:o;2945:118::-;3031:5;3024:13;3017:21;3010:5;3007:32;2997:60;;3053:1;3050;3043:12;3068:382;3133:6;3141;3194:2;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;3249:9;3236:23;3268:31;3293:5;3268:31;:::i;:::-;3318:5;-1:-1:-1;3375:2:1;3360:18;;3347:32;3388:30;3347:32;3388:30;:::i;:::-;3437:7;3427:17;;;3068:382;;;;;:::o;3455:388::-;3523:6;3531;3584:2;3572:9;3563:7;3559:23;3555:32;3552:52;;;3600:1;3597;3590:12;3552:52;3639:9;3626:23;3658:31;3683:5;3658:31;:::i;:::-;3708:5;-1:-1:-1;3765:2:1;3750:18;;3737:32;3778:33;3737:32;3778:33;:::i;3848:380::-;3927:1;3923:12;;;;3970;;;3991:61;;4045:4;4037:6;4033:17;4023:27;;3991:61;4098:2;4090:6;4087:14;4067:18;4064:38;4061:161;;4144:10;4139:3;4135:20;4132:1;4125:31;4179:4;4176:1;4169:15;4207:4;4204:1;4197:15;4061:161;;3848:380;;;:::o;4233:127::-;4294:10;4289:3;4285:20;4282:1;4275:31;4325:4;4322:1;4315:15;4349:4;4346:1;4339:15;4365:125;4430:9;;;4451:10;;;4448:36;;;4464:18;;:::i;4495:356::-;4697:2;4679:21;;;4716:18;;;4709:30;4775:34;4770:2;4755:18;;4748:62;4842:2;4827:18;;4495:356::o;4856:184::-;4926:6;4979:2;4967:9;4958:7;4954:23;4950:32;4947:52;;;4995:1;4992;4985:12;4947:52;-1:-1:-1;5018:16:1;;4856:184;-1:-1:-1;4856:184:1:o;5324:245::-;5391:6;5444:2;5432:9;5423:7;5419:23;5415:32;5412:52;;;5460:1;5457;5450:12;5412:52;5492:9;5486:16;5511:28;5533:5;5511:28;:::i;5574:168::-;5647:9;;;5678;;5695:15;;;5689:22;;5675:37;5665:71;;5716:18;;:::i;5747:127::-;5808:10;5803:3;5799:20;5796:1;5789:31;5839:4;5836:1;5829:15;5863:4;5860:1;5853:15;5879:217;5919:1;5945;5935:132;;5989:10;5984:3;5980:20;5977:1;5970:31;6024:4;6021:1;6014:15;6052:4;6049:1;6042:15;5935:132;-1:-1:-1;6081:9:1;;5879:217::o;8505:128::-;8572:9;;;8593:11;;;8590:37;;;8607:18;;:::i;8770:127::-;8831:10;8826:3;8822:20;8819:1;8812:31;8862:4;8859:1;8852:15;8886:4;8883:1;8876:15;8902:251;8972:6;9025:2;9013:9;9004:7;9000:23;8996:32;8993:52;;;9041:1;9038;9031:12;8993:52;9073:9;9067:16;9092:31;9117:5;9092:31;:::i;9158:980::-;9420:4;9468:3;9457:9;9453:19;9499:6;9488:9;9481:25;9525:2;9563:6;9558:2;9547:9;9543:18;9536:34;9606:3;9601:2;9590:9;9586:18;9579:31;9630:6;9665;9659:13;9696:6;9688;9681:22;9734:3;9723:9;9719:19;9712:26;;9773:2;9765:6;9761:15;9747:29;;9794:1;9804:195;9818:6;9815:1;9812:13;9804:195;;;9883:13;;-1:-1:-1;;;;;9879:39:1;9867:52;;9974:15;;;;9939:12;;;;9915:1;9833:9;9804:195;;;-1:-1:-1;;;;;;;10055:32:1;;;;10050:2;10035:18;;10028:60;-1:-1:-1;;;10119:3:1;10104:19;10097:35;10016:3;9158:980;-1:-1:-1;;;9158:980:1:o
Swarm Source
ipfs://76ad9a366c9446d7eac2a6e3e700a76993bbfbc889fa82bd4005fa0ef34e613f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.