// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {LaunchToken} from "./LaunchToken.sol";
import {LaunchTokenDeployer, CurvePoolDeployer} from "./deployers/CurveDeployers.sol";
import {IUniswapV3Pool, IUniswapV3SwapCallback, IWETH9} from "./interfaces/IUniswapV3.sol";
import {PoolMath} from "./libraries/PoolMath.sol";
interface ICurvePool {
function pool() external view returns (address);
function seed() external;
}
interface IPadRouter {
function register(
address token,
address pool,
address curve,
address projectWallet,
uint16 buyBps,
uint16 sellBps,
uint16 walletBps,
uint16 floorBps,
uint16 burnBps
) external;
}
/// @title CurvePadFactory — DEX-day-one launchpad (the NOXA-style model, plus the Bond)
/// @notice One `launch()` call: deploys a clean anti-snipe token, creates a REAL Uniswap v3 pool, seeds the
/// token as a single-sided "curve" position, enables trading, and (optionally) executes the creator's own
/// **dev buy** in the same transaction — before anyone else can trade — so the dev is never sniped on their
/// own coin. The dev buy is uncapped by supply (bounded only by the curve ceiling + the ETH sent). Token is
/// on Uniswap + DexScreener from block one. Free to launch; the platform
/// funds nothing (the token seeds its own liquidity); the dev buy is optional and paid by the dev.
contract CurvePadFactory is Ownable2Step, ReentrancyGuard, IUniswapV3SwapCallback {
using SafeERC20 for IERC20;
uint16 public constant AMBUSH_BPS = 2500; // 25% -> the Bond's Ambush; 75% is the curve
uint24 public constant POOL_FEE = 10000;
// The dev's atomic opening buy is uncapped by supply — it's bounded only by the curve itself
// (it can climb to the graduation ceiling, never past) and by how much ETH the dev sends.
address public immutable WETH;
address public immutable v3Factory;
address public immutable router; // PadRouter — the swap desk + project tax
LaunchTokenDeployer public immutable tokenDeployer;
CurvePoolDeployer public immutable curveDeployer;
address public immutable bondDeployer;
address public immutable feeConfig; // owner-governed LP/swap split source, handed to every curve
address public platform;
bool private _swapping; // guards the swap callback (WETH is only ever transient, mid-launch)
address private _activePool; // the pool we're mid-swap with (callback authenticity check)
// ---- fixed terms ----
uint256 public constant TOTAL_SUPPLY = 1_000_000_000 ether;
// Curve geometry is set at deploy so we can run a cheap TEST factory (small width -> graduates after a
// few $ of buys) next to the real PRODUCTION factory, sharing the same audited code + router.
int24 public immutable START_TICK_MAG; // e.g. 201600 -> ~$4k start FDV; sign set by ordering
int24 public immutable CURVE_WIDTH; // span to the curve CEILING (buys can climb here, never past)
int24 public immutable MIN_GRAD_WIDTH; // span to the MINIMUM graduation price (< CURVE_WIDTH); "let it ride" above
/// @notice A project's self-chosen tax. Both rates are hard-capped at 4% by the router; the platform
/// always takes 25% of whatever is collected. The three allocation splits are of the PROJECT'S 75% share
/// and must sum to 100% (10000 bps): to the project wallet, to deepening the Bond floor, and to auto-burn.
struct TaxParams {
uint16 buyBps; // ≤ 400
uint16 sellBps; // ≤ 400
uint16 walletBps; // project-share split \_
uint16 floorBps; // > sum to 10000
uint16 burnBps; // _/
address projectWallet; // 0 => the dev
}
struct LaunchParams {
string name;
string symbol;
address dev;
TaxParams tax;
}
struct Record {
address token;
address curve;
address dev;
uint256 at;
}
mapping(address => Record) public recordOf;
address[] public allTokens;
error BadValue();
event Launched(address indexed token, address indexed curve, address indexed pool, address dev, uint256 devBought);
event PlatformChanged(address platform);
constructor(
address weth_,
address v3Factory_,
address platform_,
address owner_,
address router_,
address tokenDeployer_,
address curveDeployer_,
address bondDeployer_,
address feeConfig_,
int24 startTickMag_,
int24 curveWidth_,
int24 minGradWidth_
) Ownable(owner_) {
require(
weth_ != address(0) && v3Factory_ != address(0) && platform_ != address(0) && router_ != address(0)
&& tokenDeployer_ != address(0) && curveDeployer_ != address(0) && bondDeployer_ != address(0),
"zero"
);
require(
startTickMag_ > 0 && curveWidth_ > 0 && startTickMag_ % 200 == 0 && curveWidth_ % 200 == 0
&& minGradWidth_ > 0 && minGradWidth_ % 200 == 0 && minGradWidth_ < curveWidth_
// derived grad tick magnitude must stay inside the usable full-range bound (spacing-200 → 887200),
// or seed()/getSqrtRatioAtTick would revert at the FIRST launch instead of failing here at deploy
&& startTickMag_ + curveWidth_ <= 887200,
"curve"
);
WETH = weth_;
v3Factory = v3Factory_;
platform = platform_;
router = router_;
tokenDeployer = LaunchTokenDeployer(tokenDeployer_);
curveDeployer = CurvePoolDeployer(curveDeployer_);
bondDeployer = bondDeployer_;
feeConfig = feeConfig_; // may be address(0) → curves default to 100% LP fee to the platform
START_TICK_MAG = startTickMag_;
CURVE_WIDTH = curveWidth_;
MIN_GRAD_WIDTH = minGradWidth_;
}
receive() external payable {} // for WETH.withdraw refunds during a dev buy
/// @notice One tx: token + real pool + seeded curve + trading on. Send ETH to also make the dev's first
/// buy (≤2%) in the same tx, before trading opens to anyone else. DEX + DexScreener day one.
function launch(LaunchParams calldata p) external payable nonReentrant returns (address token, address curve, address pool) {
if (p.dev == address(0)) revert BadValue();
uint256 ambushAmt = (TOTAL_SUPPLY * AMBUSH_BPS) / 10_000;
uint256 curveAmt = TOTAL_SUPPLY - ambushAmt;
LaunchToken.GuardConfig memory g = LaunchToken.GuardConfig({
deadSecs: 2,
phase1Secs: 60,
antiSnipeSecs: 300,
maxTxBps1: 50,
maxWalletBps1: 100,
maxTxBps2: 100,
maxWalletBps2: 200,
cooldownSecs: 2
});
// CREATE2 salt with per-launch entropy (incl. block.number) so the token — and thus its Uniswap pool
// address — can't be predicted from the deployer's nonce. An attacker who precreates+initializes the
// pool to brick a launch would have to win the race for THIS exact block; a retry lands a fresh
// address, so the DoS can't be made permanent.
bytes32 salt = keccak256(
abi.encodePacked(address(this), p.dev, p.name, p.symbol, block.number, block.timestamp, allTokens.length)
);
token = tokenDeployer.deploy(p.name, p.symbol, TOTAL_SUPPLY, address(this), g, salt);
int24 startTick = token < WETH ? -START_TICK_MAG : START_TICK_MAG;
curve = curveDeployer.deploy(
token, WETH, v3Factory, platform, p.dev, bondDeployer, feeConfig, curveAmt, ambushAmt, startTick, CURVE_WIDTH, MIN_GRAD_WIDTH
);
pool = ICurvePool(curve).pool();
IERC20(token).safeTransfer(curve, TOTAL_SUPPLY);
LaunchToken(token).setCurve(curve); // lets the curve exempt the Bond it posts at graduation
LaunchToken(token).enableTrading(pool, curve, uint64(block.timestamp));
LaunchToken(token).exemptAddress(router); // router receives tokens on burnDev/flushBurn — never a sniper
ICurvePool(curve).seed();
// register the project's tax with the swap desk (router enforces the 4% caps + 100% allocation)
address projWallet = p.tax.projectWallet == address(0) ? p.dev : p.tax.projectWallet;
IPadRouter(router).register(
token, pool, curve, projWallet, p.tax.buyBps, p.tax.sellBps, p.tax.walletBps, p.tax.floorBps, p.tax.burnBps
);
// optional dev buy (uncapped by supply), atomic and ahead of the field
uint256 devBought;
if (msg.value > 0) devBought = _devBuy(token, pool, startTick, p.dev);
recordOf[token] = Record(token, curve, p.dev, block.timestamp);
allTokens.push(token);
emit Launched(token, curve, pool, p.dev, devBought);
}
function _devBuy(address token, address pool, int24 startTick, address dev) internal returns (uint256 bought) {
bool tokenIsToken0 = token < WETH;
bool zeroForOne = !tokenIsToken0; // buying the token: WETH-in. WETH is token0 iff !tokenIsToken0.
// no supply cap on the dev buy: let it climb the whole curve up to the graduation ceiling
// (buys can never go past it). Any ETH beyond what fills the curve is refunded.
int24 capTick = tokenIsToken0 ? startTick + CURVE_WIDTH : startTick - CURVE_WIDTH;
uint160 sqrtLimit = PoolMath.getSqrtRatioAtTick(capTick);
IWETH9(WETH).deposit{value: msg.value}();
_swapping = true;
_activePool = pool;
IUniswapV3Pool(pool).swap(address(this), zeroForOne, int256(msg.value), sqrtLimit, "");
_activePool = address(0);
_swapping = false;
// deliver bought tokens to the dev; refund any unused ETH (no supply cap on the dev buy)
bought = IERC20(token).balanceOf(address(this));
if (bought > 0) IERC20(token).safeTransfer(dev, bought);
uint256 leftWeth = IERC20(WETH).balanceOf(address(this));
if (leftWeth > 0) {
IWETH9(WETH).withdraw(leftWeth);
(bool ok,) = dev.call{value: leftWeth}("");
require(ok, "refund");
}
}
function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata) external override {
require(_swapping && msg.sender == _activePool, "no swap");
uint256 owed = amount0Delta > 0 ? uint256(amount0Delta) : uint256(amount1Delta);
IERC20(WETH).safeTransfer(msg.sender, owed); // msg.sender is the pool mid-swap
}
function setPlatform(address p_) external onlyOwner {
require(p_ != address(0), "zero");
platform = p_;
emit PlatformChanged(p_);
}
/// @notice Owner-only pass-through so the platform can seed a coin's buy-side sniper blocklist during its
/// anti-snipe window (the token only accepts seedBlocklist from its factory). It is add-only and the token
/// auto-freezes it when the window ends, so it can never be used to block a normal holder's sell.
function seedBlocklist(address token, address[] calldata bots) external onlyOwner {
LaunchToken(token).seedBlocklist(bots);
}
function tokenCount() external view returns (uint256) {
return allTokens.length;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "weth_",
"type": "address",
"internalType": "address"
},
{
"name": "v3Factory_",
"type": "address",
"internalType": "address"
},
{
"name": "platform_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "router_",
"type": "address",
"internalType": "address"
},
{
"name": "tokenDeployer_",
"type": "address",
"internalType": "address"
},
{
"name": "curveDeployer_",
"type": "address",
"internalType": "address"
},
{
"name": "bondDeployer_",
"type": "address",
"internalType": "address"
},
{
"name": "feeConfig_",
"type": "address",
"internalType": "address"
},
{
"name": "startTickMag_",
"type": "int24",
"internalType": "int24"
},
{
"name": "curveWidth_",
"type": "int24",
"internalType": "int24"
},
{
"name": "minGradWidth_",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadValue",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Launched",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "curve",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "dev",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "devBought",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PlatformChanged",
"type": "event",
"inputs": [
{
"name": "platform",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "AMBUSH_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "CURVE_WIDTH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "MIN_GRAD_WIDTH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "START_TICK_MAG",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "allTokens",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "bondDeployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "curveDeployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract CurvePoolDeployer"
}
],
"stateMutability": "view"
},
{
"name": "feeConfig",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [
{
"name": "p",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "dev",
"type": "address",
"internalType": "address"
},
{
"name": "tax",
"type": "tuple",
"components": [
{
"name": "buyBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "sellBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "walletBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "floorBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "burnBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "projectWallet",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct CurvePadFactory.TaxParams"
}
],
"internalType": "struct CurvePadFactory.LaunchParams"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "curve",
"type": "address",
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "platform",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "recordOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "curve",
"type": "address",
"internalType": "address"
},
{
"name": "dev",
"type": "address",
"internalType": "address"
},
{
"name": "at",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "router",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "seedBlocklist",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "bots",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPlatform",
"type": "function",
"inputs": [
{
"name": "p_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokenDeployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract LaunchTokenDeployer"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "v3Factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6101c034620004da57601f6200240a38819003918201601f1916830191906001600160401b03831184841017620004df57816101809285926040958652833981010312620004da576200005282620004f5565b6200006060208401620004f5565b916200006e818501620004f5565b936200007d60608201620004f5565b926200008c60808301620004f5565b956200009b60a08401620004f5565b620000a960c08501620004f5565b620000b760e08601620004f5565b9161010099620000c98b8801620004f5565b946101209a620000db8c8a016200050a565b97620000fa610160620000f26101408d016200050a565b9b016200050a565b9b6001600160a01b03168015620004c257600180546001600160a01b031990811690915560008054918216831781558d5192916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b038216151580620004af575b806200049c575b8062000489575b8062000476575b8062000463575b8062000450575b1562000427575060008960020b138062000419575b8062000407575b80620003f5575b80620003e7575b80620003d5575b80620003c5575b8062000382575b15620003565760805260a052600280546001600160a01b0319166001600160a01b0392831617905560c09190915290811660e05216885286526101405261016052610180526101a091825251611ef093909290846200051a85396080518481816102bd015281816105cc0152818161068401528181610cca01528181610e4801528181610e8d01528181610f0c01528181610fef01528181611039015281816110840152611886015260a0518481816106ac01526119ba015260c05184818161094601528181610a3f01528181610adb01526116e5015260e0518481816105890152611c230152518381816107c301526119270152518281816106e401526117dd01526101405182818161070c0152611ca40152610160518281816105f801528181610626015281816116540152611c6a01526101805182818161076301528181610cf6015281816114de01526118eb01525181818161078c0152611be70152f35b8a5162461bcd60e51b8152602060048201526005602482015264637572766560d81b6044820152606490fd5b508960020b8960020b01627fffff198112627fffff821317620003af57620d89a09060020b1315620001f4565b634e487b7160e01b600052601160045260246000fd5b508960020b8c60020b12620001ed565b5060c88c60020b0760020b15620001e6565b5060008c60020b13620001df565b5060c88a60020b0760020b15620001d8565b5060c88960020b0760020b15620001d1565b5060008a60020b13620001ca565b60649062461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b506001600160a01b0388161515620001b5565b506001600160a01b0387161515620001ae565b506001600160a01b0386161515620001a7565b506001600160a01b0385161515620001a0565b506001600160a01b038416151562000199565b506001600160a01b038316151562000192565b8b51631e4fbdf760e01b815260006004820152602490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620004da57565b51908160020b8203620004da5756fe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c9081631e5eb1d014611c905750806326d3147814611c525780632a2dae0a14611c0d578063338cedfc14611bcf5780634bde38c814611ba65780635c8e086a14611b89578063634282af14611b455780636945c5ea14611aa8578063715018a614611a5557806379ba5097146119e95780637c887c59146119a45780638da5cb5b1461197d578063902d55a514611956578063967f08b9146119115780639860de67146118d35780639f181b5e146118b5578063ad5c464814611870578063c06ac6a31461180c578063d8ac0abf146117c7578063dd1b9c4a146117aa578063e30c397814611781578063f2fde38b14611714578063f887ea40146116cf578063fa3885e814610340578063fa461e33146102505763fae1e8b30361000f573461020f57604036600319011261020f5761015d611d04565b6001600160401b03919060243583811161024c573660238201121561024c57806004013593841161024c573660248560051b8301011161024c5761019f611de5565b6001600160a01b0391821693843b1561024857916040519263299a8d4560e01b84526024840181602091602060048801525260246044860194019286905b83821061021d5787808881818d8183818e03925af18015610212576101ff5750f35b61020890611d2e565b61020f5780f35b80fd5b6040513d84823e3d90fd5b9091929394853590828216809203610243579081528301948301939291600101906101dd565b600080fd5b8380fd5b8280fd5b503461020f57606036600319011261020f576004356044356001600160401b038082116102485736602383011215610248578160040135908111610248573691016024011161033c5760ff60025460a01c1680610328575b156102f957818113156102ed576102ea905b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611df9565b80f35b506102ea6024356102ba565b60405162461bcd60e51b815260206004820152600760248201526606e6f20737761760cc1b6044820152606490fd5b506003546001600160a01b031633146102a8565b5080fd5b50602036600319011261020f576001600160401b036004351161020f576101206004353603600319011261020f576002600080516020611e9b83398151915254146116bd576002600080516020611e9b833981519152556001600160a01b036103ad600435604401611d1a565b16156116ab5760405161010081016001600160401b03811182821017611697576104f59160209160405260028152603c8282015261012c60408201526032606082015260646080820152606460a082015260c860c0820152600260e082015261041a604460043501611d1a565b60a861049d61042d600480350180611d64565b9290610443602460043501600435600401611d64565b6005549181876040519889968d88019b3060601b8d5260018060601b03199060601b16603489015260488801378501918d604884019081523701904360488301524260688301526088820152036088810184520182611d41565b519020906104af600480350180611d64565b91909263ffffffff60e06105076104d0602460043501600435600401611d64565b6040516329c491f960e21b81526101a060048201529a8b998a996101a48b0191611db5565b8881036003190160248a015291611db5565b676765c793fa10079d601b1b604487015230606487015284518316608487015287850151831660a48701526040850151831660c4870152606085015161ffff90811660e48801526080860151811661010488015260a0860151811661012488015260c086015116610144870152930151166101648401526101848301520381857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610212578291611678575b506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169082161015611652577f000000000000000000000000000000000000000000000000000000000000000060020b627fffff191461163e577f000000000000000000000000000000000000000000000000000000000000000060020b82035b6002546001600160a01b0316610665600435604401611d1a565b6040516315cbb5c560e11b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f000000000000000000000000000000000000000000000000000000000000000081166044830152606482019390935290821660848201527f0000000000000000000000000000000000000000000000000000000000000000821660a48201527f0000000000000000000000000000000000000000000000000000000000000000821660c48201526b026c62ad77dc602dae00000060e48201526acecb8f27f4200f3a000000610104820152600283810b6101248301527f0000000000000000000000000000000000000000000000000000000000000000810b6101448301527f0000000000000000000000000000000000000000000000000000000000000000900b61016482015290602090829061018490829088907f0000000000000000000000000000000000000000000000000000000000000000165af190811561116657849161161f575b506040516316f0115b60e01b8152916020836004816001600160a01b0386165afa9283156116145785936115e3575b5060405163a9059cbb60e01b86526001600160a01b03838116600452676765c793fa10079d601b1b6024526020908790604490829081908a165af160018751148116156115bb575b816040521561159d57506001600160a01b0384163b15611225576040516348dc9d2b60e01b81526001600160a01b03838116600483015286908290602490829084908a165af180156112305761158a575b506001600160a01b0384163b1561122557604051630d7c584960e31b81526001600160a01b0384811660048301528381166024830152426001600160401b0316604483015286919082908290606490829084908b165af1801561021257611576575b50506001600160a01b0384163b156112255760405163d8f7558560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015286919082908290602490829084908b165af1801561021257611562575b50506001600160a01b0382163b1561122557604051633eca3c9560e11b815285908181600481836001600160a01b0389165af180156102125761154e575b50600435610104016001600160a01b036109e082611d1a565b1661154057506109f4604460043501611d1a565b610a02606460043501611dd6565b610a10608460043501611dd6565b91610a1f60a460043501611dd6565b92610a2e60c460043501611dd6565b610a3c60e460043501611dd6565b927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b1561124f576040516311b5333960e11b81526001600160a01b03808d166004830152808c166024830152808b166044830152918216606482015261ffff958616608482015292851660a484015294841660c4830152831660e48201529116610104820152908290829061012490829084907f0000000000000000000000000000000000000000000000000000000000000000165af180156102125761152c575b5050849034610caf575b50610b21604460043501611d1a565b6040519060808201906001600160401b03821183831017610c995760409182526001600160a01b0387811680855286821660208087019182529383168686019081524260608801908152928c526004909452938a20945185546001600160a01b0319908116918416919091178655935160018601805486169184169190911790559151600285018054909416911617909155516003919091015560055494600160401b861015610c855750610bde85600160609701600555611cd3565b81546001600160a01b0387811660039390931b92831b921b1916179055610c09604460043501611d1a565b604080516001600160a01b039283168152602081019390935284821692848316928716917f358e82117a0869f9749b4cc3096953b1c9307903561af80988389c2689f4530791a46001600080516020611e9b83398151915255604080516001600160a01b03948516815291841660208301529190921690820152f35b634e487b7160e01b81526041600452602490fd5b634e487b7160e01b600052604160045260246000fd5b9050610cbf604460043501611d1a565b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690861610156114dc577f000000000000000000000000000000000000000000000000000000000000000060020b9060020b01627fffff198112627fffff8213176114c8575b858160020b126000146114be578060020b8603905b620d89e88211611495578690600183161561148b576ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b0316926002811661146f575b60048116611453575b60088116611437575b6010811661141b575b602081166113ff575b604081166113e3575b608081166113c7575b61010081166113ab575b610200811661138f575b6104008116611373575b6108008116611357575b611000811661133b575b612000811661131f575b6140008116611303575b61800081166112e7575b6201000081166112cb575b6202000081166112b0575b620400008116611295575b620800001661127d575b60020b1361125a575b63ffffffff811661125357855b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b1561124f57604051630d0e30db60e41b815287908181600481347f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156102125761123b575b50506002805460ff60a01b1916600160a01b179055600380546001600160a01b0319166001600160a01b0387811691821790925560408051630251596160e31b81523060048201527f000000000000000000000000000000000000000000000000000000000000000084168a85161015602482015234604482015260209590951c60ff9490941693909301909116606484015260a0608484015260a48301889052829060c49082908a905af1801561123057611201575b50600380546001600160a01b03191690556002805460ff60a01b191690556040516370a0823160e01b81523060048201529085906020836024816001600160a01b038a165afa9283156102125782936111ca575b50826111b1575b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156111a6578391611171575b5080611037575b50505038610b12565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b1561024c57604051632e1a7d4d60e01b815260048101829052918383602481837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af192831561116657849361114e575b50829182915af13d15611149573d6001600160401b03811161113557604051906110f0601f8201601f191660200183611d41565b81528660203d92013e5b156111075784388061102e565b60405162461bcd60e51b81526020600482015260066024820152651c99599d5b9960d21b6044820152606490fd5b634e487b7160e01b87526041600452602487fd5b6110fa565b61115a90939193611d2e565b61024c578291386110bc565b6040513d86823e3d90fd5b9250506020823d60201161119e575b8161118d60209383611d41565b810103126102435786915138611027565b3d9150611180565b6040513d85823e3d90fd5b6111c583826001600160a01b038916611df9565b610fd4565b915091506020813d6020116111f9575b816111e760209383611d41565b81010312610243578590519138610fcd565b3d91506111da565b604090813d8311611229575b6112178183611d41565b810103126112255738610f79565b8480fd5b503d61120d565b6040513d88823e3d90fd5b61124490611d2e565b61124f578638610ec2565b8680fd5b6001610e46565b80156112695760001904610e39565b634e487b7160e01b86526012600452602486fd5b916b048a170391f7dc42444e8fa20260801c91610e30565b6d2216e584f5fa1ea926041bedfe9890930260801c92610e26565b926e5d6af8dedb81196699c329225ee6040260801c92610e1b565b926f09aa508b5b7a84e1c677de54f3e99bc90260801c92610e10565b926f31be135f97d08fd981231505542fcfa60260801c92610e05565b926f70d869a156d2a1b890bb3df62baf32f70260801c92610dfb565b926fa9f746462d870fdf8a65dc1f90e061e50260801c92610df1565b926fd097f3bdfd2022b8845ad8f792aa58250260801c92610de7565b926fe7159475a2c29b7443b29c7fa6e889d90260801c92610ddd565b926ff3392b0822b70005940c7a398e4b70f30260801c92610dd3565b926ff987a7253ac413176f2b074cf7815e540260801c92610dc9565b926ffcbe86c7900a88aedcffc83b479aa3a40260801c92610dbf565b926ffe5dee046a99a2a811c461f1969c30530260801c92610db5565b926fff2ea16466c96a3843ec78b326b528610260801c92610dac565b926fff973b41fa98c081472e6896dfb254c00260801c92610da3565b926fffcb9843d60f6159c9db58835c9266440260801c92610d9a565b926fffe5caca7e10e4e61c3624eaa0941cd00260801c92610d91565b926ffff2e50f5f656932ef12357cf3c7fdcc0260801c92610d88565b926ffff97272373d413259a46990580e213a0260801c92610d7f565b600160801b610d6c565b60405162461bcd60e51b81526020600482015260016024820152601560fa1b6044820152606490fd5b8060020b90610d45565b634e487b7160e01b86526011600452602486fd5b7f000000000000000000000000000000000000000000000000000000000000000060020b9060020b03627fffff8113627fffff1982121715610d3057634e487b7160e01b86526011600452602486fd5b61153590611d2e565b611225578438610b08565b61154990611d1a565b6109f4565b61155790611d2e565b6112255784386109c7565b61156b90611d2e565b611225578438610989565b61157f90611d2e565b61122557843861091d565b61159690959195611d2e565b93386108bb565b635274afe760e01b81526001600160a01b0385166004820152602490fd5b60018115166115da573d156001600160a01b0387163b1515161661086a565b503d86823e3d90fd5b61160691935060203d60201161160d575b6115fe8183611d41565b810190611d96565b9138610822565b503d6115f4565b6040513d87823e3d90fd5b611638915060203d60201161160d576115fe8183611d41565b386107f3565b634e487b7160e01b82526011600452602482fd5b7f000000000000000000000000000000000000000000000000000000000000000061064b565b611691915060203d60201161160d576115fe8183611d41565b386105c1565b634e487b7160e01b83526041600452602483fd5b604051630bba69fb60e01b8152600490fd5b604051633ee5aeb560e01b8152600490fd5b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f57602036600319011261020f5761172e611d04565b611736611de5565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461020f578060031936011261020f576001546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f5760206040516127108152f35b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f57602036600319011261020f576080906001600160a01b039060409082611836611d04565b1681526004602052209080825416916003826001830154169260028301541691015491604051938452602084015260408301526060820152f35b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f578060031936011261020f576020600554604051908152f35b503461020f578060031936011261020f5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f578060031936011261020f57604051676765c793fa10079d601b1b8152602090f35b503461020f578060031936011261020f57546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f578060031936011261020f576001546001600160a01b033381831603611a3d576001600160a01b03199182166001558254339281168317845516600080516020611e7b8339815191528380a380f35b60405163118cdaa760e01b8152336004820152602490fd5b503461020f578060031936011261020f57611a6e611de5565b600180546001600160a01b03199081169091558154908116825581906001600160a01b0316600080516020611e7b8339815191528280a380f35b503461020f57602036600319011261020f57611ac2611d04565b611aca611de5565b6001600160a01b03168015611b1a57600280546001600160a01b031916821790556040519081527f7233c505b7cde4da4138f9e5dd1c6c2081eab04da5fa59c1f616874f5369c96390602090a180f35b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b503461020f57602036600319011261020f576004359060055482101561020f576020611b7083611cd3565b905460405160039290921b1c6001600160a01b03168152f35b503461020f578060031936011261020f5760206040516109c48152f35b503461020f578060031936011261020f576002546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b503461020f578060031936011261020f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461020f578060031936011261020f5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b90503461033c578160031936011261033c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b600554811015611cee57600560005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b600435906001600160a01b038216820361024357565b356001600160a01b03811681036102435790565b6001600160401b038111610c9957604052565b601f909101601f19168101906001600160401b03821190821017610c9957604052565b903590601e198136030182121561024357018035906001600160401b0382116102435760200191813603831361024357565b9081602091031261024357516001600160a01b03811681036102435790565b908060209392818452848401376000828201840152601f01601f1916010190565b3561ffff811681036102435790565b6000546001600160a01b03163303611a3d57565b60405163a9059cbb60e01b60009081526001600160a01b039384166004526024949094529260209060448180855af1600160005114811615611e5a575b8360405215611e4457505050565b635274afe760e01b835216600482015260249150fd5b6001811516611e7057813b15153d151616611e36565b833d6000823e3d90fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220018fc8ca2dd90d02f4b1ddfcba9c2b8f716d8440db956168055943a5faf3967464736f6c634300081800330000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad730000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa000000000000000000000000cdd5ff5d521d3694c2a2f31edf7cd3c0e9a6fabf000000000000000000000000cdd5ff5d521d3694c2a2f31edf7cd3c0e9a6fabf000000000000000000000000a6baab820809c7fc8350311776627298f91f07ec000000000000000000000000b3748cb6ba4e47b885f8333aca8c004a4657383d000000000000000000000000020524511ad8b99828b19da0fd3bb7be919a080c0000000000000000000000008b04d9e55c904d6d371ea6e81ecb2a0911843ad3000000000000000000000000064d977b66fcc29256510dbcd8cc0c51bbb2de14000000000000000000000000000000000000000000000000000000000003138000000000000000000000000000000000000000000000000000000000000059d80000000000000000000000000000000000000000000000000000000000005910
0x608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c9081631e5eb1d014611c905750806326d3147814611c525780632a2dae0a14611c0d578063338cedfc14611bcf5780634bde38c814611ba65780635c8e086a14611b89578063634282af14611b455780636945c5ea14611aa8578063715018a614611a5557806379ba5097146119e95780637c887c59146119a45780638da5cb5b1461197d578063902d55a514611956578063967f08b9146119115780639860de67146118d35780639f181b5e146118b5578063ad5c464814611870578063c06ac6a31461180c578063d8ac0abf146117c7578063dd1b9c4a146117aa578063e30c397814611781578063f2fde38b14611714578063f887ea40146116cf578063fa3885e814610340578063fa461e33146102505763fae1e8b30361000f573461020f57604036600319011261020f5761015d611d04565b6001600160401b03919060243583811161024c573660238201121561024c57806004013593841161024c573660248560051b8301011161024c5761019f611de5565b6001600160a01b0391821693843b1561024857916040519263299a8d4560e01b84526024840181602091602060048801525260246044860194019286905b83821061021d5787808881818d8183818e03925af18015610212576101ff5750f35b61020890611d2e565b61020f5780f35b80fd5b6040513d84823e3d90fd5b9091929394853590828216809203610243579081528301948301939291600101906101dd565b600080fd5b8380fd5b8280fd5b503461020f57606036600319011261020f576004356044356001600160401b038082116102485736602383011215610248578160040135908111610248573691016024011161033c5760ff60025460a01c1680610328575b156102f957818113156102ed576102ea905b337f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316611df9565b80f35b506102ea6024356102ba565b60405162461bcd60e51b815260206004820152600760248201526606e6f20737761760cc1b6044820152606490fd5b506003546001600160a01b031633146102a8565b5080fd5b50602036600319011261020f576001600160401b036004351161020f576101206004353603600319011261020f576002600080516020611e9b83398151915254146116bd576002600080516020611e9b833981519152556001600160a01b036103ad600435604401611d1a565b16156116ab5760405161010081016001600160401b03811182821017611697576104f59160209160405260028152603c8282015261012c60408201526032606082015260646080820152606460a082015260c860c0820152600260e082015261041a604460043501611d1a565b60a861049d61042d600480350180611d64565b9290610443602460043501600435600401611d64565b6005549181876040519889968d88019b3060601b8d5260018060601b03199060601b16603489015260488801378501918d604884019081523701904360488301524260688301526088820152036088810184520182611d41565b519020906104af600480350180611d64565b91909263ffffffff60e06105076104d0602460043501600435600401611d64565b6040516329c491f960e21b81526101a060048201529a8b998a996101a48b0191611db5565b8881036003190160248a015291611db5565b676765c793fa10079d601b1b604487015230606487015284518316608487015287850151831660a48701526040850151831660c4870152606085015161ffff90811660e48801526080860151811661010488015260a0860151811661012488015260c086015116610144870152930151166101648401526101848301520381857f000000000000000000000000b3748cb6ba4e47b885f8333aca8c004a4657383d6001600160a01b03165af1908115610212578291611678575b506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381169082161015611652577f000000000000000000000000000000000000000000000000000000000003138060020b627fffff191461163e577f000000000000000000000000000000000000000000000000000000000003138060020b82035b6002546001600160a01b0316610665600435604401611d1a565b6040516315cbb5c560e11b81526001600160a01b0385811660048301527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73811660248301527f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa81166044830152606482019390935290821660848201527f0000000000000000000000008b04d9e55c904d6d371ea6e81ecb2a0911843ad3821660a48201527f000000000000000000000000064d977b66fcc29256510dbcd8cc0c51bbb2de14821660c48201526b026c62ad77dc602dae00000060e48201526acecb8f27f4200f3a000000610104820152600283810b6101248301527f00000000000000000000000000000000000000000000000000000000000059d8810b6101448301527f0000000000000000000000000000000000000000000000000000000000005910900b61016482015290602090829061018490829088907f000000000000000000000000020524511ad8b99828b19da0fd3bb7be919a080c165af190811561116657849161161f575b506040516316f0115b60e01b8152916020836004816001600160a01b0386165afa9283156116145785936115e3575b5060405163a9059cbb60e01b86526001600160a01b03838116600452676765c793fa10079d601b1b6024526020908790604490829081908a165af160018751148116156115bb575b816040521561159d57506001600160a01b0384163b15611225576040516348dc9d2b60e01b81526001600160a01b03838116600483015286908290602490829084908a165af180156112305761158a575b506001600160a01b0384163b1561122557604051630d7c584960e31b81526001600160a01b0384811660048301528381166024830152426001600160401b0316604483015286919082908290606490829084908b165af1801561021257611576575b50506001600160a01b0384163b156112255760405163d8f7558560e01b81526001600160a01b037f000000000000000000000000a6baab820809c7fc8350311776627298f91f07ec8116600483015286919082908290602490829084908b165af1801561021257611562575b50506001600160a01b0382163b1561122557604051633eca3c9560e11b815285908181600481836001600160a01b0389165af180156102125761154e575b50600435610104016001600160a01b036109e082611d1a565b1661154057506109f4604460043501611d1a565b610a02606460043501611dd6565b610a10608460043501611dd6565b91610a1f60a460043501611dd6565b92610a2e60c460043501611dd6565b610a3c60e460043501611dd6565b927f000000000000000000000000a6baab820809c7fc8350311776627298f91f07ec6001600160a01b03163b1561124f576040516311b5333960e11b81526001600160a01b03808d166004830152808c166024830152808b166044830152918216606482015261ffff958616608482015292851660a484015294841660c4830152831660e48201529116610104820152908290829061012490829084907f000000000000000000000000a6baab820809c7fc8350311776627298f91f07ec165af180156102125761152c575b5050849034610caf575b50610b21604460043501611d1a565b6040519060808201906001600160401b03821183831017610c995760409182526001600160a01b0387811680855286821660208087019182529383168686019081524260608801908152928c526004909452938a20945185546001600160a01b0319908116918416919091178655935160018601805486169184169190911790559151600285018054909416911617909155516003919091015560055494600160401b861015610c855750610bde85600160609701600555611cd3565b81546001600160a01b0387811660039390931b92831b921b1916179055610c09604460043501611d1a565b604080516001600160a01b039283168152602081019390935284821692848316928716917f358e82117a0869f9749b4cc3096953b1c9307903561af80988389c2689f4530791a46001600080516020611e9b83398151915255604080516001600160a01b03948516815291841660208301529190921690820152f35b634e487b7160e01b81526041600452602490fd5b634e487b7160e01b600052604160045260246000fd5b9050610cbf604460043501611d1a565b906001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73811690861610156114dc577f00000000000000000000000000000000000000000000000000000000000059d860020b9060020b01627fffff198112627fffff8213176114c8575b858160020b126000146114be578060020b8603905b620d89e88211611495578690600183161561148b576ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b0316926002811661146f575b60048116611453575b60088116611437575b6010811661141b575b602081166113ff575b604081166113e3575b608081166113c7575b61010081166113ab575b610200811661138f575b6104008116611373575b6108008116611357575b611000811661133b575b612000811661131f575b6140008116611303575b61800081166112e7575b6201000081166112cb575b6202000081166112b0575b620400008116611295575b620800001661127d575b60020b1361125a575b63ffffffff811661125357855b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b1561124f57604051630d0e30db60e41b815287908181600481347f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af180156102125761123b575b50506002805460ff60a01b1916600160a01b179055600380546001600160a01b0319166001600160a01b0387811691821790925560408051630251596160e31b81523060048201527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7384168a85161015602482015234604482015260209590951c60ff9490941693909301909116606484015260a0608484015260a48301889052829060c49082908a905af1801561123057611201575b50600380546001600160a01b03191690556002805460ff60a01b191690556040516370a0823160e01b81523060048201529085906020836024816001600160a01b038a165afa9283156102125782936111ca575b50826111b1575b6040516370a0823160e01b81523060048201526020816024817f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165afa9081156111a6578391611171575b5080611037575b50505038610b12565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b1561024c57604051632e1a7d4d60e01b815260048101829052918383602481837f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af192831561116657849361114e575b50829182915af13d15611149573d6001600160401b03811161113557604051906110f0601f8201601f191660200183611d41565b81528660203d92013e5b156111075784388061102e565b60405162461bcd60e51b81526020600482015260066024820152651c99599d5b9960d21b6044820152606490fd5b634e487b7160e01b87526041600452602487fd5b6110fa565b61115a90939193611d2e565b61024c578291386110bc565b6040513d86823e3d90fd5b9250506020823d60201161119e575b8161118d60209383611d41565b810103126102435786915138611027565b3d9150611180565b6040513d85823e3d90fd5b6111c583826001600160a01b038916611df9565b610fd4565b915091506020813d6020116111f9575b816111e760209383611d41565b81010312610243578590519138610fcd565b3d91506111da565b604090813d8311611229575b6112178183611d41565b810103126112255738610f79565b8480fd5b503d61120d565b6040513d88823e3d90fd5b61124490611d2e565b61124f578638610ec2565b8680fd5b6001610e46565b80156112695760001904610e39565b634e487b7160e01b86526012600452602486fd5b916b048a170391f7dc42444e8fa20260801c91610e30565b6d2216e584f5fa1ea926041bedfe9890930260801c92610e26565b926e5d6af8dedb81196699c329225ee6040260801c92610e1b565b926f09aa508b5b7a84e1c677de54f3e99bc90260801c92610e10565b926f31be135f97d08fd981231505542fcfa60260801c92610e05565b926f70d869a156d2a1b890bb3df62baf32f70260801c92610dfb565b926fa9f746462d870fdf8a65dc1f90e061e50260801c92610df1565b926fd097f3bdfd2022b8845ad8f792aa58250260801c92610de7565b926fe7159475a2c29b7443b29c7fa6e889d90260801c92610ddd565b926ff3392b0822b70005940c7a398e4b70f30260801c92610dd3565b926ff987a7253ac413176f2b074cf7815e540260801c92610dc9565b926ffcbe86c7900a88aedcffc83b479aa3a40260801c92610dbf565b926ffe5dee046a99a2a811c461f1969c30530260801c92610db5565b926fff2ea16466c96a3843ec78b326b528610260801c92610dac565b926fff973b41fa98c081472e6896dfb254c00260801c92610da3565b926fffcb9843d60f6159c9db58835c9266440260801c92610d9a565b926fffe5caca7e10e4e61c3624eaa0941cd00260801c92610d91565b926ffff2e50f5f656932ef12357cf3c7fdcc0260801c92610d88565b926ffff97272373d413259a46990580e213a0260801c92610d7f565b600160801b610d6c565b60405162461bcd60e51b81526020600482015260016024820152601560fa1b6044820152606490fd5b8060020b90610d45565b634e487b7160e01b86526011600452602486fd5b7f00000000000000000000000000000000000000000000000000000000000059d860020b9060020b03627fffff8113627fffff1982121715610d3057634e487b7160e01b86526011600452602486fd5b61153590611d2e565b611225578438610b08565b61154990611d1a565b6109f4565b61155790611d2e565b6112255784386109c7565b61156b90611d2e565b611225578438610989565b61157f90611d2e565b61122557843861091d565b61159690959195611d2e565b93386108bb565b635274afe760e01b81526001600160a01b0385166004820152602490fd5b60018115166115da573d156001600160a01b0387163b1515161661086a565b503d86823e3d90fd5b61160691935060203d60201161160d575b6115fe8183611d41565b810190611d96565b9138610822565b503d6115f4565b6040513d87823e3d90fd5b611638915060203d60201161160d576115fe8183611d41565b386107f3565b634e487b7160e01b82526011600452602482fd5b7f000000000000000000000000000000000000000000000000000000000003138061064b565b611691915060203d60201161160d576115fe8183611d41565b386105c1565b634e487b7160e01b83526041600452602483fd5b604051630bba69fb60e01b8152600490fd5b604051633ee5aeb560e01b8152600490fd5b503461020f578060031936011261020f576040517f000000000000000000000000a6baab820809c7fc8350311776627298f91f07ec6001600160a01b03168152602090f35b503461020f57602036600319011261020f5761172e611d04565b611736611de5565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461020f578060031936011261020f576001546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f5760206040516127108152f35b503461020f578060031936011261020f576040517f0000000000000000000000008b04d9e55c904d6d371ea6e81ecb2a0911843ad36001600160a01b03168152602090f35b503461020f57602036600319011261020f576080906001600160a01b039060409082611836611d04565b1681526004602052209080825416916003826001830154169260028301541691015491604051938452602084015260408301526060820152f35b503461020f578060031936011261020f576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b503461020f578060031936011261020f576020600554604051908152f35b503461020f578060031936011261020f5760206040517f00000000000000000000000000000000000000000000000000000000000059d860020b8152f35b503461020f578060031936011261020f576040517f000000000000000000000000020524511ad8b99828b19da0fd3bb7be919a080c6001600160a01b03168152602090f35b503461020f578060031936011261020f57604051676765c793fa10079d601b1b8152602090f35b503461020f578060031936011261020f57546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f576040517f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03168152602090f35b503461020f578060031936011261020f576001546001600160a01b033381831603611a3d576001600160a01b03199182166001558254339281168317845516600080516020611e7b8339815191528380a380f35b60405163118cdaa760e01b8152336004820152602490fd5b503461020f578060031936011261020f57611a6e611de5565b600180546001600160a01b03199081169091558154908116825581906001600160a01b0316600080516020611e7b8339815191528280a380f35b503461020f57602036600319011261020f57611ac2611d04565b611aca611de5565b6001600160a01b03168015611b1a57600280546001600160a01b031916821790556040519081527f7233c505b7cde4da4138f9e5dd1c6c2081eab04da5fa59c1f616874f5369c96390602090a180f35b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b503461020f57602036600319011261020f576004359060055482101561020f576020611b7083611cd3565b905460405160039290921b1c6001600160a01b03168152f35b503461020f578060031936011261020f5760206040516109c48152f35b503461020f578060031936011261020f576002546040516001600160a01b039091168152602090f35b503461020f578060031936011261020f5760206040517f000000000000000000000000000000000000000000000000000000000000591060020b8152f35b503461020f578060031936011261020f576040517f000000000000000000000000b3748cb6ba4e47b885f8333aca8c004a4657383d6001600160a01b03168152602090f35b503461020f578060031936011261020f5760206040517f000000000000000000000000000000000000000000000000000000000003138060020b8152f35b90503461033c578160031936011261033c577f000000000000000000000000064d977b66fcc29256510dbcd8cc0c51bbb2de146001600160a01b03168152602090f35b600554811015611cee57600560005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b600435906001600160a01b038216820361024357565b356001600160a01b03811681036102435790565b6001600160401b038111610c9957604052565b601f909101601f19168101906001600160401b03821190821017610c9957604052565b903590601e198136030182121561024357018035906001600160401b0382116102435760200191813603831361024357565b9081602091031261024357516001600160a01b03811681036102435790565b908060209392818452848401376000828201840152601f01601f1916010190565b3561ffff811681036102435790565b6000546001600160a01b03163303611a3d57565b60405163a9059cbb60e01b60009081526001600160a01b039384166004526024949094529260209060448180855af1600160005114811615611e5a575b8360405215611e4457505050565b635274afe760e01b835216600482015260249150fd5b6001811516611e7057813b15153d151616611e36565b833d6000823e3d90fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220018fc8ca2dd90d02f4b1ddfcba9c2b8f716d8440db956168055943a5faf3967464736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x7c4d79…2b35ec | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x358e82…5307 | [0] 0x000000000000…f585a725 [1] 0x000000000000…72e734e5 [2] 0x000000000000…c4e85835 data: 0x000000000000000000…5f30c2e9 |
| 0x9edde5…9ed584 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x358e82…5307 | [0] 0x000000000000…2cc7e346 [1] 0x000000000000…5dd45d09 [2] 0x000000000000…ccb4a390 data: 0x000000000000000000…c7c49077 |
| 0x305018…fec3fb | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x358e82…5307 | [0] 0x000000000000…29a70721 [1] 0x000000000000…444d55c3 [2] 0x000000000000…7d9719e0 data: 0x000000000000000000…c7c49077 |
| 0x4afa9d…2afe14 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x358e82…5307 | [0] 0x000000000000…1f3f354f [1] 0x000000000000…91cbffff [2] 0x000000000000…5d34a085 data: 0x000000000000000000…1b68aadc |
| 0x924570…2e6eef | 17 days agoFri, 31 Jul 2026 23:04:08 UTC | 0x358e82…5307 | [0] 0x000000000000…6ff1db83 [1] 0x000000000000…dd18e7ce [2] 0x000000000000…d4a862eb data: 0x000000000000000000…00000000 |
| 0xea61ad…fe5ade | 17 days agoFri, 31 Jul 2026 22:48:57 UTC | 0x358e82…5307 | [0] 0x000000000000…f5e942bd [1] 0x000000000000…ca4ad662 [2] 0x000000000000…dda43d08 data: 0x000000000000000000…00000000 |
| 0x1f6f00…05f579 | 17 days agoFri, 31 Jul 2026 20:54:34 UTC | 0x358e82…5307 | [0] 0x000000000000…07242565 [1] 0x000000000000…15d2bdf3 [2] 0x000000000000…5b2daa1b data: 0x000000000000000000…58efed24 |
| 0x195deb…d8cac4 | 24 days agoFri, 24 Jul 2026 16:54:24 UTC | 0x358e82…5307 | [0] 0x000000000000…2755c4c1 [1] 0x000000000000…1b4e942b [2] 0x000000000000…f357e251 data: 0x000000000000000000…1b68aadc |
| 0x12a444…becf1c | 24 days agoFri, 24 Jul 2026 08:46:02 UTC | 0x358e82…5307 | [0] 0x000000000000…6c5ebeaf [1] 0x000000000000…18bf5569 [2] 0x000000000000…a83b731f data: 0x000000000000000000…a50ac047 |
| 0x9e2f0a…58e682 | 25 days agoFri, 24 Jul 2026 01:26:10 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…e9a6fabf |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x7c4d79…2b35ec | launch | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0xe66c…b391 | IN | CurvePadFactory | $5,121.332.7 ETH | 0.00039704 | |
| 0x9edde5…9ed584 | launch | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0xc10b…3b3b | IN | CurvePadFactory | $3,793.582 ETH | 0.00041373 | |
| 0x305018…fec3fb | launch | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0xb7d7…ed7d | IN | CurvePadFactory | $3,793.582 ETH | 0.00036388 | |
| 0x4afa9d…2afe14 | launch | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x2997…cf68 | IN | CurvePadFactory | $18.970.01 ETH | 0.00026957 | |
| 0x924570…2e6eef | launch | 24,558,120 | 17 days agoFri, 31 Jul 2026 23:04:08 UTC | 0x5db7…575f | IN | CurvePadFactory | $0.000 ETH | 0.00026522 | |
| 0xea61ad…fe5ade | launch | 24,549,028 | 17 days agoFri, 31 Jul 2026 22:48:57 UTC | 0x8b91…4a1b | IN | CurvePadFactory | $0.000 ETH | 0.00026653 | |
| 0x1f6f00…05f579 | launch | 24,480,540 | 17 days agoFri, 31 Jul 2026 20:54:34 UTC | 0x8219…a16a | IN | CurvePadFactory | $474.200.25 ETH | 0.00027475 | |
| 0x195deb…d8cac4 | launch | 18,308,053 | 24 days agoFri, 24 Jul 2026 16:54:24 UTC | 0xaacf…e37c | IN | CurvePadFactory | $18.970.01 ETH | 0.00161956 | |
| 0x12a444…becf1c | launch | 18,015,907 | 24 days agoFri, 24 Jul 2026 08:46:02 UTC | 0x6cbd…0bb1 | IN | CurvePadFactory | $132.780.07 ETH | 0.00152431 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x7c4d79…2b35ec | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 2.7 ETH |
| 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x9edde5…9ed584 | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 2 ETH |
| 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x305018…fec3fb | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 2 ETH |
| 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x4afa9d…2afe14 | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 0.01 ETH |
| 24,480,540 | 17 days agoFri, 31 Jul 2026 20:54:34 UTC | 0x1f6f00…05f579 | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 0.25 ETH |
| 18,308,053 | 24 days agoFri, 24 Jul 2026 16:54:24 UTC | 0x195deb…d8cac4 | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 0.01 ETH |
| 18,015,907 | 24 days agoFri, 24 Jul 2026 08:46:02 UTC | 0x12a444…becf1c | CALL | launch | 0x8aa9…8074 | OUT | 0x0bd7…ad73 | 0.07 ETH |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x8aa9…8074 | OUT | 0xe66c…b391 | 637,398,000.609593 1R0NY | 1R0NYMAN (1R0NY) | |
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x8aa9…8074 | OUT | 0x302d…5835 | 2.7 WETH | WETH (WETH) | |
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x302d…5835 | IN | 0x8aa9…8074 | 637,398,000.609593 1R0NY | 1R0NYMAN (1R0NY) | |
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 2.7 WETH | WETH (WETH) | |
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x8aa9…8074 | OUT | 0xff08…34e5 | 1,000,000,000.000000 1R0NY | 1R0NYMAN (1R0NY) | |
| 0x7c4d7902…2b35ec | Transfer | 30,518,996 | 10 days agoFri, 07 Aug 2026 21:02:35 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 1,000,000,000.000000 1R0NY | 1R0NYMAN (1R0NY) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x8aa9…8074 | OUT | 0xc10b…3b3b | 555,836,070.676515 BONK | Bonk (BONK) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x8aa9…8074 | OUT | 0xf36e…a390 | 2 WETH | WETH (WETH) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0xf36e…a390 | IN | 0x8aa9…8074 | 555,836,070.676515 BONK | Bonk (BONK) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 2 WETH | WETH (WETH) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x8aa9…8074 | OUT | 0x5faf…5d09 | 1,000,000,000.000000 BONK | Bonk (BONK) | |
| 0x9edde5aa…9ed584 | Transfer | 29,706,840 | 11 days agoThu, 06 Aug 2026 22:26:24 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 1,000,000,000.000000 BONK | Bonk (BONK) | |
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x8aa9…8074 | OUT | 0xb7d7…ed7d | $NaN555,836,070.676515 TROLLCAT | ||
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x8aa9…8074 | OUT | 0x9585…19e0 | 2 WETH | WETH (WETH) | |
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x9585…19e0 | IN | 0x8aa9…8074 | $NaN555,836,070.676515 TROLLCAT | ||
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 2 WETH | WETH (WETH) | |
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x8aa9…8074 | OUT | 0xae6e…55c3 | $NaN1,000,000,000.000000 TROLLCAT | ||
| 0x305018dc…fec3fb | Transfer | 29,384,613 | 11 days agoThu, 06 Aug 2026 13:28:33 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | $NaN1,000,000,000.000000 TROLLCAT | ||
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x8aa9…8074 | OUT | 0x2997…cf68 | 5,602,112.072316 TEST | Test (TEST) | |
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x8aa9…8074 | OUT | 0x05f1…a085 | 0.01 WETH | WETH (WETH) | |
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x05f1…a085 | IN | 0x8aa9…8074 | 5,602,112.072316 TEST | Test (TEST) | |
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 0.01 WETH | WETH (WETH) | |
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x8aa9…8074 | OUT | 0xb143…ffff | 1,000,000,000.000000 TEST | Test (TEST) | |
| 0x4afa9d81…2afe14 | Transfer | 28,469,829 | 12 days agoWed, 05 Aug 2026 12:01:51 UTC | 0x0000…0000 | IN | 0x8aa9…8074 | 1,000,000,000.000000 TEST | Test (TEST) | |
| 0x924570d4…2e6eef | Transfer | 24,558,120 | 17 days agoFri, 31 Jul 2026 23:04:08 UTC | 0x8aa9…8074 | OUT | 0x1511…e7ce | 1,000,000,000.000000 BUYME | Buy This Shit (BUYME) |