// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {
IPoolManager,
IUnlockCallback,
PoolKey,
ModifyLiquidityParams,
BalanceDeltaLib
} from "./interfaces/IUniswapV4.sol";
import {TickMath} from "./lib/TickMath.sol";
import {HoodTokenWeb} from "./HoodTokenWeb.sol";
import {TaxHook} from "./TaxHook.sol";
/**
* @title UniV4EthFlexLaunch
* @notice Fair-launch a token straight into a Uniswap **v4** pool quoted in WETH. Mints a fixed 1B admin-less ERC-20,
* pays 20% to the launch vesting wallet, and places the remaining 80%
* as SINGLE-SIDED token liquidity. There is NO airdrop in this version.
*
* v4 differences that matter here:
* * Pools live inside one singleton PoolManager, so launching only
* *initializes* a pool instead of deploying a pool contract. That
* is the bulk of the gas saving over v3.
* * Balances move through flash accounting: everything happens inside
* `unlock`, and every currency delta must be settled before the
* callback returns.
* * The liquidity position is held by THIS contract inside the
* manager, keyed by (owner, tickLower, tickUpper, salt). There is no
* LP NFT to transfer and no withdraw path here, so the liquidity is
* locked at least as tightly as the v3 version.
*
* The token address is CREATE2-mined strictly below the quote so it
* always sorts as currency0, which keeps the single-sided position on
* the currency0 side exactly like the v3 launchpads.
*/
/// @notice Everything about a launch that used to be frozen in bytecode.
/// Passed in at deploy time so a new market shape never needs a
/// recompile — pick the fee tier, the opening price and the supply on
/// the site and the contract is born with them.
struct LaunchConfig {
string name; // label awal; ganti kapan saja lewat setName
string website; // menempel di tiap token lewat contractURI
uint256 totalSupply;
uint24 poolFee; // 3000 = 0.30%
int24 tickSpacing; // must divide startTick and startTick + rangeWidth
int24 startTick; // opening price = 1.0001^startTick, quote per token
int24 rangeWidth; // how far above startTick the locked liquidity spans
}
contract Hoodmarket is
Ownable2Step,
Pausable,
ReentrancyGuard,
IUnlockCallback
{
using SafeERC20 for IERC20;
using BalanceDeltaLib for int256;
struct Coin {
address creator;
bytes32 poolId;
uint256 marketTokens;
}
/// @notice Label kontrak yang dibaca semua halaman. Disimpan di storage,
/// jadi bisa diganti kapan saja lewat setName — berbeda dengan nama
/// terverifikasi di explorer, yang terikat pada bytecode.
string public NAME;
/// @notice Where people can read about these launches. Copied into every
/// token minted from here as its ERC-7572 contractURI.
string public website;
uint256 public immutable TOTAL_SUPPLY;
uint256 public constant BPS = 10_000;
/// @notice Split per launch is 15% vesting wallet (direct) / 5% airdrop
/// across four fixed wallets / 80% locked LP.
uint256 public vestBps;
/// @notice Quote currency for EVERY launch: NATIVE ETH (address(0)). Being
/// the lowest address it sorts as currency0, so the launched token
/// is currency1 — the whole layout is the mirror image of the WETH
/// sibling. Native ETH is what sniper bots hold, which is the point.
address public constant QUOTE = address(0);
/// @notice Airdrop share, in bps of total supply. Editable by the owner at
/// any time — set it to 0 and that share flows into the locked LP
/// automatically, because the market supply is simply whatever is
/// left after vesting and airdrop.
uint256 public airdropBps;
/// @notice Airdrop recipients. Editable: add, remove, or replace the whole
/// list without redeploying. Weights are drawn per launch, so the
/// split across the list differs for every token.
address[] private _airdropWallets;
/// @dev A ceiling so one launch can never run out of gas mid-distribution.
uint256 public constant MAX_AIRDROP_WALLETS = 400;
/// @dev Kept so existing pages/bots that read the old constant names keep
/// working — both now report live storage instead of hard-coded values.
function AIRDROP_TOTAL_BPS() external view returns (uint256) { return airdropBps; }
function AIRDROP_N() external view returns (uint256) { return _airdropWallets.length; }
/// @notice Full recipient list, for UIs that want to show it.
function airdropWallets() external view returns (address[] memory) { return _airdropWallets; }
function airdropWalletAt(uint256 i) external view returns (address) { return _airdropWallets[i]; }
event AirdropDistributed(address indexed token, uint256 total, uint256[] amounts);
event SplitUpdated(uint256 vestBps, uint256 airdropBps, uint256 lpBps);
event NameUpdated(string name);
/// @notice Sengaja dibuat identik dengan event yang dipakai launchpad lain
/// di chain ini (topic0 0x505c8cdc72ea…), supaya indexer yang sudah
/// mendengarkan format itu ikut membaca token dari sini.
event CoinMetadata(
address indexed coin,
string image,
string description,
string twitter,
string telegram,
string website
);
event WebsiteUpdated(string website);
event AirdropWalletsUpdated(uint256 count);
/// @notice Emitted when a mint included a seed buy that woke the pool.
event PoolSeeded(address indexed token, uint256 ethIn, uint256 tokensOut);
uint24 public immutable POOL_FEE;
int24 public immutable TICK_SPACING;
/// @notice The tax hook this launchpad mined and deployed at birth. Every
/// pool from here is keyed to it, so the owner can switch the swap
/// tax on later even though the pool key itself is immutable.
TaxHook public hook;
function HOOKS() external view returns (address) { return address(hook); }
/// @notice Launch tick. 1.0001^-210780 is about 7.0e-10 WETH per token,
/// i.e. a starting FDV of about 2,457 USD at 3,500 USD/ETH — the
/// same starting valuation as the NVDA sibling.
int24 public immutable START_TICK;
int24 public immutable RANGE_WIDTH;
uint256 private constant MAX_SALT_ITERATIONS = 4_000;
/// @dev Flags occupy 14 bits, so ~1 in 16,384 salts lands on 0x00CC; this
/// ceiling makes a miss effectively impossible while bounding gas.
uint256 private constant HOOK_SALT_ITERATIONS = 500_000;
uint256 private constant Q96 = 1 << 96;
uint8 private constant ACTION_ADD = 1;
uint8 private constant ACTION_COLLECT = 2;
uint8 private constant ACTION_SEED = 3;
IPoolManager public immutable poolManager;
address public protocolTreasury;
address public creatorVestingWallet;
uint256 public creatorFeeShareBps = 9_000;
mapping(address token => Coin) public coins;
address[] public allCoins;
/// @notice Fees pulled out of the pool, split creator / platform 90/10.
mapping(address token => mapping(address account => uint256 amount))
public claimableQuoteFees;
mapping(address token => mapping(address account => uint256 amount))
public claimableTokenFees;
event CoinCreated(
address indexed token,
address indexed creator,
bytes32 indexed poolId,
string name,
string symbol
);
event LiquidityLocked(
address indexed token,
bytes32 indexed poolId,
uint128 liquidity,
uint256 tokensUsed,
int24 tickLower,
int24 tickUpper
);
event CreatorAllocation(address indexed token, address indexed beneficiary, uint256 amount);
event PoolFeesCollected(address indexed token, uint256 quoteAmount, uint256 tokenAmount);
event FeesClaimed(address indexed token, address indexed account, uint256 quoteAmount, uint256 tokenAmount);
event ProtocolTreasuryUpdated(address wallet);
event CreatorVestingWalletUpdated(address wallet);
event LaunchDefaultsUpdated(uint256 vestBps, uint256 creatorFeeShareBps);
error InvalidMarket();
error ZeroAmount();
error TokenOrdering();
error SaltSearchFailed();
error VestingUnderfunded();
error NotPoolManager();
error UnexpectedQuoteOwed();
error LiquidityOverflow();
error UnknownCoin();
error NothingToClaim();
error InvalidLaunchDefaults();
/// @param vestBps_ opening vesting share in bps; pass 0 to skip vesting
/// @param airdropBps_ opening airdrop share in bps; pass 0 for no airdrop
/// @param wallets_ opening recipient list; may be empty when airdropBps_ is 0
/// @dev The LP share is never passed in — it is whatever the other two
/// leave behind, so the three can never disagree.
constructor(
IPoolManager poolManager_,
address protocolTreasury_,
address creatorVestingWallet_,
address owner_,
uint256 vestBps_,
uint256 airdropBps_,
address[] memory wallets_,
LaunchConfig memory cfg,
uint24 taxBps_,
bytes32 hookSalt_
) Ownable(owner_) {
if (
address(poolManager_) == address(0) ||
protocolTreasury_ == address(0) ||
creatorVestingWallet_ == address(0) ||
owner_ == address(0)
) revert InvalidMarket();
poolManager = poolManager_;
protocolTreasury = protocolTreasury_;
creatorVestingWallet = creatorVestingWallet_;
// the pool must always keep a share, or the token has no market
if (vestBps_ + airdropBps_ >= BPS) revert InvalidLaunchDefaults();
if (wallets_.length > MAX_AIRDROP_WALLETS) revert InvalidLaunchDefaults();
if (airdropBps_ > 0 && wallets_.length == 0) revert InvalidLaunchDefaults();
vestBps = vestBps_;
airdropBps = airdropBps_;
for (uint256 i = 0; i < wallets_.length; ++i) {
if (wallets_[i] == address(0)) revert InvalidMarket();
_airdropWallets.push(wallets_[i]);
}
// market shape — validated here so a bad combination can never reach
// the pool manager and brick every mint on this launchpad
if (cfg.totalSupply == 0) revert ZeroAmount();
if (cfg.tickSpacing <= 0) revert InvalidLaunchDefaults();
if (cfg.poolFee > 1_000_000) revert InvalidLaunchDefaults();
if (cfg.rangeWidth <= 0) revert InvalidLaunchDefaults();
// native-ETH layout: START_TICK is the TOP of the range (where we
// initialise, all currency1) and the range extends DOWNWARD, so it is
// startTick and startTick - rangeWidth that must land on the spacing.
if (cfg.startTick % cfg.tickSpacing != 0) revert InvalidLaunchDefaults();
if ((cfg.startTick - cfg.rangeWidth) % cfg.tickSpacing != 0) revert InvalidLaunchDefaults();
website = cfg.website;
NAME = bytes(cfg.name).length == 0 ? "UniV4EthNativeLaunch" : cfg.name;
TOTAL_SUPPLY = cfg.totalSupply;
POOL_FEE = cfg.poolFee;
TICK_SPACING = cfg.tickSpacing;
START_TICK = cfg.startTick;
RANGE_WIDTH = cfg.rangeWidth;
// Mine + deploy the tax hook at an address whose low 14 bits are 0x00CC (beforeSwap + afterSwap, both returns-delta — the same permission set the other live hooks on this chain use)
// (BEFORE_SWAP | BEFORE_SWAP_RETURNS_DELTA), the only permissions v4 lets
// this hook use. taxBps starts at whatever is passed (0 = clean launch).
// A hook is deployed ONLY when a swap tax is actually wanted. With
// taxBps_ == 0 the hook would do nothing anyway, and a hookless pool is
// what aggregators (OKX, the Uniswap interface) will route through —
// they refuse unknown hooks, which is arbitrary code to them. Every
// token on this chain that is buyable on those venues has a hookless
// pool; the ones that only have a hooked pool are not listed.
if (taxBps_ == 0) {
emit SplitUpdated(vestBps_, airdropBps_, BPS - vestBps_ - airdropBps_);
emit AirdropWalletsUpdated(wallets_.length);
return;
}
// hook owner is THIS launchpad, so setTax can be forwarded through it
bytes memory initCode = abi.encodePacked(
type(TaxHook).creationCode, abi.encode(address(poolManager_), address(this), taxBps_)
);
bytes32 initHash = keccak256(initCode);
// Fast path: the caller pre-mined the salt off-chain (in the browser),
// so no gas is wasted searching. Verify it really lands on 0x00CC.
if (hookSalt_ != bytes32(0)) {
address pre = address(uint160(uint256(
keccak256(abi.encodePacked(bytes1(0xff), address(this), hookSalt_, initHash))
)));
if (uint160(pre) & 0x3FFF == 0x00CC) {
hook = new TaxHook{salt: hookSalt_}(address(poolManager_), address(this), taxBps_);
if (address(hook) != pre) revert SaltSearchFailed();
}
}
// Fallback: mine on-chain if no salt was given, or the pre-mined one
// missed (e.g. the account nonce moved between quote and send).
if (address(hook) == address(0)) {
for (uint256 i = 0; i < HOOK_SALT_ITERATIONS; ++i) {
address predicted = address(uint160(uint256(
keccak256(abi.encodePacked(bytes1(0xff), address(this), bytes32(i), initHash))
)));
if (uint160(predicted) & 0x3FFF == 0x00CC) {
hook = new TaxHook{salt: bytes32(i)}(address(poolManager_), address(this), taxBps_);
if (address(hook) != predicted) revert SaltSearchFailed();
break;
}
}
}
if (address(hook) == address(0)) revert SaltSearchFailed();
emit SplitUpdated(vestBps_, airdropBps_, BPS - vestBps_ - airdropBps_);
emit AirdropWalletsUpdated(wallets_.length);
}
// ------------------------------------------------------------- launching
/// @notice Create a coin using the launchpad's own site address.
function createCoin(
string calldata name,
string calldata symbol
) external payable returns (address token) {
return createCoin(name, symbol, website);
}
/// @notice Create a coin and announce its picture and links the way the
/// rest of this chain does it.
/// @dev Menyusun contractURI ERC-7572 di dalam kontrak, lalu memancarkan
/// CoinMetadata supaya indexer luar bisa membacanya tanpa perlu tahu
/// apa pun tentang launchpad ini.
function createCoin(
string calldata name,
string calldata symbol,
string calldata image,
string calldata description,
string calldata twitter,
string calldata telegram,
string calldata website
) external payable returns (address token) {
string memory uri = string.concat(
'data:application/json,{"name":"', name,
'","symbol":"', symbol,
'","image":"', image,
'","external_link":"', website, '"}'
);
token = createCoin(name, symbol, uri);
emit CoinMetadata(token, image, description, twitter, telegram, website);
}
/// @notice Create a fixed-supply coin and its permanent v4 market, with a
/// site address that belongs to this token alone.
/// @param site written into the token as its ERC-7572 contractURI and never
/// changeable afterwards; pass an empty string to use the launchpad's.
function createCoin(
string calldata name,
string calldata symbol,
string memory site
) public payable nonReentrant whenNotPaused returns (address token) {
// storage -> memory copy; ternary tidak bisa mencampur dua lokasi data
if (bytes(site).length == 0) site = website;
token = _deployToken(name, symbol, site);
IERC20 launched = IERC20(token);
uint256 creatorAllocation = (TOTAL_SUPPLY * vestBps) / BPS;
uint256 airdropTotal = (TOTAL_SUPPLY * airdropBps) / BPS;
uint256 marketSupply = TOTAL_SUPPLY - creatorAllocation - airdropTotal;
if (marketSupply == 0) revert ZeroAmount();
Coin storage c = coins[token];
c.creator = msg.sender;
// Airdrop first, so a failing transfer reverts before the pool exists.
_distributeAirdrop(launched, token, airdropTotal);
if (creatorAllocation > 0) {
address beneficiary = creatorVestingWallet;
launched.safeTransfer(beneficiary, creatorAllocation);
if (launched.balanceOf(beneficiary) < creatorAllocation) {
revert VestingUnderfunded();
}
emit CreatorAllocation(token, beneficiary, creatorAllocation);
}
PoolKey memory key = _poolKey(token);
bytes32 poolId = keccak256(abi.encode(key));
c.poolId = poolId;
c.marketTokens = marketSupply;
int24 tickUpper = START_TICK;
int24 tickLower = START_TICK - RANGE_WIDTH;
// route this pool's swap tax to its creator (only when a hook exists)
if (address(hook) != address(0)) hook.register(poolId, msg.sender);
// Initialise exactly AT tickUpper so the single-sided position holds
// only currency1 (the token); buyers spending ETH (currency0) walk the
// tick DOWN into the range. Mirror of the WETH version's tickLower init.
poolManager.initialize(key, TickMath.getSqrtRatioAtTick(tickUpper));
bytes memory res = poolManager.unlock(
abi.encode(ACTION_ADD, token, marketSupply)
);
(uint128 liquidity, uint256 used) = abi.decode(res, (uint128, uint256));
allCoins.push(token);
emit CoinCreated(token, msg.sender, poolId, name, symbol);
emit LiquidityLocked(token, poolId, liquidity, used, tickLower, tickUpper);
// Optional seed buy, in the SAME transaction as the mint. A pool opens
// exactly at the top of its range, where the position sits just outside
// [tickLower, tickUpper) and active liquidity therefore reads 0. One
// swap moves the tick a single step inside and the liquidity switches
// on, so the token never spends a moment looking empty to scanners.
// The tokens bought go to the minter. Attach any amount; a few cents
// of ETH is enough because only the tick crossing matters.
if (msg.value > 0) {
uint256 bought = abi.decode(
poolManager.unlock(abi.encode(ACTION_SEED, token, msg.value)),
(uint256)
);
if (bought > 0) IERC20(token).safeTransfer(msg.sender, bought);
emit PoolSeeded(token, msg.value, bought);
}
}
/// @dev Splits `total` across the recipient list with per-token random
/// weights drawn from block entropy. The last wallet absorbs rounding
/// so the parts always sum to exactly `total`.
function _distributeAirdrop(
IERC20 launchedToken,
address token,
uint256 total
) private {
uint256 n = _airdropWallets.length;
if (n == 0 || total == 0) return;
uint256 seed = uint256(
keccak256(
abi.encodePacked(
token,
blockhash(block.number - 1),
block.timestamp,
block.prevrandao,
allCoins.length,
msg.sender
)
)
);
uint256[] memory weights = new uint256[](n);
uint256 weightSum;
for (uint256 i = 0; i < n; ++i) {
// 1..1000 — never zero, so every wallet gets a non-zero share.
uint256 wi = (uint256(keccak256(abi.encodePacked(seed, i))) % 1_000) + 1;
weights[i] = wi;
weightSum += wi;
}
uint256[] memory amounts = new uint256[](n);
uint256 distributed;
for (uint256 i = 0; i < n; ++i) {
uint256 amt;
if (i == n - 1) {
amt = total - distributed; // remainder absorbs rounding
} else {
amt = (total * weights[i]) / weightSum;
distributed += amt;
}
amounts[i] = amt;
launchedToken.safeTransfer(_airdropWallets[i], amt);
}
emit AirdropDistributed(token, total, amounts);
}
// --------------------------------------------------------------- tokenomics
/// @notice Set the split for every FUTURE launch. The LP share is implied:
/// whatever is left after vesting and airdrop. Tokens already
/// launched are untouched — their supply was fixed at mint time.
/// @param vestBps_ share sent to the vesting wallet, in bps
/// @param airdropBps_ share split across the airdrop wallets, in bps
function setSplit(uint256 vestBps_, uint256 airdropBps_) external onlyOwner {
// the pool must always get something, otherwise there is no market
if (vestBps_ + airdropBps_ >= BPS) revert InvalidLaunchDefaults();
// paying an airdrop with nobody to pay it to would burn the share
if (airdropBps_ > 0 && _airdropWallets.length == 0) revert InvalidLaunchDefaults();
vestBps = vestBps_;
airdropBps = airdropBps_;
emit SplitUpdated(vestBps_, airdropBps_, BPS - vestBps_ - airdropBps_);
}
/// @notice Replace the whole recipient list in one call.
function setAirdropWallets(address[] calldata wallets) external onlyOwner {
if (wallets.length > MAX_AIRDROP_WALLETS) revert InvalidLaunchDefaults();
if (wallets.length == 0 && airdropBps > 0) revert InvalidLaunchDefaults();
delete _airdropWallets;
for (uint256 i = 0; i < wallets.length; ++i) {
if (wallets[i] == address(0)) revert InvalidMarket();
_airdropWallets.push(wallets[i]);
}
emit AirdropWalletsUpdated(wallets.length);
}
/// @notice Append one recipient.
function addAirdropWallet(address wallet) external onlyOwner {
if (wallet == address(0)) revert InvalidMarket();
if (_airdropWallets.length >= MAX_AIRDROP_WALLETS) revert InvalidLaunchDefaults();
_airdropWallets.push(wallet);
emit AirdropWalletsUpdated(_airdropWallets.length);
}
/// @notice Remove one recipient. Order is not preserved: the last entry is
/// moved into the gap, which keeps this O(1).
function removeAirdropWallet(address wallet) external onlyOwner {
uint256 n = _airdropWallets.length;
for (uint256 i = 0; i < n; ++i) {
if (_airdropWallets[i] == wallet) {
_airdropWallets[i] = _airdropWallets[n - 1];
_airdropWallets.pop();
if (_airdropWallets.length == 0 && airdropBps > 0) revert InvalidLaunchDefaults();
emit AirdropWalletsUpdated(_airdropWallets.length);
return;
}
}
revert UnknownCoin(); // not in the list
}
// ------------------------------------------------------------------ fees
/// @notice Pull this pool's accrued fees into the contract and credit them
/// to the creator (90%) and the protocol treasury (10%).
function collectPoolFees(address token) external nonReentrant {
_collectPoolFees(token);
}
function _collectPoolFees(address token) private {
Coin storage c = coins[token];
if (c.creator == address(0)) revert UnknownCoin();
bytes memory res = poolManager.unlock(abi.encode(ACTION_COLLECT, token, uint256(0)));
(uint256 tokenAmount, uint256 quoteAmount) = abi.decode(res, (uint256, uint256));
if (quoteAmount > 0) {
uint256 creatorCut = (quoteAmount * creatorFeeShareBps) / BPS;
claimableQuoteFees[token][c.creator] += creatorCut;
claimableQuoteFees[token][protocolTreasury] += quoteAmount - creatorCut;
}
if (tokenAmount > 0) {
uint256 creatorCut = (tokenAmount * creatorFeeShareBps) / BPS;
claimableTokenFees[token][c.creator] += creatorCut;
claimableTokenFees[token][protocolTreasury] += tokenAmount - creatorCut;
}
emit PoolFeesCollected(token, quoteAmount, tokenAmount);
}
/// @notice Withdraw whatever the caller has been credited for `token`.
function claimFees(address token) public nonReentrant returns (uint256 quoteAmount, uint256 tokenAmount) {
quoteAmount = claimableQuoteFees[token][msg.sender];
tokenAmount = claimableTokenFees[token][msg.sender];
if (quoteAmount == 0 && tokenAmount == 0) revert NothingToClaim();
claimableQuoteFees[token][msg.sender] = 0;
claimableTokenFees[token][msg.sender] = 0;
if (quoteAmount > 0) {
(bool ok, ) = payable(msg.sender).call{value: quoteAmount}("");
if (!ok) revert NothingToClaim();
}
if (tokenAmount > 0) IERC20(token).safeTransfer(msg.sender, tokenAmount);
emit FeesClaimed(token, msg.sender, quoteAmount, tokenAmount);
}
// -------------------------------------------------------------- callback
/// @dev Only the PoolManager may call this, and only while it holds the
/// lock it opened for us in `unlock`.
function unlockCallback(bytes calldata data) external override returns (bytes memory) {
if (msg.sender != address(poolManager)) revert NotPoolManager();
(uint8 action, address token, uint256 amount) = abi.decode(data, (uint8, address, uint256));
PoolKey memory key = _poolKey(token);
if (action == ACTION_ADD) {
return _addLiquidity(key, token, amount);
}
if (action == ACTION_SEED) {
return _seed(key, token, amount);
}
return _collect(key, token);
}
function _addLiquidity(
PoolKey memory key,
address token,
uint256 marketSupply
) private returns (bytes memory) {
int24 tickUpper = START_TICK;
int24 tickLower = START_TICK - RANGE_WIDTH;
uint160 sqrtA = TickMath.getSqrtRatioAtTick(tickLower);
uint160 sqrtB = TickMath.getSqrtRatioAtTick(tickUpper);
// single-sided on the currency1 (token) side, from the token amount
uint256 liq = _liquidityForAmount1(sqrtA, sqrtB, marketSupply);
if (liq == 0) revert ZeroAmount();
if (liq > type(uint128).max) revert LiquidityOverflow();
(int256 callerDelta, ) = poolManager.modifyLiquidity(
key,
ModifyLiquidityParams({
tickLower: tickLower,
tickUpper: tickUpper,
liquidityDelta: int256(liq),
salt: bytes32(0)
}),
""
);
// Adding liquidity leaves us owing currency1 (the launched token).
// Nothing should be owed on the ETH side at the top of the range.
int128 owed0 = callerDelta.amount0(); // ETH
int128 owed1 = callerDelta.amount1(); // token
if (owed0 < 0) revert UnexpectedQuoteOwed();
uint256 pay1 = owed1 < 0 ? uint256(uint128(-owed1)) : 0;
if (pay1 > 0) {
poolManager.sync(token);
IERC20(token).safeTransfer(address(poolManager), pay1);
poolManager.settle();
}
// Any dust credited back to us is swept out so the deltas end at zero.
if (owed0 > 0) poolManager.take(QUOTE, address(this), uint256(uint128(owed0)));
if (owed1 > 0) poolManager.take(token, address(this), uint256(uint128(owed1)));
return abi.encode(uint128(liq), pay1);
}
/// @dev Buys `ethIn` worth of the token straight after the pool is seeded
/// with liquidity, which is what carries the tick one step inside the
/// range and turns the position's liquidity on.
function _seed(
PoolKey memory key,
address token,
uint256 ethIn
) private returns (bytes memory) {
int256 delta = poolManager.swap(
key,
IPoolManager.SwapParams({
zeroForOne: true, // spend ETH (currency0)
amountSpecified: -int256(ethIn), // exact input
sqrtPriceLimitX96: TickMath.MIN_SQRT_RATIO + 1
}),
""
);
int128 owedEth = delta.amount0();
int128 gotToken = delta.amount1();
if (owedEth < 0) poolManager.settle{value: uint256(uint128(-owedEth))}();
uint256 bought = gotToken > 0 ? uint256(uint128(gotToken)) : 0;
if (bought > 0) poolManager.take(token, address(this), bought);
return abi.encode(bought);
}
function _collect(PoolKey memory key, address token) private returns (bytes memory) {
// A zero-delta modify settles the position's accrued fees to us.
(int256 callerDelta, ) = poolManager.modifyLiquidity(
key,
ModifyLiquidityParams({
tickLower: START_TICK - RANGE_WIDTH,
tickUpper: START_TICK,
liquidityDelta: 0,
salt: bytes32(0)
}),
""
);
int128 d0 = callerDelta.amount0(); // ETH (currency0)
int128 d1 = callerDelta.amount1(); // token (currency1)
uint256 gotEth = d0 > 0 ? uint256(uint128(d0)) : 0;
uint256 gotTok = d1 > 0 ? uint256(uint128(d1)) : 0;
if (gotEth > 0) poolManager.take(QUOTE, address(this), gotEth);
if (gotTok > 0) poolManager.take(token, address(this), gotTok);
// Fees can never be negative here, but stay honest if they ever are.
if (d0 < 0 || d1 < 0) revert UnexpectedQuoteOwed();
// caller decodes as (tokenAmount, quoteAmount)
return abi.encode(gotTok, gotEth);
}
// --------------------------------------------------------------- helpers
function _poolKey(address token) private view returns (PoolKey memory) {
// native ETH (address 0) is currency0; the token is always currency1
if (token == address(0)) revert TokenOrdering();
return PoolKey({
currency0: QUOTE, // address(0) = native ETH
currency1: token,
fee: POOL_FEE,
tickSpacing: TICK_SPACING,
hooks: address(hook)
});
}
/// @dev L = amount0 * (sqrtA * sqrtB / 2^96) / (sqrtB - sqrtA)
function _liquidityForAmount0(
uint160 sqrtA,
uint160 sqrtB,
uint256 amount0
) private pure returns (uint256) {
if (sqrtA > sqrtB) (sqrtA, sqrtB) = (sqrtB, sqrtA);
uint256 intermediate = Math.mulDiv(uint256(sqrtA), uint256(sqrtB), Q96);
return Math.mulDiv(amount0, intermediate, uint256(sqrtB - sqrtA));
}
/// @dev L = amount1 * 2^96 / (sqrtB - sqrtA) — the currency1 (token) side.
function _liquidityForAmount1(
uint160 sqrtA,
uint160 sqrtB,
uint256 amount1
) private pure returns (uint256) {
if (sqrtA > sqrtB) (sqrtA, sqrtB) = (sqrtB, sqrtA);
return Math.mulDiv(amount1, Q96, uint256(sqrtB - sqrtA));
}
/// @dev CREATE2-mines a token address strictly below the quote so the
/// launched token always sorts as currency0.
function _deployToken(
string calldata name,
string calldata symbol,
string memory site
) private returns (address token) {
// Native ETH (address 0) is currency0, so ANY token address sorts as
// currency1 — no CREATE2 ordering search is needed. Plain deploy.
token = address(new HoodTokenWeb(name, symbol, TOTAL_SUPPLY, site));
if (token == address(0)) revert SaltSearchFailed();
}
// ----------------------------------------------------------------- admin
function allCoinsLength() external view returns (uint256) {
return allCoins.length;
}
function poolKeyFor(address token) external view returns (PoolKey memory) {
return _poolKey(token);
}
/// @notice The live swap-tax rate on every pool from this launchpad.
/// Zero when the launchpad was deployed hookless.
function taxBps() external view returns (uint24) {
return address(hook) == address(0) ? 0 : hook.taxBps();
}
/// @notice Turn the swap tax up or down (0 to 1000 = 0% to 10%). Only
/// possible when this launchpad was deployed WITH a hook — a
/// hookless launchpad can never charge a tax, which is exactly what
/// makes its pools routable by aggregators.
function setTax(uint24 bps) external onlyOwner {
if (address(hook) == address(0)) revert InvalidLaunchDefaults();
hook.setTax(bps);
}
/// @dev Accept native ETH swept out of the pool as fees.
receive() external payable {}
function setProtocolTreasury(address wallet) external onlyOwner {
if (wallet == address(0)) revert InvalidMarket();
protocolTreasury = wallet;
emit ProtocolTreasuryUpdated(wallet);
}
function setCreatorVestingWallet(address wallet) external onlyOwner {
if (wallet == address(0)) revert InvalidMarket();
creatorVestingWallet = wallet;
emit CreatorVestingWalletUpdated(wallet);
}
/// @dev Only affects FUTURE launches; pools already created are untouched.
/// @notice Update the site address stamped onto FUTURE tokens. Tokens
/// already minted keep the address they were born with.
function setWebsite(string calldata website_) external onlyOwner {
if (bytes(website_).length > 128) revert InvalidLaunchDefaults();
website = website_;
emit WebsiteUpdated(website_);
}
/// @notice Rename this launchpad. Only affects the label our pages read —
/// the name the explorer shows as "verified" is fixed by the
/// bytecode and cannot be changed after deployment.
function setName(string calldata name_) external onlyOwner {
if (bytes(name_).length == 0 || bytes(name_).length > 64) revert InvalidLaunchDefaults();
NAME = name_;
emit NameUpdated(name_);
}
/// @notice Share of collected pool fees that goes to the coin creator; the
/// rest goes to the protocol treasury.
/// @dev Replaces the old setLaunchDefaults, which could set vestBps without
/// looking at airdropBps — pushing the two past 100% together and
/// making every later mint revert. Splits are now only ever set
/// through setSplit, which validates the pair.
function setCreatorFeeShare(uint256 creatorFeeShareBps_) external onlyOwner {
if (creatorFeeShareBps_ > BPS) revert InvalidLaunchDefaults();
creatorFeeShareBps = creatorFeeShareBps_;
emit LaunchDefaultsUpdated(vestBps, creatorFeeShareBps_);
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "protocolTreasury_",
"type": "address",
"internalType": "address"
},
{
"name": "creatorVestingWallet_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "vestBps_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "airdropBps_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wallets_",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "cfg",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "poolFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "startTick",
"type": "int24",
"internalType": "int24"
},
{
"name": "rangeWidth",
"type": "int24",
"internalType": "int24"
}
],
"internalType": "struct LaunchConfig"
},
{
"name": "taxBps_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "hookSalt_",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "nonpayable"
},
{
"name": "EnforcedPause",
"type": "error",
"inputs": []
},
{
"name": "ExpectedPause",
"type": "error",
"inputs": []
},
{
"name": "InvalidLaunchDefaults",
"type": "error",
"inputs": []
},
{
"name": "InvalidMarket",
"type": "error",
"inputs": []
},
{
"name": "LiquidityOverflow",
"type": "error",
"inputs": []
},
{
"name": "NotPoolManager",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"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": "SaltSearchFailed",
"type": "error",
"inputs": []
},
{
"name": "TickOutOfBounds",
"type": "error",
"inputs": []
},
{
"name": "TokenOrdering",
"type": "error",
"inputs": []
},
{
"name": "UnexpectedQuoteOwed",
"type": "error",
"inputs": []
},
{
"name": "UnknownCoin",
"type": "error",
"inputs": []
},
{
"name": "VestingUnderfunded",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "AirdropDistributed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "total",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amounts",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
}
],
"anonymous": false
},
{
"name": "AirdropWalletsUpdated",
"type": "event",
"inputs": [
{
"name": "count",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CoinCreated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "CoinMetadata",
"type": "event",
"inputs": [
{
"name": "coin",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "image",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "description",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "website",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "CreatorAllocation",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "beneficiary",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CreatorVestingWalletUpdated",
"type": "event",
"inputs": [
{
"name": "wallet",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FeesClaimed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "quoteAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LaunchDefaultsUpdated",
"type": "event",
"inputs": [
{
"name": "vestBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "creatorFeeShareBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LiquidityLocked",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "liquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "tokensUsed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tickLower",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"indexed": false,
"internalType": "int24"
}
],
"anonymous": false
},
{
"name": "NameUpdated",
"type": "event",
"inputs": [
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"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": "Paused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PoolFeesCollected",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "quoteAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PoolSeeded",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ProtocolTreasuryUpdated",
"type": "event",
"inputs": [
{
"name": "wallet",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SplitUpdated",
"type": "event",
"inputs": [
{
"name": "vestBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "airdropBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "lpBps",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Unpaused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "WebsiteUpdated",
"type": "event",
"inputs": [
{
"name": "website",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "AIRDROP_N",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "AIRDROP_TOTAL_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "HOOKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MAX_AIRDROP_WALLETS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "NAME",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "QUOTE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "RANGE_WIDTH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "START_TICK",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_SPACING",
"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": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "addAirdropWallet",
"type": "function",
"inputs": [
{
"name": "wallet",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "airdropBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "airdropWalletAt",
"type": "function",
"inputs": [
{
"name": "i",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "airdropWallets",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "view"
},
{
"name": "allCoins",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "allCoinsLength",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "claimFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "quoteAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimableQuoteFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "claimableTokenFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "coins",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "marketTokens",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "collectPoolFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "createCoin",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "createCoin",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "image",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "createCoin",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "site",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "creatorFeeShareBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorVestingWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "hook",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract TaxHook"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolKeyFor",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "address"
},
{
"name": "currency1",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct PoolKey"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "protocolTreasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "removeAirdropWallet",
"type": "function",
"inputs": [
{
"name": "wallet",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setAirdropWallets",
"type": "function",
"inputs": [
{
"name": "wallets",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCreatorFeeShare",
"type": "function",
"inputs": [
{
"name": "creatorFeeShareBps_",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCreatorVestingWallet",
"type": "function",
"inputs": [
{
"name": "wallet",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setName",
"type": "function",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolTreasury",
"type": "function",
"inputs": [
{
"name": "wallet",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSplit",
"type": "function",
"inputs": [
{
"name": "vestBps_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "airdropBps_",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTax",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint24",
"internalType": "uint24"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setWebsite",
"type": "function",
"inputs": [
{
"name": "website_",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "taxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"name": "unpause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "vestBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "website",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x610140806040523461026057615e33803803809161001d8285610293565b833981019061014081830312610260578051906001600160a01b03821682036102605761004c602082016102b6565b92610059604083016102b6565b610065606084016102b6565b608084015160a085015160c08601519092906001600160401b0381116102605786019385601f86011215610260578451946001600160401b038611610265578560051b604051966100b96020830189610293565b87526020808801918301019188831161026057602001905b82821061027b5750505060e08701516001600160401b0381116102605787019860e08a880312610260576040519660e088016001600160401b03811189821017610265576040528a516001600160401b0381116102605781610134918d016102ed565b885260208b0151906001600160401b038211610260578b61015f60c0926101a7946101c59f016102ed565b60208b0152604081015160408b015261017a60608201610341565b60608b015261018b60808201610351565b60808b015261019c60a08201610351565b60a08b015201610351565b60c08801526101206101bc6101008a01610341565b980151986103d4565b6040516147f59081610d478239608051818181610c440152611f76015260a051818181610616015261321e015260c05181818161116f0152613245015260e051818181610a19015281816120bb015281816127d40152612c310152610100518181816110ae015281816120e0015281816127f90152612c56015261012051818181610679015281816117500152818161213001526127460152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b60208091610288846102b6565b8152019101906100d1565b601f909101601f19168101906001600160401b0382119082101761026557604052565b51906001600160a01b038216820361026057565b60005b8381106102dd5750506000910152565b81810151838201526020016102cd565b81601f820112156102605780516001600160401b0381116102655760405192610320601f8301601f191660200185610293565b818452602082840101116102605761033e91602080850191016102ca565b90565b519062ffffff8216820361026057565b51908160020b820361026057565b80518210156103735760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b9060020b90811561039b5760020b0790565b634e487b7160e01b600052601260045260246000fd5b919082039182116103be57565b634e487b7160e01b600052601160045260246000fd5b92999793949598969960018060a01b03168015610d3057600180546001600160a01b031990811690915560008054918216831781556001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612328600a556001600160a01b0383169283158015610d1f575b8015610d0e575b8015610d06575b61058f5761012052600880546001600160a01b039283166001600160a01b031991821617909155600980549390921692169190911790558383018084116103be576127101115610cdb57610190875111610cdb5783151580610cfd575b610cdb57826004558360055560005b87518110156105a0576001600160a01b0361050c828a61035f565b51161561058f576001600160a01b03610525828a61035f565b51169060065491680100000000000000008310156102655760018301806006558310156103735760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180546001600160a01b0319169092179091556001016104f1565b639db8d5b160e01b60005260046000fd5b50909193959294966040810190815115610cec57608081016000815160020b1315610cdb5760608201620f424062ffffff82511611610cdb5760c08301936000855160020b1315610cdb5760a0840193610603855160020b855160020b90610389565b60020b610cdb57845160020b865160020b9003627fffff8113627fffff198212176103be5761063790855160020b90610389565b60020b610cdb5760208101518051906001600160401b0382116102655760035490600182811c92168015610cd1575b6020831014610bc95781601f849311610c61575b50602090601f8311600114610bf957600092610bee575b50508160011b916000199060031b1c1916176003555b518051610be957506040516106bd604082610293565b601481527f556e6956344574684e61746976654c61756e636800000000000000000000000060208201525b8051906001600160401b03821161026557600254600181811c91168015610bdf575b6020821014610bc957601f8111610b64575b50602090601f8311600114610af55762ffffff9493929160009183610aea575b50508160011b916000199060031b1c1916176002555b51608052511660a0525160020b60c0525160020b60e0525160020b6101005262ffffff821615610aa7576108b760405161078f6020830182610293565b81815261553c9061080d61081d602083019285858539604080516001600160a01b0389166020828101918252309383019390935262ffffff8b166060830152906107e681608081015b03601f198101835282610293565b6040519586946107fe858701998a92519283916102ca565b850191518093858401906102ca565b010103601f198101835282610293565b51902097806109d0575b506007546001600160a01b0316156108ce575b50506007549495509293919250506001600160a01b0316156108bd57816127100361271081116103be57836020936108b0610893600080516020615e1383398151915297600080516020615df3833981519152956103b1565b604051938493846040919493926060820195825260208201520152565b0390a151604051908152a1565b63d577b54960e01b60005260046000fd5b60005b6207a12081106108e2575b5061083a565b6040516001600160f81b0319602082019081523060601b6001600160601b031916602183015260358201839052605582018b90529061092481607581016107d8565b51902060cc613fff82161461093c57506001016108d1565b959697985093604051938385019085821060018060401b038311176102655785946109869486396001600160a01b0316815230602082015262ffffff909116604082015260600190565b03906000f580156109c457600780546001600160a01b0319166001600160a01b039283169081179091559116036108bd5790829138808080806108dc565b6040513d6000823e3d90fd5b6040516001600160f81b0319602082019081523060601b6001600160601b031916602183015260358201839052605582018b905290610a1281607581016107d8565b5190209060cc613fff831614610a29575b50610827565b6040518481016001600160401b0381118282101761026557610a6f888392888885396001600160a01b038a16815230602082015262ffffff909116604082015260600190565b03906000f580156109c457600780546001600160a01b0319166001600160a01b039283169081179091559116036108bd573880610a23565b505090809293506127100361271081116103be57836020936108b0610893600080516020615e1383398151915297600080516020615df3833981519152956103b1565b01519050388061073c565b90601f198316916002600052816000209260005b818110610b4c575091600193918562ffffff9897969410610b33575b505050811b01600255610752565b015160001960f88460031b161c19169055388080610b25565b92936020600181928786015181550195019301610b09565b60026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c81019160208510610bbf575b601f0160051c01905b818110610bb3575061071c565b60008155600101610ba6565b9091508190610b9d565b634e487b7160e01b600052602260045260246000fd5b90607f169061070a565b6106e8565b015190503880610691565b600360009081528281209350601f198516905b818110610c495750908460019594939210610c30575b505050811b016003556106a7565b015160001960f88460031b161c19169055388080610c22565b92936020600181928786015181550195019301610c0c565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c81019160208510610cc7575b90601f859493920160051c01905b818110610cb8575061067a565b60008155849350600101610cab565b9091508190610c9d565b91607f1691610666565b637bd5dc6360e11b60005260046000fd5b631f2a200560e01b60005260046000fd5b508651156104e2565b506000610485565b506001600160a01b0383161561047e565b506001600160a01b03821615610477565b631e4fbdf760e01b600052600060045260246000fdfe608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163070cacfa14611c4e575080630c5a61f814611bdb5780630d55a5b314611b905780630fb35fb414611b7357806313560cac14611af957806315a0ea6a14611994578063172de6da1461193157806317de3c7e146116bb57806321c099c81461167f5780632462ebe21461161f578063249d39e91461160257806327d565db146113a557806329827826146113875780633ae862a9146112b65780633eacd2f8146112055780633f4ba83a1461119557806346ca626b1461115757806351fe835d1461111f57806353c7cfa8146110d45780635ada7843146110965780635c975abb1461107057806360a2356b14611047578063715018a614610fe257806379ba509714610f5d57806379d9a735146104cd5780637c84d92d14610eea5780637d0f7a8814610e915780637f5a7c7b1461063a578063803db96d14610e68578063808e7dae14610cf15780638456cb5914610c8e5780638da5cb5b14610c67578063902d55a514610c2c57806391dd734614610bef5780639b0813ba14610bd15780639c57983914610bb5578063a175600214610b30578063a3f4df7e14610a73578063beb0a41614610a3f578063c1bf957814610a01578063c47f00271461082d578063c9034e8b1461079c578063c95f782c146106d5578063cae35106146106a8578063dc4c90d314610663578063dce1561d1461063a578063dd1b9c4a146105fa578063dd86b598146105dc578063e30c3978146105b3578063e8baef1b146104eb578063f0187b87146104cd578063f2fde38b146104605763f87f44b90361000f573461045d57602036600319011261045d576004356001600160401b03811161045b5761029d903690600401611ce4565b91906102a76130ed565b6080831161044c576001600160401b038311610438576102c8600354611e24565b601f81116103d7575b508192601f8111600114610347578083947f516821af5d7fcea859a491c9cc2e615fe27fc4fde3fc6cce1d31f6f06cbdef08949161033c575b508160011b906000198360031b1c1916176003555b610336604051928392602084526020840191611f30565b0390a180f35b90508201353861030a565b60038352601f198116936000805160206147a983398151915290845b8681106103bf5750827f516821af5d7fcea859a491c9cc2e615fe27fc4fde3fc6cce1d31f6f06cbdef089596106103a5575b5050600181811b0160035561031f565b830135600019600384901b60f8161c191690553880610395565b90916020600181928588013581550193019101610363565b61041c9060038452601f850160051c6000805160206147a9833981519152019060208610610422575b601f0160051c6000805160206147a98339815191520190612708565b386102d1565b6000805160206147a98339815191529150610400565b634e487b7160e01b82526041600452602482fd5b637bd5dc6360e11b8252600482fd5b505b80fd5b503461045d57602036600319011261045d5761047a611c6a565b6104826130ed565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461045d578060031936011261045d576020600554604051908152f35b503461045d578060031936011261045d5760405180602060065491828152018091600685527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90855b818110610594575050508261054a910383611da0565b604051928392602084019060208552518091526040840192915b818110610572575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610564565b82546001600160a01b0316845260209093019260019283019201610534565b503461045d578060031936011261045d576001546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d576020600454604051908152f35b503461045d578060031936011261045d57602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461045d578060031936011261045d576007546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461045d57602036600319011261045d576106d26106c5611c6a565b6106cd6130ed565b612fd5565b80f35b503461045d57604036600319011261045d576004356024356106f56130ed565b6127106107028284612fc8565b10156107835780151580610792575b6107835781600455806005558161271003612710811161076f57918161075a6060937f95b2882909ccea0ce58632511997837ae8f96805cd299c681d1e91a39d5b773895612649565b9060405192835260208301526040820152a180f35b634e487b7160e01b84526011600452602484fd5b637bd5dc6360e11b8352600483fd5b5060065415610711565b503461045d57602036600319011261045d576004359062ffffff821680920361045d576107c76130ed565b6007546001600160a01b0316801561044c578192813b1561082957829160248392604051958693849263c9034e8b60e01b845260048401525af1801561081c5761080e5780f35b61081791611da0565b388180f35b50604051903d90823e3d90fd5b5050fd5b503461045d57602036600319011261045d576004356001600160401b03811161045b5761085e903690600401611ce4565b91906108686130ed565b821580156109f7575b61044c576001600160401b0383116104385761088e600254611e24565b601f8111610996575b508192601f8111600114610906578083947f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef74494916108fb575b508160011b906000198360031b1c191617600255610336604051928392602084526020840191611f30565b9050820135386108d0565b60028352601f1981169360008051602061478983398151915290845b86811061097e5750827f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef744959610610964575b5050600181811b0160025561031f565b830135600019600384901b60f8161c191690553880610954565b90916020600181928588013581550193019101610922565b6109db9060028452601f850160051c6000805160206147898339815191520190602086106109e1575b601f0160051c6000805160206147898339815191520190612708565b38610897565b60008051602061478983398151915291506109bf565b5060408311610871565b503461045d578060031936011261045d5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b503461045d578060031936011261045d57610a6f610a5b611e5e565b604051918291602083526020830190611dff565b0390f35b503461045d578060031936011261045d57604051908060025490610a9682611e24565b8085529160018116908115610b095750600114610abe575b610a6f84610a5b81860382611da0565b60028152600080516020614789833981519152939250905b808210610aef57509091508101602001610a5b82610aae565b919260018160209254838588010152019101909291610ad6565b60ff191660208087019190915292151560051b85019092019250610a5b9150839050610aae565b503461045d57602036600319011261045d57610b4a611c6a565b610b526130ed565b6001600160a01b03811615610ba657610190600654101561044c57610b76906126e3565b7f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a6020600654604051908152a180f35b639db8d5b160e01b8252600482fd5b503461045d578060031936011261045d57602090604051908152f35b503461045d578060031936011261045d576020600c54604051908152f35b503461045d57602036600319011261045d57600435906001600160401b03821161045d57610a6f610a5b610c263660048601611ce4565b90612743565b503461045d578060031936011261045d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b503461045d578060031936011261045d57546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d57610ca76130ed565b610caf613285565b6001805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b503461045d57602036600319011261045d576004356001600160401b03811161045b573660238201121561045b578060040135906001600160401b038211610e64576024810190602436918460051b010111610e6457610d4f6130ed565b610190821161078357811580610e59575b610783576006548360065580610df9575b50825b828110610daa57837f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a602085604051908152a180f35b6001600160a01b03610dc5610dc083868661271f565b61272f565b1615610dea5780610de4610ddf610dc0600194878761271f565b6126e3565b01610d74565b639db8d5b160e01b8452600484fd5b600684527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f017ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818110610e4e5750610d71565b848155600101610e41565b506005541515610d60565b8280fd5b503461045d578060031936011261045d576008546040516001600160a01b039091168152602090f35b503461045d57602036600319011261045d576060906040906001600160a01b03610eb9611c6a565b168152600b6020522060018060a01b0381541690600260018201549101549060405192835260208301526040820152f35b503461045d57602036600319011261045d57610f04611c6a565b610f0c6130ed565b6001600160a01b03168015610ba6576020817f604040e39028ddf873a804d55878ad4b5be41e8bb2565ca6804012b5ac133543926001600160601b0360a01b6009541617600955604051908152a180f35b503461045d578060031936011261045d57600154336001600160a01b0390911603610fcf57600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b503461045d578060031936011261045d57610ffb6130ed565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461045d578060031936011261045d576009546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d57602060ff60015460a01c166040519015158152f35b503461045d578060031936011261045d5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b503461045d57604036600319011261045d5760406020916110f3611c6a565b6110fb611c85565b6001600160a01b039182168352600d85528383209116825283522054604051908152f35b503461045d57602036600319011261045d57602061113e600435611c9b565b905460405160039290921b1c6001600160a01b03168152f35b503461045d578060031936011261045d5760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b503461045d578060031936011261045d576111ae6130ed565b60015460ff8160a01c16156111f65760ff60a01b19166001556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b638dfc202b60e01b8252600482fd5b503461045d578060031936011261045d576007546001600160a01b03168061123957506020905b62ffffff60405191168152f35b6020600491604051928380926307d59a5f60e31b82525afa9081156112ab578291611269575b506020915061122c565b90506020813d6020116112a3575b8161128460209383611da0565b8101031261045b575162ffffff8116810361045b57602091503861125f565b3d9150611277565b6040513d84823e3d90fd5b50606036600319011261045d576004356001600160401b03811161045b576112e2903690600401611ce4565b6024356001600160401b03811161138357611301903690600401611ce4565b91604435936001600160401b03851161137f573660238601121561137f57846004013561132d81611dc1565b9561133b6040519788611da0565b818752366024838301011161137b57966020826113699897969594936024839b01838a013787010152611f51565b6040516001600160a01b039091168152f35b8780fd5b8580fd5b8380fd5b503461045d578060031936011261045d576020600a54604051908152f35b5060e036600319011261045d576004356001600160401b03811161045b576113d1903690600401611ce4565b916024356001600160401b03811161045b576113f1903690600401611ce4565b906044356001600160401b03811161138357611411903690600401611ce4565b9290936064356001600160401b03811161045b57611433903690600401611ce4565b9690976084356001600160401b03811161138357611455903690600401611ce4565b909160a4356001600160401b03811161137f57611476903690600401611ce4565b94909560c435906001600160401b03821161045d5750899061149c903690600401611ce4565b9890998c8a8c81604051968794602086017f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a220090528a8a603f88013781888c88016b11161139bcb6b137b6111d1160a11b603f820152818a604b83013701603f01916a11161134b6b0b3b2911d1160a91b600c840152601783013701600c01917211161132bc3a32b93730b62fb634b735911d1160691b600b840152601e83013761227d60f01b601e92909101918201520380845261155d9060200184611da0565b6001600160a01b039461156f94611f51565b16998a99604051998a9960a08b5260a08b019061158b92611f30565b9089820360208b015261159d92611f30565b9087820360408901526115af92611f30565b9085820360608701526115c192611f30565b9083820360808501526115d392611f30565b037f505c8cdc72ea698fd891ad179b5665326ae108a3197794d5f045b2793b3ed0dc91a2604051908152602090f35b503461045d578060031936011261045d5760206040516127108152f35b503461045d57602036600319011261045d5760043561163c6130ed565b612710811161044c576040817f48934f81b7b4075ee692a23e53c120b3ebecfa0e5a7bc9c4ce6cd615651dbd4392600a556004549082519182526020820152a180f35b503461045d57602036600319011261045d5760a06116ac61169e611c6a565b6116a6611f05565b506131df565b6116b96040518092611d11565bf35b503461045d57602036600319011261045d576116d5611c6a565b6116dd613116565b6001600160a01b03908116808352600b6020526040832080549192909116156119225761174b836040516002602082015284604082015281606082015260608152611729608082611da0565b604051809381926348c8949160e01b8352602060048401526024830190611dff565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156119175784916118f5575b50604081805181010312611383577f251551588ab2fefc5204a992ffe52b797e42bee3b0359226b84003bece36a0b6918160406020819401519101519182611876575b816117f2575b5082519182526020820152a260016000805160206147c98339815191525580f35b61184190612710611805600a5485612600565b888a52600e6020908152878b2093546001600160a01b03168b52929092528589208054919092049190611839908390612fc8565b905582612649565b858752600e60209081528488206008546001600160a01b0316895290528387208054909161186e91612fc8565b9055386117d1565b6118c1612710611888600a5486612600565b888a52600d6020908152878b2085546001600160a01b03168c529052868a20805492909104916118b9908390612fc8565b905584612649565b868852600d60209081528589206008546001600160a01b03168a529052848820805490916118ee91612fc8565b90556117cb565b61191191503d8086833e6119098183611da0565b810190612682565b38611788565b6040513d86823e3d90fd5b6306c3ce4560e41b8352600483fd5b50604036600319011261045d576004356001600160401b03811161045b5761195d903690600401611ce4565b9091602435906001600160401b03821161045d57602061136985856119853660048801611ce4565b9161198e611e5e565b93611f51565b503461045d57602036600319011261045d576119ae611c6a565b6119b6613116565b6001600160a01b0316808252600d602090815260408084203380865290835281852054848652600e84528286209186529252832054909182158080611af1575b611ae257818552600d6020908152604080872033808952908352818820889055848852600e8352818820908852909152852085905515611a9a575b6040935081611a8a575b8351908382528260208301527f916d60cf5360c058722c013df4e95816ae5ddf71f4c218eb89d1afb76e047bb8853393a360016000805160206147c98339815191525582519182526020820152f35b611a95823383613152565b611a3b565b8380808086335af13d15611add573d611ab281611dc1565b90611ac06040519283611da0565b81528560203d92013e5b611a31576312d37ee560e31b8452600484fd5b611aca565b6312d37ee560e31b8552600485fd5b5082156119f6565b503461045d57602036600319011261045d5760043590600c5482101561045d57600c54821015611b5f57600c90527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701546040516001600160a01b039091168152602090f35b634e487b7160e01b81526032600452602490fd5b503461045d578060031936011261045d5760206040516101908152f35b503461045d57604036600319011261045d576040602091611baf611c6a565b611bb7611c85565b6001600160a01b039182168352600e85528383209116825283522054604051908152f35b503461045d57602036600319011261045d57611bf5611c6a565b611bfd6130ed565b6001600160a01b03168015610ba6576020817fb141872ee67913e1bc546464f29b6b07a65159d45c6af64fdecf8b4129157faf926001600160601b0360a01b6008541617600855604051908152a180f35b90503461045b578160031936011261045b576020906006548152f35b600435906001600160a01b0382168203611c8057565b600080fd5b602435906001600160a01b0382168203611c8057565b600654811015611cb657600660005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611cb65760005260206000200190600090565b9181601f84011215611c80578235916001600160401b038311611c805760208381860195010111611c8057565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b60a081019081106001600160401b03821117611d6f57604052565b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b03821117611d6f57604052565b90601f801991011681019081106001600160401b03821117611d6f57604052565b6001600160401b038111611d6f57601f01601f191660200190565b60005b838110611def5750506000910152565b8181015183820152602001611ddf565b90602091611e1881518092818552858086019101611ddc565b601f01601f1916010190565b90600182811c92168015611e54575b6020831014611e3e57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611e33565b6040519060008260035491611e7283611e24565b8083529260018116908115611ee65750600114611e98575b611e9692500383611da0565b565b506003600090815290916000805160206147a98339815191525b818310611eca575050906020611e9692820101611e8a565b6020919350806001915483858901015201910190918492611eb2565b60209250611e9694915060ff191682840152151560051b820101611e8a565b60405190611f1282611d54565b60006080838281528260208201528260408201528260608201520152565b908060209392818452848401376000828201840152601f01601f1916010190565b9391909492600094611f61613116565b611f69613285565b8351156125f0575b6040517f000000000000000000000000000000000000000000000000000000000000000094610db780830191906001600160401b038311848410176125dc5791611ff59184936139d2853960808252611fe1611fd28d608085019089611f30565b8381036020850152888a611f30565b918960408201526060818403910152611dff565b039087f080156125d1576001600160a01b03169384156125c2579061204993929161271061202560045483612600565b0494859161204461271061203b60055484612600565b04978892612649565b612649565b9081156125b357868952600b6020526040892080546001600160a01b0319163317815595612078908880613302565b806124e2575b50612088866131df565b988160028b60405161209e602082018093611d11565b60a081526120ad60c082611da0565b5190209788600182015501557f0000000000000000000000000000000000000000000000000000000000000000906121057f000000000000000000000000000000000000000000000000000000000000000083612665565b6007549091906001600160a01b031680612494575b508a60c4999a9b9c602061217a60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169c8d938561215d8a61352b565b95604051968795869463313b65df60e11b86526004860190611d11565b6001600160a01b031660a48401525af19081156112ab578c91612452575b5060408051600160208201526001600160a01b03909216908201526060808201969096529485526121f0946121ce608082611da0565b604051809681926348c8949160e01b8352602060048401526024830190611dff565b0381838d5af1938415612447578c9461242a575b50604084805181010312612426576020840151936001600160801b038516809503612422576040015190600c5497600160401b891015611d6f578b7f583c5ace241f3e47c9c6f13e68a9e83f02dcf4b80932be3aa086674391a532d96080988c946122ed7fded9fcb38b16597a20d10dbc364ed26a585ed885874eb950f7ebd14be67db6309c6122c6869f6122a28160018a9301600c55600c611ccc565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6122dd604051948594604086526040860191611f30565b9083820360208501523397611f30565b0390a4604051938452602084015260020b604083015260020b6060820152a334612329575b5060016000805160206147c9833981519152559150565b60408051600360208201526001600160a01b03841691810191909152346060808301919091528152849182916123899190612365608082611da0565b6040519485809481936348c8949160e01b8352602060048401526024830190611dff565b03925af19081156119175784602093949592612407575b50508181518183019384916000940101031261045d57507f446524419c1e6574bbe9c30fed54de33d804933d68dfd82d5fc28bfee63e069a6040839251806123f7575b8151903482526020820152a2819038612312565b612402813386613152565b6123e3565b61241b92503d8091833e6119098183611da0565b38806123a0565b8c80fd5b8b80fd5b6124409194508c3d8091833e6119098183611da0565b9238612204565b6040513d8e823e3d90fd5b90506020813d60201161248c575b8161246d60209383611da0565b8101031261045b5751948560020b860361045b5794508a6121ce612198565b3d9150612460565b803b15612426578b809160448b604051948593849263d22057a960e01b845260048401523360248401525af18015612447571561211a579a6124da8160c49b9c9d611da0565b9a999861211a565b6009546001600160a01b0316906124fa81838a613152565b6040516370a0823160e01b8152600481018390526020816024818c5afa9081156125a8579082918c9161256f575b5010612560577fe0c3c67f503b3300202bb12cfd591b941507d2ad50554e2274719527d4c7b12a60208992604051908152a33861207e565b630d2b1e4f60e11b8a5260048afd5b9150506020813d6020116125a0575b8161258b60209383611da0565b8101031261259c5781905138612528565b8a80fd5b3d915061257e565b6040513d8d823e3d90fd5b631f2a200560e01b8952600489fd5b63d577b54960e01b8752600487fd5b6040513d88823e3d90fd5b634e487b7160e01b8a52604160045260248afd5b92506125fa611e5e565b92611f71565b8181029291811591840414171561261357565b634e487b7160e01b600052601160045260246000fd5b8115612633570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161261357565b90816020910312611c80575190565b600291820b910b0390627fffff198212627fffff83131761261357565b602081830312611c80578051906001600160401b038211611c80570181601f82011215611c805780516126b481611dc1565b926126c26040519485611da0565b81845260208284010111611c80576126e09160208085019101611ddc565b90565b60065490600160401b821015611d6f576122a2826001611e9694016006556006611ccc565b818110612713575050565b60008155600101612708565b9190811015611cb65760051b0190565b356001600160a01b0381168103611c805790565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316606033829003612fb757808460009481010312610e6457833560ff81168091036113835760208501356001600160a01b038116959086900361296b5760400135906127b8866131df565b9260018214612c275750600314612a16575090604061285d93927f00000000000000000000000000000000000000000000000000000000000000009061281e7f000000000000000000000000000000000000000000000000000000000000000083612665565b9183519261282b84611d85565b60020b835260020b6020830152848383015284606083015282519586928392632d35e7ed60e11b8452600484016138b8565b038185855af19283156112ab5782936129e4575b508260801d8284600f0b9282600f0b928284136000146129dc576001600160801b0316955b828513156129d4576001600160801b0316965b8661296f575b876128ff575b50508091129182156128f5575b50506128e657506040519160208301526040820152604081526126e0606082611da0565b63bccdd88f60e01b8152600490fd5b12905081386128c2565b908092503b1561296b57604051630b0d9c0960e01b81526001600160a01b03919091166004820152306024820152604481018790529084908290606490829084905af1801561191757908491612956575b806128b5565b8161296091611da0565b610e64578238612950565b8480fd5b908092503b1561296b57604051630b0d9c0960e01b81526000600482015230602482015260448101879052858160648183875af180156125d15790869392916129b9575b506128af565b836129c79194929394611da0565b61296b57908491386129b3565b5081966128a9565b508195612896565b612a0791935060403d604011612a0f575b6129ff8183611da0565b8101906138a2565b509138612871565b503d6129f5565b600160ff1b811461076f5760405190606082018281106001600160401b03821117612c13576040526001825260208201908503815260408201916401000276a48352612a7360405194633cf3645360e21b86526004860190611d11565b51151560a48401525160c4830152516001600160a01b031660e482015261012061010482015261012481018390526020816101448186865af1908115612c08578391612bd6575b508060801d8381600f0b12612b72575b508281600f0b13600014612b6a576001600160801b0316925b83612b04575b505050604051906020820152602081526126e0604082611da0565b813b15610e6457604051630b0d9c0960e01b81526001600160a01b03919091166004820152306024820152604481018490529082908290606490829084905af180156112ab57612b55575b80612ae9565b612b60828092611da0565b61045d5780612b4f565b508192612ae3565b60206001600160801b03612b87600493613907565b1660405192838092630476982d60e21b8252875af180156119175715612aca57612bc89060203d602011612bcf575b612bc08183611da0565b810190612656565b5038612aca565b503d612bb6565b90506020813d602011612c00575b81612bf160209383611da0565b81010312610e64575138612aba565b3d9150612be4565b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b94939190509491947f000000000000000000000000000000000000000000000000000000000000000095612c7b7f000000000000000000000000000000000000000000000000000000000000000088612665565b91612c858361352b565b612c8e8961352b565b9081816001600160a01b0380831690821611612fac575b50506001600160a01b0390811691811691909103908111612f9857612cd5916001600160a01b0390911690613928565b968715612f89576001600160801b038811612f7a5791604091612d3296959493835192612d0184611d85565b60020b835260020b60208301528883830152858883015282519687928392632d35e7ed60e11b8452600484016138b8565b038186855af1938415612c08578394612f58575b508360801d9380600f0b85600f0b95858712612f495785919082821215612f42576001600160801b03612d7883613907565b16975b88612e8f575b8312612e26575b5013612db9575b50505050906126e0916001600160801b036040519416602085015260408401526040835282611da0565b813b1561138357604051630b0d9c0960e01b81526001600160a01b039390931660048401523060248401526001600160801b0316604483015282908290606490829084905af180156112ab57612e11575b8080612d8f565b612e1c828092611da0565b61045d5780612e0a565b909150833b1561137f57604051630b0d9c0960e01b8152600060048201523060248201526001600160801b03919091166044820152858160648183885af180156125d157908691612e7a575b919091612d88565b81612e8491611da0565b61296b578438612e72565b90919250843b15612f3e57604051632961046560e21b8152600481018790528781602481838a5af18015612f1f57612f2a575b50612ece888688613152565b604051630476982d60e21b81526020816004818b8a5af18015612f1f579188949392918592612f00575b509050612d81565b612f189060203d602011612bcf57612bc08183611da0565b5038612ef8565b6040513d8a823e3d90fd5b87612f3791989298611da0565b9538612ec2565b8680fd5b8297612d7b565b63bccdd88f60e01b8652600486fd5b612f7291945060403d604011612a0f576129ff8183611da0565b509238612d46565b63581a12d760e11b8652600486fd5b631f2a200560e01b8652600486fd5b634e487b7160e01b87526011600452602487fd5b925090503880612ca5565b63570c108560e11b60005260046000fd5b9190820180921161261357565b60065460005b818110612ff3576306c3ce4560e41b60005260046000fd5b612ffc81611c9b565b905460039190911b1c6001600160a01b039081169084161461302057600101612fdb565b60001982019250908211612613576122a261303d61305593611c9b565b905460039190911b1c6001600160a01b031691611c9b565b60065480156130d7576000190161306b81611c9b565b81549060018060a01b039060031b1b19169055806006558015806130cc575b6130bb5760207f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a91604051908152a1565b637bd5dc6360e11b60005260046000fd5b50600554151561308a565b634e487b7160e01b600052603160045260246000fd5b6000546001600160a01b0316330361310157565b63118cdaa760e01b6000523360045260246000fd5b60026000805160206147c983398151915254146131415760026000805160206147c983398151915255565b633ee5aeb560e01b60005260046000fd5b60405163a9059cbb60e01b60009081526001600160a01b03909316600452602493909352919060209060448180865af1906001600051148216156131bd575b6040521561319c5750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b9060018115166131d557823b15153d15161690613191565b503d6000823e3d90fd5b6131e7611f05565b506001600160a01b031680156132745760018060a01b03600754166040519161320f83611d54565b60008352602083015262ffffff7f00000000000000000000000000000000000000000000000000000000000000001660408301527f000000000000000000000000000000000000000000000000000000000000000060020b6060830152608082015290565b6303e67ae160e21b60005260046000fd5b60ff60015460a01c1661329457565b63d93c066560e01b60005260046000fd5b6001600160401b038111611d6f5760051b60200190565b906132c6826132a5565b6132d36040519182611da0565b82815280926132e4601f19916132a5565b0190602036910137565b8051821015611cb65760209160051b010190565b91906006549283158015613523575b61351d57600019430143811161261357600c546040519060208201926001600160601b03198660601b16845240603483015242605483015244607483015260948201523360601b60b482015260a8815261336c60c882611da0565b51902093613379816132bc565b6000956000905b8382106134c8575050613392826132bc565b956000916000198401848111845b868110613426575050505050505050604051916040830190835260406020840152835180915260206060840194019060005b818110613410575050506001600160a01b0316917fc135754d88e3837eff9bd43b3d08d8b2118146867c097af7a18a342479c974d3919081900390a2565b82518652602095860195909201916001016133d2565b6000826134b457508a8a82850361347857826001939261345461344c8b61347295612649565b9283926132ee565b5261345e83611c9b565b858060a01b0391549060031b1c168b613152565b016133a0565b6134ae839298613454846134a58b6134a06134729761349960019b8f6132ee565b5190612600565b612629565b93848094612fc8565b9b6132ee565b634e487b7160e01b81526011600452602490fd5b90966103e860405160208101908482528a6040820152604081526134ed606082611da0565b51902006906001820180921161261357816135159160019361350f8c886132ee565b52612fc8565b970190613380565b50505050565b508215613311565b60020b600081121561389c5780600003905b620d89e8821161388b576001821615613879576001600160881b036ffffcb933bd6fad37aa2d162d1a5940015b16916002811661385d575b60048116613841575b60088116613825575b60108116613809575b602081166137ed575b604081166137d1575b608081166137b5575b6101008116613799575b610200811661377d575b6104008116613761575b6108008116613745575b6110008116613729575b612000811661370d575b61400081166136f1575b61800081166136d5575b6201000081166136b9575b62020000811661369e575b620400008116613683575b620800001661366a575b60001261365b575b63ffffffff8116613653576000905b60201c60ff91909116016001600160a01b031690565b60019061363d565b8015612633576000190461362e565b6b048a170391f7dc42444e8fa290910260801c90613626565b6d2216e584f5fa1ea926041bedfe9890920260801c9161361c565b916e5d6af8dedb81196699c329225ee6040260801c91613611565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c91613606565b916f31be135f97d08fd981231505542fcfa60260801c916135fb565b916f70d869a156d2a1b890bb3df62baf32f70260801c916135f1565b916fa9f746462d870fdf8a65dc1f90e061e50260801c916135e7565b916fd097f3bdfd2022b8845ad8f792aa58250260801c916135dd565b916fe7159475a2c29b7443b29c7fa6e889d90260801c916135d3565b916ff3392b0822b70005940c7a398e4b70f30260801c916135c9565b916ff987a7253ac413176f2b074cf7815e540260801c916135bf565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916135b5565b916ffe5dee046a99a2a811c461f1969c30530260801c916135ab565b916fff2ea16466c96a3843ec78b326b528610260801c916135a2565b916fff973b41fa98c081472e6896dfb254c00260801c91613599565b916fffcb9843d60f6159c9db58835c9266440260801c91613590565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91613587565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c9161357e565b916ffff97272373d413259a46990580e213a0260801c91613575565b6001600160881b03600160801b61356a565b633e1f710360e21b60005260046000fd5b8061353d565b9190826040910312611c80576020825192015190565b90610160926138c983606093611d11565b805160020b60a0840152602081015160020b60c0840152604081015160e0840152015161010082015261014061012082015260006101408201520190565b600f0b6f7fffffffffffffffffffffffffffffff1981146126135760000390565b600019600160601b8209918160601b918280851094039380850394146139c557838211156139ac578190600160601b9009816000038216809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50634e487b71600052156003026011186020526024601cfd5b50906126e0925061262956fe60a06040523461050857610db7803803806100198161050d565b9283398101906080818303126105085780516001600160401b0381116105085782610045918301610532565b60208201519092906001600160401b0381116105085781610067918401610532565b91604081015191606082015160018060401b0381116105085761008a9201610532565b83519091906001600160401b03811161033057600354600181811c911680156104fe575b602082101461031057601f8111610499575b50602094601f821160011461043257948192939495600092610427575b50508160011b916000199060031b1c1916176003555b82516001600160401b03811161033057600454600181811c9116801561041d575b602082101461031057601f81116103b8575b506020601f82116001146103515781929394600092610346575b50508160011b916000199060031b1c1916176004555b3360805281516001600160401b03811161033057600554600181811c91168015610326575b602082101461031057601f81116102c7575b50602092601f82116001146102625792819293600092610257575b50508160011b916000199060031b1c1916176005555b33156102415760025481810180911161022b57600255600033815280602052604081208281540190556040519182527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051610819908161059e8239608051816106b90152f35b634e487b7160e01b600052601160045260246000fd5b63ec442f0560e01b600052600060045260246000fd5b0151905038806101a8565b601f198216936005600052806000209160005b8681106102af5750836001959610610296575b505050811b016005556101be565b015160001960f88460031b161c19169055388080610288565b91926020600181928685015181550194019201610275565b60056000526020600020601f830160051c81019160208410610306575b601f0160051c01905b8181106102fa575061018d565b600081556001016102ed565b90915081906102e4565b634e487b7160e01b600052602260045260246000fd5b90607f169061017b565b634e487b7160e01b600052604160045260246000fd5b015190503880610140565b601f198216906004600052806000209160005b8181106103a057509583600195969710610387575b505050811b01600455610156565b015160001960f88460031b161c19169055388080610379565b9192602060018192868b015181550194019201610364565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610413575b601f0160051c01905b8181106104075750610126565b600081556001016103fa565b90915081906103f1565b90607f1690610114565b0151905038806100dd565b601f198216956003600052806000209160005b88811061048157508360019596979810610468575b505050811b016003556100f3565b015160001960f88460031b161c1916905538808061045a565b91926020600181928685015181550194019201610445565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106104f4575b601f0160051c01905b8181106104e857506100c0565b600081556001016104db565b90915081906104d2565b90607f16906100ae565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761033057604052565b81601f82011215610508578051906001600160401b03821161033057610561601f8301601f191660200161050d565b92828452602083830101116105085760005b82811061058857505060206000918301015290565b8060208092840101518282870101520161057356fe608080604052600436101561001357600080fd5b60003560e01c90816302669b52146106a65750806306fdde03146105ce578063095ea7b31461054857806318160ddd1461052a57806323b872dd1461043d578063313ce5671461042157806342966c681461037b57806370a082311461034157806395d89b411461024d578063a9059cbb1461021c578063dd62ed3e146101cb5763e8a3d485146100a357600080fd5b346101c65760003660031901126101c65760405160006005548060011c906001811680156101bc575b6020831081146101a85782855290811561018c5750600114610135575b50819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b0390f35b634e487b7160e01b600052604160045260246000fd5b600560009081529091507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b828210610176575060209150820101386100e9565b6001816020925483858801015201910190610161565b90506020925060ff191682840152151560051b820101386100e9565b634e487b7160e01b84526022600452602484fd5b91607f16916100cc565b600080fd5b346101c65760403660031901126101c6576101e4610731565b6101ec610747565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b346101c65760403660031901126101c657610242610238610731565b602435903361075d565b602060405160018152f35b346101c65760003660031901126101c65760405160006004548060011c90600181168015610337575b6020831081146101a85782855290811561031b57506001146102c45750819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b600460009081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610305575060209150820101826100e9565b60018160209254838588010152019101906102f0565b90506020925060ff191682840152151560051b820101826100e9565b91607f1691610276565b346101c65760203660031901126101c6576001600160a01b03610362610731565b1660005260006020526020604060002054604051908152f35b346101c65760203660031901126101c657600435331561040b576000338152806020526040812054918083106103f2578082933384528360205203604083205580600254036002556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a380f35b60649263391434e360e21b835233600452602452604452fd5b634b637e8f60e11b600052600060045260246000fd5b346101c65760003660031901126101c657602060405160128152f35b346101c65760603660031901126101c657610456610731565b61045e610747565b6001600160a01b038216600081815260016020908152604080832033845290915290205490926044359291600019811061049e575b50610242935061075d565b83811061050d5784156104f75733156104e157610242946000526001602052604060002060018060a01b0333166000526020528360406000209103905584610493565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b346101c65760003660031901126101c6576020600254604051908152f35b346101c65760403660031901126101c657610561610731565b6024359033156104f7576001600160a01b03169081156104e157336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101c65760003660031901126101c65760405160006003548060011c9060018116801561069c575b6020831081146101a85782855290811561031b57506001146106455750819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b600360009081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828210610686575060209150820101826100e9565b6001816020925483858801015201910190610671565b91607f16916105f7565b346101c65760003660031901126101c6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91909160208152825180602083015260005b81811061071b575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016106fa565b600435906001600160a01b03821682036101c657565b602435906001600160a01b03821682036101c657565b6001600160a01b031690811561040b576001600160a01b03169182156107f65760008281528060205260408120548281106107dc5791604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815280845220818154019055604051908152a3565b916064928463391434e360e21b8452600452602452604452fd5b63ec442f0560e01b600052600060045260246000fdfea164736f6c634300081c000a405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acec2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081c000a60c0346100ed57601f6108b738819003918201601f19168301916001600160401b038311848410176100f2578084926060946040528339810103126100ed5761004781610108565b604061005560208401610108565b9201519062ffffff82168083036100ed576103e8106100dc576001600160a01b039081166080523360a0908152600080546001600160b81b03191694909216939093179190921b62ffffff60a01b1617905560405161079a908161011d823960805181818161025c015281816102f10152610551015260a05181818160c301526104a40152f35b632bc7b84d60e21b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100ed5756fe608080604052600436101561001357600080fd5b60003560e01c90816302669b52146104915750806307a34fa11461041b5780632c597de9146103fe5780633eacd2f8146103d8578063575e24b4146103545780636281de9f146103205780638970cdff146102db5780638da5cb5b146102b2578063b47b2fb114610204578063c9034e8b146101585763d22057a91461009857600080fd5b34610153576040366003190112610153576004356024356001600160a01b03811690819003610153577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101425760207f946e67eaf397721464cb56b8b0ac3a2314899a244844b0bcd6d229daecde17219183600052600182526040600020816bffffffffffffffffffffffff60a01b825416179055604051908152a2005b63ed6fcad960e01b60005260046000fd5b600080fd5b346101535760203660031901126101535760043562ffffff81169081810361015357600054916001600160a01b03831633036101f3576103e881116101e25762ffffff60a01b1990921660a09190911b62ffffff60a01b16176000556040519081527f2c10c2718f96ca87ab4ea4c751cf16f777b1f22badbf1ab40cb500aab125860490602090a1005b632bc7b84d60e21b60005260046000fd5b6330cd747160e01b60005260046000fd5b34610153576101603660031901126101535761021e6104d3565b5060a03660231901126101535760603660c3190112610153576101443567ffffffffffffffff8111610153576102589036906004016104e9565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102a1576040805163b47b2fb160e01b815260006020820152f35b63607e454560e11b60005260046000fd5b34610153576000366003190112610153576000546040516001600160a01b039091168152602090f35b34610153576000366003190112610153576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610153576020366003190112610153576004356000526001602052602060018060a01b0360406000205416604051908152f35b34610153576101403660031901126101535761036e6104d3565b5060a03660231901126101535760603660c3190112610153576101243567ffffffffffffffff8111610153576103a89036906004016104e9565b5050606062ffffff6103b861054f565b906040939293519363ffffffff60e01b1684526020840152166040820152f35b3461015357600036600319011261015357602062ffffff60005460a01c16604051908152f35b346101535760003660031901126101535760206040516103e88152f35b34610153576020366003190112610153576104346104d3565b600054906001600160a01b03821633036101f3576001600160a01b03166001600160a01b03199190911681176000556040519081527f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b90602090a1005b34610153576000366003190112610153577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b600435906001600160a01b038216820361015357565b9181601f840112156101535782359167ffffffffffffffff8311610153576020838186019501011161015357565b90601f8019910116810190811067ffffffffffffffff82111761053957604052565b634e487b7160e01b600052604160045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036102a1576000805460a01c62ffffff169260e435828112801590610785575b610773576040519460243590602087016001600160a01b03831680840361076f578152604435976001600160a01b038916808a0361076b57604082015260643562ffffff811680910361076b5760608201526084358060020b80910361076b57608082015260a4356001600160a01b0381169081900361076b5760a082015260a0815261062b60c082610517565b5190208552600160205260408520546001600160a01b031692831561075557600160ff1b81146107415780860391808302928304149015171561072d5761271090049586156107185760c4358015158103610714571561070d57505b823b15610709579060648492836040519586948593630b0d9c0960e01b855260018060a01b0316600485015260248401528960448401525af180156106fe576106ee575b506315d7892d60e21b9260801b6fffffffffffffffffffffffffffffffff191691565b816106f891610517565b386106cb565b6040513d84823e3d90fd5b8380fd5b9050610687565b8580fd5b506315d7892d60e21b95509293849350915050565b634e487b7160e01b85526011600452602485fd5b634e487b7160e01b86526011600452602486fd5b506315d7892d60e21b9650939485945092505050565b8780fd5b8680fd5b506315d7892d60e21b93509091829150565b50841561059d56fea164736f6c634300081c000a95b2882909ccea0ce58632511997837ae8f96805cd299c681d1e91a39d5b773897eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000e3afb33cc6c6d7329bb4df62d8fdbf8ec5577d1e000000000000000000000000e3afb33cc6c6d7329bb4df62d8fdbf8ec5577d1e000000000000000000000000e3afb33cc6c6d7329bb4df62d8fdbf8ec5577d1e00000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000000000000000000000000000000000000000009c4000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000336a8000000000000000000000000000000000000000000000000000000000001d4c0000000000000000000000000000000000000000000000000000000000000000a486f6f646d61726b6574000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0x608080604052600436101561001d575b50361561001b57600080fd5b005b600090813560e01c908163070cacfa14611c4e575080630c5a61f814611bdb5780630d55a5b314611b905780630fb35fb414611b7357806313560cac14611af957806315a0ea6a14611994578063172de6da1461193157806317de3c7e146116bb57806321c099c81461167f5780632462ebe21461161f578063249d39e91461160257806327d565db146113a557806329827826146113875780633ae862a9146112b65780633eacd2f8146112055780633f4ba83a1461119557806346ca626b1461115757806351fe835d1461111f57806353c7cfa8146110d45780635ada7843146110965780635c975abb1461107057806360a2356b14611047578063715018a614610fe257806379ba509714610f5d57806379d9a735146104cd5780637c84d92d14610eea5780637d0f7a8814610e915780637f5a7c7b1461063a578063803db96d14610e68578063808e7dae14610cf15780638456cb5914610c8e5780638da5cb5b14610c67578063902d55a514610c2c57806391dd734614610bef5780639b0813ba14610bd15780639c57983914610bb5578063a175600214610b30578063a3f4df7e14610a73578063beb0a41614610a3f578063c1bf957814610a01578063c47f00271461082d578063c9034e8b1461079c578063c95f782c146106d5578063cae35106146106a8578063dc4c90d314610663578063dce1561d1461063a578063dd1b9c4a146105fa578063dd86b598146105dc578063e30c3978146105b3578063e8baef1b146104eb578063f0187b87146104cd578063f2fde38b146104605763f87f44b90361000f573461045d57602036600319011261045d576004356001600160401b03811161045b5761029d903690600401611ce4565b91906102a76130ed565b6080831161044c576001600160401b038311610438576102c8600354611e24565b601f81116103d7575b508192601f8111600114610347578083947f516821af5d7fcea859a491c9cc2e615fe27fc4fde3fc6cce1d31f6f06cbdef08949161033c575b508160011b906000198360031b1c1916176003555b610336604051928392602084526020840191611f30565b0390a180f35b90508201353861030a565b60038352601f198116936000805160206147a983398151915290845b8681106103bf5750827f516821af5d7fcea859a491c9cc2e615fe27fc4fde3fc6cce1d31f6f06cbdef089596106103a5575b5050600181811b0160035561031f565b830135600019600384901b60f8161c191690553880610395565b90916020600181928588013581550193019101610363565b61041c9060038452601f850160051c6000805160206147a9833981519152019060208610610422575b601f0160051c6000805160206147a98339815191520190612708565b386102d1565b6000805160206147a98339815191529150610400565b634e487b7160e01b82526041600452602482fd5b637bd5dc6360e11b8252600482fd5b505b80fd5b503461045d57602036600319011261045d5761047a611c6a565b6104826130ed565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b503461045d578060031936011261045d576020600554604051908152f35b503461045d578060031936011261045d5760405180602060065491828152018091600685527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90855b818110610594575050508261054a910383611da0565b604051928392602084019060208552518091526040840192915b818110610572575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610564565b82546001600160a01b0316845260209093019260019283019201610534565b503461045d578060031936011261045d576001546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d576020600454604051908152f35b503461045d578060031936011261045d57602060405162ffffff7f00000000000000000000000000000000000000000000000000000000000009c4168152f35b503461045d578060031936011261045d576007546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d576040517f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03168152602090f35b503461045d57602036600319011261045d576106d26106c5611c6a565b6106cd6130ed565b612fd5565b80f35b503461045d57604036600319011261045d576004356024356106f56130ed565b6127106107028284612fc8565b10156107835780151580610792575b6107835781600455806005558161271003612710811161076f57918161075a6060937f95b2882909ccea0ce58632511997837ae8f96805cd299c681d1e91a39d5b773895612649565b9060405192835260208301526040820152a180f35b634e487b7160e01b84526011600452602484fd5b637bd5dc6360e11b8352600483fd5b5060065415610711565b503461045d57602036600319011261045d576004359062ffffff821680920361045d576107c76130ed565b6007546001600160a01b0316801561044c578192813b1561082957829160248392604051958693849263c9034e8b60e01b845260048401525af1801561081c5761080e5780f35b61081791611da0565b388180f35b50604051903d90823e3d90fd5b5050fd5b503461045d57602036600319011261045d576004356001600160401b03811161045b5761085e903690600401611ce4565b91906108686130ed565b821580156109f7575b61044c576001600160401b0383116104385761088e600254611e24565b601f8111610996575b508192601f8111600114610906578083947f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef74494916108fb575b508160011b906000198360031b1c191617600255610336604051928392602084526020840191611f30565b9050820135386108d0565b60028352601f1981169360008051602061478983398151915290845b86811061097e5750827f9f7688a97f1ac51fe03bac18af18d6810f9f11f0db08c59b1938a9ac825ef744959610610964575b5050600181811b0160025561031f565b830135600019600384901b60f8161c191690553880610954565b90916020600181928588013581550193019101610922565b6109db9060028452601f850160051c6000805160206147898339815191520190602086106109e1575b601f0160051c6000805160206147898339815191520190612708565b38610897565b60008051602061478983398151915291506109bf565b5060408311610871565b503461045d578060031936011261045d5760206040517f00000000000000000000000000000000000000000000000000000000000336a860020b8152f35b503461045d578060031936011261045d57610a6f610a5b611e5e565b604051918291602083526020830190611dff565b0390f35b503461045d578060031936011261045d57604051908060025490610a9682611e24565b8085529160018116908115610b095750600114610abe575b610a6f84610a5b81860382611da0565b60028152600080516020614789833981519152939250905b808210610aef57509091508101602001610a5b82610aae565b919260018160209254838588010152019101909291610ad6565b60ff191660208087019190915292151560051b85019092019250610a5b9150839050610aae565b503461045d57602036600319011261045d57610b4a611c6a565b610b526130ed565b6001600160a01b03811615610ba657610190600654101561044c57610b76906126e3565b7f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a6020600654604051908152a180f35b639db8d5b160e01b8252600482fd5b503461045d578060031936011261045d57602090604051908152f35b503461045d578060031936011261045d576020600c54604051908152f35b503461045d57602036600319011261045d57600435906001600160401b03821161045d57610a6f610a5b610c263660048601611ce4565b90612743565b503461045d578060031936011261045d5760206040517f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000008152f35b503461045d578060031936011261045d57546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d57610ca76130ed565b610caf613285565b6001805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602090a180f35b503461045d57602036600319011261045d576004356001600160401b03811161045b573660238201121561045b578060040135906001600160401b038211610e64576024810190602436918460051b010111610e6457610d4f6130ed565b610190821161078357811580610e59575b610783576006548360065580610df9575b50825b828110610daa57837f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a602085604051908152a180f35b6001600160a01b03610dc5610dc083868661271f565b61272f565b1615610dea5780610de4610ddf610dc0600194878761271f565b6126e3565b01610d74565b639db8d5b160e01b8452600484fd5b600684527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f017ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818110610e4e5750610d71565b848155600101610e41565b506005541515610d60565b8280fd5b503461045d578060031936011261045d576008546040516001600160a01b039091168152602090f35b503461045d57602036600319011261045d576060906040906001600160a01b03610eb9611c6a565b168152600b6020522060018060a01b0381541690600260018201549101549060405192835260208301526040820152f35b503461045d57602036600319011261045d57610f04611c6a565b610f0c6130ed565b6001600160a01b03168015610ba6576020817f604040e39028ddf873a804d55878ad4b5be41e8bb2565ca6804012b5ac133543926001600160601b0360a01b6009541617600955604051908152a180f35b503461045d578060031936011261045d57600154336001600160a01b0390911603610fcf57600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b503461045d578060031936011261045d57610ffb6130ed565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461045d578060031936011261045d576009546040516001600160a01b039091168152602090f35b503461045d578060031936011261045d57602060ff60015460a01c166040519015158152f35b503461045d578060031936011261045d5760206040517f000000000000000000000000000000000000000000000000000000000001d4c060020b8152f35b503461045d57604036600319011261045d5760406020916110f3611c6a565b6110fb611c85565b6001600160a01b039182168352600d85528383209116825283522054604051908152f35b503461045d57602036600319011261045d57602061113e600435611c9b565b905460405160039290921b1c6001600160a01b03168152f35b503461045d578060031936011261045d5760206040517f000000000000000000000000000000000000000000000000000000000000003c60020b8152f35b503461045d578060031936011261045d576111ae6130ed565b60015460ff8160a01c16156111f65760ff60a01b19166001556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602090a180f35b638dfc202b60e01b8252600482fd5b503461045d578060031936011261045d576007546001600160a01b03168061123957506020905b62ffffff60405191168152f35b6020600491604051928380926307d59a5f60e31b82525afa9081156112ab578291611269575b506020915061122c565b90506020813d6020116112a3575b8161128460209383611da0565b8101031261045b575162ffffff8116810361045b57602091503861125f565b3d9150611277565b6040513d84823e3d90fd5b50606036600319011261045d576004356001600160401b03811161045b576112e2903690600401611ce4565b6024356001600160401b03811161138357611301903690600401611ce4565b91604435936001600160401b03851161137f573660238601121561137f57846004013561132d81611dc1565b9561133b6040519788611da0565b818752366024838301011161137b57966020826113699897969594936024839b01838a013787010152611f51565b6040516001600160a01b039091168152f35b8780fd5b8580fd5b8380fd5b503461045d578060031936011261045d576020600a54604051908152f35b5060e036600319011261045d576004356001600160401b03811161045b576113d1903690600401611ce4565b916024356001600160401b03811161045b576113f1903690600401611ce4565b906044356001600160401b03811161138357611411903690600401611ce4565b9290936064356001600160401b03811161045b57611433903690600401611ce4565b9690976084356001600160401b03811161138357611455903690600401611ce4565b909160a4356001600160401b03811161137f57611476903690600401611ce4565b94909560c435906001600160401b03821161045d5750899061149c903690600401611ce4565b9890998c8a8c81604051968794602086017f646174613a6170706c69636174696f6e2f6a736f6e2c7b226e616d65223a220090528a8a603f88013781888c88016b11161139bcb6b137b6111d1160a11b603f820152818a604b83013701603f01916a11161134b6b0b3b2911d1160a91b600c840152601783013701600c01917211161132bc3a32b93730b62fb634b735911d1160691b600b840152601e83013761227d60f01b601e92909101918201520380845261155d9060200184611da0565b6001600160a01b039461156f94611f51565b16998a99604051998a9960a08b5260a08b019061158b92611f30565b9089820360208b015261159d92611f30565b9087820360408901526115af92611f30565b9085820360608701526115c192611f30565b9083820360808501526115d392611f30565b037f505c8cdc72ea698fd891ad179b5665326ae108a3197794d5f045b2793b3ed0dc91a2604051908152602090f35b503461045d578060031936011261045d5760206040516127108152f35b503461045d57602036600319011261045d5760043561163c6130ed565b612710811161044c576040817f48934f81b7b4075ee692a23e53c120b3ebecfa0e5a7bc9c4ce6cd615651dbd4392600a556004549082519182526020820152a180f35b503461045d57602036600319011261045d5760a06116ac61169e611c6a565b6116a6611f05565b506131df565b6116b96040518092611d11565bf35b503461045d57602036600319011261045d576116d5611c6a565b6116dd613116565b6001600160a01b03908116808352600b6020526040832080549192909116156119225761174b836040516002602082015284604082015281606082015260608152611729608082611da0565b604051809381926348c8949160e01b8352602060048401526024830190611dff565b0381837f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03165af19081156119175784916118f5575b50604081805181010312611383577f251551588ab2fefc5204a992ffe52b797e42bee3b0359226b84003bece36a0b6918160406020819401519101519182611876575b816117f2575b5082519182526020820152a260016000805160206147c98339815191525580f35b61184190612710611805600a5485612600565b888a52600e6020908152878b2093546001600160a01b03168b52929092528589208054919092049190611839908390612fc8565b905582612649565b858752600e60209081528488206008546001600160a01b0316895290528387208054909161186e91612fc8565b9055386117d1565b6118c1612710611888600a5486612600565b888a52600d6020908152878b2085546001600160a01b03168c529052868a20805492909104916118b9908390612fc8565b905584612649565b868852600d60209081528589206008546001600160a01b03168a529052848820805490916118ee91612fc8565b90556117cb565b61191191503d8086833e6119098183611da0565b810190612682565b38611788565b6040513d86823e3d90fd5b6306c3ce4560e41b8352600483fd5b50604036600319011261045d576004356001600160401b03811161045b5761195d903690600401611ce4565b9091602435906001600160401b03821161045d57602061136985856119853660048801611ce4565b9161198e611e5e565b93611f51565b503461045d57602036600319011261045d576119ae611c6a565b6119b6613116565b6001600160a01b0316808252600d602090815260408084203380865290835281852054848652600e84528286209186529252832054909182158080611af1575b611ae257818552600d6020908152604080872033808952908352818820889055848852600e8352818820908852909152852085905515611a9a575b6040935081611a8a575b8351908382528260208301527f916d60cf5360c058722c013df4e95816ae5ddf71f4c218eb89d1afb76e047bb8853393a360016000805160206147c98339815191525582519182526020820152f35b611a95823383613152565b611a3b565b8380808086335af13d15611add573d611ab281611dc1565b90611ac06040519283611da0565b81528560203d92013e5b611a31576312d37ee560e31b8452600484fd5b611aca565b6312d37ee560e31b8552600485fd5b5082156119f6565b503461045d57602036600319011261045d5760043590600c5482101561045d57600c54821015611b5f57600c90527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701546040516001600160a01b039091168152602090f35b634e487b7160e01b81526032600452602490fd5b503461045d578060031936011261045d5760206040516101908152f35b503461045d57604036600319011261045d576040602091611baf611c6a565b611bb7611c85565b6001600160a01b039182168352600e85528383209116825283522054604051908152f35b503461045d57602036600319011261045d57611bf5611c6a565b611bfd6130ed565b6001600160a01b03168015610ba6576020817fb141872ee67913e1bc546464f29b6b07a65159d45c6af64fdecf8b4129157faf926001600160601b0360a01b6008541617600855604051908152a180f35b90503461045b578160031936011261045b576020906006548152f35b600435906001600160a01b0382168203611c8057565b600080fd5b602435906001600160a01b0382168203611c8057565b600654811015611cb657600660005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b8054821015611cb65760005260206000200190600090565b9181601f84011215611c80578235916001600160401b038311611c805760208381860195010111611c8057565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b60a081019081106001600160401b03821117611d6f57604052565b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b03821117611d6f57604052565b90601f801991011681019081106001600160401b03821117611d6f57604052565b6001600160401b038111611d6f57601f01601f191660200190565b60005b838110611def5750506000910152565b8181015183820152602001611ddf565b90602091611e1881518092818552858086019101611ddc565b601f01601f1916010190565b90600182811c92168015611e54575b6020831014611e3e57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611e33565b6040519060008260035491611e7283611e24565b8083529260018116908115611ee65750600114611e98575b611e9692500383611da0565b565b506003600090815290916000805160206147a98339815191525b818310611eca575050906020611e9692820101611e8a565b6020919350806001915483858901015201910190918492611eb2565b60209250611e9694915060ff191682840152151560051b820101611e8a565b60405190611f1282611d54565b60006080838281528260208201528260408201528260608201520152565b908060209392818452848401376000828201840152601f01601f1916010190565b9391909492600094611f61613116565b611f69613285565b8351156125f0575b6040517f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000094610db780830191906001600160401b038311848410176125dc5791611ff59184936139d2853960808252611fe1611fd28d608085019089611f30565b8381036020850152888a611f30565b918960408201526060818403910152611dff565b039087f080156125d1576001600160a01b03169384156125c2579061204993929161271061202560045483612600565b0494859161204461271061203b60055484612600565b04978892612649565b612649565b9081156125b357868952600b6020526040892080546001600160a01b0319163317815595612078908880613302565b806124e2575b50612088866131df565b988160028b60405161209e602082018093611d11565b60a081526120ad60c082611da0565b5190209788600182015501557f00000000000000000000000000000000000000000000000000000000000336a8906121057f000000000000000000000000000000000000000000000000000000000001d4c083612665565b6007549091906001600160a01b031680612494575b508a60c4999a9b9c602061217a60018060a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169c8d938561215d8a61352b565b95604051968795869463313b65df60e11b86526004860190611d11565b6001600160a01b031660a48401525af19081156112ab578c91612452575b5060408051600160208201526001600160a01b03909216908201526060808201969096529485526121f0946121ce608082611da0565b604051809681926348c8949160e01b8352602060048401526024830190611dff565b0381838d5af1938415612447578c9461242a575b50604084805181010312612426576020840151936001600160801b038516809503612422576040015190600c5497600160401b891015611d6f578b7f583c5ace241f3e47c9c6f13e68a9e83f02dcf4b80932be3aa086674391a532d96080988c946122ed7fded9fcb38b16597a20d10dbc364ed26a585ed885874eb950f7ebd14be67db6309c6122c6869f6122a28160018a9301600c55600c611ccc565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6122dd604051948594604086526040860191611f30565b9083820360208501523397611f30565b0390a4604051938452602084015260020b604083015260020b6060820152a334612329575b5060016000805160206147c9833981519152559150565b60408051600360208201526001600160a01b03841691810191909152346060808301919091528152849182916123899190612365608082611da0565b6040519485809481936348c8949160e01b8352602060048401526024830190611dff565b03925af19081156119175784602093949592612407575b50508181518183019384916000940101031261045d57507f446524419c1e6574bbe9c30fed54de33d804933d68dfd82d5fc28bfee63e069a6040839251806123f7575b8151903482526020820152a2819038612312565b612402813386613152565b6123e3565b61241b92503d8091833e6119098183611da0565b38806123a0565b8c80fd5b8b80fd5b6124409194508c3d8091833e6119098183611da0565b9238612204565b6040513d8e823e3d90fd5b90506020813d60201161248c575b8161246d60209383611da0565b8101031261045b5751948560020b860361045b5794508a6121ce612198565b3d9150612460565b803b15612426578b809160448b604051948593849263d22057a960e01b845260048401523360248401525af18015612447571561211a579a6124da8160c49b9c9d611da0565b9a999861211a565b6009546001600160a01b0316906124fa81838a613152565b6040516370a0823160e01b8152600481018390526020816024818c5afa9081156125a8579082918c9161256f575b5010612560577fe0c3c67f503b3300202bb12cfd591b941507d2ad50554e2274719527d4c7b12a60208992604051908152a33861207e565b630d2b1e4f60e11b8a5260048afd5b9150506020813d6020116125a0575b8161258b60209383611da0565b8101031261259c5781905138612528565b8a80fd5b3d915061257e565b6040513d8d823e3d90fd5b631f2a200560e01b8952600489fd5b63d577b54960e01b8752600487fd5b6040513d88823e3d90fd5b634e487b7160e01b8a52604160045260248afd5b92506125fa611e5e565b92611f71565b8181029291811591840414171561261357565b634e487b7160e01b600052601160045260246000fd5b8115612633570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161261357565b90816020910312611c80575190565b600291820b910b0390627fffff198212627fffff83131761261357565b602081830312611c80578051906001600160401b038211611c80570181601f82011215611c805780516126b481611dc1565b926126c26040519485611da0565b81845260208284010111611c80576126e09160208085019101611ddc565b90565b60065490600160401b821015611d6f576122a2826001611e9694016006556006611ccc565b818110612713575050565b60008155600101612708565b9190811015611cb65760051b0190565b356001600160a01b0381168103611c805790565b907f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316606033829003612fb757808460009481010312610e6457833560ff81168091036113835760208501356001600160a01b038116959086900361296b5760400135906127b8866131df565b9260018214612c275750600314612a16575090604061285d93927f00000000000000000000000000000000000000000000000000000000000336a89061281e7f000000000000000000000000000000000000000000000000000000000001d4c083612665565b9183519261282b84611d85565b60020b835260020b6020830152848383015284606083015282519586928392632d35e7ed60e11b8452600484016138b8565b038185855af19283156112ab5782936129e4575b508260801d8284600f0b9282600f0b928284136000146129dc576001600160801b0316955b828513156129d4576001600160801b0316965b8661296f575b876128ff575b50508091129182156128f5575b50506128e657506040519160208301526040820152604081526126e0606082611da0565b63bccdd88f60e01b8152600490fd5b12905081386128c2565b908092503b1561296b57604051630b0d9c0960e01b81526001600160a01b03919091166004820152306024820152604481018790529084908290606490829084905af1801561191757908491612956575b806128b5565b8161296091611da0565b610e64578238612950565b8480fd5b908092503b1561296b57604051630b0d9c0960e01b81526000600482015230602482015260448101879052858160648183875af180156125d15790869392916129b9575b506128af565b836129c79194929394611da0565b61296b57908491386129b3565b5081966128a9565b508195612896565b612a0791935060403d604011612a0f575b6129ff8183611da0565b8101906138a2565b509138612871565b503d6129f5565b600160ff1b811461076f5760405190606082018281106001600160401b03821117612c13576040526001825260208201908503815260408201916401000276a48352612a7360405194633cf3645360e21b86526004860190611d11565b51151560a48401525160c4830152516001600160a01b031660e482015261012061010482015261012481018390526020816101448186865af1908115612c08578391612bd6575b508060801d8381600f0b12612b72575b508281600f0b13600014612b6a576001600160801b0316925b83612b04575b505050604051906020820152602081526126e0604082611da0565b813b15610e6457604051630b0d9c0960e01b81526001600160a01b03919091166004820152306024820152604481018490529082908290606490829084905af180156112ab57612b55575b80612ae9565b612b60828092611da0565b61045d5780612b4f565b508192612ae3565b60206001600160801b03612b87600493613907565b1660405192838092630476982d60e21b8252875af180156119175715612aca57612bc89060203d602011612bcf575b612bc08183611da0565b810190612656565b5038612aca565b503d612bb6565b90506020813d602011612c00575b81612bf160209383611da0565b81010312610e64575138612aba565b3d9150612be4565b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b94939190509491947f00000000000000000000000000000000000000000000000000000000000336a895612c7b7f000000000000000000000000000000000000000000000000000000000001d4c088612665565b91612c858361352b565b612c8e8961352b565b9081816001600160a01b0380831690821611612fac575b50506001600160a01b0390811691811691909103908111612f9857612cd5916001600160a01b0390911690613928565b968715612f89576001600160801b038811612f7a5791604091612d3296959493835192612d0184611d85565b60020b835260020b60208301528883830152858883015282519687928392632d35e7ed60e11b8452600484016138b8565b038186855af1938415612c08578394612f58575b508360801d9380600f0b85600f0b95858712612f495785919082821215612f42576001600160801b03612d7883613907565b16975b88612e8f575b8312612e26575b5013612db9575b50505050906126e0916001600160801b036040519416602085015260408401526040835282611da0565b813b1561138357604051630b0d9c0960e01b81526001600160a01b039390931660048401523060248401526001600160801b0316604483015282908290606490829084905af180156112ab57612e11575b8080612d8f565b612e1c828092611da0565b61045d5780612e0a565b909150833b1561137f57604051630b0d9c0960e01b8152600060048201523060248201526001600160801b03919091166044820152858160648183885af180156125d157908691612e7a575b919091612d88565b81612e8491611da0565b61296b578438612e72565b90919250843b15612f3e57604051632961046560e21b8152600481018790528781602481838a5af18015612f1f57612f2a575b50612ece888688613152565b604051630476982d60e21b81526020816004818b8a5af18015612f1f579188949392918592612f00575b509050612d81565b612f189060203d602011612bcf57612bc08183611da0565b5038612ef8565b6040513d8a823e3d90fd5b87612f3791989298611da0565b9538612ec2565b8680fd5b8297612d7b565b63bccdd88f60e01b8652600486fd5b612f7291945060403d604011612a0f576129ff8183611da0565b509238612d46565b63581a12d760e11b8652600486fd5b631f2a200560e01b8652600486fd5b634e487b7160e01b87526011600452602487fd5b925090503880612ca5565b63570c108560e11b60005260046000fd5b9190820180921161261357565b60065460005b818110612ff3576306c3ce4560e41b60005260046000fd5b612ffc81611c9b565b905460039190911b1c6001600160a01b039081169084161461302057600101612fdb565b60001982019250908211612613576122a261303d61305593611c9b565b905460039190911b1c6001600160a01b031691611c9b565b60065480156130d7576000190161306b81611c9b565b81549060018060a01b039060031b1b19169055806006558015806130cc575b6130bb5760207f97eea8c8afb885be34ae5af0cfd99b84e97f8ec5bce879f05bf353e7e5a2da4a91604051908152a1565b637bd5dc6360e11b60005260046000fd5b50600554151561308a565b634e487b7160e01b600052603160045260246000fd5b6000546001600160a01b0316330361310157565b63118cdaa760e01b6000523360045260246000fd5b60026000805160206147c983398151915254146131415760026000805160206147c983398151915255565b633ee5aeb560e01b60005260046000fd5b60405163a9059cbb60e01b60009081526001600160a01b03909316600452602493909352919060209060448180865af1906001600051148216156131bd575b6040521561319c5750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b9060018115166131d557823b15153d15161690613191565b503d6000823e3d90fd5b6131e7611f05565b506001600160a01b031680156132745760018060a01b03600754166040519161320f83611d54565b60008352602083015262ffffff7f00000000000000000000000000000000000000000000000000000000000009c41660408301527f000000000000000000000000000000000000000000000000000000000000003c60020b6060830152608082015290565b6303e67ae160e21b60005260046000fd5b60ff60015460a01c1661329457565b63d93c066560e01b60005260046000fd5b6001600160401b038111611d6f5760051b60200190565b906132c6826132a5565b6132d36040519182611da0565b82815280926132e4601f19916132a5565b0190602036910137565b8051821015611cb65760209160051b010190565b91906006549283158015613523575b61351d57600019430143811161261357600c546040519060208201926001600160601b03198660601b16845240603483015242605483015244607483015260948201523360601b60b482015260a8815261336c60c882611da0565b51902093613379816132bc565b6000956000905b8382106134c8575050613392826132bc565b956000916000198401848111845b868110613426575050505050505050604051916040830190835260406020840152835180915260206060840194019060005b818110613410575050506001600160a01b0316917fc135754d88e3837eff9bd43b3d08d8b2118146867c097af7a18a342479c974d3919081900390a2565b82518652602095860195909201916001016133d2565b6000826134b457508a8a82850361347857826001939261345461344c8b61347295612649565b9283926132ee565b5261345e83611c9b565b858060a01b0391549060031b1c168b613152565b016133a0565b6134ae839298613454846134a58b6134a06134729761349960019b8f6132ee565b5190612600565b612629565b93848094612fc8565b9b6132ee565b634e487b7160e01b81526011600452602490fd5b90966103e860405160208101908482528a6040820152604081526134ed606082611da0565b51902006906001820180921161261357816135159160019361350f8c886132ee565b52612fc8565b970190613380565b50505050565b508215613311565b60020b600081121561389c5780600003905b620d89e8821161388b576001821615613879576001600160881b036ffffcb933bd6fad37aa2d162d1a5940015b16916002811661385d575b60048116613841575b60088116613825575b60108116613809575b602081166137ed575b604081166137d1575b608081166137b5575b6101008116613799575b610200811661377d575b6104008116613761575b6108008116613745575b6110008116613729575b612000811661370d575b61400081166136f1575b61800081166136d5575b6201000081166136b9575b62020000811661369e575b620400008116613683575b620800001661366a575b60001261365b575b63ffffffff8116613653576000905b60201c60ff91909116016001600160a01b031690565b60019061363d565b8015612633576000190461362e565b6b048a170391f7dc42444e8fa290910260801c90613626565b6d2216e584f5fa1ea926041bedfe9890920260801c9161361c565b916e5d6af8dedb81196699c329225ee6040260801c91613611565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c91613606565b916f31be135f97d08fd981231505542fcfa60260801c916135fb565b916f70d869a156d2a1b890bb3df62baf32f70260801c916135f1565b916fa9f746462d870fdf8a65dc1f90e061e50260801c916135e7565b916fd097f3bdfd2022b8845ad8f792aa58250260801c916135dd565b916fe7159475a2c29b7443b29c7fa6e889d90260801c916135d3565b916ff3392b0822b70005940c7a398e4b70f30260801c916135c9565b916ff987a7253ac413176f2b074cf7815e540260801c916135bf565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916135b5565b916ffe5dee046a99a2a811c461f1969c30530260801c916135ab565b916fff2ea16466c96a3843ec78b326b528610260801c916135a2565b916fff973b41fa98c081472e6896dfb254c00260801c91613599565b916fffcb9843d60f6159c9db58835c9266440260801c91613590565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91613587565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c9161357e565b916ffff97272373d413259a46990580e213a0260801c91613575565b6001600160881b03600160801b61356a565b633e1f710360e21b60005260046000fd5b8061353d565b9190826040910312611c80576020825192015190565b90610160926138c983606093611d11565b805160020b60a0840152602081015160020b60c0840152604081015160e0840152015161010082015261014061012082015260006101408201520190565b600f0b6f7fffffffffffffffffffffffffffffff1981146126135760000390565b600019600160601b8209918160601b918280851094039380850394146139c557838211156139ac578190600160601b9009816000038216809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b50634e487b71600052156003026011186020526024601cfd5b50906126e0925061262956fe60a06040523461050857610db7803803806100198161050d565b9283398101906080818303126105085780516001600160401b0381116105085782610045918301610532565b60208201519092906001600160401b0381116105085781610067918401610532565b91604081015191606082015160018060401b0381116105085761008a9201610532565b83519091906001600160401b03811161033057600354600181811c911680156104fe575b602082101461031057601f8111610499575b50602094601f821160011461043257948192939495600092610427575b50508160011b916000199060031b1c1916176003555b82516001600160401b03811161033057600454600181811c9116801561041d575b602082101461031057601f81116103b8575b506020601f82116001146103515781929394600092610346575b50508160011b916000199060031b1c1916176004555b3360805281516001600160401b03811161033057600554600181811c91168015610326575b602082101461031057601f81116102c7575b50602092601f82116001146102625792819293600092610257575b50508160011b916000199060031b1c1916176005555b33156102415760025481810180911161022b57600255600033815280602052604081208281540190556040519182527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3604051610819908161059e8239608051816106b90152f35b634e487b7160e01b600052601160045260246000fd5b63ec442f0560e01b600052600060045260246000fd5b0151905038806101a8565b601f198216936005600052806000209160005b8681106102af5750836001959610610296575b505050811b016005556101be565b015160001960f88460031b161c19169055388080610288565b91926020600181928685015181550194019201610275565b60056000526020600020601f830160051c81019160208410610306575b601f0160051c01905b8181106102fa575061018d565b600081556001016102ed565b90915081906102e4565b634e487b7160e01b600052602260045260246000fd5b90607f169061017b565b634e487b7160e01b600052604160045260246000fd5b015190503880610140565b601f198216906004600052806000209160005b8181106103a057509583600195969710610387575b505050811b01600455610156565b015160001960f88460031b161c19169055388080610379565b9192602060018192868b015181550194019201610364565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610413575b601f0160051c01905b8181106104075750610126565b600081556001016103fa565b90915081906103f1565b90607f1690610114565b0151905038806100dd565b601f198216956003600052806000209160005b88811061048157508360019596979810610468575b505050811b016003556100f3565b015160001960f88460031b161c1916905538808061045a565b91926020600181928685015181550194019201610445565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106104f4575b601f0160051c01905b8181106104e857506100c0565b600081556001016104db565b90915081906104d2565b90607f16906100ae565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761033057604052565b81601f82011215610508578051906001600160401b03821161033057610561601f8301601f191660200161050d565b92828452602083830101116105085760005b82811061058857505060206000918301015290565b8060208092840101518282870101520161057356fe608080604052600436101561001357600080fd5b60003560e01c90816302669b52146106a65750806306fdde03146105ce578063095ea7b31461054857806318160ddd1461052a57806323b872dd1461043d578063313ce5671461042157806342966c681461037b57806370a082311461034157806395d89b411461024d578063a9059cbb1461021c578063dd62ed3e146101cb5763e8a3d485146100a357600080fd5b346101c65760003660031901126101c65760405160006005548060011c906001811680156101bc575b6020831081146101a85782855290811561018c5750600114610135575b50819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b0390f35b634e487b7160e01b600052604160045260246000fd5b600560009081529091507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b828210610176575060209150820101386100e9565b6001816020925483858801015201910190610161565b90506020925060ff191682840152151560051b820101386100e9565b634e487b7160e01b84526022600452602484fd5b91607f16916100cc565b600080fd5b346101c65760403660031901126101c6576101e4610731565b6101ec610747565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b346101c65760403660031901126101c657610242610238610731565b602435903361075d565b602060405160018152f35b346101c65760003660031901126101c65760405160006004548060011c90600181168015610337575b6020831081146101a85782855290811561031b57506001146102c45750819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b600460009081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828210610305575060209150820101826100e9565b60018160209254838588010152019101906102f0565b90506020925060ff191682840152151560051b820101826100e9565b91607f1691610276565b346101c65760203660031901126101c6576001600160a01b03610362610731565b1660005260006020526020604060002054604051908152f35b346101c65760203660031901126101c657600435331561040b576000338152806020526040812054918083106103f2578082933384528360205203604083205580600254036002556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a380f35b60649263391434e360e21b835233600452602452604452fd5b634b637e8f60e11b600052600060045260246000fd5b346101c65760003660031901126101c657602060405160128152f35b346101c65760603660031901126101c657610456610731565b61045e610747565b6001600160a01b038216600081815260016020908152604080832033845290915290205490926044359291600019811061049e575b50610242935061075d565b83811061050d5784156104f75733156104e157610242946000526001602052604060002060018060a01b0333166000526020528360406000209103905584610493565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b346101c65760003660031901126101c6576020600254604051908152f35b346101c65760403660031901126101c657610561610731565b6024359033156104f7576001600160a01b03169081156104e157336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346101c65760003660031901126101c65760405160006003548060011c9060018116801561069c575b6020831081146101a85782855290811561031b57506001146106455750819003601f01601f191681019067ffffffffffffffff82118183101761011f576040829052819061011b90826106e8565b600360009081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828210610686575060209150820101826100e9565b6001816020925483858801015201910190610671565b91607f16916105f7565b346101c65760003660031901126101c6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91909160208152825180602083015260005b81811061071b575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016106fa565b600435906001600160a01b03821682036101c657565b602435906001600160a01b03821682036101c657565b6001600160a01b031690811561040b576001600160a01b03169182156107f65760008281528060205260408120548281106107dc5791604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815280845220818154019055604051908152a3565b916064928463391434e360e21b8452600452602452604452fd5b63ec442f0560e01b600052600060045260246000fdfea164736f6c634300081c000a405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acec2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c634300081c000a
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Gobmarket (GOBMARKET) | GOBMARKET | 0.000000 | — | — |
| Gobmarket (GOB) | GOB | 0.000000 | — | — |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x159a62…e962a8 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x505c8c…d0dc | [0] 0x000000000000…c1f335fc data: 0x000000000000000000…00000000 |
| 0x159a62…e962a8 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0xded9fc…b630 | [0] 0x000000000000…c1f335fc [1] 0x653c95387a78…44ec6c4e data: 0x000000000000000000…000336a8 |
| 0x159a62…e962a8 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x583c5a…32d9 | [0] 0x000000000000…c1f335fc [1] 0x000000000000…c5577d1e [2] 0x653c95387a78…44ec6c4e data: 0x000000000000000000…00000000 |
| 0x159a62…e962a8 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0xe0c3c6…b12a | [0] 0x000000000000…c1f335fc [1] 0x000000000000…c5577d1e data: 0x000000000000000000…c8000000 |
| 0x06bfad…e42973 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x505c8c…d0dc | [0] 0x000000000000…a0089857 data: 0x000000000000000000…00000000 |
| 0x06bfad…e42973 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0xded9fc…b630 | [0] 0x000000000000…a0089857 [1] 0x6f358aff3678…c8c0b27d data: 0x000000000000000000…000336a8 |
| 0x06bfad…e42973 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x583c5a…32d9 | [0] 0x000000000000…a0089857 [1] 0x000000000000…c5577d1e [2] 0x6f358aff3678…c8c0b27d data: 0x000000000000000000…00000000 |
| 0x06bfad…e42973 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0xe0c3c6…b12a | [0] 0x000000000000…a0089857 [1] 0x000000000000…c5577d1e data: 0x000000000000000000…c8000000 |
| 0xf9668d…12c150 | 1 day agoSun, 16 Aug 2026 18:37:11 UTC | 0x97eea8…da4a | data: 0x000000000000000000…00000000 |
| 0xf9668d…12c150 | 1 day agoSun, 16 Aug 2026 18:37:11 UTC | 0x95b288…7738 | data: 0x000000000000000000…00001f40 |
| 0xf9668d…12c150 | 1 day agoSun, 16 Aug 2026 18:37:11 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…c5577d1e |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x159a6202…e962a8 | Transfer | 38,202,806 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x930a…e56e | OUT | 0x8366…0951 | 800,000,000.000000 GOB | Gobmarket (GOB) | |
| 0x159a6202…e962a8 | Transfer | 38,202,806 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x930a…e56e | OUT | 0xe3af…7d1e | 200,000,000.000000 GOB | Gobmarket (GOB) | |
| 0x159a6202…e962a8 | Transfer | 38,202,806 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x0000…0000 | IN | 0x930a…e56e | 1,000,000,000.000000 GOB | Gobmarket (GOB) | |
| 0x06bfada9…e42973 | Transfer | 38,197,328 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x930a…e56e | OUT | 0x8366…0951 | 800,000,000.000000 GOBMARKET | Gobmarket (GOBMARKET) | |
| 0x06bfada9…e42973 | Transfer | 38,197,328 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x930a…e56e | OUT | 0xe3af…7d1e | 200,000,000.000000 GOBMARKET | Gobmarket (GOBMARKET) | |
| 0x06bfada9…e42973 | Transfer | 38,197,328 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x0000…0000 | IN | 0x930a…e56e | 1,000,000,000.000000 GOBMARKET | Gobmarket (GOBMARKET) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x159a62…e962a8 | createCoin | 38,202,806 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0xe3af…7d1e | IN | Hoodmarket | $0.000 ETH | 0.00002160 | |
| 0x06bfad…e42973 | createCoin | 38,197,328 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0xe3af…7d1e | IN | Hoodmarket | $0.000 ETH | 0.00002259 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 38,202,806 | 1 day agoSun, 16 Aug 2026 18:48:16 UTC | 0x159a62…e962a8 | CREATE | createCoin | 0x930a…e56e | OUT | 0xed50…35fc | 0 ETH |
| 38,197,328 | 1 day agoSun, 16 Aug 2026 18:39:05 UTC | 0x06bfad…e42973 | CREATE | createCoin | 0x930a…e56e | OUT | 0x250d…9857 | 0 ETH |