ETH Price: $3,621.12 (+5.83%)

Contract

0xB777eb033557490abb7Fb8F3948000826423Ea07
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve211995472024-11-16 10:05:3511 days ago1731751535IN
0xB777eb03...26423Ea07
0 ETH0.0006442513.93282395
Approve211945052024-11-15 17:12:2312 days ago1731690743IN
0xB777eb03...26423Ea07
0 ETH0.0013170328.48254779
Transfer209734302024-10-15 20:44:2343 days ago1729025063IN
0xB777eb03...26423Ea07
0 ETH0.0009868317.55098991
Approve209734002024-10-15 20:38:2343 days ago1729024703IN
0xB777eb03...26423Ea07
0 ETH0.000995921.41556166
Transfer209733972024-10-15 20:37:4743 days ago1729024667IN
0xB777eb03...26423Ea07
0 ETH0.0011124919.78154953
Transfer209733742024-10-15 20:32:5943 days ago1729024379IN
0xB777eb03...26423Ea07
0 ETH0.0010204918.14563377
Approve209733622024-10-15 20:30:3543 days ago1729024235IN
0xB777eb03...26423Ea07
0 ETH0.0008321517.89419958
Approve209733022024-10-15 20:18:3543 days ago1729023515IN
0xB777eb03...26423Ea07
0 ETH0.0008538318.36042766
Approve209670922024-10-14 23:29:3544 days ago1728948575IN
0xB777eb03...26423Ea07
0 ETH0.0007669216.49161471
Approve208997562024-10-05 13:52:4753 days ago1728136367IN
0xB777eb03...26423Ea07
0 ETH0.0006252813.44573258
Transfer208754852024-10-02 4:41:1157 days ago1727844071IN
0xB777eb03...26423Ea07
0 ETH0.000377976.72081924
Approve208442672024-09-27 20:11:2361 days ago1727467883IN
0xB777eb03...26423Ea07
0 ETH0.0010338222.23092593
Approve208442482024-09-27 20:07:3561 days ago1727467655IN
0xB777eb03...26423Ea07
0 ETH0.0010540322.66550364
Approve208442282024-09-27 20:03:3561 days ago1727467415IN
0xB777eb03...26423Ea07
0 ETH0.0011803625.38208284
Approve208442262024-09-27 20:03:1161 days ago1727467391IN
0xB777eb03...26423Ea07
0 ETH0.0011849525.48077606
Approve208442262024-09-27 20:03:1161 days ago1727467391IN
0xB777eb03...26423Ea07
0 ETH0.0014639831.48077606
Approve208442252024-09-27 20:02:5961 days ago1727467379IN
0xB777eb03...26423Ea07
0 ETH0.001199725.79779617
Approve208442242024-09-27 20:02:4761 days ago1727467367IN
0xB777eb03...26423Ea07
0 ETH0.0010619522.83575763
Approve208442222024-09-27 20:02:2361 days ago1727467343IN
0xB777eb03...26423Ea07
0 ETH0.0015269832.83552423
Approve208442202024-09-27 20:01:5961 days ago1727467319IN
0xB777eb03...26423Ea07
0 ETH0.001198325.76770645
Approve208442072024-09-27 19:59:2361 days ago1727467163IN
0xB777eb03...26423Ea07
0 ETH0.0011249524.19039633
Approve208410232024-09-27 9:20:2361 days ago1727428823IN
0xB777eb03...26423Ea07
0 ETH0.0003719715.35837809
Approve206854592024-09-05 16:03:5983 days ago1725552239IN
0xB777eb03...26423Ea07
0 ETH0.000169743.65019699
Approve205922142024-08-23 15:32:1196 days ago1724427131IN
0xB777eb03...26423Ea07
0 ETH0.000245685.3119343
Approve205884352024-08-23 2:50:2397 days ago1724381423IN
0xB777eb03...26423Ea07
0 ETH0.000050281.08715255
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
211995502024-11-16 10:06:1111 days ago1731751571
0xB777eb03...26423Ea07
0.04672257 ETH
211995502024-11-16 10:06:1111 days ago1731751571
0xB777eb03...26423Ea07
0.01335343 ETH
211995502024-11-16 10:06:1111 days ago1731751571
0xB777eb03...26423Ea07
0.06007601 ETH
211995502024-11-16 10:06:1111 days ago1731751571
0xB777eb03...26423Ea07
0.00334558 ETH
211995502024-11-16 10:06:1111 days ago1731751571
0xB777eb03...26423Ea07
0.00334558 ETH
209789002024-10-16 15:04:1142 days ago1729091051
0xB777eb03...26423Ea07
0.08327888 ETH
209789002024-10-16 15:04:1142 days ago1729091051
0xB777eb03...26423Ea07
0.02380643 ETH
209789002024-10-16 15:04:1142 days ago1729091051
0xB777eb03...26423Ea07
0.10708532 ETH
209789002024-10-16 15:04:1142 days ago1729091051
0xB777eb03...26423Ea07
0.00597342 ETH
209789002024-10-16 15:04:1142 days ago1729091051
0xB777eb03...26423Ea07
0.00597342 ETH
208925072024-10-04 13:38:1154 days ago1728049091
0xB777eb03...26423Ea07
0.02461251 ETH
208925072024-10-04 13:38:1154 days ago1728049091
0xB777eb03...26423Ea07
0.00703326 ETH
208925072024-10-04 13:38:1154 days ago1728049091
0xB777eb03...26423Ea07
0.03164577 ETH
208925072024-10-04 13:38:1154 days ago1728049091
0xB777eb03...26423Ea07
0.00176026 ETH
208925072024-10-04 13:38:1154 days ago1728049091
0xB777eb03...26423Ea07
0.00176026 ETH
208509362024-09-28 18:30:2360 days ago1727548223
0xB777eb03...26423Ea07
0.03349619 ETH
208509362024-09-28 18:30:2360 days ago1727548223
0xB777eb03...26423Ea07
0.00957235 ETH
208509362024-09-28 18:30:2360 days ago1727548223
0xB777eb03...26423Ea07
0.04306855 ETH
208509362024-09-28 18:30:2360 days ago1727548223
0xB777eb03...26423Ea07
0.00239661 ETH
208509362024-09-28 18:30:2360 days ago1727548223
0xB777eb03...26423Ea07
0.00239661 ETH
208446752024-09-27 21:33:1161 days ago1727472791
0xB777eb03...26423Ea07
0.05304614 ETH
208446752024-09-27 21:33:1161 days ago1727472791
0xB777eb03...26423Ea07
0.01516091 ETH
208446752024-09-27 21:33:1161 days ago1727472791
0xB777eb03...26423Ea07
0.06820706 ETH
208446752024-09-27 21:33:1161 days ago1727472791
0xB777eb03...26423Ea07
0.00379876 ETH
208446752024-09-27 21:33:1161 days ago1727472791
0xB777eb03...26423Ea07
0.00379876 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Chad

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
File 1 of 7 : Chad.sol
/**
 $CHAD (Chad Index) is a token that acts as an index of the following tokens: 
  
  - Rollbit (RLB)
  - Sanko Game Corporation (DMT)
  - Unibot (UNIBOT)
  - HarryPotterObamaSonic10Inu (BITCOIN)
  - Open Exchange Token (OX)

 All swaps and transfers incur a 5% tax - this value goes to adding liquidity for $CHAD and to purchase tokens.
 $CHAD can be redeemed in equal proportion for the underlyiing assets that the burned amount respresents.

 Website: https://www.chads.life/
 Telegram: https://t.me/ChadIndexPortal
 */
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {ERC20} from "solmate/tokens/ERC20.sol";
import {WETH} from "solmate/tokens/WETH.sol";
import {Owned} from "solmate/auth/Owned.sol";
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
import {IUniswapV2Factory} from "./interfaces/IUniswapV2Factory.sol";
import {IUniswapV2Router} from "./interfaces/IUniswapV2Router.sol";

/**
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣤⣄⡠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣻⣿⣿⣿⣿⣿⣿⣿⠉⠉⠛⠛⠛⠛⠿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⡿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠲⠶⢤⡄⠀⠘⢿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡿⠁⣂⡀⠀⠀⠀⠀⠀⠦⠤⣽⠷⣾⢷⢮⣀⠀⢻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⡷⠟⠉⠀⠀⢀⣠⣶⣶⣶⣤⣠⣤⡟⠈⢻⡿⠀⠘⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠠⠼⠿⢻⣿⣻⣿⣿⣿⣿⣿⣷⣾⣣⣇⡀⢻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⢿⡿⣿⣿⣿⠁⠀⠀⠀⠲⣶⣷⣿⣿⣿⣿⣿⣿⣿⠟⢻⣟⣿⣿⣿⣾⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠃⡼⣁⢀⣿⠁⠀⠀⠀⠀⠀⠉⠙⢿⣿⣿⣿⣿⣿⣿⠀⢸⣿⣿⣿⣿⣭⣛⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡟⠻⡟⣿⣷⡆⠀⠀⠀⠀⠀⢀⣠⣬⣿⣿⣿⣿⡋⠀⠈⢻⣟⣿⣌⣻⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⢷⣤⢁⣿⡿⣿⣀⣀⢀⡀⣼⠿⠟⢋⣿⣿⣿⣯⢉⣓⣂⠈⣿⠙⣿⠉⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠡⣤⡷⣾⣿⠷⢻⣿⣷⣿⣿⡟⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⡟⣿⣼⣷⠀⣼⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢀⣿⠛⣷⣴⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠗⢿⣽⡏⣸⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⣿⣟⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡻⢶⣿⣏⣙⡋⢳⣦⣿⣵⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣭⣽⣿⣿⡊⢹⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠉⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⡃⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠈⠹⠻⣿⣿⣿⣿⢟⣿⣿⣿⣿⣿⣿⣿⣿⡿⠇⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣠⣤⠶⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠒⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣀⣤⡶⠖⠛⠛⠉⠉⣁⣤⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⣿⣿⡿⠉⠁⢸⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣤⣶⠿⠛⠉⠀⠀⠀⠀⠀⠀⣼⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡀⠀⠀⢰⣾⣿⡷⠀⠀⣾⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠟⠁⠀⠀⠃⢀⠈⠉⢁⣨⣭⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢺⡇⠀⣀⣿⣿⡏⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⡀⠀⠠⠆⠒⣿⣶⣾⣿⣿⣿⡿⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠀⣿⣿⡏⠀⢸⠁⠀⡙⠷⢦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣿⣶⣦⣶⣿⣿⣿⣿⣿⣿⣿⣧⣥⣄⡀⠀⠀⠀⣄⣀⠀⠀⡀⠀⠀⠀⣿⣿⣿⢿⣿⢀⣴⡻⠀⠀⣧⠀⠀⠈⠛⠶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣿⣿⣷⣄⠀⠀⠀⠈⠉⠉⠉⠉⠛⠛⠛⠛⠿⠿⠿⣿⣷⣶⣿⣄⠀⢰⣿⢻⣿⣸⣿⣾⠁⠁⠇⠀⢿⣷⡤⣄⣀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠈⠻⠿⣿⣧⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⣀⠀⠈⠉⠙⠿⠷⣿⣏⠀⣿⣿⣿⡇⠀⠈⡀⠀⠈⠻⣷⡈⠻⢿⣤⠀⠈⠻⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠉⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡋⠀⠉⠠⠀⠈⠻⣄⢹⣿⡟⢀⣀⡴⢿⣶⠒⠺⠟⠛⠂⠀⢻⡆⢰⣶⣬⣍⣉⠓⠶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣷⠀⠀⠂⠶⢤⣄⡙⠀⠻⠁⣾⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣾⣿⣿⡟⠋⠙⠓⠂⠙⠓⠒⠶⢤⣤⡀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⠿⠶⠀⠈⠀⠒⠀⢺⣿⣷⣿⣙⡻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣷⣀⢤⡴⢄⠀⠀⠀⠀⠀⠀⠉⠳⠦⣄⠀⠀⠀
⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠀⠀⠘⣿⣿⡿⣿⡟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣯⣷⣘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡀
⠴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠳⣄⠀⢸⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻
⠀⠀⠐⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠄⠀⠀⠙⠀⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⣹⣿⠷⣦⣁⠂⠀⠀⠀⠀⠀⠀
⠤⠄⠀⠀⠀⣀⡀⢀⡀⠤⠀⠉⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣦⠈⠛⢷⣄⠀⠀⠀⠀⠀
⠛⠀⠀⠀⠀⠀⠠⠄⢀⡀⢀⣤⢠⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⠿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣦⠀⠈⠙⠀⠀⠀⠀⠀
⠀⠀⠀⣐⣂⣀⣀⠀⣶⣶⣾⢉⣴⢾⣿⣷⣤⣤⣤⣤⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡄⢀⣀⠀⠄⠈⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣦⡀⣀⣀⣀⣀⠀⢀
 */
contract Chad is ERC20, Owned {
  using SafeTransferLib for ERC20;
  struct User {
    bool isBlacklisted;
    bool isAutomatedMarketMaker;
    bool isExcludedFromFees;
    bool isExcludedFromMaxTransactionAmount;
  }

  struct Fees {
    uint8 buy;
    uint8 sell;
    uint8 liquidity;
    uint8 index;
    uint8 development;
  }

  struct Settings {
    bool limitsInEffect;
    bool swapEnabled;
    bool blacklistRenounced;
    bool feeChangeRenounced;
    bool tradingActive;
    /// @dev Upon enabling trading, record the end block for bot protection fee
    /// @dev This fee is a 90% fee that is reduced by 5% every block for 18 blocks.
    uint216 endBlock;
  }

  uint256 public constant MAX_SUPPLY = 1_000_000_000 * 1e18;
  uint256 public constant MIN_SWAP_AMOUNT = MAX_SUPPLY / 100_000; // 0.001%
  uint256 public constant MAX_SWAP_AMOUNT = (MAX_SUPPLY * 5) / 1_000; // 0.5%

  IUniswapV2Router public immutable uniswapV2Router;
  address public immutable uniswapV2Pair;
  address public immutable index;
  address public immutable developmentWallet;

  uint256 public maxTransactionAmount;
  uint256 public swapTokensAtAmount;
  uint256 public maxWallet;
  uint256 public tokensForBotProtection;

  Fees public feeAmounts;

  bool private _swapping;

  Settings private settings =
    Settings({
      limitsInEffect: true,
      swapEnabled: true,
      blacklistRenounced: false,
      feeChangeRenounced: false,
      tradingActive: false,
      endBlock: uint216(0)
    });

  mapping(address => User) private _users;
  address private wethAddress;

  event ExcludeFromFees(address indexed account, bool isExcluded);
  event ExcludeFromMaxTransaction(address indexed account, bool isExcluded);
  event FailedSwapBackTransfer(address indexed destination, uint256 amount);
  event MaxTransactionAmountUpdated(uint256 newAmount, uint256 oldAmount);
  event SetAutomatedMarketMakerPair(address indexed pair, bool value);
  event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived);
  event SwapTokensAtAmountUpdated(uint256 newAmount, uint256 oldAmount);

  error Chad__BlacklistModificationDisabled();
  error Chad__BuyAmountGreaterThanMax();
  error Chad__CannotBlacklistLPPair();
  error Chad__CannotBlacklistRouter();
  error Chad__CannotRemovePairFromAMMs();
  error Chad__CannotTransferFromAddressZero();
  error Chad__CannotTransferToAddressZero();
  error Chad__ErrorWithdrawingEth();
  error Chad__FeeChangeRenounced();
  error Chad__MaxFeeFivePercent();
  error Chad__MaxTransactionTooLow();
  error Chad__MaxWalletAmountExceeded();
  error Chad__MaxWalletAmountTooLow();
  error Chad__OnlyOwner();
  error Chad__ReceiverBlacklisted();
  error Chad__ReceiverCannotBeAddressZero();
  error Chad__SellAmountGreaterThanMax();
  error Chad__SenderBlacklisted();
  error Chad__StuckEthWithdrawError();
  error Chad__SwapAmountGreaterThanMaximum();
  error Chad__SwapAmountLowerThanMinimum();
  error Chad__TokenAddressCannotBeAddressZero();
  error Chad__TradingNotActive();

  constructor(
    address routerAddress,
    address indexAddress,
    address devWallet
  ) ERC20("CHAD", "Chad Index", 18) Owned(msg.sender) {
    index = indexAddress;
    developmentWallet = devWallet;
    IUniswapV2Router _uniswapV2Router = IUniswapV2Router(routerAddress);
    uniswapV2Router = _uniswapV2Router;
    wethAddress = uniswapV2Router.WETH();
    uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

    maxTransactionAmount = MAX_SUPPLY / 200; // 0.5%
    maxWallet = MAX_SUPPLY / 100; // 1%
    swapTokensAtAmount = (MAX_SUPPLY * 5) / 10_000; // 0.05%
    feeAmounts = Fees({buy: 5, sell: 5, liquidity: 10, index: 70, development: 20});

    _users[msg.sender] = User({
      isExcludedFromFees: true,
      isExcludedFromMaxTransactionAmount: true,
      isAutomatedMarketMaker: false,
      isBlacklisted: false
    });

    _users[address(this)] = User({
      isExcludedFromFees: true,
      isExcludedFromMaxTransactionAmount: true,
      isAutomatedMarketMaker: false,
      isBlacklisted: false
    });

    _users[address(uniswapV2Router)] = User({
      isExcludedFromMaxTransactionAmount: true,
      isAutomatedMarketMaker: false,
      isExcludedFromFees: false,
      isBlacklisted: false
    });

    _users[address(uniswapV2Pair)] = User({
      isExcludedFromMaxTransactionAmount: true,
      isAutomatedMarketMaker: true,
      isExcludedFromFees: false,
      isBlacklisted: false
    });

    _mint(msg.sender, MAX_SUPPLY);
    _approve(address(uniswapV2Router), type(uint256).max);
  }

  receive() external payable {}

  function _requireIsOwner() internal view {
    require(msg.sender == owner, "!owner");
  }

  function burn(address from, uint256 amount) external {
    require(msg.sender == index, "!index");
    _burn(from, amount);
  }

  function updateFees(Fees memory newFees) external {
    _requireIsOwner();
    require(newFees.development <= 20, "!valid");
    require(newFees.index >= 60, "!valid");
    require(newFees.liquidity >= 10, "!valid");
    require(newFees.development + newFees.index + newFees.liquidity == 100, "!valid");
    feeAmounts = newFees;
  }

  function enableTrading() external {
    _requireIsOwner();
    settings.endBlock = uint216(block.number) + 20;
    settings.tradingActive = true;
  }

  function removeLimits() external {
    _requireIsOwner();
    settings.limitsInEffect = false;
  }

  // change the minimum amount of tokens to sell from fees
  function updateSwapTokensAtAmount(uint256 newAmount) external {
    _requireIsOwner();
    if (newAmount < MIN_SWAP_AMOUNT) {
      revert Chad__SwapAmountLowerThanMinimum();
    }
    if (newAmount > MAX_SWAP_AMOUNT) {
      revert Chad__SwapAmountGreaterThanMaximum();
    }
    uint256 oldSwapAmount = swapTokensAtAmount;
    swapTokensAtAmount = newAmount;
    emit SwapTokensAtAmountUpdated(newAmount, oldSwapAmount);
  }

  function updateMaxTransactionAmount(uint256 newAmount) external {
    _requireIsOwner();
    if (newAmount < (MAX_SUPPLY * 5) / 1000) {
      revert Chad__MaxTransactionTooLow();
    }
    uint256 oldMaxTransactionAmount = maxTransactionAmount;
    maxTransactionAmount = newAmount;
    emit MaxTransactionAmountUpdated(newAmount, oldMaxTransactionAmount);
  }

  function excludeFromFees(address account, bool excluded) external {
    _requireIsOwner();
    _users[account].isExcludedFromFees = excluded;
    emit ExcludeFromFees(account, excluded);
  }

  function excludeFromMaxTransaction(address account, bool isExcluded) external {
    _requireIsOwner();
    _users[account].isExcludedFromMaxTransactionAmount = isExcluded;
    emit ExcludeFromMaxTransaction(account, isExcluded);
  }

  function setAutomatedMarketMakerPair(address pair, bool value) external {
    _requireIsOwner();
    if (pair == uniswapV2Pair) {
      revert Chad__CannotRemovePairFromAMMs();
    }

    _users[pair].isAutomatedMarketMaker = value;
    emit SetAutomatedMarketMakerPair(pair, value);
  }

  function renounceBlacklist() external {
    _requireIsOwner();
    settings.blacklistRenounced = true;
  }

  function blacklist(address account) external {
    _requireIsOwner();
    if (settings.blacklistRenounced) {
      revert Chad__BlacklistModificationDisabled();
    }
    if (account == uniswapV2Pair) {
      revert Chad__CannotBlacklistLPPair();
    }
    if (account == address(uniswapV2Router)) {
      revert Chad__CannotBlacklistRouter();
    }
    _users[account].isBlacklisted = true;
  }

  // @dev unblacklist address; not affected by blacklistRenounced incase team wants to unblacklist v3 pools down the
  function unblacklist(address account) external {
    _requireIsOwner();
    _users[account].isBlacklisted = false;
  }

  function isExcludedFromFees(address account) external view returns (bool) {
    return _users[account].isExcludedFromFees;
  }

  function isExcludedFromMaxTransactionAmount(address account) external view returns (bool) {
    return _users[account].isExcludedFromMaxTransactionAmount;
  }

  function isAutomatedMarketMakerPair(address pair) external view returns (bool) {
    return _users[pair].isAutomatedMarketMaker;
  }

  function isBlacklisted(address account) external view returns (bool) {
    return _users[account].isBlacklisted;
  }

  function isSwapEnabled() external view returns (bool) {
    return settings.swapEnabled;
  }

  function isBlacklistRenounced() external view returns (bool) {
    return settings.blacklistRenounced;
  }

  function isFeeChangeRenounced() external view returns (bool) {
    return settings.feeChangeRenounced;
  }

  function isTradingActive() external view returns (bool) {
    return settings.tradingActive;
  }

  function isLimitInEffect() external view returns (bool) {
    return settings.limitsInEffect;
  }

  function transfer(address to, uint256 amount) public override returns (bool) {
    _transfer(msg.sender, to, amount);
    return true;
  }

  function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
    uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
    if (allowed != type(uint256).max) {
      allowance[from][msg.sender] = allowed - amount;
    }
    _transfer(from, to, amount);
    return true;
  }

  function _transfer(address from, address to, uint256 amount) internal returns (bool) {
    User memory fromData = _users[from];
    User memory toData = _users[to];
    Settings memory settingCache = settings;

    if (!settingCache.tradingActive) {
      if (!fromData.isExcludedFromFees) {
        if (!toData.isExcludedFromFees) {
          revert Chad__TradingNotActive();
        }
      }
    }

    // Apply blacklist protection
    if (fromData.isBlacklisted) {
      revert Chad__SenderBlacklisted();
    }
    if (toData.isBlacklisted) {
      revert Chad__ReceiverBlacklisted();
    }

    // If zero amount, continue
    if (amount == 0) {
      return true;
    }

    bool excludedFromFees = fromData.isExcludedFromFees || toData.isExcludedFromFees;

    // Cache transaction type for reference.
    // 1 = Buy
    // 2 = Sell
    // 3 = Transfer
    uint8 txType = 3;

    if (fromData.isAutomatedMarketMaker) {
      // Buys originate from the AMM pair
      txType = 1;
    } else if (toData.isAutomatedMarketMaker) {
      // Sells send funds to AMM pair
      txType = 2;
    }

    if (!_swapping) {
      if (settingCache.limitsInEffect) {
        //when buy
        if (txType == 1 && !toData.isExcludedFromMaxTransactionAmount) {
          if (amount > maxTransactionAmount) {
            revert Chad__BuyAmountGreaterThanMax();
          }
          if (amount + this.balanceOf(to) > maxWallet) {
            revert Chad__MaxWalletAmountExceeded();
          }
        }
        //when sell
        else if (txType == 2 && !fromData.isExcludedFromMaxTransactionAmount) {
          if (amount > maxTransactionAmount) {
            revert Chad__SellAmountGreaterThanMax();
          }
        } else if (!toData.isExcludedFromMaxTransactionAmount) {
          if (amount + this.balanceOf(to) > maxWallet) {
            revert Chad__MaxWalletAmountExceeded();
          }
        }
      }

      if (settingCache.swapEnabled) {
        // Only sells will trigger the fee swap
        if (txType == 2) {
          if (this.balanceOf(address(this)) >= swapTokensAtAmount) {
            _swapping = true;
            _swapBack();
            _swapping = false;
          }
        }
      }
    }

    if (txType < 3) {
      bool takeFee = !_swapping;

      // if any account belongs to _isExcludedFromFee account then remove the fee
      if (excludedFromFees) {
        takeFee = false;
      }
      uint256 fees = 0;
      // only take fees on buys/sells, do not take on wallet transfers
      if (takeFee) {
        Fees memory feeCache = feeAmounts;
        // on sell
        if (txType == 2) {
          if (feeCache.sell > 0) {
            fees = (amount * feeCache.sell) / 100;
          }
        }
        // on buy
        else if (txType == 1) {
          if (feeCache.buy > 0) {
            fees = (amount * feeCache.buy) / 100;
          }
        }

        if (block.number < settingCache.endBlock) {
          uint256 blocksLeft = settingCache.endBlock - block.number;
          uint256 botFeeMultiplier = 95;

          // Apply sniper protection - first 18 blocks have a fee reduced 5% each block.
          if (blocksLeft < 19) {
            botFeeMultiplier -= (5 * (19 - blocksLeft));
          }
          uint256 botFee = (amount * botFeeMultiplier) / 100;
          _doTransfer(from, owner, fees);
          amount -= botFee;
          tokensForBotProtection += botFee;
        }

        amount -= fees;

        if (fees > 0) {
          _doTransfer(from, address(this), fees);
        }
      }
    }

    _doTransfer(from, to, amount);

    return true;
  }

  function _swapTokensForEth(uint256 tokenAmount) internal {
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = uniswapV2Router.WETH();

    uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      tokenAmount,
      0,
      path,
      address(this),
      block.timestamp
    );
  }

  function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
    uniswapV2Router.addLiquidityETH{value: ethAmount}(
      address(this),
      tokenAmount,
      0, // slippage is unavoidable
      0, // slippage is unavoidable
      index,
      block.timestamp
    );
  }

  function _doTransfer(address from, address to, uint256 amount) internal returns (bool) {
    balanceOf[from] -= amount;

    // Cannot overflow because the sum of all user
    // balances can't exceed the max uint256 value.
    unchecked {
      balanceOf[to] += amount;
    }

    emit Transfer(from, to, amount);

    return true;
  }

  function _swapBack() internal {
    // Cache values
    uint256 contractBalance = this.balanceOf(address(this));
    Fees memory feeCache = feeAmounts;

    if (contractBalance == 0) {
      return;
    }

    // Prevent too many tokens from being swapped
    uint256 maxAmount = swapTokensAtAmount * 20;
    if (contractBalance > maxAmount) {
      contractBalance = maxAmount;
    }

    uint256 liquidityAmount = (contractBalance * feeCache.liquidity) / 100;

    // Halve the amount of liquidity tokens
    uint256 liquidityTokens = liquidityAmount - (liquidityAmount / 2);

    uint256 initialETHBalance = address(this).balance;
    _swapTokensForEth(liquidityTokens);
    uint256 ethForLiquidity = address(this).balance - initialETHBalance;

    if (liquidityTokens > 0 && ethForLiquidity > 0) {
      _addLiquidity(liquidityTokens, ethForLiquidity);
      emit SwapAndLiquify(liquidityTokens, ethForLiquidity);
    }

    uint256 amountToSwapForETH = contractBalance - liquidityAmount;
    _swapTokensForEth(amountToSwapForETH);

    uint256 contractEthAmount = address(this).balance;
    uint256 initialTotalEth = contractEthAmount + (ethForLiquidity * 2);

    uint256 developmentEthAmount = (initialTotalEth * feeCache.development) / 100;
    (bool success, ) = address(developmentWallet).call{value: developmentEthAmount}("");
    require(success);

    uint256 indexEthAmount = contractEthAmount - developmentEthAmount;
    WETH(payable(wethAddress)).deposit{value: indexEthAmount}();
    ERC20(wethAddress).safeTransfer(index, indexEthAmount);
  }

  function _approve(address spender, uint256 amount) internal onlyOwner {
    allowance[address(this)][spender] = amount;
    emit Approval(address(this), spender, amount);
  }
}

File 2 of 7 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 3 of 7 : WETH.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "./ERC20.sol";

import {SafeTransferLib} from "../utils/SafeTransferLib.sol";

/// @notice Minimalist and modern Wrapped Ether implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/WETH.sol)
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
    using SafeTransferLib for address;

    event Deposit(address indexed from, uint256 amount);

    event Withdrawal(address indexed to, uint256 amount);

    function deposit() public payable virtual {
        _mint(msg.sender, msg.value);

        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) public virtual {
        _burn(msg.sender, amount);

        emit Withdrawal(msg.sender, amount);

        msg.sender.safeTransferETH(amount);
    }

    receive() external payable virtual {
        deposit();
    }
}

File 4 of 7 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 5 of 7 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 6 of 7 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IUniswapV2Factory {
  function createPair(address tokenA, address tokenB) external returns (address pair);
}

File 7 of 7 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IUniswapV2Router {
  function factory() external pure returns (address);

  function WETH() external pure returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) external returns (uint amountA, uint amountB);

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] calldata path,
    address to,
    uint256 deadline
  ) external;
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "@uniswap/v3-core/=lib/v3-core/",
    "@uniswap/v3-periphery/=lib/v3-periphery/contracts/",
    "v3-core/=lib/v3-core/",
    "v3-periphery/=lib/v3-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"indexAddress","type":"address"},{"internalType":"address","name":"devWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Chad__BlacklistModificationDisabled","type":"error"},{"inputs":[],"name":"Chad__BuyAmountGreaterThanMax","type":"error"},{"inputs":[],"name":"Chad__CannotBlacklistLPPair","type":"error"},{"inputs":[],"name":"Chad__CannotBlacklistRouter","type":"error"},{"inputs":[],"name":"Chad__CannotRemovePairFromAMMs","type":"error"},{"inputs":[],"name":"Chad__CannotTransferFromAddressZero","type":"error"},{"inputs":[],"name":"Chad__CannotTransferToAddressZero","type":"error"},{"inputs":[],"name":"Chad__ErrorWithdrawingEth","type":"error"},{"inputs":[],"name":"Chad__FeeChangeRenounced","type":"error"},{"inputs":[],"name":"Chad__MaxFeeFivePercent","type":"error"},{"inputs":[],"name":"Chad__MaxTransactionTooLow","type":"error"},{"inputs":[],"name":"Chad__MaxWalletAmountExceeded","type":"error"},{"inputs":[],"name":"Chad__MaxWalletAmountTooLow","type":"error"},{"inputs":[],"name":"Chad__OnlyOwner","type":"error"},{"inputs":[],"name":"Chad__ReceiverBlacklisted","type":"error"},{"inputs":[],"name":"Chad__ReceiverCannotBeAddressZero","type":"error"},{"inputs":[],"name":"Chad__SellAmountGreaterThanMax","type":"error"},{"inputs":[],"name":"Chad__SenderBlacklisted","type":"error"},{"inputs":[],"name":"Chad__StuckEthWithdrawError","type":"error"},{"inputs":[],"name":"Chad__SwapAmountGreaterThanMaximum","type":"error"},{"inputs":[],"name":"Chad__SwapAmountLowerThanMinimum","type":"error"},{"inputs":[],"name":"Chad__TokenAddressCannotBeAddressZero","type":"error"},{"inputs":[],"name":"Chad__TradingNotActive","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":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FailedSwapBackTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"}],"name":"MaxTransactionAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"}],"name":"SwapTokensAtAmountUpdated","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SWAP_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_SWAP_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAmounts","outputs":[{"internalType":"uint8","name":"buy","type":"uint8"},{"internalType":"uint8","name":"sell","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"uint8","name":"development","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isAutomatedMarketMakerPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isBlacklistRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFeeChangeRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLimitInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForBotProtection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"buy","type":"uint8"},{"internalType":"uint8","name":"sell","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"uint8","name":"development","type":"uint8"}],"internalType":"struct Chad.Fees","name":"newFees","type":"tuple"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6102206040526001610160819052610180525f6101a08190526101c08190526101e081905261020052610101600d553480156200003a575f80fd5b5060405162003462380380620034628339810160408190526200005d9162000991565b336040518060400160405280600481526020016310d2105160e21b8152506040518060400160405280600a815260200169086d0c2c84092dcc8caf60b31b8152506012825f9081620000b0919062000a78565b506001620000bf838262000a78565b5060ff81166080524660a052620000d5620007c9565b60c0525050600680546001600160a01b0319166001600160a01b0384169081179091556040519091505f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038083166101205281811661014052831660e0819052604080516315ab88c960e31b8152905185929163ad5c46489160048083019260209291908290030181865afa1580156200017f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a5919062000b40565b600f5f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000207573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200022d919062000b40565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000279573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200029f919062000b40565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620002ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000310919062000b40565b6001600160a01b0316610100526200033660c86b033b2e3c9fd0803ce800000062000b77565b6007556200035260646b033b2e3c9fd0803ce800000062000b77565b600955612710620003716b033b2e3c9fd0803ce8000000600562000b97565b6200037d919062000b77565b6008819055506040518060a00160405280600560ff168152602001600560ff168152602001600a60ff168152602001604660ff168152602001601460ff16815250600b5f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff1602179055506040820151815f0160026101000a81548160ff021916908360ff1602179055506060820151815f0160036101000a81548160ff021916908360ff1602179055506080820151815f0160046101000a81548160ff021916908360ff16021790555090505060405180608001604052805f151581526020015f1515815260200160011515815260200160011515815250600e5f336001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a81548160ff0219169083151502179055506060820151815f0160036101000a81548160ff02191690831515021790555090505060405180608001604052805f151581526020015f1515815260200160011515815260200160011515815250600e5f306001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a81548160ff0219169083151502179055506060820151815f0160036101000a81548160ff02191690831515021790555090505060405180608001604052805f151581526020015f151581526020015f1515815260200160011515815250600e5f60e0516001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a81548160ff0219169083151502179055506060820151815f0160036101000a81548160ff02191690831515021790555090505060405180608001604052805f151581526020016001151581526020015f1515815260200160011515815250600e5f610100516001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151815f0160016101000a81548160ff0219169083151502179055506040820151815f0160026101000a81548160ff0219169083151502179055506060820151815f0160036101000a81548160ff021916908315150217905550905050620007af336b033b2e3c9fd0803ce80000006200086360201b60201c565b60e051620007bf905f19620008cf565b5050505062000c47565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051620007fb919062000bb7565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f82825462000876919062000c31565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6006546001600160a01b031633146200091d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640160405180910390fd5b305f8181526004602090815260408083206001600160a01b03871680855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101620008c3565b80516001600160a01b03811681146200098c575f80fd5b919050565b5f805f60608486031215620009a4575f80fd5b620009af8462000975565b9250620009bf6020850162000975565b9150620009cf6040850162000975565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000a0157607f821691505b60208210810362000a2057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000a73575f81815260208120601f850160051c8101602086101562000a4e5750805b601f850160051c820191505b8181101562000a6f5782815560010162000a5a565b5050505b505050565b81516001600160401b0381111562000a945762000a94620009d8565b62000aac8162000aa58454620009ec565b8462000a26565b602080601f83116001811462000ae2575f841562000aca5750858301515b5f19600386901b1c1916600185901b17855562000a6f565b5f85815260208120601f198616915b8281101562000b125788860151825594840194600190910190840162000af1565b508582101562000b3057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000b51575f80fd5b62000b5c8262000975565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f8262000b9257634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141762000bb15762000bb162000b63565b92915050565b5f80835462000bc681620009ec565b6001828116801562000be1576001811462000bf75762000c25565b60ff198416875282151583028701945062000c25565b875f526020805f205f5b8581101562000c1c5781548a82015290840190820162000c01565b50505082870194505b50929695505050505050565b8082018082111562000bb15762000bb162000b63565b60805160a05160c05160e05161010051610120516101405161278362000cdf5f395f818161079c0152611db901525f81816103bb01528181610e9701528181611eb4015261212b01525f81816104f601528181610dde01526113d401525f81816102f80152818161142601528181611fd40152818161208a015261215901525f610c4c01525f610c1701525f6103ee01526127835ff3fe608060405260043610610283575f3560e01c80638da5cb5b11610155578063c53d4d53116100be578063e2f4560511610078578063e2f4560514610883578063e9481eee14610898578063f2fde38b146108d6578063f8b45b05146108f5578063f9f92be41461090a578063fe575a8714610929575f80fd5b8063c53d4d53146107be578063c8c8ebe4146107dc578063cc10a179146107f1578063d257b34f1461080f578063d505accf1461082e578063dd62ed3e1461084d575f80fd5b8063a9059cbb1161010f578063a9059cbb146106fa578063aa49802314610719578063ba1618d514610738578063be1ded871461074f578063c02466681461076c578063c04a54141461078b575f80fd5b80638da5cb5b1461066157806395d89b41146106805780639759f76e1461069457806399f34c12146106a85780639a7a23d6146106bc5780639dc29fac146106db575f80fd5b80633644e515116101f7578063751039fc116101b1578063751039fc146105945780637571336a146105a857806375e3661e146105c75780637949a403146105e65780637ecebe00146106225780638a8c523c1461064d575f80fd5b80633644e5151461045d5780633f17b1611461047157806349bd5a5e146104e55780634fbee193146105185780635f1893611461055557806370a0823114610569575f80fd5b80631b624ecb116102485780631b624ecb1461037657806323b872dd1461038b5780632986c0e5146103aa578063313ce567146103dd57806332cb6b0c14610422578063351a964d14610441575f80fd5b806306fdde031461028e578063095ea7b3146102b85780631694505e146102e757806317ee89511461033257806318160ddd14610353575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a2610960565b6040516102af9190612250565b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046122b2565b6109eb565b60405190151581526020016102af565b3480156102f2575f80fd5b5061031a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102af565b34801561033d575f80fd5b5061035161034c3660046122f1565b610a57565b005b34801561035e575f80fd5b5061036860025481565b6040519081526020016102af565b348015610381575f80fd5b50610368600a5481565b348015610396575f80fd5b506102d76103a5366004612389565b610ba2565b3480156103b5575f80fd5b5061031a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e8575f80fd5b506104107f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102af565b34801561042d575f80fd5b506103686b033b2e3c9fd0803ce800000081565b34801561044c575f80fd5b50600d54610100900460ff166102d7565b348015610468575f80fd5b50610368610c14565b34801561047c575f80fd5b50600b546104b19060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102af565b3480156104f0575f80fd5b5061031a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610523575f80fd5b506102d76105323660046123c7565b6001600160a01b03165f908152600e602052604090205462010000900460ff1690565b348015610560575f80fd5b50610351610c6e565b348015610574575f80fd5b506103686105833660046123c7565b60036020525f908152604090205481565b34801561059f575f80fd5b50610351610c89565b3480156105b3575f80fd5b506103516105c23660046123e2565b610c9d565b3480156105d2575f80fd5b506103516105e13660046123c7565b610d13565b3480156105f1575f80fd5b506102d76106003660046123c7565b6001600160a01b03165f908152600e6020526040902054610100900460ff1690565b34801561062d575f80fd5b5061036861063c3660046123c7565b60056020525f908152604090205481565b348015610658575f80fd5b50610351610d3b565b34801561066c575f80fd5b5060065461031a906001600160a01b031681565b34801561068b575f80fd5b506102a2610d87565b34801561069f575f80fd5b50610368610d94565b3480156106b3575f80fd5b50610368610dbb565b3480156106c7575f80fd5b506103516106d63660046123e2565b610dd4565b3480156106e6575f80fd5b506103516106f53660046122b2565b610e8c565b348015610705575f80fd5b506102d76107143660046122b2565b610efb565b348015610724575f80fd5b5061035161073336600461241d565b610f11565b348015610743575f80fd5b50600d5460ff166102d7565b34801561075a575f80fd5b50600d5462010000900460ff166102d7565b348015610777575f80fd5b506103516107863660046123e2565b610fa3565b348015610796575f80fd5b5061031a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107c9575f80fd5b50600d54600160201b900460ff166102d7565b3480156107e7575f80fd5b5061036860075481565b3480156107fc575f80fd5b50600d546301000000900460ff166102d7565b34801561081a575f80fd5b5061035161082936600461241d565b61100b565b348015610839575f80fd5b50610351610848366004612434565b6110ce565b348015610858575f80fd5b5061036861086736600461249d565b600460209081525f928352604080842090915290825290205481565b34801561088e575f80fd5b5061036860085481565b3480156108a3575f80fd5b506102d76108b23660046123c7565b6001600160a01b03165f908152600e60205260409020546301000000900460ff1690565b3480156108e1575f80fd5b506103516108f03660046123c7565b61130c565b348015610900575f80fd5b5061036860095481565b348015610915575f80fd5b506103516109243660046123c7565b6113a0565b348015610934575f80fd5b506102d76109433660046123c7565b6001600160a01b03165f908152600e602052604090205460ff1690565b5f805461096c906124c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610998906124c9565b80156109e35780601f106109ba576101008083540402835291602001916109e3565b820191905f5260205f20905b8154815290600101906020018083116109c657829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a459086815260200190565b60405180910390a35060015b92915050565b610a5f611499565b6014816080015160ff161115610a905760405162461bcd60e51b8152600401610a8790612501565b60405180910390fd5b603c816060015160ff161015610ab85760405162461bcd60e51b8152600401610a8790612501565b600a816040015160ff161015610ae05760405162461bcd60e51b8152600401610a8790612501565b806040015181606001518260800151610af99190612535565b610b039190612535565b60ff16606414610b255760405162461bcd60e51b8152600401610a8790612501565b8051600b805460208401516040850151606086015160809096015160ff908116600160201b0264ff000000001997821663010000000263ff0000001993831662010000029390931663ffff0000199483166101000261ffff1990961692909716919091179390931791909116939093179290921792909216179055565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f198114610bfb57610bd7838261254e565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b610c068585856114de565b5060019150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610c4957610c44611ad4565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b610c76611499565b600d805462ff0000191662010000179055565b610c91611499565b600d805460ff19169055565b610ca5611499565b6001600160a01b0382165f818152600e602052604090819020805484151563010000000263ff00000019909116179055517fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f0890610d0790841515815260200190565b60405180910390a25050565b610d1b611499565b6001600160a01b03165f908152600e60205260409020805460ff19169055565b610d43611499565b610d4e436014612561565b600d805464ff00000000196001600160d81b039390931665010000000000029290921663ffffffff90921691909117600160201b179055565b6001805461096c906124c9565b6103e8610dae6b033b2e3c9fd0803ce80000006005612588565b610db8919061259f565b81565b610db8620186a06b033b2e3c9fd0803ce800000061259f565b610ddc611499565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610e2e57604051637b575cc360e01b815260040160405180910390fd5b6001600160a01b0382165f818152600e60205260409081902080548415156101000261ff0019909116179055517fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90610d0790841515815260200190565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610eed5760405162461bcd60e51b8152602060048201526006602482015265042d2dcc8caf60d31b6044820152606401610a87565b610ef78282611b6c565b5050565b5f610f073384846114de565b5060019392505050565b610f19611499565b6103e8610f336b033b2e3c9fd0803ce80000006005612588565b610f3d919061259f565b811015610f5d5760405163ea05bba160e01b815260040160405180910390fd5b600780549082905560408051838152602081018390527fd40d861b6c61fb22040b4eb8de22cc4c267673593fef5c5880e2f55e75ef454891015b60405180910390a15050565b610fab611499565b6001600160a01b0382165f818152600e6020526040908190208054841515620100000262ff000019909116179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610d0790841515815260200190565b611013611499565b61102c620186a06b033b2e3c9fd0803ce800000061259f565b81101561104c5760405163707caa9b60e01b815260040160405180910390fd5b6103e86110666b033b2e3c9fd0803ce80000006005612588565b611070919061259f565b8111156110905760405163191ab1d960e11b815260040160405180910390fd5b600880549082905560408051838152602081018390527febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea19101610f97565b4284101561111e5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610a87565b5f6001611129610c14565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611231573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906112675750876001600160a01b0316816001600160a01b0316145b6112a45760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610a87565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b031633146113555760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610a87565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6113a8611499565b600d5462010000900460ff16156113d257604051633d698aeb60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03160361142457604051630d181eb960e41b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031603611476576040516331f20ca360e01b815260040160405180910390fd5b6001600160a01b03165f908152600e60205260409020805460ff19166001179055565b6006546001600160a01b031633146114dc5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610a87565b565b6001600160a01b038381165f908152600e60208181526040808420815160808082018452915460ff808216151583526101008083048216151584880152620100008084048316151585880152630100000093849004831615156060808701919091529a8d168a529787528589208651808701885290548084161515825282810484161515828a0152898104841615158289015284900483161515818c0152865160c081018852600d5480851615158252928304841615159881019890985297810482161515958701959095529084048116151597850197909752600160201b83049096161515908301819052650100000000009091046001600160d81b031660a083015292939261161457826040015161161457816040015161161457604051632af20c5f60e21b815260040160405180910390fd5b8251156116345760405163168f8b5560e01b815260040160405180910390fd5b8151156116545760405163bebb403760e01b815260040160405180910390fd5b845f036116675760019350505050610c0d565b5f836040015180611679575082604001515b6020850151909150600390156116915750600161169f565b83602001511561169f575060025b600c5460ff166118f75782511561185c578060ff1660011480156116c557508360600151155b15611784576007548711156116ed57604051635f54cdcb60e11b815260040160405180910390fd5b6009546040516370a0823160e01b81526001600160a01b038a16600482015230906370a0823190602401602060405180830381865afa158015611732573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175691906125be565b61176090896125d5565b111561177f57604051631aa8912960e21b815260040160405180910390fd5b61185c565b8060ff16600214801561179957508460600151155b156117c15760075487111561177f576040516393c7fa2d60e01b815260040160405180910390fd5b836060015161185c576009546040516370a0823160e01b81526001600160a01b038a16600482015230906370a0823190602401602060405180830381865afa15801561180f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183391906125be565b61183d90896125d5565b111561185c57604051631aa8912960e21b815260040160405180910390fd5b8260200151156118f7578060ff166002036118f7576008546040516370a0823160e01b81523060048201819052906370a0823190602401602060405180830381865afa1580156118ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d291906125be565b106118f757600c805460ff191660011790556118ec611be5565b600c805460ff191690555b60038160ff161015611ab957600c5460ff1615821561191357505f5b5f8115611ab6576040805160a081018252600b5460ff80821683526101008204811660208401526201000082048116938301939093526301000000810483166060830152600160201b9004821660808201529084166002036119a357602081015160ff161561199e576064816020015160ff168b6119919190612588565b61199b919061259f565b91505b6119d7565b8360ff166001036119d757805160ff16156119d75780516064906119ca9060ff168c612588565b6119d4919061259f565b91505b8560a001516001600160d81b0316431015611a95575f438760a001516001600160d81b0316611a06919061254e565b9050605f6013821015611a3657611a1e82601361254e565b611a29906005612588565b611a33908261254e565b90505b5f6064611a43838f612588565b611a4d919061259f565b9050611a6e8f60065f9054906101000a90046001600160a01b031687611eea565b50611a79818e61254e565b9c5080600a5f828254611a8c91906125d5565b90915550505050505b611a9f828b61254e565b99508115611ab457611ab28c3084611eea565b505b505b50505b611ac4898989611eea565b5060019998505050505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051611b0491906125e8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b0382165f9081526003602052604081208054839290611b9390849061254e565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015611c20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4491906125be565b6040805160a081018252600b5460ff80821683526101008204811660208401526201000082048116938301939093526301000000810483166060830152600160201b900490911660808201529091505f829003611c9f575050565b5f6008546014611caf9190612588565b905080831115611cbd578092505b5f6064836040015160ff1685611cd39190612588565b611cdd919061259f565b90505f611ceb60028361259f565b611cf5908361254e565b905047611d0182611f7f565b5f611d0c824761254e565b90505f83118015611d1c57505f81115b15611d6557611d2b83826120fa565b60408051848152602081018390527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b5f611d70858961254e565b9050611d7b81611f7f565b475f611d88846002612588565b611d9290836125d5565b90505f60648a6080015160ff1683611daa9190612588565b611db4919061259f565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611e1f576040519150601f19603f3d011682016040523d82523d5f602084013e611e24565b606091505b5050905080611e31575f80fd5b5f611e3c838661254e565b9050600f5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611e8b575f80fd5b505af1158015611e9d573d5f803e3d5ffd5b5050600f54611edb93506001600160a01b031691507f00000000000000000000000000000000000000000000000000000000000000009050836121cd565b50505050505050505050505050565b6001600160a01b0383165f90815260036020526040812080548391908390611f1390849061254e565b90915550506001600160a01b038084165f81815260036020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f6d9086815260200190565b60405180910390a35060019392505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fb257611fb2612684565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561202e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120529190612698565b8160018151811061206557612065612684565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906120c99085905f908690309042906004016126b3565b5f604051808303815f87803b1580156120e0575f80fd5b505af11580156120f2573d5f803e3d5ffd5b505050505050565b60405163f305d71960e01b8152306004820152602481018390525f6044820181905260648201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660848301524260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990839060c40160606040518083038185885af11580156121a1573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121c69190612722565b5050505050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f51141617169150508061224a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610a87565b50505050565b5f6020808352835180828501525f5b8181101561227b5785810183015185820160400152820161225f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146122af575f80fd5b50565b5f80604083850312156122c3575f80fd5b82356122ce8161229b565b946020939093013593505050565b803560ff811681146122ec575f80fd5b919050565b5f60a08284031215612301575f80fd5b60405160a0810181811067ffffffffffffffff8211171561233057634e487b7160e01b5f52604160045260245ffd5b60405261233c836122dc565b815261234a602084016122dc565b602082015261235b604084016122dc565b604082015261236c606084016122dc565b606082015261237d608084016122dc565b60808201529392505050565b5f805f6060848603121561239b575f80fd5b83356123a68161229b565b925060208401356123b68161229b565b929592945050506040919091013590565b5f602082840312156123d7575f80fd5b8135610c0d8161229b565b5f80604083850312156123f3575f80fd5b82356123fe8161229b565b915060208301358015158114612412575f80fd5b809150509250929050565b5f6020828403121561242d575f80fd5b5035919050565b5f805f805f805f60e0888a03121561244a575f80fd5b87356124558161229b565b965060208801356124658161229b565b95506040880135945060608801359350612481608089016122dc565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156124ae575f80fd5b82356124b98161229b565b915060208301356124128161229b565b600181811c908216806124dd57607f821691505b6020821081036124fb57634e487b7160e01b5f52602260045260245ffd5b50919050565b602080825260069082015265085d985b1a5960d21b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610a5157610a51612521565b81810381811115610a5157610a51612521565b6001600160d81b0381811683821601908082111561258157612581612521565b5092915050565b8082028115828204841417610a5157610a51612521565b5f826125b957634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156125ce575f80fd5b5051919050565b80820180821115610a5157610a51612521565b5f80835481600182811c91508083168061260357607f831692505b6020808410820361262257634e487b7160e01b86526022600452602486fd5b818015612636576001811461264b57612676565b60ff1986168952841515850289019650612676565b5f8a8152602090205f5b8681101561266e5781548b820152908501908301612655565b505084890196505b509498975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156126a8575f80fd5b8151610c0d8161229b565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156127015784516001600160a01b0316835293830193918301916001016126dc565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612734575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212205ca4f4339b467e090c78d29d765ac5f5e338e436c0d04a4954616e1e28d5372a64736f6c634300081500330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a140000000000000000000000000e6ba59a768dd5455f1f9eda0cca1a74b723dca35

Deployed Bytecode

0x608060405260043610610283575f3560e01c80638da5cb5b11610155578063c53d4d53116100be578063e2f4560511610078578063e2f4560514610883578063e9481eee14610898578063f2fde38b146108d6578063f8b45b05146108f5578063f9f92be41461090a578063fe575a8714610929575f80fd5b8063c53d4d53146107be578063c8c8ebe4146107dc578063cc10a179146107f1578063d257b34f1461080f578063d505accf1461082e578063dd62ed3e1461084d575f80fd5b8063a9059cbb1161010f578063a9059cbb146106fa578063aa49802314610719578063ba1618d514610738578063be1ded871461074f578063c02466681461076c578063c04a54141461078b575f80fd5b80638da5cb5b1461066157806395d89b41146106805780639759f76e1461069457806399f34c12146106a85780639a7a23d6146106bc5780639dc29fac146106db575f80fd5b80633644e515116101f7578063751039fc116101b1578063751039fc146105945780637571336a146105a857806375e3661e146105c75780637949a403146105e65780637ecebe00146106225780638a8c523c1461064d575f80fd5b80633644e5151461045d5780633f17b1611461047157806349bd5a5e146104e55780634fbee193146105185780635f1893611461055557806370a0823114610569575f80fd5b80631b624ecb116102485780631b624ecb1461037657806323b872dd1461038b5780632986c0e5146103aa578063313ce567146103dd57806332cb6b0c14610422578063351a964d14610441575f80fd5b806306fdde031461028e578063095ea7b3146102b85780631694505e146102e757806317ee89511461033257806318160ddd14610353575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a2610960565b6040516102af9190612250565b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046122b2565b6109eb565b60405190151581526020016102af565b3480156102f2575f80fd5b5061031a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102af565b34801561033d575f80fd5b5061035161034c3660046122f1565b610a57565b005b34801561035e575f80fd5b5061036860025481565b6040519081526020016102af565b348015610381575f80fd5b50610368600a5481565b348015610396575f80fd5b506102d76103a5366004612389565b610ba2565b3480156103b5575f80fd5b5061031a7f000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a14081565b3480156103e8575f80fd5b506104107f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016102af565b34801561042d575f80fd5b506103686b033b2e3c9fd0803ce800000081565b34801561044c575f80fd5b50600d54610100900460ff166102d7565b348015610468575f80fd5b50610368610c14565b34801561047c575f80fd5b50600b546104b19060ff80821691610100810482169162010000820481169163010000008104821691600160201b9091041685565b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016102af565b3480156104f0575f80fd5b5061031a7f0000000000000000000000002db071e62c052f9709f916a585cc9249d46da77881565b348015610523575f80fd5b506102d76105323660046123c7565b6001600160a01b03165f908152600e602052604090205462010000900460ff1690565b348015610560575f80fd5b50610351610c6e565b348015610574575f80fd5b506103686105833660046123c7565b60036020525f908152604090205481565b34801561059f575f80fd5b50610351610c89565b3480156105b3575f80fd5b506103516105c23660046123e2565b610c9d565b3480156105d2575f80fd5b506103516105e13660046123c7565b610d13565b3480156105f1575f80fd5b506102d76106003660046123c7565b6001600160a01b03165f908152600e6020526040902054610100900460ff1690565b34801561062d575f80fd5b5061036861063c3660046123c7565b60056020525f908152604090205481565b348015610658575f80fd5b50610351610d3b565b34801561066c575f80fd5b5060065461031a906001600160a01b031681565b34801561068b575f80fd5b506102a2610d87565b34801561069f575f80fd5b50610368610d94565b3480156106b3575f80fd5b50610368610dbb565b3480156106c7575f80fd5b506103516106d63660046123e2565b610dd4565b3480156106e6575f80fd5b506103516106f53660046122b2565b610e8c565b348015610705575f80fd5b506102d76107143660046122b2565b610efb565b348015610724575f80fd5b5061035161073336600461241d565b610f11565b348015610743575f80fd5b50600d5460ff166102d7565b34801561075a575f80fd5b50600d5462010000900460ff166102d7565b348015610777575f80fd5b506103516107863660046123e2565b610fa3565b348015610796575f80fd5b5061031a7f000000000000000000000000e6ba59a768dd5455f1f9eda0cca1a74b723dca3581565b3480156107c9575f80fd5b50600d54600160201b900460ff166102d7565b3480156107e7575f80fd5b5061036860075481565b3480156107fc575f80fd5b50600d546301000000900460ff166102d7565b34801561081a575f80fd5b5061035161082936600461241d565b61100b565b348015610839575f80fd5b50610351610848366004612434565b6110ce565b348015610858575f80fd5b5061036861086736600461249d565b600460209081525f928352604080842090915290825290205481565b34801561088e575f80fd5b5061036860085481565b3480156108a3575f80fd5b506102d76108b23660046123c7565b6001600160a01b03165f908152600e60205260409020546301000000900460ff1690565b3480156108e1575f80fd5b506103516108f03660046123c7565b61130c565b348015610900575f80fd5b5061036860095481565b348015610915575f80fd5b506103516109243660046123c7565b6113a0565b348015610934575f80fd5b506102d76109433660046123c7565b6001600160a01b03165f908152600e602052604090205460ff1690565b5f805461096c906124c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610998906124c9565b80156109e35780601f106109ba576101008083540402835291602001916109e3565b820191905f5260205f20905b8154815290600101906020018083116109c657829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a459086815260200190565b60405180910390a35060015b92915050565b610a5f611499565b6014816080015160ff161115610a905760405162461bcd60e51b8152600401610a8790612501565b60405180910390fd5b603c816060015160ff161015610ab85760405162461bcd60e51b8152600401610a8790612501565b600a816040015160ff161015610ae05760405162461bcd60e51b8152600401610a8790612501565b806040015181606001518260800151610af99190612535565b610b039190612535565b60ff16606414610b255760405162461bcd60e51b8152600401610a8790612501565b8051600b805460208401516040850151606086015160809096015160ff908116600160201b0264ff000000001997821663010000000263ff0000001993831662010000029390931663ffff0000199483166101000261ffff1990961692909716919091179390931791909116939093179290921792909216179055565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f198114610bfb57610bd7838261254e565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b610c068585856114de565b5060019150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610c4957610c44611ad4565b905090565b507f4b5bf98918f901fff04f17eb5021cfcaf74162a508ae632063885a2656c855c990565b610c76611499565b600d805462ff0000191662010000179055565b610c91611499565b600d805460ff19169055565b610ca5611499565b6001600160a01b0382165f818152600e602052604090819020805484151563010000000263ff00000019909116179055517fe0a7c1f8826ab3d62a6e242681ccca3828462e5c87816004b9f8d655b22d5f0890610d0790841515815260200190565b60405180910390a25050565b610d1b611499565b6001600160a01b03165f908152600e60205260409020805460ff19169055565b610d43611499565b610d4e436014612561565b600d805464ff00000000196001600160d81b039390931665010000000000029290921663ffffffff90921691909117600160201b179055565b6001805461096c906124c9565b6103e8610dae6b033b2e3c9fd0803ce80000006005612588565b610db8919061259f565b81565b610db8620186a06b033b2e3c9fd0803ce800000061259f565b610ddc611499565b7f0000000000000000000000002db071e62c052f9709f916a585cc9249d46da7786001600160a01b0316826001600160a01b031603610e2e57604051637b575cc360e01b815260040160405180910390fd5b6001600160a01b0382165f818152600e60205260409081902080548415156101000261ff0019909116179055517fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90610d0790841515815260200190565b336001600160a01b037f000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a1401614610eed5760405162461bcd60e51b8152602060048201526006602482015265042d2dcc8caf60d31b6044820152606401610a87565b610ef78282611b6c565b5050565b5f610f073384846114de565b5060019392505050565b610f19611499565b6103e8610f336b033b2e3c9fd0803ce80000006005612588565b610f3d919061259f565b811015610f5d5760405163ea05bba160e01b815260040160405180910390fd5b600780549082905560408051838152602081018390527fd40d861b6c61fb22040b4eb8de22cc4c267673593fef5c5880e2f55e75ef454891015b60405180910390a15050565b610fab611499565b6001600160a01b0382165f818152600e6020526040908190208054841515620100000262ff000019909116179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790610d0790841515815260200190565b611013611499565b61102c620186a06b033b2e3c9fd0803ce800000061259f565b81101561104c5760405163707caa9b60e01b815260040160405180910390fd5b6103e86110666b033b2e3c9fd0803ce80000006005612588565b611070919061259f565b8111156110905760405163191ab1d960e11b815260040160405180910390fd5b600880549082905560408051838152602081018390527febb96427ceba6a46f9f71146db5c30bc7e2fe31285e9bf34b38bbdede7cd5ea19101610f97565b4284101561111e5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610a87565b5f6001611129610c14565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611231573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906112675750876001600160a01b0316816001600160a01b0316145b6112a45760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610a87565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b6006546001600160a01b031633146113555760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610a87565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6113a8611499565b600d5462010000900460ff16156113d257604051633d698aeb60e01b815260040160405180910390fd5b7f0000000000000000000000002db071e62c052f9709f916a585cc9249d46da7786001600160a01b0316816001600160a01b03160361142457604051630d181eb960e41b815260040160405180910390fd5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316816001600160a01b031603611476576040516331f20ca360e01b815260040160405180910390fd5b6001600160a01b03165f908152600e60205260409020805460ff19166001179055565b6006546001600160a01b031633146114dc5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610a87565b565b6001600160a01b038381165f908152600e60208181526040808420815160808082018452915460ff808216151583526101008083048216151584880152620100008084048316151585880152630100000093849004831615156060808701919091529a8d168a529787528589208651808701885290548084161515825282810484161515828a0152898104841615158289015284900483161515818c0152865160c081018852600d5480851615158252928304841615159881019890985297810482161515958701959095529084048116151597850197909752600160201b83049096161515908301819052650100000000009091046001600160d81b031660a083015292939261161457826040015161161457816040015161161457604051632af20c5f60e21b815260040160405180910390fd5b8251156116345760405163168f8b5560e01b815260040160405180910390fd5b8151156116545760405163bebb403760e01b815260040160405180910390fd5b845f036116675760019350505050610c0d565b5f836040015180611679575082604001515b6020850151909150600390156116915750600161169f565b83602001511561169f575060025b600c5460ff166118f75782511561185c578060ff1660011480156116c557508360600151155b15611784576007548711156116ed57604051635f54cdcb60e11b815260040160405180910390fd5b6009546040516370a0823160e01b81526001600160a01b038a16600482015230906370a0823190602401602060405180830381865afa158015611732573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175691906125be565b61176090896125d5565b111561177f57604051631aa8912960e21b815260040160405180910390fd5b61185c565b8060ff16600214801561179957508460600151155b156117c15760075487111561177f576040516393c7fa2d60e01b815260040160405180910390fd5b836060015161185c576009546040516370a0823160e01b81526001600160a01b038a16600482015230906370a0823190602401602060405180830381865afa15801561180f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183391906125be565b61183d90896125d5565b111561185c57604051631aa8912960e21b815260040160405180910390fd5b8260200151156118f7578060ff166002036118f7576008546040516370a0823160e01b81523060048201819052906370a0823190602401602060405180830381865afa1580156118ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d291906125be565b106118f757600c805460ff191660011790556118ec611be5565b600c805460ff191690555b60038160ff161015611ab957600c5460ff1615821561191357505f5b5f8115611ab6576040805160a081018252600b5460ff80821683526101008204811660208401526201000082048116938301939093526301000000810483166060830152600160201b9004821660808201529084166002036119a357602081015160ff161561199e576064816020015160ff168b6119919190612588565b61199b919061259f565b91505b6119d7565b8360ff166001036119d757805160ff16156119d75780516064906119ca9060ff168c612588565b6119d4919061259f565b91505b8560a001516001600160d81b0316431015611a95575f438760a001516001600160d81b0316611a06919061254e565b9050605f6013821015611a3657611a1e82601361254e565b611a29906005612588565b611a33908261254e565b90505b5f6064611a43838f612588565b611a4d919061259f565b9050611a6e8f60065f9054906101000a90046001600160a01b031687611eea565b50611a79818e61254e565b9c5080600a5f828254611a8c91906125d5565b90915550505050505b611a9f828b61254e565b99508115611ab457611ab28c3084611eea565b505b505b50505b611ac4898989611eea565b5060019998505050505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051611b0491906125e8565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b0382165f9081526003602052604081208054839290611b9390849061254e565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015611c20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4491906125be565b6040805160a081018252600b5460ff80821683526101008204811660208401526201000082048116938301939093526301000000810483166060830152600160201b900490911660808201529091505f829003611c9f575050565b5f6008546014611caf9190612588565b905080831115611cbd578092505b5f6064836040015160ff1685611cd39190612588565b611cdd919061259f565b90505f611ceb60028361259f565b611cf5908361254e565b905047611d0182611f7f565b5f611d0c824761254e565b90505f83118015611d1c57505f81115b15611d6557611d2b83826120fa565b60408051848152602081018390527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b5f611d70858961254e565b9050611d7b81611f7f565b475f611d88846002612588565b611d9290836125d5565b90505f60648a6080015160ff1683611daa9190612588565b611db4919061259f565b90505f7f000000000000000000000000e6ba59a768dd5455f1f9eda0cca1a74b723dca356001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611e1f576040519150601f19603f3d011682016040523d82523d5f602084013e611e24565b606091505b5050905080611e31575f80fd5b5f611e3c838661254e565b9050600f5f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015611e8b575f80fd5b505af1158015611e9d573d5f803e3d5ffd5b5050600f54611edb93506001600160a01b031691507f000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a1409050836121cd565b50505050505050505050505050565b6001600160a01b0383165f90815260036020526040812080548391908390611f1390849061254e565b90915550506001600160a01b038084165f81815260036020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f6d9086815260200190565b60405180910390a35060019392505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611fb257611fb2612684565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561202e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120529190612698565b8160018151811061206557612065612684565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906120c99085905f908690309042906004016126b3565b5f604051808303815f87803b1580156120e0575f80fd5b505af11580156120f2573d5f803e3d5ffd5b505050505050565b60405163f305d71960e01b8152306004820152602481018390525f6044820181905260648201526001600160a01b037f000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a140811660848301524260a48301527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063f305d71990839060c40160606040518083038185885af11580156121a1573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906121c69190612722565b5050505050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f51141617169150508061224a5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610a87565b50505050565b5f6020808352835180828501525f5b8181101561227b5785810183015185820160400152820161225f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146122af575f80fd5b50565b5f80604083850312156122c3575f80fd5b82356122ce8161229b565b946020939093013593505050565b803560ff811681146122ec575f80fd5b919050565b5f60a08284031215612301575f80fd5b60405160a0810181811067ffffffffffffffff8211171561233057634e487b7160e01b5f52604160045260245ffd5b60405261233c836122dc565b815261234a602084016122dc565b602082015261235b604084016122dc565b604082015261236c606084016122dc565b606082015261237d608084016122dc565b60808201529392505050565b5f805f6060848603121561239b575f80fd5b83356123a68161229b565b925060208401356123b68161229b565b929592945050506040919091013590565b5f602082840312156123d7575f80fd5b8135610c0d8161229b565b5f80604083850312156123f3575f80fd5b82356123fe8161229b565b915060208301358015158114612412575f80fd5b809150509250929050565b5f6020828403121561242d575f80fd5b5035919050565b5f805f805f805f60e0888a03121561244a575f80fd5b87356124558161229b565b965060208801356124658161229b565b95506040880135945060608801359350612481608089016122dc565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156124ae575f80fd5b82356124b98161229b565b915060208301356124128161229b565b600181811c908216806124dd57607f821691505b6020821081036124fb57634e487b7160e01b5f52602260045260245ffd5b50919050565b602080825260069082015265085d985b1a5960d21b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610a5157610a51612521565b81810381811115610a5157610a51612521565b6001600160d81b0381811683821601908082111561258157612581612521565b5092915050565b8082028115828204841417610a5157610a51612521565b5f826125b957634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156125ce575f80fd5b5051919050565b80820180821115610a5157610a51612521565b5f80835481600182811c91508083168061260357607f831692505b6020808410820361262257634e487b7160e01b86526022600452602486fd5b818015612636576001811461264b57612676565b60ff1986168952841515850289019650612676565b5f8a8152602090205f5b8681101561266e5781548b820152908501908301612655565b505084890196505b509498975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156126a8575f80fd5b8151610c0d8161229b565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156127015784516001600160a01b0316835293830193918301916001016126dc565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215612734575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212205ca4f4339b467e090c78d29d765ac5f5e338e436c0d04a4954616e1e28d5372a64736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a140000000000000000000000000e6ba59a768dd5455f1f9eda0cca1a74b723dca35

-----Decoded View---------------
Arg [0] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : indexAddress (address): 0xdCe46b2D2193b5fab04b3129eA9498c9B601A140
Arg [2] : devWallet (address): 0xE6Ba59A768Dd5455f1F9eDa0cCa1A74B723Dca35

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000dce46b2d2193b5fab04b3129ea9498c9b601a140
Arg [2] : 000000000000000000000000e6ba59a768dd5455f1f9eda0cca1a74b723dca35


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.