// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {VetoCurveToken} from "./VetoCurveToken.sol";
import {VetoFeeLocker} from "./VetoFeeLocker.sol";
import {INonfungiblePositionManager, IUniswapV3Factory, IUniswapV3Pool, IWETH9} from "./interfaces/IUniswapV3.sol";
/// Veto launchpad: pump.fun-style virtual-reserve bonding curve with
/// automatic, permissionless graduation to Uniswap v3 on Robinhood Chain.
///
/// Lifecycle per token:
/// 1. createToken: flat creationFee in ETH, fixed 1B supply minted to this
/// contract, curve opens.
/// 2. buy/sell against the constant-product curve (x*y=k on virtual reserves);
/// a fee in ETH is skimmed on each trade and accrued for protocol+creator.
/// 3. The buy that sells out the 793.1M curve allocation graduates the token:
/// the curve freezes.
/// 4. migrate (callable by ANYONE, idempotent): raised ETH + the reserved
/// 206.9M tokens seed a full-range Uniswap v3 position at the final curve
/// price; the position NFT is locked forever in the VetoFeeLocker, which only
/// streams swap fees to the creator's recipient and the treasury.
///
/// Fee model: a global, owner-tunable FeeConfig (hard-capped) is SNAPSHOTTED
/// into each token's CurveState at createToken. Config changes only affect
/// future launches — a live token's trade fee and LP split can never change.
///
/// What neither the owner nor the creator can ever do: withdraw curve
/// reserves, pause or alter a live curve, change a launched token's fees,
/// mint tokens, or unlock liquidity.
contract VetoDotFun is Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
// ---------------------------------------------------------------- config
uint256 public constant BPS = 10_000;
/// Hard cap on protocol+creator trade fee (5%).
uint256 public constant MAX_TOTAL_FEE_BPS = 500;
/// Hard cap on the flat creation fee.
uint256 public constant MAX_CREATION_FEE = 0.1 ether;
// Curve shape: pump.fun's constants, token side verbatim (18 decimals).
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
uint256 public constant VIRTUAL_TOKEN_0 = 1_073_000_000e18;
uint256 public constant SALE_SUPPLY = 793_100_000e18;
uint256 public constant POOL_SUPPLY = TOTAL_SUPPLY - SALE_SUPPLY; // 206.9M
/// Uniswap v3 1% fee tier (tick spacing 200) — verified enabled on the
/// Robinhood Chain factory. Full range rounded to spacing:
uint24 public constant POOL_FEE = 10_000;
int24 public constant TICK_LOWER = -887_200;
int24 public constant TICK_UPPER = 887_200;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
/// Initial virtual ETH reserve: the one economic knob. Sets the starting
/// price; ETH raised at graduation is ~2.8335x this value.
uint256 public immutable virtualEth0;
INonfungiblePositionManager public immutable positionManager;
IWETH9 public immutable weth;
/// Global fee config, applied to FUTURE launches only: createToken
/// snapshots the current values into the token's CurveState, freezing
/// them for that token's lifetime. Owner-tunable within the hard caps.
struct FeeConfig {
uint16 protocolFeeBps; // curve trade fee, platform side
uint16 creatorFeeBps; // curve trade fee, creator side
uint16 creatorLpShareBps; // creator's share of post-migration Uniswap fees
uint96 creationFee; // flat launch fee in wei, accrues to protocol
}
FeeConfig public feeConfig;
/// Backend wallet allowed to TRIGGER creator fee payouts on behalf of
/// recipients (funds still only ever flow to the recorded recipient).
/// address(0) disables it. Also honored by the VetoFeeLocker for LP fees.
address public claimAuthority;
/// Pool this contract is mid-swap with during a migration price
/// correction; the swap callback only pays when called by it.
address private _swapPool;
// ----------------------------------------------------------------- state
struct CurveState {
uint128 virtualEth; // x
uint128 virtualToken; // y
uint128 realTokensLeft; // curve allocation remaining; 0 => graduated
uint128 realEth; // ETH held for this curve (net of fees)
address creator;
bool graduated;
bool migrated;
// Fee snapshot taken from feeConfig at createToken — immutable for
// this token's lifetime. Packs into the same slot as creator+flags.
uint16 protocolFeeBps;
uint16 creatorFeeBps;
uint16 creatorLpShareBps;
}
mapping(address token => CurveState) public curves;
mapping(address token => address recipient) public feeRecipientOf;
mapping(address token => uint256 amount) public creatorFeesOwed;
uint256 public protocolFeesOwed;
address[] public allTokens;
address public treasury;
VetoFeeLocker public locker;
// ---------------------------------------------------------------- events
event TokenCreated(
address indexed token,
address indexed creator,
string name,
string symbol,
string metadataURI,
uint16 protocolFeeBps,
uint16 creatorFeeBps,
uint16 creatorLpShareBps
);
event Trade(
address indexed token,
address indexed trader,
bool isBuy,
uint256 ethGross,
uint256 tokenAmount,
uint256 fee,
uint128 virtualEth,
uint128 virtualToken
);
event Graduated(address indexed token, uint256 ethRaised);
event Migrated(
address indexed token, address indexed pool, uint256 indexed tokenId, uint256 ethAmount, uint256 tokenAmount
);
event FeeRecipientSet(address indexed token, address indexed recipient);
event CreatorFeesClaimed(address indexed token, address indexed recipient, uint256 amount);
event ProtocolFeesClaimed(address indexed treasury, uint256 amount);
event TreasurySet(address indexed treasury);
event LockerSet(address indexed locker);
event FeeConfigSet(uint16 protocolFeeBps, uint16 creatorFeeBps, uint16 creatorLpShareBps, uint96 creationFee);
event ClaimAuthoritySet(address indexed authority);
// ---------------------------------------------------------------- errors
error UnknownToken();
error CurveClosed();
error CurveStillOpen();
error AlreadyMigrated();
error Expired();
error ZeroAmount();
error ZeroAddress();
error SlippageExceeded();
error FeeTooHigh();
error NotFeeRecipient();
error LockerAlreadySet();
error LockerNotSet();
error EthTransferFailed();
error OnlyWeth();
error NotPool();
error NotTreasury();
error InsufficientCreationFee();
constructor(
address owner_,
address treasury_,
address positionManager_,
address weth_,
uint256 virtualEth0_,
FeeConfig memory feeConfig_,
address claimAuthority_
) Ownable(owner_) {
if (treasury_ == address(0) || positionManager_ == address(0) || weth_ == address(0)) {
revert ZeroAddress();
}
// Bounded so virtual reserves always fit uint128 (max vE = ~3.84x vE0).
if (virtualEth0_ == 0 || virtualEth0_ > 1e24) revert ZeroAmount();
treasury = treasury_;
positionManager = INonfungiblePositionManager(positionManager_);
weth = IWETH9(weth_);
virtualEth0 = virtualEth0_;
_setFeeConfig(feeConfig_);
claimAuthority = claimAuthority_; // address(0) = disabled
emit ClaimAuthoritySet(claimAuthority_);
}
// ---------------------------------------------------------------- launch
/// Deploys a new token and opens its curve, snapshotting the current
/// global fee config into the token's state (its fees never change after
/// this). msg.value must cover the flat creationFee; any ETH beyond it is
/// executed as the creator's first buy ("dev buy") at the public price.
function createToken(
string calldata name,
string calldata symbol,
string calldata metadataURI,
uint256 minTokensOut
) external payable nonReentrant returns (address token) {
if (address(locker) == address(0)) revert LockerNotSet();
FeeConfig memory c = feeConfig;
if (msg.value < c.creationFee) revert InsufficientCreationFee();
protocolFeesOwed += c.creationFee;
token = address(new VetoCurveToken(name, symbol, metadataURI, address(this)));
curves[token] = CurveState({
virtualEth: uint128(virtualEth0),
virtualToken: uint128(VIRTUAL_TOKEN_0),
realTokensLeft: uint128(SALE_SUPPLY),
realEth: 0,
creator: msg.sender,
graduated: false,
migrated: false,
protocolFeeBps: c.protocolFeeBps,
creatorFeeBps: c.creatorFeeBps,
creatorLpShareBps: c.creatorLpShareBps
});
feeRecipientOf[token] = msg.sender;
allTokens.push(token);
emit TokenCreated(
token, msg.sender, name, symbol, metadataURI, c.protocolFeeBps, c.creatorFeeBps, c.creatorLpShareBps
);
uint256 devBuyEth = msg.value - c.creationFee;
if (devBuyEth > 0) {
_buy(token, devBuyEth, minTokensOut);
}
}
// --------------------------------------------------------------- trading
function buy(address token, uint256 minTokensOut, uint256 deadline) external payable nonReentrant {
if (block.timestamp > deadline) revert Expired();
if (msg.value == 0) revert ZeroAmount();
_buy(token, msg.value, minTokensOut);
}
function _buy(address token, uint256 grossIn, uint256 minTokensOut) internal {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated) revert CurveClosed();
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 k = vE * vT;
uint256 totalFeeBps = uint256(s.protocolFeeBps) + s.creatorFeeBps;
uint256 fee = grossIn * totalFeeBps / BPS;
uint256 net = grossIn - fee;
// ceilDiv rounds the post-trade token reserve up => tokensOut down,
// always in the curve's favor (k never decreases).
uint256 tokensOut = vT - Math.ceilDiv(k, vE + net);
uint256 refund = 0;
if (tokensOut >= s.realTokensLeft) {
// Final buy: partial fill up to the curve allocation, refund the rest.
tokensOut = s.realTokensLeft;
uint256 netNeeded = Math.ceilDiv(k, vT - tokensOut) - vE;
uint256 grossNeeded = Math.ceilDiv(netNeeded * BPS, BPS - totalFeeBps);
if (grossNeeded < grossIn) {
refund = grossIn - grossNeeded;
grossIn = grossNeeded;
}
fee = grossIn * totalFeeBps / BPS;
net = grossIn - fee;
s.graduated = true;
}
if (tokensOut == 0) revert ZeroAmount();
if (tokensOut < minTokensOut) revert SlippageExceeded();
s.virtualEth = uint128(vE + net);
s.virtualToken = uint128(vT - tokensOut);
s.realTokensLeft -= uint128(tokensOut);
s.realEth += uint128(net);
_accrueFees(token, grossIn, fee, s.creatorFeeBps);
IERC20(token).safeTransfer(msg.sender, tokensOut);
if (refund > 0) _sendEth(msg.sender, refund);
emit Trade(token, msg.sender, true, grossIn, tokensOut, fee, s.virtualEth, s.virtualToken);
if (s.graduated) emit Graduated(token, s.realEth);
}
/// Exact-output buy: receive exactly `tokensOut` tokens, paying whatever
/// they cost at execution time. `msg.value` is the spend cap — the curve
/// takes what it needs and refunds the rest; if the price moved past the
/// cap, the call reverts instead of delivering fewer tokens.
function buyExactTokens(address token, uint256 tokensOut, uint256 deadline) external payable nonReentrant {
if (block.timestamp > deadline) revert Expired();
if (tokensOut == 0) revert ZeroAmount();
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated) revert CurveClosed();
if (tokensOut > s.realTokensLeft) revert SlippageExceeded();
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 k = vE * vT;
uint256 totalFeeBps = uint256(s.protocolFeeBps) + s.creatorFeeBps;
// Cost of exactly tokensOut, rounded in the curve's favor, then
// grossed up so the fee comes out of what the buyer pays.
uint256 netNeeded = Math.ceilDiv(k, vT - tokensOut) - vE;
uint256 grossNeeded = Math.ceilDiv(netNeeded * BPS, BPS - totalFeeBps);
if (grossNeeded > msg.value) revert SlippageExceeded();
uint256 fee = grossNeeded * totalFeeBps / BPS;
uint256 net = grossNeeded - fee;
if (tokensOut == s.realTokensLeft) s.graduated = true;
s.virtualEth = uint128(vE + net);
s.virtualToken = uint128(vT - tokensOut);
s.realTokensLeft -= uint128(tokensOut);
s.realEth += uint128(net);
_accrueFees(token, grossNeeded, fee, s.creatorFeeBps);
IERC20(token).safeTransfer(msg.sender, tokensOut);
uint256 refund = msg.value - grossNeeded;
if (refund > 0) _sendEth(msg.sender, refund);
emit Trade(token, msg.sender, true, grossNeeded, tokensOut, fee, s.virtualEth, s.virtualToken);
if (s.graduated) emit Graduated(token, s.realEth);
}
function sell(address token, uint256 tokenAmount, uint256 minEthOut, uint256 deadline) external nonReentrant {
if (block.timestamp > deadline) revert Expired();
_sell(token, tokenAmount, minEthOut);
}
/// One-transaction sell: approves via EIP-2612 signature, then sells.
/// The permit call is wrapped in try/catch — if a griefer front-runs the
/// signature by submitting it to the token directly, the allowance is
/// already set and the sell proceeds anyway (OZ-recommended pattern).
function sellWithPermit(
address token,
uint256 tokenAmount,
uint256 minEthOut,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s_
) external nonReentrant {
if (block.timestamp > deadline) revert Expired();
try IERC20Permit(token).permit(msg.sender, address(this), tokenAmount, deadline, v, r, s_) {} catch {}
_sell(token, tokenAmount, minEthOut);
}
function _sell(address token, uint256 tokenAmount, uint256 minEthOut) internal {
if (tokenAmount == 0) revert ZeroAmount();
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated) revert CurveClosed();
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 k = vE * vT;
// ceilDiv rounds the post-trade ETH reserve up => ethOut down (pool favored).
uint256 grossOut = vE - Math.ceilDiv(k, vT + tokenAmount);
if (grossOut == 0) revert ZeroAmount();
uint256 totalFeeBps = uint256(s.protocolFeeBps) + s.creatorFeeBps;
uint256 fee = grossOut * totalFeeBps / BPS;
uint256 ethOut = grossOut - fee;
if (ethOut < minEthOut) revert SlippageExceeded();
s.virtualEth = uint128(vE - grossOut);
s.virtualToken = uint128(vT + tokenAmount);
s.realTokensLeft += uint128(tokenAmount);
s.realEth -= uint128(grossOut);
_accrueFees(token, grossOut, fee, s.creatorFeeBps);
IERC20(token).safeTransferFrom(msg.sender, address(this), tokenAmount);
_sendEth(msg.sender, ethOut);
emit Trade(token, msg.sender, false, grossOut, tokenAmount, fee, s.virtualEth, s.virtualToken);
}
/// Splits `fee` (already skimmed from a trade of gross size `grossEth`)
/// into creator and protocol accruals, pull-claimable later. Uses the
/// token's snapshotted creator fee bps.
function _accrueFees(address token, uint256 grossEth, uint256 fee, uint256 creatorFeeBps_) internal {
uint256 creatorFee = grossEth * creatorFeeBps_ / BPS;
if (creatorFee > fee) creatorFee = fee;
creatorFeesOwed[token] += creatorFee;
protocolFeesOwed += fee - creatorFee;
}
// ------------------------------------------------------------- migration
/// Moves a graduated token's liquidity to Uniswap v3. Permissionless and
/// idempotent: anyone may call, exactly once, with zero discretion.
function migrate(address token) external nonReentrant returns (address pool, uint256 tokenId) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (!s.graduated) revert CurveStillOpen();
if (s.migrated) revert AlreadyMigrated();
s.migrated = true;
uint256 ethAmount = s.realEth;
s.realEth = 0;
weth.deposit{value: ethAmount}();
(address token0, address token1, uint256 amount0, uint256 amount1) = token < address(weth)
? (token, address(weth), POOL_SUPPLY, ethAmount)
: (address(weth), token, ethAmount, POOL_SUPPLY);
// Opening price = deposit ratio = final curve price (to ~0.007%).
uint160 sqrtPriceX96 = uint160(Math.sqrt(Math.mulDiv(amount1, 1 << 192, amount0)));
// Anti-griefing: anyone can create+initialize the pool ahead of us at a
// hostile price (costs them nothing while the pool has no liquidity).
// If that happened, swap the pool price back to the fair curve price
// before minting. Against an empty pool this moves the price for free;
// against hostile liquidity every unit trades at a better-than-fair
// price for us, so griefing is strictly money-losing for the attacker.
// The swap is best-effort and capped at half the input-side balance so
// the mint below always has both assets and migrate can never be
// reverted (a revert here would be a worse griefing vector: a
// permanently blocked migration).
address existing = IUniswapV3Factory(positionManager.factory()).getPool(token0, token1, POOL_FEE);
if (existing != address(0)) {
(uint160 poolPrice,,,,,,) = IUniswapV3Pool(existing).slot0();
if (poolPrice != 0 && poolPrice != sqrtPriceX96) {
bool zeroForOne = poolPrice > sqrtPriceX96;
uint256 cap = IERC20(zeroForOne ? token0 : token1).balanceOf(address(this)) / 2;
if (cap > 0) {
_swapPool = existing;
IUniswapV3Pool(existing)
.swap(address(this), zeroForOne, int256(cap), sqrtPriceX96, abi.encode(token0, token1));
_swapPool = address(0);
// Balances shifted; the position is minted from what we hold now.
(amount0, amount1) = token0 == token
? (IERC20(token).balanceOf(address(this)), weth.balanceOf(address(this)))
: (weth.balanceOf(address(this)), IERC20(token).balanceOf(address(this)));
}
}
}
pool = positionManager.createAndInitializePoolIfNecessary(token0, token1, POOL_FEE, sqrtPriceX96);
(uint256 tokenAvail, uint256 ethAvail) = token0 == token ? (amount0, amount1) : (amount1, amount0);
IERC20(token).forceApprove(address(positionManager), tokenAvail);
IERC20(address(weth)).forceApprove(address(positionManager), ethAvail);
// Mins are 0 by design: there is no trusted party to pick them, and a
// reverting mint would block migration forever. Any deposit-ratio
// mismatch ends up as dust and is swept below, so nothing is stranded.
uint256 used0;
uint256 used1;
(tokenId,, used0, used1) = positionManager.mint(
INonfungiblePositionManager.MintParams({
token0: token0,
token1: token1,
fee: POOL_FEE,
tickLower: TICK_LOWER,
tickUpper: TICK_UPPER,
amount0Desired: amount0,
amount1Desired: amount1,
amount0Min: 0,
amount1Min: 0,
recipient: address(locker),
deadline: block.timestamp
})
);
IERC20(token).forceApprove(address(positionManager), 0);
IERC20(address(weth)).forceApprove(address(positionManager), 0);
locker.register(token, tokenId);
// Sweep dust: unused tokens are burned, unused WETH accrues to the
// protocol (it cannot be returned to the curve, which is closed).
(uint256 usedToken, uint256 usedWeth) = token0 == token ? (used0, used1) : (used1, used0);
uint256 tokenDust = tokenAvail - usedToken;
if (tokenDust > 0) IERC20(token).safeTransfer(DEAD, tokenDust);
uint256 wethDust = ethAvail - usedWeth;
if (wethDust > 0) {
weth.withdraw(wethDust);
protocolFeesOwed += wethDust;
}
emit Migrated(token, pool, tokenId, usedWeth, usedToken);
}
/// Pays the pool for the migration price-correction swap above. Only the
/// pool this contract is actively mid-swap with can trigger a payment;
/// at every other moment `_swapPool` is zero and this reverts.
function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external {
if (msg.sender != _swapPool || _swapPool == address(0)) revert NotPool();
(address token0, address token1) = abi.decode(data, (address, address));
if (amount0Delta > 0) IERC20(token0).safeTransfer(msg.sender, uint256(amount0Delta));
if (amount1Delta > 0) IERC20(token1).safeTransfer(msg.sender, uint256(amount1Delta));
}
// ------------------------------------------------------------------ fees
/// Pays out a token's accrued creator fees. Only the recorded fee
/// recipient or the backend claim authority may trigger; funds always go
/// to the recipient regardless of who calls.
function claimCreatorFees(address token) external nonReentrant {
_claimCreatorFees(token);
}
/// Batch payout for the claim authority ("airdrop" mode): pays each
/// token's accrued creator fees to its own recipient. Zero-balance
/// tokens are skipped; an unknown token or unauthorized caller reverts
/// the whole batch.
function claimCreatorFeesBatch(address[] calldata tokens) external nonReentrant {
for (uint256 i = 0; i < tokens.length; i++) {
_claimCreatorFees(tokens[i]);
}
}
function _claimCreatorFees(address token) internal {
address recipient = feeRecipientOf[token];
if (recipient == address(0)) revert UnknownToken();
if (msg.sender != recipient && msg.sender != claimAuthority) revert NotFeeRecipient();
uint256 amount = creatorFeesOwed[token];
if (amount == 0) return;
creatorFeesOwed[token] = 0;
_sendEth(recipient, amount);
emit CreatorFeesClaimed(token, recipient, amount);
}
/// Pays accrued protocol fees to the treasury. Only the treasury itself
/// may claim (survives an ownership renounce; a multisig treasury claims
/// directly).
function claimProtocolFees() external nonReentrant {
if (msg.sender != treasury) revert NotTreasury();
uint256 amount = protocolFeesOwed;
if (amount == 0) return;
protocolFeesOwed = 0;
_sendEth(treasury, amount);
emit ProtocolFeesClaimed(treasury, amount);
}
/// Redirects a token's fee stream (curve fees + locked-LP fees). Only the
/// current recipient may reassign, and the change is event-logged.
function setFeeRecipient(address token, address newRecipient) external {
if (msg.sender != feeRecipientOf[token]) revert NotFeeRecipient();
if (newRecipient == address(0)) revert ZeroAddress();
feeRecipientOf[token] = newRecipient;
emit FeeRecipientSet(token, newRecipient);
}
// ----------------------------------------------------------------- admin
/// Updates the global fee config. Applies to FUTURE launches only —
/// existing tokens keep their snapshot. Hard caps: 5% total trade fee,
/// 100% LP share, 0.1 ETH creation fee.
function setFeeConfig(FeeConfig calldata feeConfig_) external onlyOwner {
_setFeeConfig(feeConfig_);
}
function _setFeeConfig(FeeConfig memory c) internal {
if (uint256(c.protocolFeeBps) + c.creatorFeeBps > MAX_TOTAL_FEE_BPS) revert FeeTooHigh();
if (c.creatorLpShareBps > BPS) revert FeeTooHigh();
if (c.creationFee > MAX_CREATION_FEE) revert FeeTooHigh();
feeConfig = c;
emit FeeConfigSet(c.protocolFeeBps, c.creatorFeeBps, c.creatorLpShareBps, c.creationFee);
}
/// Rotates (or disables, with address(0)) the backend claim authority.
function setClaimAuthority(address claimAuthority_) external onlyOwner {
claimAuthority = claimAuthority_;
emit ClaimAuthoritySet(claimAuthority_);
}
function setTreasury(address treasury_) external onlyOwner {
if (treasury_ == address(0)) revert ZeroAddress();
treasury = treasury_;
emit TreasurySet(treasury_);
}
/// One-time wiring of the VetoFeeLocker (deployed after this contract because
/// it needs this address in its constructor).
function setLocker(address locker_) external onlyOwner {
if (locker_ == address(0)) revert ZeroAddress();
if (address(locker) != address(0)) revert LockerAlreadySet();
locker = VetoFeeLocker(locker_);
emit LockerSet(locker_);
}
// ----------------------------------------------------------------- views
function quoteBuy(address token, uint256 grossIn)
external
view
returns (uint256 tokensOut, uint256 fee, uint256 ethUsed)
{
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated || grossIn == 0) return (0, 0, 0);
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 k = vE * vT;
uint256 totalFeeBps = uint256(s.protocolFeeBps) + s.creatorFeeBps;
fee = grossIn * totalFeeBps / BPS;
tokensOut = vT - Math.ceilDiv(k, vE + (grossIn - fee));
ethUsed = grossIn;
if (tokensOut >= s.realTokensLeft) {
tokensOut = s.realTokensLeft;
uint256 netNeeded = Math.ceilDiv(k, vT - tokensOut) - vE;
uint256 grossNeeded = Math.ceilDiv(netNeeded * BPS, BPS - totalFeeBps);
if (grossNeeded < grossIn) ethUsed = grossNeeded;
fee = ethUsed * totalFeeBps / BPS;
}
}
/// Cost of buying exactly `tokensOut` right now (gross ETH incl. fee).
function quoteBuyExact(address token, uint256 tokensOut) external view returns (uint256 ethNeeded, uint256 fee) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated || tokensOut == 0 || tokensOut > s.realTokensLeft) return (0, 0);
uint256 totalFeeBps = uint256(s.protocolFeeBps) + s.creatorFeeBps;
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 netNeeded = Math.ceilDiv(vE * vT, vT - tokensOut) - vE;
ethNeeded = Math.ceilDiv(netNeeded * BPS, BPS - totalFeeBps);
fee = ethNeeded * totalFeeBps / BPS;
}
function quoteSell(address token, uint256 tokenAmount) external view returns (uint256 ethOut, uint256 fee) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
if (s.graduated || tokenAmount == 0) return (0, 0);
uint256 vE = s.virtualEth;
uint256 vT = s.virtualToken;
uint256 grossOut = vE - Math.ceilDiv(vE * vT, vT + tokenAmount);
fee = grossOut * (uint256(s.protocolFeeBps) + s.creatorFeeBps) / BPS;
ethOut = grossOut - fee;
}
/// The token's snapshotted creator LP fee share (bps of collected Uniswap
/// fees). Read by the VetoFeeLocker at every harvest; fixed at createToken.
function creatorLpShareBpsOf(address token) external view returns (uint256) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
return s.creatorLpShareBps;
}
/// Current spot price in wei per whole token (1e18 base units).
function currentPrice(address token) external view returns (uint256) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
return Math.mulDiv(s.virtualEth, 1e18, s.virtualToken);
}
/// Curve progress toward graduation in bps (10_000 = graduated).
function curveProgressBps(address token) external view returns (uint256) {
CurveState storage s = curves[token];
if (s.creator == address(0)) revert UnknownToken();
return (SALE_SUPPLY - s.realTokensLeft) * BPS / SALE_SUPPLY;
}
function tokenCount() external view returns (uint256) {
return allTokens.length;
}
/// Paginated slice of every launched token (newest launches at the end).
/// One RPC call replaces `limit` calls to allTokens(i).
function getTokens(uint256 offset, uint256 limit) external view returns (address[] memory page) {
uint256 len = allTokens.length;
if (offset >= len) return new address[](0);
uint256 n = len - offset;
if (n > limit) n = limit;
page = new address[](n);
for (uint256 i = 0; i < n; i++) {
page[i] = allTokens[offset + i];
}
}
/// Batch curve reads for a token list — one RPC call renders a whole page.
function getCurveStates(address[] calldata tokens) external view returns (CurveState[] memory states) {
states = new CurveState[](tokens.length);
for (uint256 i = 0; i < tokens.length; i++) {
states[i] = curves[tokens[i]];
}
}
// -------------------------------------------------------------- internal
function _sendEth(address to, uint256 amount) internal {
(bool ok,) = to.call{value: amount}("");
if (!ok) revert EthTransferFailed();
}
/// Accepts ETH only from WETH withdrawals during migration dust sweeping.
receive() external payable {
if (msg.sender != address(weth)) revert OnlyWeth();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
},
{
"name": "virtualEth0_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "feeConfig_",
"type": "tuple",
"components": [
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creationFee",
"type": "uint96",
"internalType": "uint96"
}
],
"internalType": "struct VetoDotFun.FeeConfig"
},
{
"name": "claimAuthority_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyMigrated",
"type": "error",
"inputs": []
},
{
"name": "CurveClosed",
"type": "error",
"inputs": []
},
{
"name": "CurveStillOpen",
"type": "error",
"inputs": []
},
{
"name": "EthTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "Expired",
"type": "error",
"inputs": []
},
{
"name": "FeeTooHigh",
"type": "error",
"inputs": []
},
{
"name": "InsufficientCreationFee",
"type": "error",
"inputs": []
},
{
"name": "LockerAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "LockerNotSet",
"type": "error",
"inputs": []
},
{
"name": "NotFeeRecipient",
"type": "error",
"inputs": []
},
{
"name": "NotPool",
"type": "error",
"inputs": []
},
{
"name": "NotTreasury",
"type": "error",
"inputs": []
},
{
"name": "OnlyWeth",
"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": "SlippageExceeded",
"type": "error",
"inputs": []
},
{
"name": "UnknownToken",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "ClaimAuthoritySet",
"type": "event",
"inputs": [
{
"name": "authority",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CreatorFeesClaimed",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeeConfigSet",
"type": "event",
"inputs": [
{
"name": "protocolFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creationFee",
"type": "uint96",
"indexed": false,
"internalType": "uint96"
}
],
"anonymous": false
},
{
"name": "FeeRecipientSet",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethRaised",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LockerSet",
"type": "event",
"inputs": [
{
"name": "locker",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Migrated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolFeesClaimed",
"type": "event",
"inputs": [
{
"name": "treasury",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TokenCreated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "metadataURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "protocolFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "Trade",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "trader",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "isBuy",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "ethGross",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "virtualToken",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "TreasurySet",
"type": "event",
"inputs": [
{
"name": "treasury",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "DEAD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MAX_CREATION_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_TOTAL_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "POOL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "SALE_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TICK_LOWER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_UPPER",
"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": "VIRTUAL_TOKEN_0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "allTokens",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "minTokensOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "buyExactTokens",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokensOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "claimAuthority",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "claimCreatorFees",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimCreatorFeesBatch",
"type": "function",
"inputs": [
{
"name": "tokens",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimProtocolFees",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "createToken",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "metadataURI",
"type": "string",
"internalType": "string"
},
{
"name": "minTokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "creatorFeesOwed",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorLpShareBpsOf",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentPrice",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "curveProgressBps",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "curves",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "virtualEth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "virtualToken",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "realTokensLeft",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "realEth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "graduated",
"type": "bool",
"internalType": "bool"
},
{
"name": "migrated",
"type": "bool",
"internalType": "bool"
},
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "feeConfig",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creationFee",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "feeRecipientOf",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getCurveStates",
"type": "function",
"inputs": [
{
"name": "tokens",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [
{
"name": "states",
"type": "tuple[]",
"components": [
{
"name": "virtualEth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "virtualToken",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "realTokensLeft",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "realEth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "graduated",
"type": "bool",
"internalType": "bool"
},
{
"name": "migrated",
"type": "bool",
"internalType": "bool"
},
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"internalType": "uint16"
}
],
"internalType": "struct VetoDotFun.CurveState[]"
}
],
"stateMutability": "view"
},
{
"name": "getTokens",
"type": "function",
"inputs": [
{
"name": "offset",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "limit",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "page",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "view"
},
{
"name": "locker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract VetoFeeLocker"
}
],
"stateMutability": "view"
},
{
"name": "migrate",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "pool",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "protocolFeesOwed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteBuy",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "grossIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokensOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "ethUsed",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteBuyExact",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethNeeded",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteSell",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sell",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sellWithPermit",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s_",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setClaimAuthority",
"type": "function",
"inputs": [
{
"name": "claimAuthority_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeConfig",
"type": "function",
"inputs": [
{
"name": "feeConfig_",
"type": "tuple",
"components": [
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorLpShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creationFee",
"type": "uint96",
"internalType": "uint96"
}
],
"internalType": "struct VetoDotFun.FeeConfig"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeRecipient",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "newRecipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLocker",
"type": "function",
"inputs": [
{
"name": "locker_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "treasury_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "virtualEth0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IWETH9"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e0604052346103d3576040516154ff38819003601f8101601f191683016001600160401b038111848210176103d7578392829160405283398101039061014082126103d35761004e816103eb565b9161005b602083016103eb565b610067604084016103eb565b610073606085016103eb565b9060808086015194609f1901126103d35760405193608085016001600160401b038111868210176103d7576040526100ad60a087016103ff565b85526100bb60c087016103ff565b92602086019384526100cf60e088016103ff565b60408701908152610100880151979093906001600160601b03891689036103d3576101206101049160608a019a8b52016103eb565b986001600160a01b03169586156103c057600180546001600160a01b03199081169091555f80549182168917815560405198916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b0316801580156103af575b801561039e575b61038f578315801561037c575b61036d57600a80546001600160a01b0319169190911790556001600160a01b0390811660a0521660c0526080528351825161ffff91821691168101908110610359576101f41061034a5761271061ffff8251161161034a57845167016345785d8a00006001600160601b039091161161034a577f6de2280d4c0e176b06b2b4456ea35741345e4b405dcffbc90d0abb6c7f0395d39461ffff8092816080975116600254955191519351956601000000000000600160901b038760301b1690826601000000000000600160901b03199165ffffffffffff1916171663ffff00008460101b161765ffff000000008660201b161717600255865216602085015216604083015260018060601b03166060820152a1600380546001600160a01b0319166001600160a01b03929092169182179055604051907f1e077cc4b4c8dce097ded0b9b4a3cc4fdcf8b4b79087c387ba3ac3dd5e9593525f80a26150f0908161040f82396080518181816102b60152610719015260a051818181610ca90152611872015260c051818181601c01528181610c0b01526121420152f35b63cd4e616760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b631f2a200560e01b5f5260045ffd5b5069d3c21bcecceda100000084116101af565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038316156101a2565b506001600160a01b0382161561019b565b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036103d357565b519061ffff821682036103d35756fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b632f95b04960e21b5f5260045ffd5b5f905f3560e01c90816303fd2a4514612740575080630a20ab9f146126dd5780630d7a94f6146126a3578063171060ec1461261e5780631dc6d33f146125f65780631e5eb1d0146125a3578063239f3af714612586578063249d39e91461256a578063270401cb146124b25780632cc3dc6e146123f55780633ab68b96146123bd5780633ca38fca146121715780633fc8cef31461212d578063431a9caa1461211157806347377d92146120f3578063494cfc6c146120875780634a7d0369146120545780634ac638f31461202e5780634c33aa2e14611f5e5780634cf4bdb214611f375780635460476514611daf578063552e6f7614611d915780635cfb1d0e14611d3d57806361d027b314611d14578063634282af14611cd05780636452ce201461196e578063715018a61461190957806372900339146118a1578063791b98bc1461185c57806379ba5097146117d757806387cb5f94146117b45780638da5cb5b1461178d578063902d55a51461176657806392cdbac51461171b5780639f181b5e146116fd5780639fb7a31f146116d5578063a59ac6dd1461168a578063cbf6fff914611663578063ce5494bb14610b84578063d6ae6e4414610b46578063d7b96d4e14610b1d578063d98b2f5c14610ae9578063dd1b9c4a14610acc578063dfcee7d214610a8b578063e30c397814610a62578063e9833c2f146109ed578063efbe8fd114610581578063f0c394661461049d578063f0f4426014610424578063f2fde38b146103b7578063fa461e33146102dc5763fd17fd280361000f57346102d957806003193601126102d95760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b80fd5b50346102d95760603660031901126102d9576004356024356044356001600160401b03811161039b5761031390369060040161284d565b60018060a01b0360045416803314908115916103ae575b5061039f57816040918101031261039b57610350602061034983612770565b9201612770565b92848113610380575b5050828113610366578280f35b61037a9133906001600160a01b0316613268565b5f808280f35b6103949133906001600160a01b0316613268565b5f80610359565b8380fd5b636f61f64160e01b8552600485fd5b9050155f61032a565b50346102d95760203660031901126102d9576103d161275a565b6103d9612e40565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346102d95760203660031901126102d95761043e61275a565b610446612e40565b6001600160a01b0316801561048e57600a80546001600160a01b031916821790557f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f8280a280f35b63d92e233d60e01b8252600482fd5b50346102d95760203660031901126102d9576001600160a01b036104bf61275a565b16815260056020526040812060028101546001600160a01b0316156105725760016001600160801b039101541690816b029009752660ad62af80000003916b029009752660ad62af800000831161055e57612710830292830461271014906b029009752660ad62af80000014171561054a576020826b029009752660ad62af80000060405191048152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b638698bf3760e01b8252600482fd5b5060803660031901126102d9576004356001600160401b0381116109e9576105ad90369060040161284d565b6024929192356001600160401b0381116109e5576105cf90369060040161284d565b9190936044356001600160401b0381116109e1576105f190369060040161284d565b95906105fb612e66565b600b546001600160a01b0316156109d2576040519661061988612a30565b6002549261ffff84168952602089019661ffff8560101c1688526001600160601b0360408b019561ffff8160201c16875260301c1699606081019a808c5234106109c3576106736001600160601b038c511660085461288d565b6008556040516116e2808201908282106001600160401b038311176109af57906106d16106c26106b38c8e87966139b98839608086526080860191612df0565b83810360208501528789612df0565b8281036040840152888a612df0565b9060603091015203908bf080156109a457600160a01b6001900316998a825161ffff168b5161ffff1690895161ffff16906040519361070f85612a00565b6001600160801b037f0000000000000000000000000000000000000000000000000000000000000000811686526b037790968dc8efffd100000060208088019182526b029009752660ad62af8000006040808a0191825260608a018b8152336080808d0191825260a08d018e815260c08e018f815260e08f019b8c526101008f019d8e526101208f019c8d52998f526005909652928d209b51955190921b6001600160801b0319169490951693909317895591979092909151905160801b6001600160801b0319166001600160801b0390911617600182015595516002969096018054915192519351955194516001600160e01b03199092166001600160a01b03979097169690961791151560a01b60ff60a01b169190911791151560a81b60ff60a81b169190911760b09390931b61ffff60b01b169290921760c09190911b61ffff60c01b161760d09190911b61ffff60d01b161790558a815260066020526040812080546001600160a01b0319163317905560095490600160401b82101561099057508a957f2807e927148c24956ef8a3bb6f3ccd7c2502584afa23ba9959cab0762f782f87956109306001600160601b039b9660209f9b9661092261095c9f9c9761ffff8080928f6108ed8c600161093e9e016009556127f7565b819291549060031b91821b9160018060a01b03901b191617905551169e5116985116986040519a60c08c5260c08c0191612df0565b9189830360208b0152612df0565b918683036040880152612df0565b956060840152608083015260a08201528033940390a35116346127d6565b8061097c575b5060015f51602061509b5f395f51905f5255604051908152f35b61098a9060643590836132e0565b5f610962565b634e487b7160e01b81526041600452602490fd5b6040513d8c823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b630535b74760e41b8a5260048afd5b6333c001eb60e11b8652600486fd5b8480fd5b8280fd5b5080fd5b50346102d95760203660031901126102d9576001600160a01b03610a0f61275a565b16815260056020526040812060028101549091906001600160a01b031615610a53576020610a4b83546001600160801b038160801c9116613674565b604051908152f35b638698bf3760e01b8152600490fd5b50346102d957806003193601126102d9576001546040516001600160a01b039091168152602090f35b50346102d95760203660031901126102d9576020906001600160a01b03610ab061275a565b16815260068252604060018060a01b0391205416604051908152f35b50346102d957806003193601126102d95760206040516127108152f35b50346102d95760403660031901126102d9576040610b11610b0861275a565b60243590612d43565b82519182526020820152f35b50346102d957806003193601126102d957600b546040516001600160a01b039091168152602090f35b50346102d95760203660031901126102d957610b70610b6361275a565b610b6b612e66565b61316c565b60015f51602061509b5f395f51905f525580f35b50346102d95760203660031901126102d957610b9e61275a565b610ba6612e66565b6001600160a01b03818116808452600560205260408420600281018054929493919290918116156116545760ff8160a01c16156116455760ff8160a81c166116365760ff60a81b1916600160a81b17905560010180546001600160801b0381169091557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169260809190911c9190833b156109e157604051630d0e30db60e41b815285908181600481888a5af1801561110057611621575b50508381101561160e576aab24c7796fd2da388000009180948093945b946001600160a01b03610c9e610c9983896135cc565b613703565b169560018060a01b037f000000000000000000000000000000000000000000000000000000000000000016976040519663c45a015560e01b88526020886004818d5afa978815611603578b986115e2575b50604051630b4c774160e11b81526001600160a01b03808416600483018190528382166024840181905261271060448501529a90948e939092909160209183916064918391165afa9081156115065783916115c3575b506001600160a01b031690816111b7575b50505050604051976309f56ab160e11b89528160048a01528760248a015261271060448a015260648901526020886084818d8d5af19788156109a4578a98611186575b5080861496871561117f57839280945b610db4858d8b61387d565b610dbf868d8961387d565b60018060a01b03600b5416916040519461016086018681106001600160401b0382111761116a57908f9392916040528652602086019485526040860191612710835260608701620d899f1981526080880190620d89a0825260a0890192835260c0890193845260e08901948686526101008a019687526101208a019788526101408a0198428a526040519a634418b22b60e11b8c52600160a01b6001900390511660048c0152600160a01b6001900390511660248b01525162ffffff1660448a01525160020b60648901525160020b60848801525160a48701525160c48601525160e485015251610104840152600160a01b60019003905116610124830152516101448201528980828b815a9361016492608095f195861561105b57819a8293839861110b575b5080610ef5610efb928b613825565b87613825565b600b546001600160a01b0316803b156109e557604051636d705ebb60e01b81526001600160a01b03929092166004830152602482018c905282908290604490829084905af18015611100576110e7575b50610f62971590506110dd579586949687926127d6565b80611068575b50610f72916127d6565b9081610fe8575b505060408051938452602084019190915284926001600160a01b03851692917f57aa04076c8e8e00f17b6f082eb7c65ec1aa90f07da036638ccfcb07dcae6cc891a460015f51602061509b5f395f51905f5255604080516001600160a01b039290921682526020820192909252f35b8088913b156109e95781906024604051809b8193632e1a7d4d60e01b83528760048401525af197881561105b57879897969761103a575b505061102d9060085461288d565b6008555f80959495610f79565b818093949596975061104b91612a4b565b6102d9579081879594939261101f565b50604051903d90823e3d90fd5b90506040519063a9059cbb60e01b8a5261dead60045260245260208960448180895af19060018a51148216156110bc575b604052156110a857845f610f68565b635274afe760e01b88526004849052602488fd5b9060018115166110d457853b15153d15161690611099565b503d89823e3d90fd5b95869185906127d6565b816110f191612a4b565b6110fc57895f610f4b565b8980fd5b6040513d84823e3d90fd5b9b5096509150506080893d608011611162575b8161112b60809383612a4b565b810103126110fc578989519160208b01516001600160801b038116036109e957610efb606060408d01519c0151939b939790610ee6565b3d915061111e565b50634e487b7160e01b8f52604160045260248ffd5b8284610da9565b6111a991985060203d6020116111b0575b6111a18183612a4b565b810190612d15565b965f610d99565b503d611197565b604051633850c7bd60e01b81529060e082600481865afa80156115b8578d928591611522575b506001600160a01b03169081151580611518575b6111fd575b5050610d56565b6024926020921195865f1461151157505b6040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115611506578c93916114d1575b5060011c80611253575b91818e936111f6565b90604094965080929395506001600160601b0360a01b60045416176004558c60c4855196602088018981528d888a015287895261129160608a612a4b565b875198899788968794630251596160e31b865230600487015260248601526044850152606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301925af180156113d4576114a2575b50600480546001600160a01b03191690558084036113df576040516370a0823160e01b8152306004820152602081602481885afa9081156113d45789916113a2575b506040516370a0823160e01b815230600482015290602082602481875afa9182156109a4578a9261136a575b50905b90915f88818061124a565b9091506020813d60201161139a575b8161138660209383612a4b565b810103126113965751905f61135c565b5f80fd5b3d9150611379565b90506020813d6020116113cc575b816113bd60209383612a4b565b8101031261139657515f611330565b3d91506113b0565b6040513d8b823e3d90fd5b6040516370a0823160e01b8152306004820152602081602481865afa9081156113d4578991611470575b506040516370a0823160e01b815230600482015290602082602481895afa9182156109a4578a9261143c575b509061135f565b9091506020813d602011611468575b8161145860209383612a4b565b810103126113965751905f611435565b3d915061144b565b90506020813d60201161149a575b8161148b60209383612a4b565b8101031261139657515f611409565b3d915061147e565b604090813d83116114ca575b6114b88183612a4b565b810103126114c6575f6112ee565b8780fd5b503d6114ae565b9250506020823d6020116114fe575b816114ed60209383612a4b565b81010312611396578a91515f611240565b3d91506114e0565b6040513d85823e3d90fd5b905061120e565b50828214156111f1565b92505060e0823d60e0116115b0575b8161153e60e09383612a4b565b8101031261039b578151916001600160a01b03831683036109e15760208101518060020b036109e15761157360408201612d34565b5061158060608201612d34565b5061158d60808201612d34565b5060a081015160ff8116036109e15760c001518015150361039b578c915f6111dd565b3d9150611531565b6040513d86823e3d90fd5b6115dc915060203d6020116111b0576111a18183612a4b565b5f610d45565b6115fc91985060203d6020116111b0576111a18183612a4b565b965f610cef565b6040513d8d823e3d90fd5b81846aab24c7796fd2da38800000610c83565b8161162b91612a4b565b6109e157845f610c66565b6332870f2f60e21b8652600486fd5b634b38323360e01b8652600486fd5b638698bf3760e01b8652600486fd5b50346102d957806003193601126102d95760206040516b029009752660ad62af8000008152f35b5061169436612823565b61169f929192612e66565b42116116c65734156116b75790610b709134906132e0565b631f2a200560e01b8352600483fd5b630407b05b60e31b8352600483fd5b50346102d95760403660031901126102d9576040610b116116f461275a565b60243590612c2b565b50346102d957806003193601126102d9576020600954604051908152f35b50346102d95760803660031901126102d95761173561275a565b61173d612e66565b606435421161175757610b70906044359060243590612ef8565b630407b05b60e31b8252600482fd5b50346102d957806003193601126102d95760206040516b033b2e3c9fd0803ce80000008152f35b50346102d957806003193601126102d957546040516001600160a01b039091168152602090f35b50346102d957806003193601126102d957602060405167016345785d8a00008152f35b50346102d957806003193601126102d957600154336001600160a01b039091160361184957600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b50346102d957806003193601126102d9576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102d95760203660031901126102d9576118bb61275a565b6118c3612e40565b600380546001600160a01b0319166001600160a01b039290921691821790557f1e077cc4b4c8dce097ded0b9b4a3cc4fdcf8b4b79087c387ba3ac3dd5e9593528280a280f35b50346102d957806003193601126102d957611922612e40565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5061197836612823565b611980612e66565b42116116c65780156116b7576001600160a01b0382811684526005602052604084206002810154909291811615611cc15760ff8160a01c16611cb2576001600160801b03600184015416808311611ca35783546119e98160801c6001600160801b03831661287a565b92611a2c611a0561ffff8360c01c1661ffff8460b01c1661288d565b94611a276001600160801b03851691611a21898760801c6127d6565b90612e10565b6127d6565b6127108102908082046127101490151715611c8f578461271003906127108211611c7b5790611a5a91612e10565b93348511611c6c576001600160801b037fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c94611b0182611ae28a8a988d611b4f99612710611ab99f9e611b319b611ab09161287a565b049e8f8d6127d6565b978414611c51575b508480611ad08982861661288d565b1616851982541617905560801c6127d6565b8b546001600160801b0316911660801b6001600160801b031916178a55565b81611b148189168260018d015416612beb565b16821960018b0154161760018a015516600188015460801c612c0b565b60018701906001600160801b0382549181199060801b169116179055565b611b6661ffff600287015460c01c1685838961320e565b611b7a83336001600160a01b038916613268565b611b8481346127d6565b80611c41575b5084546040805160018152602081019390935282019390935260608101939093526001600160801b0382166080808501919091529190911c60a083015233916001600160a01b038516919060c090a360ff600282015460a01c16611bfe575b8260015f51602061509b5f395f51905f525580f35b602060017f3a11b9c0ca38b86101cb9e6e1dd2f752c31467c6eaa353f931b801a338406de692015460801c9260405193845260018060a01b031692a25f80611be9565b611c4b9033612e9e565b5f611b8a565b60ff60a01b1916600160a01b17600291909101558d5f611ac1565b638199f5f360e01b8952600489fd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b89526011600452602489fd5b638199f5f360e01b8652600486fd5b63210b9e2d60e01b8552600485fd5b638698bf3760e01b8552600485fd5b50346102d95760203660031901126102d957600435906009548210156102d9576020611cfb836127f7565b905460405160039290921b1c6001600160a01b03168152f35b50346102d957806003193601126102d957600a546040516001600160a01b039091168152602090f35b50346102d957611d4c36612784565b611d54612e66565b825b818110611d72578360015f51602061509b5f395f51905f525580f35b80611d8b610b6b611d866001948688612a83565b612a93565b01611d56565b50346102d957806003193601126102d9576020600854604051908152f35b50346102d95760803660031901126102d957611dc9612e40565b604051611dd581612a30565b60043561ffff81169081810361039b5782526024359161ffff8316908184036109e157602081019384526044359161ffff83168303611f335760408201928352606435936001600160601b0385168503611f2f576101f491611e3d916060850196875261288d565b11611f205761271061ffff83511611611f205767016345785d8a00006001600160601b0384511611611f20575160028054945192519351602085811b65ffff0000000016601086901b63ffff00001671ffffffffffffffffffffffffffffffffffff1990981661ffff9586169081179890981717603083901b71ffffffffffffffffffffffff000000000000161790925560408051968752938316918601919091529216908301526001600160601b031660608201527f6de2280d4c0e176b06b2b4456ea35741345e4b405dcffbc90d0abb6c7f0395d39080608081010390a180f35b63cd4e616760e01b8552600485fd5b8680fd5b8580fd5b50346102d957806003193601126102d95760206040516b037790968dc8efffd10000008152f35b50346113965760e036600319011261139657611f7861275a565b90602435916064356084359060ff821680920361139657611f97612e66565b80421161201f576001600160a01b03831691823b156113965760e45f9283604051958694859363d505accf60e01b85523360048601523060248601528b60448601526064850152608484015260a43560a484015260c43560c48401525af1612009575b50610b70919260443591612ef8565b610b7092505f61201891612a4b565b5f91611ffa565b630407b05b60e31b5f5260045ffd5b34611396575f3660031901126113965760206aab24c7796fd2da38800000604051908152f35b34611396575f3660031901126113965761206c612e66565b612074612b71565b60015f51602061509b5f395f51905f5255005b34611396576040366003190112611396576120a6602435600435612abb565b6040518091602082016020835281518091526020604084019201905f5b8181106120d1575050500390f35b82516001600160a01b03168452859450602093840193909201916001016120c3565b34611396575f366003190112611396576020604051620d899f198152f35b34611396575f3660031901126113965760206040516101f48152f35b34611396575f366003190112611396576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346113965761217f36612784565b61218881612a6c565b916121966040519384612a4b565b818352601f196121a583612a6c565b015f5b8181106123685750505f5b82811061229857836040518091602082016020835281518091526020604084019201905f5b8181106121e6575050500390f35b91935091602061014060019261ffff61012088516001600160801b0381511684526001600160801b038682015116868501526001600160801b0360408201511660408501526001600160801b036060820151166060850152868060a01b03608082015116608085015260a0810151151560a085015260c0810151151560c08501528260e08201511660e085015282610100820151166101008501520151166101208201520194019101918493926121d8565b6001906001600160a01b036122b1611d86838787612a83565b165f52600560205260405f2061ffff6002604051926122cf84612a00565b80546001600160801b038116855260801c6020850152858101546001600160801b038116604086015260801c60608501520154848060a01b038116608084015260ff8160a01c16151560a084015260ff8160a81c16151560c0840152818160b01c1660e0840152818160c01c1661010084015260d01c166101208201526123568287612aa7565b526123618186612aa7565b50016121b3565b60209060405161237781612a00565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c08201525f60e08201525f6101008201525f610120820152828288010152016121a8565b34611396576020366003190112611396576001600160a01b036123de61275a565b165f526007602052602060405f2054604051908152f35b34611396576020366003190112611396576001600160a01b0361241661275a565b165f52600560205261014060405f2061ffff8154916002600182015491015490604051936001600160801b038116855260801c60208501526001600160801b038116604085015260801c606084015260018060a01b038116608084015260ff8160a01c16151560a084015260ff8160a81c16151560c0840152818160b01c1660e0840152818160c01c1661010084015260d01c16610120820152f35b34611396576040366003190112611396576124cb61275a565b6024356001600160a01b0381169190829003611396576001600160a01b039081165f81815260066020526040902054909116330361255b57811561254c575f81815260066020526040812080546001600160a01b031916841790557f15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa708401527219080a3005b63d92e233d60e01b5f5260045ffd5b631d713add60e21b5f5260045ffd5b34611396575f3660031901126113965760206040516127108152f35b34611396575f366003190112611396576020604051620d89a08152f35b34611396575f366003190112611396576002546040805161ffff8084168252601084901c811660208084019190915284901c169181019190915260309190911c6001600160601b03166060820152608090f35b34611396575f366003190112611396576003546040516001600160a01b039091168152602090f35b346113965760203660031901126113965761263761275a565b61263f612e40565b6001600160a01b0316801561254c57600b546001600160a01b038116612694576001600160a01b0319168117600b557fef7ce00901486d0ae4bbe00a818eb6bb2f42bc78fc75571cf294c1c50c61adfd5f80a2005b631aa5264b60e01b5f5260045ffd5b346113965760403660031901126113965760606126ca6126c161275a565b602435906128b8565b9060405192835260208301526040820152f35b34611396576020366003190112611396576001600160a01b036126fe61275a565b165f908152600560205260409020600201546001600160a01b038116156127315760209061ffff6040519160d01c168152f35b638698bf3760e01b5f5260045ffd5b34611396575f366003190112611396578061dead60209252f35b600435906001600160a01b038216820361139657565b35906001600160a01b038216820361139657565b906020600319830112611396576004356001600160401b0381116113965782602382011215611396578060040135926001600160401b0384116113965760248460051b83010111611396576024019190565b919082039182116127e357565b634e487b7160e01b5f52601160045260245ffd5b60095481101561280f5760095f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6060906003190112611396576004356001600160a01b038116810361139657906024359060443590565b9181601f84011215611396578235916001600160401b038311611396576020838186019501011161139657565b818102929181159184041417156127e357565b919082018092116127e357565b81156128a4570490565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b039081165f90815260056020526040902060028101549390918416156127315760ff8460a01c1680156129f8575b6129ed578154926001600160801b0384169360801c90612924612910838761287a565b9661ffff808260c01c169160b01c1661288d565b90612710612932838361287a565b049561295961295361294d6129478a866127d6565b8461288d565b8a612e10565b856127d6565b976001600160801b0360018498015416808a101561297a575b505050505050565b611a2792939599506129949496985080611a21919a6127d6565b61271081029080820461271014901517156127e357826127100361271081116127e3576129c091612e10565b9081106129e3575b506129d6612710918361287a565b04915f8080808080612972565b91506129d66129c8565b5f9350839250829150565b5082156128ed565b61014081019081106001600160401b03821117612a1c57604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117612a1c57604052565b90601f801991011681019081106001600160401b03821117612a1c57604052565b6001600160401b038111612a1c5760051b60200190565b919081101561280f5760051b0190565b356001600160a01b03811681036113965790565b805182101561280f5760209160051b010190565b919060095480841015612b555783612ad2916127d6565b90808211612b4d575b50612ae581612a6c565b612af26040519182612a4b565b818152601f19612b0183612a6c565b0136602083013780935f5b838110612b195750505050565b80612b2e612b296001938561288d565b6127f7565b838060a01b0391549060031b1c16612b468286612aa7565b5201612b0c565b90505f612adb565b50509050604051612b67602082612a4b565b5f81525f36813790565b600a546001600160a01b031633819003612bdc57600854908115612bd85781612b9d915f600855612e9e565b600a546040519182526001600160a01b0316907f0f58cb6262d88971b87878468debb7bc81f1714be597710e16a9fb84c66ff7b590602090a2565b5050565b63b90cdbb160e01b5f5260045ffd5b906001600160801b03809116911603906001600160801b0382116127e357565b906001600160801b03809116911601906001600160801b0382116127e357565b6001600160a01b039081165f9081526005602052604090206002810154909392918116156127315760ff8160a01c168015612d0d575b8015612cf7575b612ced5790611a27612c8a8361ffff80612caf9660c01c169160b01c1661288d565b945491611a216001600160801b0384169360801c91612ca9838661287a565b926127d6565b61271081029080820461271014901517156127e357826127100361271081116127e357612ce2612ce99161271093612e10565b938461287a565b0490565b505090505f905f90565b506001600160801b036001850154168211612c68565b508115612c61565b9081602091031261139657516001600160a01b03811681036113965790565b519061ffff8216820361139657565b6001600160a01b039081165f90815260056020526040902060028101549290918316156127315760ff8360a01c168015612de8575b612ddf57612dd4612dce612dba61271093612db4612ddc965491611a216001600160801b0384169360801c91612dae838661287a565b9261288d565b906127d6565b9461ffff808260c01c169160b01c1661288d565b8461287a565b0480926127d6565b91565b5050505f905f90565b508015612d78565b908060209392818452848401375f828201840152601f01601f1916010190565b908015612e2e57612e266001915f19840161289a565b019015150290565b634e487b715f5260126020526024601cfd5b5f546001600160a01b03163303612e5357565b63118cdaa760e01b5f523360045260245ffd5b60025f51602061509b5f395f51905f525414612e8f5760025f51602061509b5f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b5f80809381935af13d15612ef3573d6001600160401b038111612a1c5760405190612ed3601f8201601f191660200183612a4b565b81525f60203d92013e5b15612ee457565b630db2c7f160e31b5f5260045ffd5b612edd565b9190801561314e576001600160a01b038381165f8181526005602052604090206002810180549692959093919290918716156127315760ff8760a01c1661315d578254906001600160801b0382169160801c94612f6b612f65612f5b888661287a565b611a218a8a61288d565b846127d6565b98891561314e57612f95612f8f8261ffff806127109560c01c169160b01c1661288d565b8b61287a565b0495612fa1878b6127d6565b94851061313f5761ffff8792612ffc6001600160801b03612fdd8c8f968380612fcd8a61306d9e6127d6565b16168d8519905416178d5561288d565b8a546001600160801b0316911660801b6001600160801b031916178955565b6130628a6001600160801b0361301b8160018d01931682845416612c0b565b166001600160801b03198254161781556130426001600160801b038616825460801c612beb565b81546001600160801b031660809190911b6001600160801b031916179055565b5460c01c169261320e565b6040516323b872dd60e01b5f5233600452306024528460445260205f606481808a5af19060015f511482161561311e575b6040525f6060521561310b576130b49033612e9e565b5491604051945f86526020860152604085015260608401526001600160801b038116608084015260801c60a08301527fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c60c03393a3565b84635274afe760e01b5f5260045260245ffd5b90600181151661313657863b15153d1516169061309e565b503d5f823e3d90fd5b638199f5f360e01b5f5260045ffd5b631f2a200560e01b5f5260045ffd5b63210b9e2d60e01b5f5260045ffd5b6001600160a01b039081165f818152600660205260409020549091169081156127315781331415806131f9575b61255b57805f52600760205260405f205480156131f45760207faa4ecfd5324d73e3b54d038b3ae8ac8f88866d49dc334dc1f02fe36e0f93574891835f52600782525f60408120556131eb8186612e9e565b604051908152a3565b505050565b506003546001600160a01b0316331415613199565b909161271061322361325a956132529561287a565b049181831161325f575b60018060a01b03165f52600760205260405f2061324b83825461288d565b90556127d6565b60085461288d565b600855565b9150809161322d565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156132c8575b604052156132a85750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661313657823b15153d1516169061329d565b6001600160a01b038082165f8181526005602052604090206002810180549296919592949093919290918516156127315760ff8560a01c1661315d578554906133358260801c6001600160801b03841661287a565b958761334f61ffff8360c01c1661ffff8460b01c1661288d565b9561271061335d888661287a565b049261336984866127d6565b996133926133896133838d6001600160801b038b1661288d565b83612e10565b8860801c6127d6565b986001600160801b0360015f96015416808b101561351f575b50505050861561314e57861061313f5761347d8a9561346c61344e8c60016001600160801b038e60ff9f6134358f807fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c9f86612fdd819694838380613416819982613429991661288d565b16168d8519905416178d5560801c6127d6565b16828688015416612beb565b168219848601541617838501551691015460801c612c0b565b60018d01906001600160801b0382549181199060801b169116179055565b838561ffff8b5460c01c169261320e565b613488863387613268565b8061350f575b5087546040805160018152602081019490945283019590955260608201526001600160801b0384166080808301919091529390931c60a0840152339260c090a35460a01c166134db575050565b602060017f3a11b9c0ca38b86101cb9e6e1dd2f752c31467c6eaa353f931b801a338406de692015460801c604051908152a2565b6135199033612e9e565b5f61348e565b613548939c5080929a50611a279194965099611a216001600160801b038a16938a60801c6127d6565b61271081029080820461271014901517156127e357816127100361271081116127e35761357491612e10565b8481106135b0575b5061358a612710918561287a565b049161359683856127d6565b60ff60a01b19909916600160a01b1788555f8080806133ab565b91509261358a6135c383612710936127d6565b9294915061357c565b5f19600160c01b8209918160c01b91828085109403938085039414613665578382111561364d578190600160c01b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090613671925061289a565b90565b5f19670de0b6b3a7640000820991670de0b6b3a7640000820291828085109403938085039414613665578382111561364d57670de0b6b3a7640000829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b600181111561367157806001600160801b821015613814575b600482600160401b6137c6941015613807575b6401000000008110156137fa575b620100008110156137ed575b6101008110156137e1575b60108110156137d5575b10156137cd575b60030260011c613775818461289a565b0160011c613783818461289a565b0160011c613791818461289a565b0160011c61379f818461289a565b0160011c6137ad818461289a565b0160011c6137bb818461289a565b0160011c809261289a565b8111900390565b60011b613765565b811c9160021b9161375e565b60081c91811b91613754565b60101c9160081b91613749565b60201c9160101b9161373d565b60401c9160201b9161372f565b5050608081901c600160401b61371c565b906138315f82846138cc565b1561383a575050565b6138448183613919565b1561385c575f613854918361397d565b156132a85750565b50635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b919061388a8282856138cc565b1561389457505050565b61389e8184613919565b156138ae5790613854918361397d565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f5114841615613908575b50604052565b3d15903b151516909216915f613902565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f511484161561395b5750604052565b60018492941516613974573b15153d151616915f613902565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f511484161561395b575060405256fe6101608060405234610620576116e2803803809161001d8285610624565b833981016080828203126106205781516001600160401b0381116106205781610047918401610647565b60208301516001600160401b0381116106205782610066918501610647565b60408401519092906001600160401b0381116106205760609161008a918601610647565b9301516001600160a01b0381169190829003610620576040928351916100b08584610624565b60018352603160f81b6020840190815281519092906001600160401b03811161044757600354600181811c91168015610616575b602082101461042957601f81116105b3575b50806020601f821160011461054f575f91610544575b508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104475760045490600182811c9216801561053a575b60208310146104295781601f8493116104cc575b50602090601f8311600114610466575f9261045b575b50508160011b915f199060031b1c1916176004555b61018b8161069c565b6101205261019883610823565b6101405260208151910120918260e05251902080610100524660a05283519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528583015260608201524660808201523060a082015260a0815261020360c082610624565b5190206080523060c05282516001600160401b03811161044757600854600181811c9116801561043d575b602082101461042957601f81116103c6575b506020601f821160011461036357819293945f92610358575b50508160011b915f199060031b1c1916176008555b8015610345576002546b033b2e3c9fd0803ce8000000810180911161033157600255805f525f602052815f206b033b2e3c9fd0803ce800000081540190555f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602084516b033b2e3c9fd0803ce80000008152a351610d86908161095c823960805181610954015260a05181610a11015260c0518161091e015260e051816109a3015261010051816109c9015261012051816103a8015261014051816103d10152f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610259565b601f1982169060085f52805f20915f5b8181106103ae57509583600195969710610396575b505050811b0160085561026e565b01515f1960f88460031b161c191690555f8080610388565b9192602060018192868b015181550194019201610373565b60085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3601f830160051c8101916020841061041f575b601f0160051c01905b8181106104145750610240565b5f8155600101610407565b90915081906103fe565b634e487b7160e01b5f52602260045260245ffd5b90607f169061022e565b634e487b7160e01b5f52604160045260245ffd5b015190505f8061016d565b60045f9081528281209350601f198516905b8181106104b4575090846001959493921061049c575b505050811b01600455610182565b01515f1960f88460031b161c191690555f808061048e565b92936020600181928786015181550195019301610478565b60045f529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c81019160208510610530575b90601f859493920160051c01905b8181106105225750610157565b5f8155849350600101610515565b9091508190610507565b91607f1691610143565b90508301515f61010c565b60035f9081528181209250601f198416905b81811061059b57509083600194939210610583575b5050811b01600355610120565b8501515f1960f88460031b161c191690555f80610576565b9192602060018192868a015181550194019201610561565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c8101916020841061060c575b601f0160051c01905b81811061060157506100f6565b5f81556001016105f4565b90915081906105eb565b90607f16906100e4565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761044757604052565b81601f82011215610620578051906001600160401b038211610447576040519261067b601f8401601f191660200185610624565b8284526020838301011161062057815f9260208093018386015e8301015290565b908151602081105f14610716575090601f8151116106d65760208151910151602082106106c7571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b6001600160401b03811161044757600554600181811c91168015610819575b602082101461042957601f81116107e6575b50602092601f821160011461078557928192935f9261077a575b50508160011b915f199060031b1c19161760055560ff90565b015190505f80610761565b601f1982169360055f52805f20915f5b8681106107ce57508360019596106107b6575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f80806107a8565b91926020600181928685015181550194019201610795565b60055f52601f60205f20910160051c810190601f830160051c015b81811061080e5750610747565b5f8155600101610801565b90607f1690610735565b908151602081105f1461084e575090601f8151116106d65760208151910151602082106106c7571790565b6001600160401b03811161044757600654600181811c91168015610951575b602082101461042957601f811161091e575b50602092601f82116001146108bd57928192935f926108b2575b50508160011b915f199060031b1c19161760065560ff90565b015190505f80610899565b601f1982169360065f52805f20915f5b86811061090657508360019596106108ee575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f80806108e0565b919260206001819286850151815501940192016108cd565b60065f52601f60205f20910160051c810190601f830160051c015b818110610946575061087f565b5f8155600101610939565b90607f169061086d56fe60806040526004361015610011575f80fd5b5f3560e01c806303ee438c146106fb57806306fdde0314610656578063095ea7b31461063057806318160ddd1461061357806323b872dd14610534578063313ce567146105195780633644e515146104f757806370a08231146104c05780637ecebe001461048857806384b0196e14610390578063902d55a51461036a57806395d89b4114610288578063a9059cbb14610257578063d505accf146101125763dd62ed3e146100be575f80fd5b3461010e57604036600319011261010e576100d7610832565b6100df610848565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b3461010e5760e036600319011261010e5761012b610832565b610133610848565b604435906064359260843560ff8116810361010e57844211610244576102076102109160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c081526101d560e0826107d8565b5190206101e061091b565b906040519161190160f01b83526002830152602282015260c43591604260a4359220610c4f565b90929192610cdc565b6001600160a01b031684810361022d575061022b9350610a37565b005b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b3461010e57604036600319011261010e5761027d610273610832565b602435903361085e565b602060405160018152f35b3461010e575f36600319011261010e576040515f6004546102a8816107a0565b808452906001811690811561034657506001146102e8575b6102e4836102d0818503826107d8565b60405191829160208352602083019061080e565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061032c575090915081016020016102d06102c0565b919260018160209254838588010152019101909291610314565b60ff191660208086019190915291151560051b840190910191506102d090506102c0565b3461010e575f36600319011261010e5760206040516b033b2e3c9fd0803ce80000008152f35b3461010e575f36600319011261010e5761042c6103cc7f0000000000000000000000000000000000000000000000000000000000000000610a9a565b6103f57f0000000000000000000000000000000000000000000000000000000000000000610b97565b602061043a6040519261040883856107d8565b5f84525f368137604051958695600f60f81b875260e08588015260e087019061080e565b90858203604087015261080e565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b82811061047157505050500390f35b835185528695509381019392810192600101610462565b3461010e57602036600319011261010e576001600160a01b036104a9610832565b165f526007602052602060405f2054604051908152f35b3461010e57602036600319011261010e576001600160a01b036104e1610832565b165f525f602052602060405f2054604051908152f35b3461010e575f36600319011261010e57602061051161091b565b604051908152f35b3461010e575f36600319011261010e57602060405160128152f35b3461010e57606036600319011261010e5761054d610832565b610555610848565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610593575b5061027d935061085e565b8381106105f85784156105e55733156105d25761027d945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610588565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461010e575f36600319011261010e576020600254604051908152f35b3461010e57604036600319011261010e5761027d61064c610832565b6024359033610a37565b3461010e575f36600319011261010e576040515f600354610676816107a0565b8084529060018116908115610346575060011461069d576102e4836102d0818503826107d8565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b8082106106e1575090915081016020016102d06102c0565b9192600181602092548385880101520191019092916106c9565b3461010e575f36600319011261010e576040515f60085461071b816107a0565b80845290600181169081156103465750600114610742576102e4836102d0818503826107d8565b60085f9081527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3939250905b808210610786575090915081016020016102d06102c0565b91926001816020925483858801015201910190929161076e565b90600182811c921680156107ce575b60208310146107ba57565b634e487b7160e01b5f52602260045260245ffd5b91607f16916107af565b90601f8019910116810190811067ffffffffffffffff8211176107fa57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361010e57565b602435906001600160a01b038216820361010e57565b6001600160a01b0316908115610908576001600160a01b03169182156108f557815f525f60205260405f20548181106108dc57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480610a0e575b15610976577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152610a0860c0826107d8565b51902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461094d565b6001600160a01b03169081156105e5576001600160a01b03169182156105d25760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff8114610ae05760ff811690601f8211610ad15760405191610abe6040846107d8565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b50604051600554815f610af2836107a0565b8083529260018116908115610b785750600114610b19575b610b16925003826107d8565b90565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b818310610b5c575050906020610b1692820101610b0a565b6020919350806001915483858801015201910190918392610b44565b60209250610b1694915060ff191682840152151560051b820101610b0a565b60ff8114610bbb5760ff811690601f8211610ad15760405191610abe6040846107d8565b50604051600654815f610bcd836107a0565b8083529260018116908115610b785750600114610bf057610b16925003826107d8565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818310610c33575050906020610b1692820101610b0a565b6020919350806001915483858801015201910190918392610c1b565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610cd1579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610cc6575f516001600160a01b03811615610cbc57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b6004811015610d3c5780610cee575050565b60018103610d055763f645eedf60e01b5f5260045ffd5b60028103610d20575063fce698f760e01b5f5260045260245ffd5b600314610d2a5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220327d387b49db240a165de6d94a37293c73aa6ece3b54379e63c9b7389c60ffb964736f6c634300081e00339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a264697066735822122043139cef5020e7282ac8a00106c057732b82cb54fdbf69cedcb986c23ade706f64736f6c634300081e0033000000000000000000000000c1fc76f7e0e5ec624a406cc47855f24f1b668e6d000000000000000000000000c1fc76f7e0e5ec624a406cc47855f24f1b668e6d00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d30000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7300000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000ab4d6d7da6ec1ce1177c2f3688fdaa489f14274f
0x608080604052600436101561005b575b50361561001a575f80fd5b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316330361004c57005b632f95b04960e21b5f5260045ffd5b5f905f3560e01c90816303fd2a4514612740575080630a20ab9f146126dd5780630d7a94f6146126a3578063171060ec1461261e5780631dc6d33f146125f65780631e5eb1d0146125a3578063239f3af714612586578063249d39e91461256a578063270401cb146124b25780632cc3dc6e146123f55780633ab68b96146123bd5780633ca38fca146121715780633fc8cef31461212d578063431a9caa1461211157806347377d92146120f3578063494cfc6c146120875780634a7d0369146120545780634ac638f31461202e5780634c33aa2e14611f5e5780634cf4bdb214611f375780635460476514611daf578063552e6f7614611d915780635cfb1d0e14611d3d57806361d027b314611d14578063634282af14611cd05780636452ce201461196e578063715018a61461190957806372900339146118a1578063791b98bc1461185c57806379ba5097146117d757806387cb5f94146117b45780638da5cb5b1461178d578063902d55a51461176657806392cdbac51461171b5780639f181b5e146116fd5780639fb7a31f146116d5578063a59ac6dd1461168a578063cbf6fff914611663578063ce5494bb14610b84578063d6ae6e4414610b46578063d7b96d4e14610b1d578063d98b2f5c14610ae9578063dd1b9c4a14610acc578063dfcee7d214610a8b578063e30c397814610a62578063e9833c2f146109ed578063efbe8fd114610581578063f0c394661461049d578063f0f4426014610424578063f2fde38b146103b7578063fa461e33146102dc5763fd17fd280361000f57346102d957806003193601126102d95760206040517f00000000000000000000000000000000000000000000000016345785d8a000008152f35b80fd5b50346102d95760603660031901126102d9576004356024356044356001600160401b03811161039b5761031390369060040161284d565b60018060a01b0360045416803314908115916103ae575b5061039f57816040918101031261039b57610350602061034983612770565b9201612770565b92848113610380575b5050828113610366578280f35b61037a9133906001600160a01b0316613268565b5f808280f35b6103949133906001600160a01b0316613268565b5f80610359565b8380fd5b636f61f64160e01b8552600485fd5b9050155f61032a565b50346102d95760203660031901126102d9576103d161275a565b6103d9612e40565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b50346102d95760203660031901126102d95761043e61275a565b610446612e40565b6001600160a01b0316801561048e57600a80546001600160a01b031916821790557f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f8280a280f35b63d92e233d60e01b8252600482fd5b50346102d95760203660031901126102d9576001600160a01b036104bf61275a565b16815260056020526040812060028101546001600160a01b0316156105725760016001600160801b039101541690816b029009752660ad62af80000003916b029009752660ad62af800000831161055e57612710830292830461271014906b029009752660ad62af80000014171561054a576020826b029009752660ad62af80000060405191048152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b638698bf3760e01b8252600482fd5b5060803660031901126102d9576004356001600160401b0381116109e9576105ad90369060040161284d565b6024929192356001600160401b0381116109e5576105cf90369060040161284d565b9190936044356001600160401b0381116109e1576105f190369060040161284d565b95906105fb612e66565b600b546001600160a01b0316156109d2576040519661061988612a30565b6002549261ffff84168952602089019661ffff8560101c1688526001600160601b0360408b019561ffff8160201c16875260301c1699606081019a808c5234106109c3576106736001600160601b038c511660085461288d565b6008556040516116e2808201908282106001600160401b038311176109af57906106d16106c26106b38c8e87966139b98839608086526080860191612df0565b83810360208501528789612df0565b8281036040840152888a612df0565b9060603091015203908bf080156109a457600160a01b6001900316998a825161ffff168b5161ffff1690895161ffff16906040519361070f85612a00565b6001600160801b037f00000000000000000000000000000000000000000000000016345785d8a00000811686526b037790968dc8efffd100000060208088019182526b029009752660ad62af8000006040808a0191825260608a018b8152336080808d0191825260a08d018e815260c08e018f815260e08f019b8c526101008f019d8e526101208f019c8d52998f526005909652928d209b51955190921b6001600160801b0319169490951693909317895591979092909151905160801b6001600160801b0319166001600160801b0390911617600182015595516002969096018054915192519351955194516001600160e01b03199092166001600160a01b03979097169690961791151560a01b60ff60a01b169190911791151560a81b60ff60a81b169190911760b09390931b61ffff60b01b169290921760c09190911b61ffff60c01b161760d09190911b61ffff60d01b161790558a815260066020526040812080546001600160a01b0319163317905560095490600160401b82101561099057508a957f2807e927148c24956ef8a3bb6f3ccd7c2502584afa23ba9959cab0762f782f87956109306001600160601b039b9660209f9b9661092261095c9f9c9761ffff8080928f6108ed8c600161093e9e016009556127f7565b819291549060031b91821b9160018060a01b03901b191617905551169e5116985116986040519a60c08c5260c08c0191612df0565b9189830360208b0152612df0565b918683036040880152612df0565b956060840152608083015260a08201528033940390a35116346127d6565b8061097c575b5060015f51602061509b5f395f51905f5255604051908152f35b61098a9060643590836132e0565b5f610962565b634e487b7160e01b81526041600452602490fd5b6040513d8c823e3d90fd5b634e487b7160e01b8d52604160045260248dfd5b630535b74760e41b8a5260048afd5b6333c001eb60e11b8652600486fd5b8480fd5b8280fd5b5080fd5b50346102d95760203660031901126102d9576001600160a01b03610a0f61275a565b16815260056020526040812060028101549091906001600160a01b031615610a53576020610a4b83546001600160801b038160801c9116613674565b604051908152f35b638698bf3760e01b8152600490fd5b50346102d957806003193601126102d9576001546040516001600160a01b039091168152602090f35b50346102d95760203660031901126102d9576020906001600160a01b03610ab061275a565b16815260068252604060018060a01b0391205416604051908152f35b50346102d957806003193601126102d95760206040516127108152f35b50346102d95760403660031901126102d9576040610b11610b0861275a565b60243590612d43565b82519182526020820152f35b50346102d957806003193601126102d957600b546040516001600160a01b039091168152602090f35b50346102d95760203660031901126102d957610b70610b6361275a565b610b6b612e66565b61316c565b60015f51602061509b5f395f51905f525580f35b50346102d95760203660031901126102d957610b9e61275a565b610ba6612e66565b6001600160a01b03818116808452600560205260408420600281018054929493919290918116156116545760ff8160a01c16156116455760ff8160a81c166116365760ff60a81b1916600160a81b17905560010180546001600160801b0381169091557f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03169260809190911c9190833b156109e157604051630d0e30db60e41b815285908181600481888a5af1801561110057611621575b50508381101561160e576aab24c7796fd2da388000009180948093945b946001600160a01b03610c9e610c9983896135cc565b613703565b169560018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d316976040519663c45a015560e01b88526020886004818d5afa978815611603578b986115e2575b50604051630b4c774160e11b81526001600160a01b03808416600483018190528382166024840181905261271060448501529a90948e939092909160209183916064918391165afa9081156115065783916115c3575b506001600160a01b031690816111b7575b50505050604051976309f56ab160e11b89528160048a01528760248a015261271060448a015260648901526020886084818d8d5af19788156109a4578a98611186575b5080861496871561117f57839280945b610db4858d8b61387d565b610dbf868d8961387d565b60018060a01b03600b5416916040519461016086018681106001600160401b0382111761116a57908f9392916040528652602086019485526040860191612710835260608701620d899f1981526080880190620d89a0825260a0890192835260c0890193845260e08901948686526101008a019687526101208a019788526101408a0198428a526040519a634418b22b60e11b8c52600160a01b6001900390511660048c0152600160a01b6001900390511660248b01525162ffffff1660448a01525160020b60648901525160020b60848801525160a48701525160c48601525160e485015251610104840152600160a01b60019003905116610124830152516101448201528980828b815a9361016492608095f195861561105b57819a8293839861110b575b5080610ef5610efb928b613825565b87613825565b600b546001600160a01b0316803b156109e557604051636d705ebb60e01b81526001600160a01b03929092166004830152602482018c905282908290604490829084905af18015611100576110e7575b50610f62971590506110dd579586949687926127d6565b80611068575b50610f72916127d6565b9081610fe8575b505060408051938452602084019190915284926001600160a01b03851692917f57aa04076c8e8e00f17b6f082eb7c65ec1aa90f07da036638ccfcb07dcae6cc891a460015f51602061509b5f395f51905f5255604080516001600160a01b039290921682526020820192909252f35b8088913b156109e95781906024604051809b8193632e1a7d4d60e01b83528760048401525af197881561105b57879897969761103a575b505061102d9060085461288d565b6008555f80959495610f79565b818093949596975061104b91612a4b565b6102d9579081879594939261101f565b50604051903d90823e3d90fd5b90506040519063a9059cbb60e01b8a5261dead60045260245260208960448180895af19060018a51148216156110bc575b604052156110a857845f610f68565b635274afe760e01b88526004849052602488fd5b9060018115166110d457853b15153d15161690611099565b503d89823e3d90fd5b95869185906127d6565b816110f191612a4b565b6110fc57895f610f4b565b8980fd5b6040513d84823e3d90fd5b9b5096509150506080893d608011611162575b8161112b60809383612a4b565b810103126110fc578989519160208b01516001600160801b038116036109e957610efb606060408d01519c0151939b939790610ee6565b3d915061111e565b50634e487b7160e01b8f52604160045260248ffd5b8284610da9565b6111a991985060203d6020116111b0575b6111a18183612a4b565b810190612d15565b965f610d99565b503d611197565b604051633850c7bd60e01b81529060e082600481865afa80156115b8578d928591611522575b506001600160a01b03169081151580611518575b6111fd575b5050610d56565b6024926020921195865f1461151157505b6040516370a0823160e01b815230600482015292839182906001600160a01b03165afa908115611506578c93916114d1575b5060011c80611253575b91818e936111f6565b90604094965080929395506001600160601b0360a01b60045416176004558c60c4855196602088018981528d888a015287895261129160608a612a4b565b875198899788968794630251596160e31b865230600487015260248601526044850152606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301925af180156113d4576114a2575b50600480546001600160a01b03191690558084036113df576040516370a0823160e01b8152306004820152602081602481885afa9081156113d45789916113a2575b506040516370a0823160e01b815230600482015290602082602481875afa9182156109a4578a9261136a575b50905b90915f88818061124a565b9091506020813d60201161139a575b8161138660209383612a4b565b810103126113965751905f61135c565b5f80fd5b3d9150611379565b90506020813d6020116113cc575b816113bd60209383612a4b565b8101031261139657515f611330565b3d91506113b0565b6040513d8b823e3d90fd5b6040516370a0823160e01b8152306004820152602081602481865afa9081156113d4578991611470575b506040516370a0823160e01b815230600482015290602082602481895afa9182156109a4578a9261143c575b509061135f565b9091506020813d602011611468575b8161145860209383612a4b565b810103126113965751905f611435565b3d915061144b565b90506020813d60201161149a575b8161148b60209383612a4b565b8101031261139657515f611409565b3d915061147e565b604090813d83116114ca575b6114b88183612a4b565b810103126114c6575f6112ee565b8780fd5b503d6114ae565b9250506020823d6020116114fe575b816114ed60209383612a4b565b81010312611396578a91515f611240565b3d91506114e0565b6040513d85823e3d90fd5b905061120e565b50828214156111f1565b92505060e0823d60e0116115b0575b8161153e60e09383612a4b565b8101031261039b578151916001600160a01b03831683036109e15760208101518060020b036109e15761157360408201612d34565b5061158060608201612d34565b5061158d60808201612d34565b5060a081015160ff8116036109e15760c001518015150361039b578c915f6111dd565b3d9150611531565b6040513d86823e3d90fd5b6115dc915060203d6020116111b0576111a18183612a4b565b5f610d45565b6115fc91985060203d6020116111b0576111a18183612a4b565b965f610cef565b6040513d8d823e3d90fd5b81846aab24c7796fd2da38800000610c83565b8161162b91612a4b565b6109e157845f610c66565b6332870f2f60e21b8652600486fd5b634b38323360e01b8652600486fd5b638698bf3760e01b8652600486fd5b50346102d957806003193601126102d95760206040516b029009752660ad62af8000008152f35b5061169436612823565b61169f929192612e66565b42116116c65734156116b75790610b709134906132e0565b631f2a200560e01b8352600483fd5b630407b05b60e31b8352600483fd5b50346102d95760403660031901126102d9576040610b116116f461275a565b60243590612c2b565b50346102d957806003193601126102d9576020600954604051908152f35b50346102d95760803660031901126102d95761173561275a565b61173d612e66565b606435421161175757610b70906044359060243590612ef8565b630407b05b60e31b8252600482fd5b50346102d957806003193601126102d95760206040516b033b2e3c9fd0803ce80000008152f35b50346102d957806003193601126102d957546040516001600160a01b039091168152602090f35b50346102d957806003193601126102d957602060405167016345785d8a00008152f35b50346102d957806003193601126102d957600154336001600160a01b039091160361184957600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b50346102d957806003193601126102d9576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b50346102d95760203660031901126102d9576118bb61275a565b6118c3612e40565b600380546001600160a01b0319166001600160a01b039290921691821790557f1e077cc4b4c8dce097ded0b9b4a3cc4fdcf8b4b79087c387ba3ac3dd5e9593528280a280f35b50346102d957806003193601126102d957611922612e40565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5061197836612823565b611980612e66565b42116116c65780156116b7576001600160a01b0382811684526005602052604084206002810154909291811615611cc15760ff8160a01c16611cb2576001600160801b03600184015416808311611ca35783546119e98160801c6001600160801b03831661287a565b92611a2c611a0561ffff8360c01c1661ffff8460b01c1661288d565b94611a276001600160801b03851691611a21898760801c6127d6565b90612e10565b6127d6565b6127108102908082046127101490151715611c8f578461271003906127108211611c7b5790611a5a91612e10565b93348511611c6c576001600160801b037fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c94611b0182611ae28a8a988d611b4f99612710611ab99f9e611b319b611ab09161287a565b049e8f8d6127d6565b978414611c51575b508480611ad08982861661288d565b1616851982541617905560801c6127d6565b8b546001600160801b0316911660801b6001600160801b031916178a55565b81611b148189168260018d015416612beb565b16821960018b0154161760018a015516600188015460801c612c0b565b60018701906001600160801b0382549181199060801b169116179055565b611b6661ffff600287015460c01c1685838961320e565b611b7a83336001600160a01b038916613268565b611b8481346127d6565b80611c41575b5084546040805160018152602081019390935282019390935260608101939093526001600160801b0382166080808501919091529190911c60a083015233916001600160a01b038516919060c090a360ff600282015460a01c16611bfe575b8260015f51602061509b5f395f51905f525580f35b602060017f3a11b9c0ca38b86101cb9e6e1dd2f752c31467c6eaa353f931b801a338406de692015460801c9260405193845260018060a01b031692a25f80611be9565b611c4b9033612e9e565b5f611b8a565b60ff60a01b1916600160a01b17600291909101558d5f611ac1565b638199f5f360e01b8952600489fd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b89526011600452602489fd5b638199f5f360e01b8652600486fd5b63210b9e2d60e01b8552600485fd5b638698bf3760e01b8552600485fd5b50346102d95760203660031901126102d957600435906009548210156102d9576020611cfb836127f7565b905460405160039290921b1c6001600160a01b03168152f35b50346102d957806003193601126102d957600a546040516001600160a01b039091168152602090f35b50346102d957611d4c36612784565b611d54612e66565b825b818110611d72578360015f51602061509b5f395f51905f525580f35b80611d8b610b6b611d866001948688612a83565b612a93565b01611d56565b50346102d957806003193601126102d9576020600854604051908152f35b50346102d95760803660031901126102d957611dc9612e40565b604051611dd581612a30565b60043561ffff81169081810361039b5782526024359161ffff8316908184036109e157602081019384526044359161ffff83168303611f335760408201928352606435936001600160601b0385168503611f2f576101f491611e3d916060850196875261288d565b11611f205761271061ffff83511611611f205767016345785d8a00006001600160601b0384511611611f20575160028054945192519351602085811b65ffff0000000016601086901b63ffff00001671ffffffffffffffffffffffffffffffffffff1990981661ffff9586169081179890981717603083901b71ffffffffffffffffffffffff000000000000161790925560408051968752938316918601919091529216908301526001600160601b031660608201527f6de2280d4c0e176b06b2b4456ea35741345e4b405dcffbc90d0abb6c7f0395d39080608081010390a180f35b63cd4e616760e01b8552600485fd5b8680fd5b8580fd5b50346102d957806003193601126102d95760206040516b037790968dc8efffd10000008152f35b50346113965760e036600319011261139657611f7861275a565b90602435916064356084359060ff821680920361139657611f97612e66565b80421161201f576001600160a01b03831691823b156113965760e45f9283604051958694859363d505accf60e01b85523360048601523060248601528b60448601526064850152608484015260a43560a484015260c43560c48401525af1612009575b50610b70919260443591612ef8565b610b7092505f61201891612a4b565b5f91611ffa565b630407b05b60e31b5f5260045ffd5b34611396575f3660031901126113965760206aab24c7796fd2da38800000604051908152f35b34611396575f3660031901126113965761206c612e66565b612074612b71565b60015f51602061509b5f395f51905f5255005b34611396576040366003190112611396576120a6602435600435612abb565b6040518091602082016020835281518091526020604084019201905f5b8181106120d1575050500390f35b82516001600160a01b03168452859450602093840193909201916001016120c3565b34611396575f366003190112611396576020604051620d899f198152f35b34611396575f3660031901126113965760206040516101f48152f35b34611396575f366003190112611396576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b346113965761217f36612784565b61218881612a6c565b916121966040519384612a4b565b818352601f196121a583612a6c565b015f5b8181106123685750505f5b82811061229857836040518091602082016020835281518091526020604084019201905f5b8181106121e6575050500390f35b91935091602061014060019261ffff61012088516001600160801b0381511684526001600160801b038682015116868501526001600160801b0360408201511660408501526001600160801b036060820151166060850152868060a01b03608082015116608085015260a0810151151560a085015260c0810151151560c08501528260e08201511660e085015282610100820151166101008501520151166101208201520194019101918493926121d8565b6001906001600160a01b036122b1611d86838787612a83565b165f52600560205260405f2061ffff6002604051926122cf84612a00565b80546001600160801b038116855260801c6020850152858101546001600160801b038116604086015260801c60608501520154848060a01b038116608084015260ff8160a01c16151560a084015260ff8160a81c16151560c0840152818160b01c1660e0840152818160c01c1661010084015260d01c166101208201526123568287612aa7565b526123618186612aa7565b50016121b3565b60209060405161237781612a00565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c08201525f60e08201525f6101008201525f610120820152828288010152016121a8565b34611396576020366003190112611396576001600160a01b036123de61275a565b165f526007602052602060405f2054604051908152f35b34611396576020366003190112611396576001600160a01b0361241661275a565b165f52600560205261014060405f2061ffff8154916002600182015491015490604051936001600160801b038116855260801c60208501526001600160801b038116604085015260801c606084015260018060a01b038116608084015260ff8160a01c16151560a084015260ff8160a81c16151560c0840152818160b01c1660e0840152818160c01c1661010084015260d01c16610120820152f35b34611396576040366003190112611396576124cb61275a565b6024356001600160a01b0381169190829003611396576001600160a01b039081165f81815260066020526040902054909116330361255b57811561254c575f81815260066020526040812080546001600160a01b031916841790557f15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa708401527219080a3005b63d92e233d60e01b5f5260045ffd5b631d713add60e21b5f5260045ffd5b34611396575f3660031901126113965760206040516127108152f35b34611396575f366003190112611396576020604051620d89a08152f35b34611396575f366003190112611396576002546040805161ffff8084168252601084901c811660208084019190915284901c169181019190915260309190911c6001600160601b03166060820152608090f35b34611396575f366003190112611396576003546040516001600160a01b039091168152602090f35b346113965760203660031901126113965761263761275a565b61263f612e40565b6001600160a01b0316801561254c57600b546001600160a01b038116612694576001600160a01b0319168117600b557fef7ce00901486d0ae4bbe00a818eb6bb2f42bc78fc75571cf294c1c50c61adfd5f80a2005b631aa5264b60e01b5f5260045ffd5b346113965760403660031901126113965760606126ca6126c161275a565b602435906128b8565b9060405192835260208301526040820152f35b34611396576020366003190112611396576001600160a01b036126fe61275a565b165f908152600560205260409020600201546001600160a01b038116156127315760209061ffff6040519160d01c168152f35b638698bf3760e01b5f5260045ffd5b34611396575f366003190112611396578061dead60209252f35b600435906001600160a01b038216820361139657565b35906001600160a01b038216820361139657565b906020600319830112611396576004356001600160401b0381116113965782602382011215611396578060040135926001600160401b0384116113965760248460051b83010111611396576024019190565b919082039182116127e357565b634e487b7160e01b5f52601160045260245ffd5b60095481101561280f5760095f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6060906003190112611396576004356001600160a01b038116810361139657906024359060443590565b9181601f84011215611396578235916001600160401b038311611396576020838186019501011161139657565b818102929181159184041417156127e357565b919082018092116127e357565b81156128a4570490565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b039081165f90815260056020526040902060028101549390918416156127315760ff8460a01c1680156129f8575b6129ed578154926001600160801b0384169360801c90612924612910838761287a565b9661ffff808260c01c169160b01c1661288d565b90612710612932838361287a565b049561295961295361294d6129478a866127d6565b8461288d565b8a612e10565b856127d6565b976001600160801b0360018498015416808a101561297a575b505050505050565b611a2792939599506129949496985080611a21919a6127d6565b61271081029080820461271014901517156127e357826127100361271081116127e3576129c091612e10565b9081106129e3575b506129d6612710918361287a565b04915f8080808080612972565b91506129d66129c8565b5f9350839250829150565b5082156128ed565b61014081019081106001600160401b03821117612a1c57604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117612a1c57604052565b90601f801991011681019081106001600160401b03821117612a1c57604052565b6001600160401b038111612a1c5760051b60200190565b919081101561280f5760051b0190565b356001600160a01b03811681036113965790565b805182101561280f5760209160051b010190565b919060095480841015612b555783612ad2916127d6565b90808211612b4d575b50612ae581612a6c565b612af26040519182612a4b565b818152601f19612b0183612a6c565b0136602083013780935f5b838110612b195750505050565b80612b2e612b296001938561288d565b6127f7565b838060a01b0391549060031b1c16612b468286612aa7565b5201612b0c565b90505f612adb565b50509050604051612b67602082612a4b565b5f81525f36813790565b600a546001600160a01b031633819003612bdc57600854908115612bd85781612b9d915f600855612e9e565b600a546040519182526001600160a01b0316907f0f58cb6262d88971b87878468debb7bc81f1714be597710e16a9fb84c66ff7b590602090a2565b5050565b63b90cdbb160e01b5f5260045ffd5b906001600160801b03809116911603906001600160801b0382116127e357565b906001600160801b03809116911601906001600160801b0382116127e357565b6001600160a01b039081165f9081526005602052604090206002810154909392918116156127315760ff8160a01c168015612d0d575b8015612cf7575b612ced5790611a27612c8a8361ffff80612caf9660c01c169160b01c1661288d565b945491611a216001600160801b0384169360801c91612ca9838661287a565b926127d6565b61271081029080820461271014901517156127e357826127100361271081116127e357612ce2612ce99161271093612e10565b938461287a565b0490565b505090505f905f90565b506001600160801b036001850154168211612c68565b508115612c61565b9081602091031261139657516001600160a01b03811681036113965790565b519061ffff8216820361139657565b6001600160a01b039081165f90815260056020526040902060028101549290918316156127315760ff8360a01c168015612de8575b612ddf57612dd4612dce612dba61271093612db4612ddc965491611a216001600160801b0384169360801c91612dae838661287a565b9261288d565b906127d6565b9461ffff808260c01c169160b01c1661288d565b8461287a565b0480926127d6565b91565b5050505f905f90565b508015612d78565b908060209392818452848401375f828201840152601f01601f1916010190565b908015612e2e57612e266001915f19840161289a565b019015150290565b634e487b715f5260126020526024601cfd5b5f546001600160a01b03163303612e5357565b63118cdaa760e01b5f523360045260245ffd5b60025f51602061509b5f395f51905f525414612e8f5760025f51602061509b5f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b5f80809381935af13d15612ef3573d6001600160401b038111612a1c5760405190612ed3601f8201601f191660200183612a4b565b81525f60203d92013e5b15612ee457565b630db2c7f160e31b5f5260045ffd5b612edd565b9190801561314e576001600160a01b038381165f8181526005602052604090206002810180549692959093919290918716156127315760ff8760a01c1661315d578254906001600160801b0382169160801c94612f6b612f65612f5b888661287a565b611a218a8a61288d565b846127d6565b98891561314e57612f95612f8f8261ffff806127109560c01c169160b01c1661288d565b8b61287a565b0495612fa1878b6127d6565b94851061313f5761ffff8792612ffc6001600160801b03612fdd8c8f968380612fcd8a61306d9e6127d6565b16168d8519905416178d5561288d565b8a546001600160801b0316911660801b6001600160801b031916178955565b6130628a6001600160801b0361301b8160018d01931682845416612c0b565b166001600160801b03198254161781556130426001600160801b038616825460801c612beb565b81546001600160801b031660809190911b6001600160801b031916179055565b5460c01c169261320e565b6040516323b872dd60e01b5f5233600452306024528460445260205f606481808a5af19060015f511482161561311e575b6040525f6060521561310b576130b49033612e9e565b5491604051945f86526020860152604085015260608401526001600160801b038116608084015260801c60a08301527fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c60c03393a3565b84635274afe760e01b5f5260045260245ffd5b90600181151661313657863b15153d1516169061309e565b503d5f823e3d90fd5b638199f5f360e01b5f5260045ffd5b631f2a200560e01b5f5260045ffd5b63210b9e2d60e01b5f5260045ffd5b6001600160a01b039081165f818152600660205260409020549091169081156127315781331415806131f9575b61255b57805f52600760205260405f205480156131f45760207faa4ecfd5324d73e3b54d038b3ae8ac8f88866d49dc334dc1f02fe36e0f93574891835f52600782525f60408120556131eb8186612e9e565b604051908152a3565b505050565b506003546001600160a01b0316331415613199565b909161271061322361325a956132529561287a565b049181831161325f575b60018060a01b03165f52600760205260405f2061324b83825461288d565b90556127d6565b60085461288d565b600855565b9150809161322d565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156132c8575b604052156132a85750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661313657823b15153d1516169061329d565b6001600160a01b038082165f8181526005602052604090206002810180549296919592949093919290918516156127315760ff8560a01c1661315d578554906133358260801c6001600160801b03841661287a565b958761334f61ffff8360c01c1661ffff8460b01c1661288d565b9561271061335d888661287a565b049261336984866127d6565b996133926133896133838d6001600160801b038b1661288d565b83612e10565b8860801c6127d6565b986001600160801b0360015f96015416808b101561351f575b50505050861561314e57861061313f5761347d8a9561346c61344e8c60016001600160801b038e60ff9f6134358f807fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c9f86612fdd819694838380613416819982613429991661288d565b16168d8519905416178d5560801c6127d6565b16828688015416612beb565b168219848601541617838501551691015460801c612c0b565b60018d01906001600160801b0382549181199060801b169116179055565b838561ffff8b5460c01c169261320e565b613488863387613268565b8061350f575b5087546040805160018152602081019490945283019590955260608201526001600160801b0384166080808301919091529390931c60a0840152339260c090a35460a01c166134db575050565b602060017f3a11b9c0ca38b86101cb9e6e1dd2f752c31467c6eaa353f931b801a338406de692015460801c604051908152a2565b6135199033612e9e565b5f61348e565b613548939c5080929a50611a279194965099611a216001600160801b038a16938a60801c6127d6565b61271081029080820461271014901517156127e357816127100361271081116127e35761357491612e10565b8481106135b0575b5061358a612710918561287a565b049161359683856127d6565b60ff60a01b19909916600160a01b1788555f8080806133ab565b91509261358a6135c383612710936127d6565b9294915061357c565b5f19600160c01b8209918160c01b91828085109403938085039414613665578382111561364d578190600160c01b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090613671925061289a565b90565b5f19670de0b6b3a7640000820991670de0b6b3a7640000820291828085109403938085039414613665578382111561364d57670de0b6b3a7640000829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b600181111561367157806001600160801b821015613814575b600482600160401b6137c6941015613807575b6401000000008110156137fa575b620100008110156137ed575b6101008110156137e1575b60108110156137d5575b10156137cd575b60030260011c613775818461289a565b0160011c613783818461289a565b0160011c613791818461289a565b0160011c61379f818461289a565b0160011c6137ad818461289a565b0160011c6137bb818461289a565b0160011c809261289a565b8111900390565b60011b613765565b811c9160021b9161375e565b60081c91811b91613754565b60101c9160081b91613749565b60201c9160101b9161373d565b60401c9160201b9161372f565b5050608081901c600160401b61371c565b906138315f82846138cc565b1561383a575050565b6138448183613919565b1561385c575f613854918361397d565b156132a85750565b50635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b919061388a8282856138cc565b1561389457505050565b61389e8184613919565b156138ae5790613854918361397d565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f5114841615613908575b50604052565b3d15903b151516909216915f613902565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f511484161561395b5750604052565b60018492941516613974573b15153d151616915f613902565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f511484161561395b575060405256fe6101608060405234610620576116e2803803809161001d8285610624565b833981016080828203126106205781516001600160401b0381116106205781610047918401610647565b60208301516001600160401b0381116106205782610066918501610647565b60408401519092906001600160401b0381116106205760609161008a918601610647565b9301516001600160a01b0381169190829003610620576040928351916100b08584610624565b60018352603160f81b6020840190815281519092906001600160401b03811161044757600354600181811c91168015610616575b602082101461042957601f81116105b3575b50806020601f821160011461054f575f91610544575b508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104475760045490600182811c9216801561053a575b60208310146104295781601f8493116104cc575b50602090601f8311600114610466575f9261045b575b50508160011b915f199060031b1c1916176004555b61018b8161069c565b6101205261019883610823565b6101405260208151910120918260e05251902080610100524660a05283519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84528583015260608201524660808201523060a082015260a0815261020360c082610624565b5190206080523060c05282516001600160401b03811161044757600854600181811c9116801561043d575b602082101461042957601f81116103c6575b506020601f821160011461036357819293945f92610358575b50508160011b915f199060031b1c1916176008555b8015610345576002546b033b2e3c9fd0803ce8000000810180911161033157600255805f525f602052815f206b033b2e3c9fd0803ce800000081540190555f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602084516b033b2e3c9fd0803ce80000008152a351610d86908161095c823960805181610954015260a05181610a11015260c0518161091e015260e051816109a3015261010051816109c9015261012051816103a8015261014051816103d10152f35b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610259565b601f1982169060085f52805f20915f5b8181106103ae57509583600195969710610396575b505050811b0160085561026e565b01515f1960f88460031b161c191690555f8080610388565b9192602060018192868b015181550194019201610373565b60085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3601f830160051c8101916020841061041f575b601f0160051c01905b8181106104145750610240565b5f8155600101610407565b90915081906103fe565b634e487b7160e01b5f52602260045260245ffd5b90607f169061022e565b634e487b7160e01b5f52604160045260245ffd5b015190505f8061016d565b60045f9081528281209350601f198516905b8181106104b4575090846001959493921061049c575b505050811b01600455610182565b01515f1960f88460031b161c191690555f808061048e565b92936020600181928786015181550195019301610478565b60045f529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c81019160208510610530575b90601f859493920160051c01905b8181106105225750610157565b5f8155849350600101610515565b9091508190610507565b91607f1691610143565b90508301515f61010c565b60035f9081528181209250601f198416905b81811061059b57509083600194939210610583575b5050811b01600355610120565b8501515f1960f88460031b161c191690555f80610576565b9192602060018192868a015181550194019201610561565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c8101916020841061060c575b601f0160051c01905b81811061060157506100f6565b5f81556001016105f4565b90915081906105eb565b90607f16906100e4565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761044757604052565b81601f82011215610620578051906001600160401b038211610447576040519261067b601f8401601f191660200185610624565b8284526020838301011161062057815f9260208093018386015e8301015290565b908151602081105f14610716575090601f8151116106d65760208151910151602082106106c7571790565b5f198260200360031b1b161790565b604460209160405192839163305a27a960e01b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fd5b6001600160401b03811161044757600554600181811c91168015610819575b602082101461042957601f81116107e6575b50602092601f821160011461078557928192935f9261077a575b50508160011b915f199060031b1c19161760055560ff90565b015190505f80610761565b601f1982169360055f52805f20915f5b8681106107ce57508360019596106107b6575b505050811b0160055560ff90565b01515f1960f88460031b161c191690555f80806107a8565b91926020600181928685015181550194019201610795565b60055f52601f60205f20910160051c810190601f830160051c015b81811061080e5750610747565b5f8155600101610801565b90607f1690610735565b908151602081105f1461084e575090601f8151116106d65760208151910151602082106106c7571790565b6001600160401b03811161044757600654600181811c91168015610951575b602082101461042957601f811161091e575b50602092601f82116001146108bd57928192935f926108b2575b50508160011b915f199060031b1c19161760065560ff90565b015190505f80610899565b601f1982169360065f52805f20915f5b86811061090657508360019596106108ee575b505050811b0160065560ff90565b01515f1960f88460031b161c191690555f80806108e0565b919260206001819286850151815501940192016108cd565b60065f52601f60205f20910160051c810190601f830160051c015b818110610946575061087f565b5f8155600101610939565b90607f169061086d56fe60806040526004361015610011575f80fd5b5f3560e01c806303ee438c146106fb57806306fdde0314610656578063095ea7b31461063057806318160ddd1461061357806323b872dd14610534578063313ce567146105195780633644e515146104f757806370a08231146104c05780637ecebe001461048857806384b0196e14610390578063902d55a51461036a57806395d89b4114610288578063a9059cbb14610257578063d505accf146101125763dd62ed3e146100be575f80fd5b3461010e57604036600319011261010e576100d7610832565b6100df610848565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b3461010e5760e036600319011261010e5761012b610832565b610133610848565b604435906064359260843560ff8116810361010e57844211610244576102076102109160018060a01b03841696875f52600760205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528a604084015260018060a01b038916606084015289608084015260a083015260c082015260c081526101d560e0826107d8565b5190206101e061091b565b906040519161190160f01b83526002830152602282015260c43591604260a4359220610c4f565b90929192610cdc565b6001600160a01b031684810361022d575061022b9350610a37565b005b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b3461010e57604036600319011261010e5761027d610273610832565b602435903361085e565b602060405160018152f35b3461010e575f36600319011261010e576040515f6004546102a8816107a0565b808452906001811690811561034657506001146102e8575b6102e4836102d0818503826107d8565b60405191829160208352602083019061080e565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b80821061032c575090915081016020016102d06102c0565b919260018160209254838588010152019101909291610314565b60ff191660208086019190915291151560051b840190910191506102d090506102c0565b3461010e575f36600319011261010e5760206040516b033b2e3c9fd0803ce80000008152f35b3461010e575f36600319011261010e5761042c6103cc7f0000000000000000000000000000000000000000000000000000000000000000610a9a565b6103f57f0000000000000000000000000000000000000000000000000000000000000000610b97565b602061043a6040519261040883856107d8565b5f84525f368137604051958695600f60f81b875260e08588015260e087019061080e565b90858203604087015261080e565b4660608501523060808501525f60a085015283810360c08501528180845192838152019301915f5b82811061047157505050500390f35b835185528695509381019392810192600101610462565b3461010e57602036600319011261010e576001600160a01b036104a9610832565b165f526007602052602060405f2054604051908152f35b3461010e57602036600319011261010e576001600160a01b036104e1610832565b165f525f602052602060405f2054604051908152f35b3461010e575f36600319011261010e57602061051161091b565b604051908152f35b3461010e575f36600319011261010e57602060405160128152f35b3461010e57606036600319011261010e5761054d610832565b610555610848565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610593575b5061027d935061085e565b8381106105f85784156105e55733156105d25761027d945f52600160205260405f2060018060a01b0333165f526020528360405f209103905584610588565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461010e575f36600319011261010e576020600254604051908152f35b3461010e57604036600319011261010e5761027d61064c610832565b6024359033610a37565b3461010e575f36600319011261010e576040515f600354610676816107a0565b8084529060018116908115610346575060011461069d576102e4836102d0818503826107d8565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b8082106106e1575090915081016020016102d06102c0565b9192600181602092548385880101520191019092916106c9565b3461010e575f36600319011261010e576040515f60085461071b816107a0565b80845290600181169081156103465750600114610742576102e4836102d0818503826107d8565b60085f9081527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3939250905b808210610786575090915081016020016102d06102c0565b91926001816020925483858801015201910190929161076e565b90600182811c921680156107ce575b60208310146107ba57565b634e487b7160e01b5f52602260045260245ffd5b91607f16916107af565b90601f8019910116810190811067ffffffffffffffff8211176107fa57604052565b634e487b7160e01b5f52604160045260245ffd5b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361010e57565b602435906001600160a01b038216820361010e57565b6001600160a01b0316908115610908576001600160a01b03169182156108f557815f525f60205260405f20548181106108dc57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161480610a0e575b15610976577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a08152610a0860c0826107d8565b51902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461094d565b6001600160a01b03169081156105e5576001600160a01b03169182156105d25760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60ff8114610ae05760ff811690601f8211610ad15760405191610abe6040846107d8565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b50604051600554815f610af2836107a0565b8083529260018116908115610b785750600114610b19575b610b16925003826107d8565b90565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b818310610b5c575050906020610b1692820101610b0a565b6020919350806001915483858801015201910190918392610b44565b60209250610b1694915060ff191682840152151560051b820101610b0a565b60ff8114610bbb5760ff811690601f8211610ad15760405191610abe6040846107d8565b50604051600654815f610bcd836107a0565b8083529260018116908115610b785750600114610bf057610b16925003826107d8565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818310610c33575050906020610b1692820101610b0a565b6020919350806001915483858801015201910190918392610c1b565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411610cd1579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15610cc6575f516001600160a01b03811615610cbc57905f905f90565b505f906001905f90565b6040513d5f823e3d90fd5b5050505f9160039190565b6004811015610d3c5780610cee575050565b60018103610d055763f645eedf60e01b5f5260045ffd5b60028103610d20575063fce698f760e01b5f5260045260245ffd5b600314610d2a5750565b6335e2f38360e21b5f5260045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220327d387b49db240a165de6d94a37293c73aa6ece3b54379e63c9b7389c60ffb964736f6c634300081e00339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a264697066735822122043139cef5020e7282ac8a00106c057732b82cb54fdbf69cedcb986c23ade706f64736f6c634300081e0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000106 | $0 | |
| OꓕƎꓥ (OꓕƎꓥ) | OꓕƎꓥ | 1,000,000,000 | — | — |
| VCat (VCAT) | VCAT | 1,000,000,000 | — | — |
| VetoCat (VCAT) | VCAT | 1,000,000,000 | — | — |
| Dummy (DUMMY) | DUMMY | 1,000,000,000 | — | — |
| FETO (FETO) | FETO | 993,401,639.853407 | — | — |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xd4b110…514f87 | 28 days agoSun, 19 Jul 2026 00:40:39 UTC | 0x0f58cb…f7b5 | [0] 0x000000000000…1b668e6d data: 0x000000000000000000…667cea00 |
| 0x7eb47d…7000b2 | 28 days agoSun, 19 Jul 2026 00:40:32 UTC | 0xaa4ecf…5748 | [0] 0x000000000000…c08b4897 [1] 0x000000000000…9ddfccef data: 0x000000000000000000…fd4b07ff |
| 0xc68f01…5d0726 | 29 days agoSat, 18 Jul 2026 00:57:05 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…bcf5c212 [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…d1000000 |
| 0xe32bbc…813644 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…bcf5c212 [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…4aa66d1e |
| 0xe32bbc…813644 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0x2807e9…2f87 | [0] 0x000000000000…bcf5c212 [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…00000000 |
| 0x4589be…898206 | 29 days agoFri, 17 Jul 2026 21:18:39 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…db94ed1d [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…d1000000 |
| 0x1b7e1a…6238ff | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…db94ed1d [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…de315317 |
| 0x1b7e1a…6238ff | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0x2807e9…2f87 | [0] 0x000000000000…db94ed1d [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…00000000 |
| 0xadc08e…08b97b | 29 days agoFri, 17 Jul 2026 20:41:51 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…c08b4897 [1] 0x000000000000…9ddfccef data: 0x000000000000000000…d1000000 |
| 0x141e87…7c430f | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…e8293a40 [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…4aa66d1e |
| 0x141e87…7c430f | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0x2807e9…2f87 | [0] 0x000000000000…e8293a40 [1] 0x000000000000…44f2acc8 data: 0x000000000000000000…00000000 |
| 0xd0dcf8…82576d | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…c08b4897 [1] 0x000000000000…9ddfccef data: 0x000000000000000000…4aa66d1e |
| 0xd0dcf8…82576d | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0x2807e9…2f87 | [0] 0x000000000000…c08b4897 [1] 0x000000000000…9ddfccef data: 0x000000000000000000…00000000 |
| 0x41a925…58b96a | 29 days agoFri, 17 Jul 2026 20:20:49 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…6ca9e1b5 [1] 0x000000000000…9051d9b4 data: 0x000000000000000000…d1000000 |
| 0x8d628c…299a90 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…6ca9e1b5 [1] 0x000000000000…9051d9b4 data: 0x000000000000000000…453e253c |
| 0x8d628c…299a90 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0x2807e9…2f87 | [0] 0x000000000000…6ca9e1b5 [1] 0x000000000000…9051d9b4 data: 0x000000000000000000…00000000 |
| 0x1aa9c1…6063c9 | 30 days agoFri, 17 Jul 2026 16:27:12 UTC | 0xef7ce0…adfd | [0] 0x000000000000…888433e1 |
| 0x40bf61…6b3084 | 30 days agoFri, 17 Jul 2026 16:27:12 UTC | 0x1e077c…9352 | [0] 0x000000000000…9f14274f |
| 0x40bf61…6b3084 | 30 days agoFri, 17 Jul 2026 16:27:12 UTC | 0x6de228…95d3 | data: 0x000000000000000000…a4c68000 |
| 0x40bf61…6b3084 | 30 days agoFri, 17 Jul 2026 16:27:12 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…1b668e6d |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd4b110…514f87 | claimProtocolFees | 13,418,069 | 28 days agoSun, 19 Jul 2026 00:40:39 UTC | 0xc1fc…8e6d | IN | VetoDotFun | $0.000 ETH | 0.00000224 | |
| 0x7eb47d…7000b2 | claimCreatorFees | 13,418,000 | 28 days agoSun, 19 Jul 2026 00:40:32 UTC | 0x4fe3…ccef | IN | VetoDotFun | $0.000 ETH | 0.00000234 | |
| 0xc68f01…5d0726 | sellWithPermit | 12,567,330 | 29 days agoSat, 18 Jul 2026 00:57:05 UTC | 0xa86c…acc8 | IN | VetoDotFun | $0.000 ETH | 0.00000819 | |
| 0xe32bbc…813644 | createToken | 12,469,550 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0xa86c…acc8 | IN | VetoDotFun | $20.720.011 ETH | 0.00008472 | |
| 0x4589be…898206 | sellWithPermit | 12,436,538 | 29 days agoFri, 17 Jul 2026 21:18:39 UTC | 0xa86c…acc8 | IN | VetoDotFun | $0.000 ETH | 0.00000784 | |
| 0x1b7e1a…6238ff | createToken | 12,429,125 | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0xa86c…acc8 | IN | VetoDotFun | $190.280.101 ETH | 0.00008462 | |
| 0xadc08e…08b97b | sellWithPermit | 12,414,503 | 29 days agoFri, 17 Jul 2026 20:41:51 UTC | 0x4fe3…ccef | IN | VetoDotFun | $0.000 ETH | 0.00000790 | |
| 0x141e87…7c430f | createToken | 12,412,384 | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0xa86c…acc8 | IN | VetoDotFun | $20.720.011 ETH | 0.00008395 | |
| 0xd0dcf8…82576d | createToken | 12,403,788 | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0x4fe3…ccef | IN | VetoDotFun | $20.720.011 ETH | 0.00008372 | |
| 0x41a925…58b96a | sellWithPermit | 12,401,921 | 29 days agoFri, 17 Jul 2026 20:20:49 UTC | 0x351e…d9b4 | IN | VetoDotFun | $0.000 ETH | 0.00000791 | |
| 0x8d628c…299a90 | createToken | 12,401,404 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0x351e…d9b4 | IN | VetoDotFun | $2.070.0011 ETH | 0.00008748 | |
| 0x1aa9c1…6063c9 | setLocker | 12,262,096 | 30 days agoFri, 17 Jul 2026 16:27:12 UTC | 0xc1fc…8e6d | IN | VetoDotFun | $0.000 ETH | 0.00000348 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 13,418,069 | 28 days agoSun, 19 Jul 2026 00:40:39 UTC | 0xd4b110…514f87 | CALL | claimProtocolFees | 0x40d8…e885 | OUT | 0xc1fc…8e6d | 0.00674 ETH |
| 13,418,000 | 28 days agoSun, 19 Jul 2026 00:40:32 UTC | 0x7eb47d…7000b2 | CALL | claimCreatorFees | 0x40d8…e885 | OUT | 0x4fe3…ccef | 0.00005 ETH |
| 12,567,330 | 29 days agoSat, 18 Jul 2026 00:57:05 UTC | 0xc68f01…5d0726 | CALL | sellWithPermit | 0x40d8…e885 | OUT | 0xa86c…acc8 | 0.00980 ETH |
| 12,469,550 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0xe32bbc…813644 | CREATE | createToken | 0x40d8…e885 | OUT | 0x7afb…c212 | 0 ETH |
| 12,436,538 | 29 days agoFri, 17 Jul 2026 21:18:39 UTC | 0x4589be…898206 | CALL | sellWithPermit | 0x40d8…e885 | OUT | 0xa86c…acc8 | 0.09801 ETH |
| 12,429,125 | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0x1b7e1a…6238ff | CREATE | createToken | 0x40d8…e885 | OUT | 0xc90d…ed1d | 0 ETH |
| 12,414,503 | 29 days agoFri, 17 Jul 2026 20:41:51 UTC | 0xadc08e…08b97b | CALL | sellWithPermit | 0x40d8…e885 | OUT | 0x4fe3…ccef | 0.00980 ETH |
| 12,412,384 | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0x141e87…7c430f | CREATE | createToken | 0x40d8…e885 | OUT | 0x5875…3a40 | 0 ETH |
| 12,403,788 | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0xd0dcf8…82576d | CREATE | createToken | 0x40d8…e885 | OUT | 0xa917…4897 | 0 ETH |
| 12,401,921 | 29 days agoFri, 17 Jul 2026 20:20:49 UTC | 0x41a925…58b96a | CALL | sellWithPermit | 0x40d8…e885 | OUT | 0x351e…d9b4 | 0.00009 ETH |
| 12,401,404 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0x8d628c…299a90 | CREATE | createToken | 0x40d8…e885 | OUT | 0x1cb7…e1b5 | 0 ETH |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x042ddc5a…b7b589 | Transfer | 20,587,798 | 20 days agoMon, 27 Jul 2026 08:27:01 UTC | 0xcaf7…5d11 | IN | 0x40d8…e885 | $0.001 DIH | ||
| 0xc68f019f…5d0726 | Transfer | 12,567,330 | 29 days agoSat, 18 Jul 2026 00:57:05 UTC | 0xa86c…acc8 | IN | 0x40d8…e885 | 6,598,360.146592 VCAT | VetoCat (VCAT) | |
| 0xe32bbcc9…813644 | Transfer | 12,469,550 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0x40d8…e885 | OUT | 0xa86c…acc8 | 6,598,360.146592 VCAT | VetoCat (VCAT) | |
| 0xe32bbcc9…813644 | Transfer | 12,469,550 | 29 days agoFri, 17 Jul 2026 22:13:48 UTC | 0x0000…0000 | IN | 0x40d8…e885 | 1,000,000,000.000000 VCAT | VetoCat (VCAT) | |
| 0x4589be07…898206 | Transfer | 12,436,538 | 29 days agoFri, 17 Jul 2026 21:18:39 UTC | 0xa86c…acc8 | IN | 0x40d8…e885 | 62,523,248.969982 VCAT | VCat (VCAT) | |
| 0x1b7e1ae9…6238ff | Transfer | 12,429,125 | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0x40d8…e885 | OUT | 0xa86c…acc8 | 62,523,248.969982 VCAT | VCat (VCAT) | |
| 0x1b7e1ae9…6238ff | Transfer | 12,429,125 | 29 days agoFri, 17 Jul 2026 21:06:15 UTC | 0x0000…0000 | IN | 0x40d8…e885 | 1,000,000,000.000000 VCAT | VCat (VCAT) | |
| 0xadc08e55…08b97b | Transfer | 12,414,503 | 29 days agoFri, 17 Jul 2026 20:41:51 UTC | 0x4fe3…ccef | IN | 0x40d8…e885 | 6,598,360.146592 DUMMY | Dummy (DUMMY) | |
| 0x141e8792…7c430f | Transfer | 12,412,384 | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0x40d8…e885 | OUT | 0xa86c…acc8 | 6,598,360.146592 FETO | FETO (FETO) | |
| 0x141e8792…7c430f | Transfer | 12,412,384 | 29 days agoFri, 17 Jul 2026 20:38:19 UTC | 0x0000…0000 | IN | 0x40d8…e885 | 1,000,000,000.000000 FETO | FETO (FETO) | |
| 0xd0dcf89e…82576d | Transfer | 12,403,788 | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0x40d8…e885 | OUT | 0x4fe3…ccef | 6,598,360.146592 DUMMY | Dummy (DUMMY) | |
| 0xd0dcf89e…82576d | Transfer | 12,403,788 | 29 days agoFri, 17 Jul 2026 20:23:57 UTC | 0x0000…0000 | IN | 0x40d8…e885 | 1,000,000,000.000000 DUMMY | Dummy (DUMMY) | |
| 0x41a9258f…58b96a | Transfer | 12,401,921 | 29 days agoFri, 17 Jul 2026 20:20:49 UTC | 0x351e…d9b4 | IN | 0x40d8…e885 | 66,387.767256 OꓕƎꓥ | OꓕƎꓥ (OꓕƎꓥ) | |
| 0x8d628c61…299a90 | Transfer | 12,401,404 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0x40d8…e885 | OUT | 0x351e…d9b4 | 66,387.767256 OꓕƎꓥ | OꓕƎꓥ (OꓕƎꓥ) | |
| 0x8d628c61…299a90 | Transfer | 12,401,404 | 29 days agoFri, 17 Jul 2026 20:19:58 UTC | 0x0000…0000 | IN | 0x40d8…e885 | 1,000,000,000.000000 OꓕƎꓥ | OꓕƎꓥ (OꓕƎꓥ) |