Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 354 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 23807245 | 32 hrs ago | IN | 0 ETH | 0.00005072 | ||||
| Approve | 23805577 | 38 hrs ago | IN | 0 ETH | 0.00005023 | ||||
| Approve | 23805561 | 38 hrs ago | IN | 0 ETH | 0.00005056 | ||||
| Approve | 23779627 | 5 days ago | IN | 0 ETH | 0.00000467 | ||||
| Approve | 23755833 | 8 days ago | IN | 0 ETH | 0.00000619 | ||||
| Approve | 23732702 | 11 days ago | IN | 0 ETH | 0.00001919 | ||||
| Approve | 23728738 | 12 days ago | IN | 0 ETH | 0.00070545 | ||||
| Approve | 23717685 | 13 days ago | IN | 0 ETH | 0.00035987 | ||||
| Approve | 23709795 | 14 days ago | IN | 0 ETH | 0.0000242 | ||||
| Approve | 23708923 | 15 days ago | IN | 0 ETH | 0.00000783 | ||||
| Approve | 23706117 | 15 days ago | IN | 0 ETH | 0.00047712 | ||||
| Approve | 23705894 | 15 days ago | IN | 0 ETH | 0.00024061 | ||||
| Approve | 23688622 | 17 days ago | IN | 0 ETH | 0.00001927 | ||||
| Approve | 23684337 | 18 days ago | IN | 0 ETH | 0.00002758 | ||||
| Approve | 23684212 | 18 days ago | IN | 0 ETH | 0.00009853 | ||||
| Approve | 23675157 | 19 days ago | IN | 0 ETH | 0.00000422 | ||||
| Approve | 23668766 | 20 days ago | IN | 0 ETH | 0.00008951 | ||||
| Approve | 23664337 | 21 days ago | IN | 0 ETH | 0.00047821 | ||||
| Approve | 23664273 | 21 days ago | IN | 0 ETH | 0.00000636 | ||||
| Approve | 23664134 | 21 days ago | IN | 0 ETH | 0.0000055 | ||||
| Approve | 23664130 | 21 days ago | IN | 0 ETH | 0.00002834 | ||||
| Approve | 23663955 | 21 days ago | IN | 0 ETH | 0.00014658 | ||||
| Approve | 23663900 | 21 days ago | IN | 0 ETH | 0.00000498 | ||||
| Approve | 23663893 | 21 days ago | IN | 0 ETH | 0.00000499 | ||||
| Approve | 23663883 | 21 days ago | IN | 0 ETH | 0.00033108 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Token
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
/*
Viper
https://viper.cash
Money, unstoppable
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣠⣠⣄⣤⣤⣠⣄⣤⣠⣤⣄⣤⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣀⣀⣀⣀⣠⣤⣤⣤⣶⣶⣶⣶⣶⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣶⣶⣶⣶⣦⣤⣤⣤⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠟⠛⠋⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⣠⣤⣤⣤⣤⣤⣄⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠛⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀
⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⣀⣀⣤⣴⣶⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀
⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⢸⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⣿⣿⣿⡿⠟⠛⠁⠀⠀⠀⠀⠀⣀⣀⣠⣤⣤⣤⣤⣤⣤⣤⣤⣀⣀⣀⠀⠉⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠸⣿⣿⣿⣿⠟⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠛⠛⢋⣹⣥⣶⣾⣶⠷⢀⣤⣶⠿⠛⠁⠀⠀⠀⢀⣠⣴⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡙⢿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠉⣀⣀⣤⣶⣾⣿⣿⣿⣿⡿⠋⣡⣼⠿⠋⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠉⠀⣀⣴⣶⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⣰⡾⠋⠁⠀⠀⣀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠉⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁⠀⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⣠⡟⠃⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠉⠻⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠁⠀⢀⣴⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢡⡾⠉⠀⢀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠉⠀⠀⢠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢃⡴⠋⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⠀⠀⠀⠀
⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠐⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠈⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⠀⠀⠀⠀
⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠛⠛⠛⠛⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⠀⠀⠀⠀
⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣆⠀⠀⠀
⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⡄⠀⡀
⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠀⠀⠀⠀⢀⣀⣀⣠⣄⣀⣀⣀⣀⣀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣧⠀⡇
⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀⣀⣴⣶⠿⠛⠋⣹⣿⡿⠟⠋⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣤⣤⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡗⡇
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠀⠀⠀⣀⣴⡾⠛⠁⠀⠀⣠⣾⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠋⠉⠉⠉⠑⠂⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⡟⠀⠃
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⢀⣴⠾⣿⠁⠀⠀⣀⣤⣾⠛⠁⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣾⣿⣿⣿⣿⣿⣿⡟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣶⣶⣾⣿⡿⠋⠀⠀⠀
⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢳⡄⠀⢹⡟⠛⠻⠿⠿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⢀⣤⣞⣉⣤⡴⠿⠶⠟⠛⠉⠁⠀⠀⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀
⢸⣿⣿⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⢹⡀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠀⠰⠛⠀⠀⢠⠴⠛⠋⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀
⠀⢽⣺⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠸⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀
⠀⠸⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⡄⠀⠙⠦⠀⠀⠀⠀⠀⠀⠀⠀⢠⣤⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀
⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⢹⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀
⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠀⠀⠀⣴⣿⣿⡄⠀⢦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⢀⣾⣿⣿⣿⣷⠀⠀⠈⣿⣿⣶⣶⣶⣤⣤⣤⣤⡀⠀⠀⠀⠴⠞⠛⢉⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⣼⣿⣿⣿⣿⣿⣧⠀⠰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣦⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣇⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣧⡘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣆⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣷⣮⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣆⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢻⣆⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣦⡀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⣎⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⣠⠂⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣶⡀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⡇⠙⣿⡇⠸⣿⣿⣿⣿⡟⠹⣿⣿⣿⣿⣿⣿⣿⠟⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠔⠁⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣶⣄⢠⠀⠀⠀⠙⠻⣿⣿⣿⣿⣿⡄⠀⠁⠀⠉⠻⢿⣿⣷⠀⠻⣿⣿⣿⡿⠋⠁⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣦⡀⠀⠀⠀⠀⠉⠛⢿⣿⣿⣦⣀⣠⣄⣀⠀⠀⠉⠀⠀⠈⠉⠉⠀⢠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠳⢦⣀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣶⣦⣀⠀⠀⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠑⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⣿⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠛⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠻⠿⢿⣿⣿⣿⣿⡿⠿⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/
pragma solidity ^0.8.28;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
contract Token is ERC20, Ownable {
uint256 public immutable MAX_SUPPLY;
address public immutable pair;
address public treasury;
IUniswapV2Router02 private constant _router =
IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address private immutable _weth;
address private immutable _deployer;
uint256 public startBlock;
uint256 public startBlockTime;
bool public taxesDisabled = false;
mapping(address account => bool) public isExcludedFromFees;
mapping(address account => bool) public isExcludedFromMaxWallet;
mapping(uint256 blockNumber => uint256 txCount) public maxBuyTxsPerBlock;
mapping(uint256 blockNumber => uint256 supplyPerBlock)
public supplyPerBlock;
constructor(
string memory name,
string memory symbol,
uint256 maxSupply,
address _treasury
) ERC20(name, symbol) Ownable(msg.sender) {
MAX_SUPPLY = maxSupply;
_weth = _router.WETH();
pair = IUniswapV2Factory(_router.factory()).createPair(
address(this),
_weth
);
isExcludedFromFees[msg.sender] = true;
isExcludedFromFees[address(this)] = true;
isExcludedFromFees[pair] = true;
isExcludedFromFees[treasury] = true;
isExcludedFromMaxWallet[msg.sender] = true;
isExcludedFromMaxWallet[address(this)] = true;
isExcludedFromMaxWallet[pair] = true;
isExcludedFromMaxWallet[treasury] = true;
_mint(msg.sender, maxSupply);
_approve(msg.sender, address(_router), type(uint256).max);
treasury = _treasury;
_deployer = msg.sender;
_approve(address(this), address(_router), type(uint256).max);
}
function setTreasury(address newTreasury) external {
require(newTreasury != address(0), "treasury-is-0");
require(
msg.sender == _deployer || msg.sender == owner(),
"only-deployer"
);
treasury = newTreasury;
}
function enableTrading() external onlyOwner {
require(startBlock == 0, "trading-already-enabled");
startBlock = block.number;
startBlockTime = block.timestamp;
}
function disableTaxes() external onlyOwner {
taxesDisabled = true;
}
function setExcludedFromFees(
address account,
bool excluded
) external onlyOwner {
isExcludedFromFees[account] = excluded;
}
function setExcludedFromMaxWallet(
address account,
bool excluded
) external onlyOwner {
isExcludedFromMaxWallet[account] = excluded;
}
function feesAndMaxWallet()
external
view
returns (uint256 _feeBps, uint256 _maxWallet)
{
return _feesAndMaxWallet();
}
function _feesAndMaxWallet()
internal
view
returns (uint256 _feeBps, uint256 _maxWallet)
{
if (block.number - startBlock < 1) {
return (0, MAX_SUPPLY / 200);
}
uint256 _diffSeconds = block.timestamp - startBlockTime;
if (_diffSeconds < 3600) {
_maxWallet = MAX_SUPPLY / 200; // 0.5%
uint256 _topTax = 4000; // 40%
uint256 _bottomTax = 500; // 5%
_feeBps =
_topTax -
((_diffSeconds * (_topTax - _bottomTax)) / 3600);
return (_feeBps, _maxWallet);
}
_feeBps = taxesDisabled ? 0 : 500;
_maxWallet = MAX_SUPPLY;
return (_feeBps, _maxWallet);
}
function _update(
address from,
address to,
uint256 value
) internal override {
(uint256 _feeBps, uint256 _maxWallet) = _feesAndMaxWallet();
bool isBuy = from == pair;
if (isBuy || to == pair) {
require(
startBlock > 0 || isExcludedFromFees[to],
"trading-not-enabled"
);
if (isBuy && block.number - startBlock < 1) {
require(
maxBuyTxsPerBlock[block.number] <= 50,
"max-buy-txs-per-block-exceeded"
);
maxBuyTxsPerBlock[block.number]++;
}
if (_feeBps != 0) {
if (isBuy && !isExcludedFromFees[to]) {
uint256 fee = (value * _feeBps) / 10000;
value -= fee;
super._update(from, address(this), fee);
}
if (!isBuy && !isExcludedFromFees[from]) {
uint256 fee = (value * _feeBps) / 10000;
value -= fee;
super._update(from, address(this), fee);
_swapTokensForEth();
}
} else {
if (!isBuy && !isExcludedFromFees[from]) {
_swapTokensForEth();
}
}
}
require(
isExcludedFromMaxWallet[to] || value + balanceOf(to) <= _maxWallet,
"max-wallet-size-exceeded"
);
super._update(from, to, value);
}
function _swapTokensForEth() internal {
uint256 startDiff = block.timestamp - startBlockTime;
if (startDiff < 300) {
return;
}
if (supplyPerBlock[block.number] > MAX_SUPPLY / 200) {
return;
}
uint256 _tokenAmount = balanceOf(address(this));
if (_tokenAmount == 0) {
return;
}
address[] memory _path = new address[](2);
_path[0] = _weth;
_path[1] = address(this);
uint256 _maxTokenAmount = _router.getAmountsOut(1 ether, _path)[1];
if (_tokenAmount > _maxTokenAmount) {
_tokenAmount = _maxTokenAmount;
}
supplyPerBlock[block.number] += _tokenAmount;
_path[0] = address(this);
_path[1] = _weth;
_router.swapExactTokensForETHSupportingFeeOnTransferTokens(
_tokenAmount,
0,
_path,
treasury,
block.timestamp
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAndMaxWallet","outputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlock","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"supplyPerBlock","outputs":[{"internalType":"uint256","name":"supplyPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101006040526000600960006101000a81548160ff02191690831515021790555034801561002c57600080fd5b50604051614b69380380614b69833981810160405281019061004e919061177e565b33848481600390816100609190611a34565b5080600490816100709190611a34565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100e55760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100dc9190611b15565b60405180910390fd5b6100f48161070860201b60201c565b508160808181525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561015c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101809190611b30565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102369190611b30565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060c0516040518363ffffffff1660e01b8152600401610272929190611b5d565b6020604051808303816000875af1158015610291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b59190611b30565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600060a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061060033836107ce60201b60201c565b61064533737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61085660201b60201c565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250506106ff30737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61085660201b60201c565b505050506121bb565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108405760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108379190611b15565b60405180910390fd5b6108526000838361086e60201b60201c565b5050565b6108698383836001610cb660201b60201c565b505050565b60008061087f610e8d60201b60201c565b91509150600060a05173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905080806108f1575060a05173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b15610bed57600060075411806109505750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690611be3565b60405180910390fd5b8080156109a957506001600754436109a79190611c32565b105b15610a2f576032600c6000438152602001908152602001600020541115610a05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fc90611cb2565b60405180910390fd5b600c60004381526020019081526020016000206000815480929190610a2990611cd2565b91905055505b60008314610b7f57808015610a8e5750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610ad15760006127108486610aa49190611d1a565b610aae9190611d8b565b90508085610abc9190611c32565b9450610acf873083610f6460201b60201c565b505b80158015610b295750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610b7a5760006127108486610b3f9190611d1a565b610b499190611d8b565b90508085610b579190611c32565b9450610b6a873083610f6460201b60201c565b610b7861118960201b60201c565b505b610bec565b80158015610bd75750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610beb57610bea61118960201b60201c565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610c5e575081610c508661152d60201b60201c565b85610c5b9190611dbc565b11155b610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9490611e3c565b60405180910390fd5b610cae868686610f6460201b60201c565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d285760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610d1f9190611b15565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d9a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d919190611b15565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610e87578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610e7e9190611e6b565b60405180910390a35b50505050565b600080600160075443610ea09190611c32565b1015610ec057600060c8608051610eb79190611d8b565b91509150610f60565b600060085442610ed09190611c32565b9050610e10811015610f345760c8608051610eeb9190611d8b565b91506000610fa0905060006101f49050610e108183610f0a9190611c32565b84610f159190611d1a565b610f1f9190611d8b565b82610f2a9190611c32565b9450505050610f60565b600960009054906101000a900460ff16610f50576101f4610f53565b60005b61ffff1692506080519150505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fb6578060026000828254610faa9190611dbc565b92505081905550611089565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611042578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161103993929190611e86565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110d2578060026000828254039250508190555061111f565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161117c9190611e6b565b60405180910390a3505050565b6000600854426111999190611c32565b905061012c8110156111ab575061152b565b60c86080516111ba9190611d8b565b600d60004381526020019081526020016000205411156111da575061152b565b60006111eb3061152d60201b60201c565b9050600081036111fc57505061152b565b6000600267ffffffffffffffff811115611219576112186115a4565b5b6040519080825280602002602001820160405280156112475781602001602082028036833780820191505090505b50905060c0518160008151811061126157611260611ebd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106112b0576112af611ebd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611343929190611fe5565b600060405180830381865afa158015611360573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061138991906120dd565b60018151811061139c5761139b611ebd565b5b60200260200101519050808311156113b2578092505b82600d600043815260200190815260200160002060008282546113d59190611dbc565b9250508190555030826000815181106113f1576113f0611ebd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060c0518260018151811061144257611441611ebd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b81526004016114f4959493929190612161565b600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b50505050505050505b565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115dc82611593565b810181811067ffffffffffffffff821117156115fb576115fa6115a4565b5b80604052505050565b600061160e611575565b905061161a82826115d3565b919050565b600067ffffffffffffffff82111561163a576116396115a4565b5b61164382611593565b9050602081019050919050565b60005b8381101561166e578082015181840152602081019050611653565b60008484015250505050565b600061168d6116888461161f565b611604565b9050828152602081018484840111156116a9576116a861158e565b5b6116b4848285611650565b509392505050565b600082601f8301126116d1576116d0611589565b5b81516116e184826020860161167a565b91505092915050565b6000819050919050565b6116fd816116ea565b811461170857600080fd5b50565b60008151905061171a816116f4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061174b82611720565b9050919050565b61175b81611740565b811461176657600080fd5b50565b60008151905061177881611752565b92915050565b600080600080608085870312156117985761179761157f565b5b600085015167ffffffffffffffff8111156117b6576117b5611584565b5b6117c2878288016116bc565b945050602085015167ffffffffffffffff8111156117e3576117e2611584565b5b6117ef878288016116bc565b93505060406118008782880161170b565b925050606061181187828801611769565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061186f57607f821691505b60208210810361188257611881611828565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026118ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826118ad565b6118f486836118ad565b95508019841693508086168417925050509392505050565b6000819050919050565b600061193161192c611927846116ea565b61190c565b6116ea565b9050919050565b6000819050919050565b61194b83611916565b61195f61195782611938565b8484546118ba565b825550505050565b600090565b611974611967565b61197f818484611942565b505050565b5b818110156119a35761199860008261196c565b600181019050611985565b5050565b601f8211156119e8576119b981611888565b6119c28461189d565b810160208510156119d1578190505b6119e56119dd8561189d565b830182611984565b50505b505050565b600082821c905092915050565b6000611a0b600019846008026119ed565b1980831691505092915050565b6000611a2483836119fa565b9150826002028217905092915050565b611a3d8261181d565b67ffffffffffffffff811115611a5657611a556115a4565b5b611a608254611857565b611a6b8282856119a7565b600060209050601f831160018114611a9e5760008415611a8c578287015190505b611a968582611a18565b865550611afe565b601f198416611aac86611888565b60005b82811015611ad457848901518255600182019150602085019450602081019050611aaf565b86831015611af15784890151611aed601f8916826119fa565b8355505b6001600288020188555050505b505050505050565b611b0f81611740565b82525050565b6000602082019050611b2a6000830184611b06565b92915050565b600060208284031215611b4657611b4561157f565b5b6000611b5484828501611769565b91505092915050565b6000604082019050611b726000830185611b06565b611b7f6020830184611b06565b9392505050565b600082825260208201905092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b6000611bcd601383611b86565b9150611bd882611b97565b602082019050919050565b60006020820190508181036000830152611bfc81611bc0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611c3d826116ea565b9150611c48836116ea565b9250828203905081811115611c6057611c5f611c03565b5b92915050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b6000611c9c601e83611b86565b9150611ca782611c66565b602082019050919050565b60006020820190508181036000830152611ccb81611c8f565b9050919050565b6000611cdd826116ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d0f57611d0e611c03565b5b600182019050919050565b6000611d25826116ea565b9150611d30836116ea565b9250828202611d3e816116ea565b91508282048414831517611d5557611d54611c03565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611d96826116ea565b9150611da1836116ea565b925082611db157611db0611d5c565b5b828204905092915050565b6000611dc7826116ea565b9150611dd2836116ea565b9250828201905080821115611dea57611de9611c03565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b6000611e26601883611b86565b9150611e3182611df0565b602082019050919050565b60006020820190508181036000830152611e5581611e19565b9050919050565b611e65816116ea565b82525050565b6000602082019050611e806000830184611e5c565b92915050565b6000606082019050611e9b6000830186611b06565b611ea86020830185611e5c565b611eb56040830184611e5c565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000611f11611f0c611f0784611eec565b61190c565b6116ea565b9050919050565b611f2181611ef6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611f5c81611740565b82525050565b6000611f6e8383611f53565b60208301905092915050565b6000602082019050919050565b6000611f9282611f27565b611f9c8185611f32565b9350611fa783611f43565b8060005b83811015611fd8578151611fbf8882611f62565b9750611fca83611f7a565b925050600181019050611fab565b5085935050505092915050565b6000604082019050611ffa6000830185611f18565b818103602083015261200c8184611f87565b90509392505050565b600067ffffffffffffffff8211156120305761202f6115a4565b5b602082029050602081019050919050565b600080fd5b600061205961205484612015565b611604565b9050808382526020820190506020840283018581111561207c5761207b612041565b5b835b818110156120a55780612091888261170b565b84526020840193505060208101905061207e565b5050509392505050565b600082601f8301126120c4576120c3611589565b5b81516120d4848260208601612046565b91505092915050565b6000602082840312156120f3576120f261157f565b5b600082015167ffffffffffffffff81111561211157612110611584565b5b61211d848285016120af565b91505092915050565b6000819050919050565b600061214b61214661214184612126565b61190c565b6116ea565b9050919050565b61215b81612130565b82525050565b600060a0820190506121766000830188611e5c565b6121836020830187612152565b81810360408301526121958186611f87565b90506121a46060830185611b06565b6121b16080830184611e5c565b9695505050505050565b60805160a05160c05160e0516129446122256000396000610adf0152600081816119d70152611bd60152600081816109650152818161129001526112e801526000818161068701528181610f9401528181610fe60152818161107f015261192201526129446000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146104ea578063f0f442601461051a578063f2fde38b14610536578063fd6d0eb314610552576101c4565b8063a9059cbb14610480578063d523e092146104b0578063dbb64d4b146104ba576101c4565b80638da5cb5b116100d35780638da5cb5b1461040757806395d89b4114610425578063a25ba18314610443578063a8aa1b3114610462576101c4565b806370a08231146103c3578063715018a6146103f35780638a8c523c146103fd576101c4565b806332cb6b0c116101665780634fbee193116101405780634fbee19314610329578063590ffdce1461035957806361d027b3146103755780636dd3d39f14610393576101c4565b806332cb6b0c146102d157806341220104146102ef57806348cd4cb11461030b576101c4565b806318160ddd116101a257806318160ddd1461023557806321b024861461025357806323b872dd14610283578063313ce567146102b3576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630c18d4ce14610217575b600080fd5b6101d1610570565b6040516101de9190611d84565b60405180910390f35b61020160048036038101906101fc9190611e4e565b610602565b60405161020e9190611ea9565b60405180910390f35b61021f610625565b60405161022c9190611ed3565b60405180910390f35b61023d61062b565b60405161024a9190611ed3565b60405180910390f35b61026d60048036038101906102689190611eee565b610635565b60405161027a9190611ed3565b60405180910390f35b61029d60048036038101906102989190611f1b565b61064d565b6040516102aa9190611ea9565b60405180910390f35b6102bb61067c565b6040516102c89190611f8a565b60405180910390f35b6102d9610685565b6040516102e69190611ed3565b60405180910390f35b61030960048036038101906103049190611fd1565b6106a9565b005b61031361070c565b6040516103209190611ed3565b60405180910390f35b610343600480360381019061033e9190612011565b610712565b6040516103509190611ea9565b60405180910390f35b610373600480360381019061036e9190611fd1565b610732565b005b61037d610795565b60405161038a919061204d565b60405180910390f35b6103ad60048036038101906103a89190612011565b6107bb565b6040516103ba9190611ea9565b60405180910390f35b6103dd60048036038101906103d89190612011565b6107db565b6040516103ea9190611ed3565b60405180910390f35b6103fb610823565b005b610405610837565b005b61040f610894565b60405161041c919061204d565b60405180910390f35b61042d6108be565b60405161043a9190611d84565b60405180910390f35b61044b610950565b604051610459929190612068565b60405180910390f35b61046a610963565b604051610477919061204d565b60405180910390f35b61049a60048036038101906104959190611e4e565b610987565b6040516104a79190611ea9565b60405180910390f35b6104b86109aa565b005b6104d460048036038101906104cf9190611eee565b6109cf565b6040516104e19190611ed3565b60405180910390f35b61050460048036038101906104ff9190612091565b6109e7565b6040516105119190611ed3565b60405180910390f35b610534600480360381019061052f9190612011565b610a6e565b005b610550600480360381019061054b9190612011565b610bec565b005b61055a610c72565b6040516105679190611ea9565b60405180910390f35b60606003805461057f90612100565b80601f01602080910402602001604051908101604052809291908181526020018280546105ab90612100565b80156105f85780601f106105cd576101008083540402835291602001916105f8565b820191906000526020600020905b8154815290600101906020018083116105db57829003601f168201915b5050505050905090565b60008061060d610c85565b905061061a818585610c8d565b600191505092915050565b60085481565b6000600254905090565b600c6020528060005260406000206000915090505481565b600080610658610c85565b9050610665858285610c9f565b610670858585610d34565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106b1610e28565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b600a6020528060005260406000206000915054906101000a900460ff1681565b61073a610e28565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61082b610e28565b6108356000610eaf565b565b61083f610e28565b600060075414610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b9061217d565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108cd90612100565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990612100565b80156109465780601f1061091b57610100808354040283529160200191610946565b820191906000526020600020905b81548152906001019060200180831161092957829003601f168201915b5050505050905090565b60008061095b610f75565b915091509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610992610c85565b905061099f818585610d34565b600191505092915050565b6109b2610e28565b6001600960006101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906121e9565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b695750610b3a610894565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f90612255565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bf4610e28565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c665760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c5d919061204d565b60405180910390fd5b610c6f81610eaf565b50565b600960009054906101000a900460ff1681565b600033905090565b610c9a83838360016110a6565b505050565b6000610cab84846109e7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610d2e5781811015610d1e578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d1593929190612275565b60405180910390fd5b610d2d848484840360006110a6565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610da65760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d9d919061204d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e185760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e0f919061204d565b60405180910390fd5b610e2383838361127d565b505050565b610e30610c85565b73ffffffffffffffffffffffffffffffffffffffff16610e4e610894565b73ffffffffffffffffffffffffffffffffffffffff1614610ead57610e71610c85565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ea4919061204d565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600160075443610f8891906122db565b1015610fc657600060c87f0000000000000000000000000000000000000000000000000000000000000000610fbd919061233e565b915091506110a2565b600060085442610fd691906122db565b9050610e108110156110585760c87f000000000000000000000000000000000000000000000000000000000000000061100f919061233e565b91506000610fa0905060006101f49050610e10818361102e91906122db565b84611039919061236f565b611043919061233e565b8261104e91906122db565b94505050506110a2565b600960009054906101000a900460ff16611074576101f4611077565b60005b61ffff1692507f00000000000000000000000000000000000000000000000000000000000000009150505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111185760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161110f919061204d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361118a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611181919061204d565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611277578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161126e9190611ed3565b60405180910390a35b50505050565b600080611288610f75565b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050808061133657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1561161a57600060075411806113955750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb906123fd565b60405180910390fd5b8080156113ee57506001600754436113ec91906122db565b105b15611474576032600c600043815260200190815260200160002054111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612469565b60405180910390fd5b600c6000438152602001908152602001600020600081548092919061146e90612489565b91905055505b600083146115b2578080156114d35750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561151057600061271084866114e9919061236f565b6114f3919061233e565b9050808561150191906122db565b945061150e8730836116d7565b505b801580156115685750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156115ad576000612710848661157e919061236f565b611588919061233e565b9050808561159691906122db565b94506115a38730836116d7565b6115ab6118fc565b505b611619565b8015801561160a5750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611618576116176118fc565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611685575081611677866107db565b8561168291906124d1565b11155b6116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90612551565b60405180910390fd5b6116cf8686866116d7565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361172957806002600082825461171d91906124d1565b925050819055506117fc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117b5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117ac93929190612275565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118455780600260008282540392505081905550611892565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ef9190611ed3565b60405180910390a3505050565b60006008544261190c91906122db565b905061012c81101561191e5750611cf2565b60c87f000000000000000000000000000000000000000000000000000000000000000061194b919061233e565b600d600043815260200190815260200160002054111561196b5750611cf2565b6000611976306107db565b905060008103611987575050611cf2565b6000600267ffffffffffffffff8111156119a4576119a3612571565b5b6040519080825280602002602001820160405280156119d25781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a0a57611a096125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611a5957611a586125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611aec9291906126d2565b600060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b329190612830565b600181518110611b4557611b446125a0565b5b6020026020010151905080831115611b5b578092505b82600d60004381526020019081526020016000206000828254611b7e91906124d1565b925050819055503082600081518110611b9a57611b996125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000082600181518110611c0957611c086125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611cbb9594939291906128b4565b600060405180830381600087803b158015611cd557600080fd5b505af1158015611ce9573d6000803e3d6000fd5b50505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d2e578082015181840152602081019050611d13565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d5682611cf4565b611d608185611cff565b9350611d70818560208601611d10565b611d7981611d3a565b840191505092915050565b60006020820190508181036000830152611d9e8184611d4b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611de582611dba565b9050919050565b611df581611dda565b8114611e0057600080fd5b50565b600081359050611e1281611dec565b92915050565b6000819050919050565b611e2b81611e18565b8114611e3657600080fd5b50565b600081359050611e4881611e22565b92915050565b60008060408385031215611e6557611e64611db0565b5b6000611e7385828601611e03565b9250506020611e8485828601611e39565b9150509250929050565b60008115159050919050565b611ea381611e8e565b82525050565b6000602082019050611ebe6000830184611e9a565b92915050565b611ecd81611e18565b82525050565b6000602082019050611ee86000830184611ec4565b92915050565b600060208284031215611f0457611f03611db0565b5b6000611f1284828501611e39565b91505092915050565b600080600060608486031215611f3457611f33611db0565b5b6000611f4286828701611e03565b9350506020611f5386828701611e03565b9250506040611f6486828701611e39565b9150509250925092565b600060ff82169050919050565b611f8481611f6e565b82525050565b6000602082019050611f9f6000830184611f7b565b92915050565b611fae81611e8e565b8114611fb957600080fd5b50565b600081359050611fcb81611fa5565b92915050565b60008060408385031215611fe857611fe7611db0565b5b6000611ff685828601611e03565b925050602061200785828601611fbc565b9150509250929050565b60006020828403121561202757612026611db0565b5b600061203584828501611e03565b91505092915050565b61204781611dda565b82525050565b6000602082019050612062600083018461203e565b92915050565b600060408201905061207d6000830185611ec4565b61208a6020830184611ec4565b9392505050565b600080604083850312156120a8576120a7611db0565b5b60006120b685828601611e03565b92505060206120c785828601611e03565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211857607f821691505b60208210810361212b5761212a6120d1565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b6000612167601783611cff565b915061217282612131565b602082019050919050565b600060208201905081810360008301526121968161215a565b9050919050565b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b60006121d3600d83611cff565b91506121de8261219d565b602082019050919050565b60006020820190508181036000830152612202816121c6565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b600061223f600d83611cff565b915061224a82612209565b602082019050919050565b6000602082019050818103600083015261226e81612232565b9050919050565b600060608201905061228a600083018661203e565b6122976020830185611ec4565b6122a46040830184611ec4565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122e682611e18565b91506122f183611e18565b9250828203905081811115612309576123086122ac565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061234982611e18565b915061235483611e18565b9250826123645761236361230f565b5b828204905092915050565b600061237a82611e18565b915061238583611e18565b925082820261239381611e18565b915082820484148315176123aa576123a96122ac565b5b5092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b60006123e7601383611cff565b91506123f2826123b1565b602082019050919050565b60006020820190508181036000830152612416816123da565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b6000612453601e83611cff565b915061245e8261241d565b602082019050919050565b6000602082019050818103600083015261248281612446565b9050919050565b600061249482611e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c6576124c56122ac565b5b600182019050919050565b60006124dc82611e18565b91506124e783611e18565b92508282019050808211156124ff576124fe6122ac565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b600061253b601883611cff565b915061254682612505565b602082019050919050565b6000602082019050818103600083015261256a8161252e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006125fe6125f96125f4846125cf565b6125d9565b611e18565b9050919050565b61260e816125e3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61264981611dda565b82525050565b600061265b8383612640565b60208301905092915050565b6000602082019050919050565b600061267f82612614565b612689818561261f565b935061269483612630565b8060005b838110156126c55781516126ac888261264f565b97506126b783612667565b925050600181019050612698565b5085935050505092915050565b60006040820190506126e76000830185612605565b81810360208301526126f98184612674565b90509392505050565b600080fd5b61271082611d3a565b810181811067ffffffffffffffff8211171561272f5761272e612571565b5b80604052505050565b6000612742611da6565b905061274e8282612707565b919050565b600067ffffffffffffffff82111561276e5761276d612571565b5b602082029050602081019050919050565b600080fd5b60008151905061279381611e22565b92915050565b60006127ac6127a784612753565b612738565b905080838252602082019050602084028301858111156127cf576127ce61277f565b5b835b818110156127f857806127e48882612784565b8452602084019350506020810190506127d1565b5050509392505050565b600082601f83011261281757612816612702565b5b8151612827848260208601612799565b91505092915050565b60006020828403121561284657612845611db0565b5b600082015167ffffffffffffffff81111561286457612863611db5565b5b61287084828501612802565b91505092915050565b6000819050919050565b600061289e61289961289484612879565b6125d9565b611e18565b9050919050565b6128ae81612883565b82525050565b600060a0820190506128c96000830188611ec4565b6128d660208301876128a5565b81810360408301526128e88186612674565b90506128f7606083018561203e565b6129046080830184611ec4565b969550505050505056fea26469706673582212203e546091fb540e46be1977c9aaa7a4decc99d6fd0e13befa1dadf30c6f931d1964736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000115eec47f6cf7e350000000000000000000000000000003b21507c9a072534a57c0d972f9a19d9245c05db0000000000000000000000000000000000000000000000000000000000000005566970657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035649500000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a9059cbb11610097578063dd62ed3e11610071578063dd62ed3e146104ea578063f0f442601461051a578063f2fde38b14610536578063fd6d0eb314610552576101c4565b8063a9059cbb14610480578063d523e092146104b0578063dbb64d4b146104ba576101c4565b80638da5cb5b116100d35780638da5cb5b1461040757806395d89b4114610425578063a25ba18314610443578063a8aa1b3114610462576101c4565b806370a08231146103c3578063715018a6146103f35780638a8c523c146103fd576101c4565b806332cb6b0c116101665780634fbee193116101405780634fbee19314610329578063590ffdce1461035957806361d027b3146103755780636dd3d39f14610393576101c4565b806332cb6b0c146102d157806341220104146102ef57806348cd4cb11461030b576101c4565b806318160ddd116101a257806318160ddd1461023557806321b024861461025357806323b872dd14610283578063313ce567146102b3576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630c18d4ce14610217575b600080fd5b6101d1610570565b6040516101de9190611d84565b60405180910390f35b61020160048036038101906101fc9190611e4e565b610602565b60405161020e9190611ea9565b60405180910390f35b61021f610625565b60405161022c9190611ed3565b60405180910390f35b61023d61062b565b60405161024a9190611ed3565b60405180910390f35b61026d60048036038101906102689190611eee565b610635565b60405161027a9190611ed3565b60405180910390f35b61029d60048036038101906102989190611f1b565b61064d565b6040516102aa9190611ea9565b60405180910390f35b6102bb61067c565b6040516102c89190611f8a565b60405180910390f35b6102d9610685565b6040516102e69190611ed3565b60405180910390f35b61030960048036038101906103049190611fd1565b6106a9565b005b61031361070c565b6040516103209190611ed3565b60405180910390f35b610343600480360381019061033e9190612011565b610712565b6040516103509190611ea9565b60405180910390f35b610373600480360381019061036e9190611fd1565b610732565b005b61037d610795565b60405161038a919061204d565b60405180910390f35b6103ad60048036038101906103a89190612011565b6107bb565b6040516103ba9190611ea9565b60405180910390f35b6103dd60048036038101906103d89190612011565b6107db565b6040516103ea9190611ed3565b60405180910390f35b6103fb610823565b005b610405610837565b005b61040f610894565b60405161041c919061204d565b60405180910390f35b61042d6108be565b60405161043a9190611d84565b60405180910390f35b61044b610950565b604051610459929190612068565b60405180910390f35b61046a610963565b604051610477919061204d565b60405180910390f35b61049a60048036038101906104959190611e4e565b610987565b6040516104a79190611ea9565b60405180910390f35b6104b86109aa565b005b6104d460048036038101906104cf9190611eee565b6109cf565b6040516104e19190611ed3565b60405180910390f35b61050460048036038101906104ff9190612091565b6109e7565b6040516105119190611ed3565b60405180910390f35b610534600480360381019061052f9190612011565b610a6e565b005b610550600480360381019061054b9190612011565b610bec565b005b61055a610c72565b6040516105679190611ea9565b60405180910390f35b60606003805461057f90612100565b80601f01602080910402602001604051908101604052809291908181526020018280546105ab90612100565b80156105f85780601f106105cd576101008083540402835291602001916105f8565b820191906000526020600020905b8154815290600101906020018083116105db57829003601f168201915b5050505050905090565b60008061060d610c85565b905061061a818585610c8d565b600191505092915050565b60085481565b6000600254905090565b600c6020528060005260406000206000915090505481565b600080610658610c85565b9050610665858285610c9f565b610670858585610d34565b60019150509392505050565b60006012905090565b7f000000000000000000000000000000000000000000115eec47f6cf7e3500000081565b6106b1610e28565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60075481565b600a6020528060005260406000206000915054906101000a900460ff1681565b61073a610e28565b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61082b610e28565b6108356000610eaf565b565b61083f610e28565b600060075414610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b9061217d565b60405180910390fd5b4360078190555042600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546108cd90612100565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990612100565b80156109465780601f1061091b57610100808354040283529160200191610946565b820191906000526020600020905b81548152906001019060200180831161092957829003601f168201915b5050505050905090565b60008061095b610f75565b915091509091565b7f0000000000000000000000005e1e904c87fbc23c5006d8eee11d02837e98391681565b600080610992610c85565b905061099f818585610d34565b600191505092915050565b6109b2610e28565b6001600960006101000a81548160ff021916908315150217905550565b600d6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad4906121e9565b60405180910390fd5b7f00000000000000000000000054e2c3ff8781410ff582e32092367666c4a56d7d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b695750610b3a610894565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f90612255565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bf4610e28565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c665760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c5d919061204d565b60405180910390fd5b610c6f81610eaf565b50565b600960009054906101000a900460ff1681565b600033905090565b610c9a83838360016110a6565b505050565b6000610cab84846109e7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610d2e5781811015610d1e578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d1593929190612275565b60405180910390fd5b610d2d848484840360006110a6565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610da65760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d9d919061204d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e185760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e0f919061204d565b60405180910390fd5b610e2383838361127d565b505050565b610e30610c85565b73ffffffffffffffffffffffffffffffffffffffff16610e4e610894565b73ffffffffffffffffffffffffffffffffffffffff1614610ead57610e71610c85565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ea4919061204d565b60405180910390fd5b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600160075443610f8891906122db565b1015610fc657600060c87f000000000000000000000000000000000000000000115eec47f6cf7e35000000610fbd919061233e565b915091506110a2565b600060085442610fd691906122db565b9050610e108110156110585760c87f000000000000000000000000000000000000000000115eec47f6cf7e3500000061100f919061233e565b91506000610fa0905060006101f49050610e10818361102e91906122db565b84611039919061236f565b611043919061233e565b8261104e91906122db565b94505050506110a2565b600960009054906101000a900460ff16611074576101f4611077565b60005b61ffff1692507f000000000000000000000000000000000000000000115eec47f6cf7e350000009150505b9091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111185760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161110f919061204d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361118a5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611181919061204d565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611277578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161126e9190611ed3565b60405180910390a35b50505050565b600080611288610f75565b9150915060007f0000000000000000000000005e1e904c87fbc23c5006d8eee11d02837e98391673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16149050808061133657507f0000000000000000000000005e1e904c87fbc23c5006d8eee11d02837e98391673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1561161a57600060075411806113955750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb906123fd565b60405180910390fd5b8080156113ee57506001600754436113ec91906122db565b105b15611474576032600c600043815260200190815260200160002054111561144a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144190612469565b60405180910390fd5b600c6000438152602001908152602001600020600081548092919061146e90612489565b91905055505b600083146115b2578080156114d35750600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561151057600061271084866114e9919061236f565b6114f3919061233e565b9050808561150191906122db565b945061150e8730836116d7565b505b801580156115685750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156115ad576000612710848661157e919061236f565b611588919061233e565b9050808561159691906122db565b94506115a38730836116d7565b6115ab6118fc565b505b611619565b8015801561160a5750600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611618576116176118fc565b5b5b5b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611685575081611677866107db565b8561168291906124d1565b11155b6116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90612551565b60405180910390fd5b6116cf8686866116d7565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361172957806002600082825461171d91906124d1565b925050819055506117fc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117b5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016117ac93929190612275565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036118455780600260008282540392505081905550611892565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118ef9190611ed3565b60405180910390a3505050565b60006008544261190c91906122db565b905061012c81101561191e5750611cf2565b60c87f000000000000000000000000000000000000000000115eec47f6cf7e3500000061194b919061233e565b600d600043815260200190815260200160002054111561196b5750611cf2565b6000611976306107db565b905060008103611987575050611cf2565b6000600267ffffffffffffffff8111156119a4576119a3612571565b5b6040519080825280602002602001820160405280156119d25781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110611a0a57611a096125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110611a5957611a586125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f670de0b6b3a7640000846040518363ffffffff1660e01b8152600401611aec9291906126d2565b600060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611b329190612830565b600181518110611b4557611b446125a0565b5b6020026020010151905080831115611b5b578092505b82600d60004381526020019081526020016000206000828254611b7e91906124d1565b925050819055503082600081518110611b9a57611b996125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc282600181518110611c0957611c086125a0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94784600085600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611cbb9594939291906128b4565b600060405180830381600087803b158015611cd557600080fd5b505af1158015611ce9573d6000803e3d6000fd5b50505050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d2e578082015181840152602081019050611d13565b60008484015250505050565b6000601f19601f8301169050919050565b6000611d5682611cf4565b611d608185611cff565b9350611d70818560208601611d10565b611d7981611d3a565b840191505092915050565b60006020820190508181036000830152611d9e8184611d4b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611de582611dba565b9050919050565b611df581611dda565b8114611e0057600080fd5b50565b600081359050611e1281611dec565b92915050565b6000819050919050565b611e2b81611e18565b8114611e3657600080fd5b50565b600081359050611e4881611e22565b92915050565b60008060408385031215611e6557611e64611db0565b5b6000611e7385828601611e03565b9250506020611e8485828601611e39565b9150509250929050565b60008115159050919050565b611ea381611e8e565b82525050565b6000602082019050611ebe6000830184611e9a565b92915050565b611ecd81611e18565b82525050565b6000602082019050611ee86000830184611ec4565b92915050565b600060208284031215611f0457611f03611db0565b5b6000611f1284828501611e39565b91505092915050565b600080600060608486031215611f3457611f33611db0565b5b6000611f4286828701611e03565b9350506020611f5386828701611e03565b9250506040611f6486828701611e39565b9150509250925092565b600060ff82169050919050565b611f8481611f6e565b82525050565b6000602082019050611f9f6000830184611f7b565b92915050565b611fae81611e8e565b8114611fb957600080fd5b50565b600081359050611fcb81611fa5565b92915050565b60008060408385031215611fe857611fe7611db0565b5b6000611ff685828601611e03565b925050602061200785828601611fbc565b9150509250929050565b60006020828403121561202757612026611db0565b5b600061203584828501611e03565b91505092915050565b61204781611dda565b82525050565b6000602082019050612062600083018461203e565b92915050565b600060408201905061207d6000830185611ec4565b61208a6020830184611ec4565b9392505050565b600080604083850312156120a8576120a7611db0565b5b60006120b685828601611e03565b92505060206120c785828601611e03565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061211857607f821691505b60208210810361212b5761212a6120d1565b5b50919050565b7f74726164696e672d616c72656164792d656e61626c6564000000000000000000600082015250565b6000612167601783611cff565b915061217282612131565b602082019050919050565b600060208201905081810360008301526121968161215a565b9050919050565b7f74726561737572792d69732d3000000000000000000000000000000000000000600082015250565b60006121d3600d83611cff565b91506121de8261219d565b602082019050919050565b60006020820190508181036000830152612202816121c6565b9050919050565b7f6f6e6c792d6465706c6f79657200000000000000000000000000000000000000600082015250565b600061223f600d83611cff565b915061224a82612209565b602082019050919050565b6000602082019050818103600083015261226e81612232565b9050919050565b600060608201905061228a600083018661203e565b6122976020830185611ec4565b6122a46040830184611ec4565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122e682611e18565b91506122f183611e18565b9250828203905081811115612309576123086122ac565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061234982611e18565b915061235483611e18565b9250826123645761236361230f565b5b828204905092915050565b600061237a82611e18565b915061238583611e18565b925082820261239381611e18565b915082820484148315176123aa576123a96122ac565b5b5092915050565b7f74726164696e672d6e6f742d656e61626c656400000000000000000000000000600082015250565b60006123e7601383611cff565b91506123f2826123b1565b602082019050919050565b60006020820190508181036000830152612416816123da565b9050919050565b7f6d61782d6275792d7478732d7065722d626c6f636b2d65786365656465640000600082015250565b6000612453601e83611cff565b915061245e8261241d565b602082019050919050565b6000602082019050818103600083015261248281612446565b9050919050565b600061249482611e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124c6576124c56122ac565b5b600182019050919050565b60006124dc82611e18565b91506124e783611e18565b92508282019050808211156124ff576124fe6122ac565b5b92915050565b7f6d61782d77616c6c65742d73697a652d65786365656465640000000000000000600082015250565b600061253b601883611cff565b915061254682612505565b602082019050919050565b6000602082019050818103600083015261256a8161252e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b60006125fe6125f96125f4846125cf565b6125d9565b611e18565b9050919050565b61260e816125e3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61264981611dda565b82525050565b600061265b8383612640565b60208301905092915050565b6000602082019050919050565b600061267f82612614565b612689818561261f565b935061269483612630565b8060005b838110156126c55781516126ac888261264f565b97506126b783612667565b925050600181019050612698565b5085935050505092915050565b60006040820190506126e76000830185612605565b81810360208301526126f98184612674565b90509392505050565b600080fd5b61271082611d3a565b810181811067ffffffffffffffff8211171561272f5761272e612571565b5b80604052505050565b6000612742611da6565b905061274e8282612707565b919050565b600067ffffffffffffffff82111561276e5761276d612571565b5b602082029050602081019050919050565b600080fd5b60008151905061279381611e22565b92915050565b60006127ac6127a784612753565b612738565b905080838252602082019050602084028301858111156127cf576127ce61277f565b5b835b818110156127f857806127e48882612784565b8452602084019350506020810190506127d1565b5050509392505050565b600082601f83011261281757612816612702565b5b8151612827848260208601612799565b91505092915050565b60006020828403121561284657612845611db0565b5b600082015167ffffffffffffffff81111561286457612863611db5565b5b61287084828501612802565b91505092915050565b6000819050919050565b600061289e61289961289484612879565b6125d9565b611e18565b9050919050565b6128ae81612883565b82525050565b600060a0820190506128c96000830188611ec4565b6128d660208301876128a5565b81810360408301526128e88186612674565b90506128f7606083018561203e565b6129046080830184611ec4565b969550505050505056fea26469706673582212203e546091fb540e46be1977c9aaa7a4decc99d6fd0e13befa1dadf30c6f931d1964736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000115eec47f6cf7e350000000000000000000000000000003b21507c9a072534a57c0d972f9a19d9245c05db0000000000000000000000000000000000000000000000000000000000000005566970657200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035649500000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Viper
Arg [1] : symbol (string): VIP
Arg [2] : maxSupply (uint256): 21000000000000000000000000
Arg [3] : _treasury (address): 0x3B21507C9A072534A57C0d972f9a19d9245c05db
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000115eec47f6cf7e35000000
Arg [3] : 0000000000000000000000003b21507c9a072534a57c0d972f9a19d9245c05db
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 5669706572000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5649500000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.