ETH Price: $3,545.85 (-0.79%)

Token

Viper (VIP)
 

Overview

Max Total Supply

21,000,000 VIP

Holders

203

Transfers

-
2

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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
// 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;
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

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"}]

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
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.