// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {Ownable2Step, Ownable} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {TickMath} from "v4-core/src/libraries/TickMath.sol";
import {
INonfungiblePositionManager,
ISwapRouter02,
IUniswapV3Factory,
IUniswapV3PoolState
} from "../interfaces/IUniswapV3.sol";
import {MemeToken} from "../meme/MemeToken.sol";
interface ISSLTVault {
function mint(uint256 usdcIn, uint256 minSharesOut) external returns (uint256 shares);
function redeem(uint256 shares, uint256 minUsdcOut) external returns (uint256 usdcOut);
function nav() external view returns (uint256);
}
interface ISSLtFactory {
function isLt(address lt) external view returns (bool);
}
/// @title SingleSidedMeme — bonding-curve-free launcher + hedge harvester
/// @notice A meme launches as a PLAIN ERC20 on a Uniswap V3 pool seeded single-sided (all
/// MEME, 0 WETH) in a concentrated range: it prices like a bonding curve as buys walk
/// it up, but IS a native Uniswap pool tradeable by every bot from second one - no
/// bonding curve, no graduation, no zap. This contract owns each meme's LP position.
/// Once the pool has accumulated more than `hedgeStartUsdgValue` of WETH, the keeper
/// harvests a calibrated slice of that WETH into the backing LT (WETH -> USDG ->
/// vault.mint), the same hedge the graduated model funded from its carve - now fed by
/// organic volume instead of a graduation event. The MEME the harvest frees is
/// redeployed single-sided just above spot, so depth follows the price up.
contract SingleSidedMeme is Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
address constant DEAD = 0x000000000000000000000000000000000000dEaD;
// --- immutables ---------------------------------------------------------
INonfungiblePositionManager public immutable positionManager;
ISwapRouter02 public immutable swapRouter;
IUniswapV3Factory public immutable v3Factory;
address public immutable weth;
IERC20 public immutable usdc; // USDG on Robinhood Chain
address public immutable memeImpl; // MemeToken implementation to clone
ISSLtFactory public immutable ltFactory;
uint24 public immutable wethUsdgFee; // fee tier of the live WETH/USDG pool
// --- config (owner) -----------------------------------------------------
uint256 public defaultSupply = 1_000_000_000e18;
uint24 public memeFee = 10_000; // 1%, matches the launchpads' pools
int24 public rangeWidthTicks = 12_000; // ~ +/- 2.3x band the single-sided position spans
/// @notice Pool WETH value (in USDG terms) below which NO hedge harvest fires - the meme
/// trades as a pure memecoin until it has this much organic liquidity. Defaults to
/// the old bonding graduation threshold; owner-tunable.
uint256 public hedgeStartUsdgValue = 11_600e6;
/// @notice Split of collected LP fees between the launcher of the coin and the protocol.
/// The pool charges `memeFee` (1%); this halves it - 0.5% to the creator, 0.5% to
/// the platform buyback. Owner-tunable, capped at 100%.
uint16 public creatorFeeShareBps = 5_000;
uint16 constant BPS = 10_000;
/// @notice The coin the platform's fee share buys and burns. Zero until that coin exists;
/// until then the share simply accrues in `platformFeesWeth` and nothing is lost.
address public platformToken;
/// @notice Fee tier of the WETH/platformToken pool the buyback swaps through.
uint24 public platformPoolFee = 10_000;
struct Market {
address lt;
address pool;
uint256 tokenId;
bool memeIsToken0;
bool live;
/// @dev Whoever called launch(). Recorded so LP fees have a payee; it carries no
/// authority over the market beyond claiming its own accrued share.
address creator;
}
mapping(address meme => Market) public markets;
address[] public memes;
// --- LP fee accounting ---------------------------------------------------
// Fees are accrued and pulled, not pushed: a creator address that reverts on receive would
// otherwise brick the keeper's harvest for that market.
mapping(address meme => uint256) public creatorFeesWeth;
mapping(address meme => uint256) public creatorFeesMeme;
mapping(address meme => uint256) public platformFeesMeme;
/// @notice Platform WETH awaiting a buyback. Not per-meme - it is one protocol-level pot.
uint256 public platformFeesWeth;
/// @notice Everything owed out of this contract's balances. The hedge and the reseed both
/// work off balances, so without these they would spend fees that are already
/// somebody else's.
uint256 public reservedWeth;
mapping(address meme => uint256) public reservedMeme;
event Launched(
address indexed meme, address indexed lt, address pool, uint256 tokenId, address indexed creator
);
event Harvested(
address indexed meme, uint256 wethPulled, uint256 usdgOut, uint256 ltMinted, uint256 memeRedeployed
);
event HedgeStartSet(uint256 usdgValue);
event KeeperSet(address indexed account, bool allowed);
event Swept(address indexed token, address indexed to, uint256 amount);
event Unwound(uint256 indexed tokenId, uint256 amount0, uint256 amount1);
event Expanded(address indexed meme, uint256 ltRedeemed, uint256 usdgOut, uint256 wethAdded);
event Reanchored(address indexed meme, uint256 tokenId, uint256 memeRedeployed, uint256 wethToFloor);
event BoughtBackAndBurned(
address indexed meme, uint256 ltRedeemed, uint256 wethSpent, uint256 memeBought, uint256 memeBurned
);
event FeesAccrued(
address indexed meme, uint256 creatorWeth, uint256 creatorMeme, uint256 platformWeth, uint256 platformMeme
);
event CreatorFeesClaimed(address indexed meme, address indexed creator, uint256 wethOut, uint256 memeOut);
event PlatformBuyback(uint256 wethSpent, uint256 tokensBought, uint256 tokensBurned);
event PlatformTokenSet(address indexed token, uint24 poolFee);
event CreatorFeeShareSet(uint16 bps);
/// @notice Backing LT this market's harvests have minted, net of what expand/buyback have
/// redeemed. On-chain because the keeper's off-process tally cannot survive its own
/// restarts: after a day of crash-restarts its file had drifted 6.46 LT short of
/// totalSupply, and `expand` sizes a market's refill off exactly this number - an
/// under-count means a coin cannot recall all the margin it is owed. One LT is
/// shared by many memes, so the LT's own balance cannot answer this per meme.
mapping(address meme => uint256) public backingLtShares;
mapping(address account => bool allowed) public keeper;
/// @notice The tokenId of each market's WETH-floor position (single-sided WETH below spot,
/// the sell-side depth expand seeds). 0 until the first expand.
mapping(address meme => uint256) public floorTokenId;
error NotKeeper(address caller);
error InvalidBackingLt(address lt);
error MarketExists(address meme);
error MarketUnknown(address meme);
error BelowHedgeStart(uint256 poolWethValue, uint256 threshold);
error Slippage(uint256 out, uint256 min);
error ZeroAmount();
error NotCreator(address caller, address creator);
error NothingToClaim();
error PlatformTokenUnset();
error InsufficientPlatformFees(uint256 requested, uint256 available);
error ReservedFunds(uint256 requested, uint256 free);
error InsufficientBacking(uint256 requested, uint256 available);
error ShareTooHigh(uint16 bps);
error ZeroAddress();
error PoolPriceOutOfRange(int24 tick);
modifier onlyKeeper() {
if (msg.sender != owner() && !keeper[msg.sender]) revert NotKeeper(msg.sender);
_;
}
constructor(
INonfungiblePositionManager positionManager_,
ISwapRouter02 swapRouter_,
IUniswapV3Factory v3Factory_,
IERC20 usdc_,
address memeImpl_,
ISSLtFactory ltFactory_,
uint24 wethUsdgFee_,
address owner_
) Ownable(owner_) {
if (
address(positionManager_) == address(0) || address(swapRouter_) == address(0)
|| address(v3Factory_) == address(0) || address(usdc_) == address(0) || memeImpl_ == address(0)
|| address(ltFactory_) == address(0) || owner_ == address(0)
) revert ZeroAddress();
positionManager = positionManager_;
swapRouter = swapRouter_;
v3Factory = v3Factory_;
usdc = usdc_;
memeImpl = memeImpl_;
ltFactory = ltFactory_;
wethUsdgFee = wethUsdgFee_;
weth = positionManager_.WETH9();
}
// ------------------------------------------------------------------
// Launch (permissionless, gated only by a real backing LT)
// ------------------------------------------------------------------
function launch(string calldata name, string calldata symbol, string calldata metadataURI, address backingLt)
external
nonReentrant
returns (address meme, address pool)
{
if (!ltFactory.isLt(backingLt)) revert InvalidBackingLt(backingLt);
meme = Clones.clone(memeImpl);
MemeToken(meme).initialize(name, symbol, metadataURI, address(this), defaultSupply);
if (markets[meme].lt != address(0)) revert MarketExists(meme);
bool memeIsToken0 = meme < weth;
(address t0, address t1) = memeIsToken0 ? (meme, weth) : (weth, meme);
int24 spacing = v3Factory.feeAmountTickSpacing(memeFee);
// Single-sided: init at the boundary where the position is 100% MEME, with the range
// on the side buys push the tick into. memeIsToken0 -> buys raise the price -> range
// ABOVE spot, init at tickLower. memeIsToken1 -> range BELOW spot, init at tickUpper.
int24 width = _roundTicks(rangeWidthTicks, spacing);
int24 tickLower;
int24 tickUpper;
int24 initTick;
if (memeIsToken0) {
initTick = _roundTicks(-200_000, spacing);
tickLower = initTick;
tickUpper = initTick + width;
} else {
initTick = _roundTicks(200_000, spacing);
tickUpper = initTick;
tickLower = initTick - width;
}
pool = positionManager.createAndInitializePoolIfNecessary(t0, t1, memeFee, TickMath.getSqrtPriceAtTick(initTick));
IERC20(meme).forceApprove(address(positionManager), defaultSupply);
(uint256 a0, uint256 a1) = memeIsToken0 ? (defaultSupply, uint256(0)) : (uint256(0), defaultSupply);
(uint256 tokenId,,,) = positionManager.mint(
INonfungiblePositionManager.MintParams({
token0: t0,
token1: t1,
fee: memeFee,
tickLower: tickLower,
tickUpper: tickUpper,
amount0Desired: a0,
amount1Desired: a1,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: block.timestamp
})
);
markets[meme] = Market({
lt: backingLt,
pool: pool,
tokenId: tokenId,
memeIsToken0: memeIsToken0,
live: true,
creator: msg.sender
});
memes.push(meme);
emit Launched(meme, backingLt, pool, tokenId, msg.sender);
}
// ------------------------------------------------------------------
// Harvest (keeper): accumulated WETH -> backing LT, redeploy the MEME
// ------------------------------------------------------------------
/// @param liquidityToPull how much of the position's liquidity to unwind this sweep (the
/// keeper sizes it from the adaptive deploy curve - a fraction of the pool that
/// grows with size). The freed WETH is hedged; the freed MEME is re-seeded
/// single-sided just above the live tick so depth follows the price up.
function harvest(address meme, uint128 liquidityToPull, uint256 minUsdgOut)
external
onlyKeeper
nonReentrant
returns (uint256 ltMinted)
{
Market storage m = markets[meme];
if (m.lt == address(0)) revert MarketUnknown(meme);
if (liquidityToPull == 0) revert ZeroAmount();
// Gate: no hedge until the pool holds more than hedgeStartUsdgValue of WETH.
uint256 poolWethValue = _poolWethValueUsdg(m.pool);
if (poolWethValue < hedgeStartUsdgValue) revert BelowHedgeStart(poolWethValue, hedgeStartUsdgValue);
// Collect BEFORE touching liquidity. decreaseLiquidity moves principal into the same
// tokensOwed bucket the fees sit in, so collecting afterwards returns one undifferentiated
// number - which is what this used to do, silently hedging the LP fees along with the
// principal. Collecting first isolates exactly the fees the pool has earned.
uint256 wethAtStart = _bal(weth);
uint256 memeAtStart = _bal(meme);
_collect(m.tokenId);
_accrueFees(meme, _bal(weth) - wethAtStart, _bal(meme) - memeAtStart);
uint256 wethBefore = _bal(weth);
positionManager.decreaseLiquidity(
INonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: m.tokenId,
liquidity: liquidityToPull,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
})
);
_collect(m.tokenId);
// Principal only - the fee slice was taken and reserved above.
uint256 wethPulled = _bal(weth) - wethBefore;
// WETH -> USDG -> mint backing LT (the hedge; the LT accrues to this contract).
// Slippage, not BelowHedgeStart: reusing the gate's error here disguised a too-tight
// keeper min-out as a threshold failure on the first live launch (RUN 15) and sent
// the debugging toward the wrong knob. (The launcher deployed at 0xF950…D0628 still
// reports the old selector until redeployed.)
uint256 usdgOut = wethPulled == 0 ? 0 : _swap(weth, address(usdc), wethUsdgFee, wethPulled);
if (usdgOut < minUsdgOut) revert Slippage(usdgOut, minUsdgOut);
if (usdgOut != 0) {
usdc.forceApprove(m.lt, usdgOut);
ltMinted = ISSLTVault(m.lt).mint(usdgOut, 1);
backingLtShares[meme] += ltMinted;
}
// Redeploy MEME single-sided just above the live tick, so the pool keeps a memecoin-deep
// book that follows the price up. Deploy the contract's FULL MEME balance, not just this
// sweep's delta, so any MEME an earlier partial reseed left stranded gets swept in too.
// Only the unreserved balance may be redeployed - the fee slice belongs to the creator
// and the platform, and putting it back in the pool would quietly spend it.
uint256 memeReserved = reservedMeme[meme];
uint256 memeBal = _bal(meme);
uint256 memeOnHand = memeBal > memeReserved ? memeBal - memeReserved : 0;
uint256 memeRedeployed = memeOnHand == 0 ? 0 : _reseedSingleSided(m, memeOnHand);
emit Harvested(meme, wethPulled, usdgOut, ltMinted, memeRedeployed);
}
// ------------------------------------------------------------------
// Expand (keeper): backing LT -> WETH -> refill the pool's sell-side depth
// ------------------------------------------------------------------
/// @notice The reverse of harvest, for the size-adaptive breathing: when the pool's depth
/// has fallen below its target (a young market, or after heavy sells), redeem some
/// backing LT to WETH and seed it single-sided just BELOW spot as buy-side depth /
/// a price floor. The LT vault must hold enough idle USDG to redeem - the keeper
/// recalls margin from the Lighter perp first (perp -> vault) so this settles.
/// @param ltToRedeem backing LT shares to redeem this step (keeper sizes it off the curve).
function expand(address meme, uint256 ltToRedeem, uint256 minWethOut)
external
onlyKeeper
nonReentrant
returns (uint256 wethAdded)
{
Market storage m = markets[meme];
if (m.lt == address(0)) revert MarketUnknown(meme);
if (ltToRedeem == 0) revert ZeroAmount();
// A market can only ever give back what IT put in. Without this bound, one meme's
// expand could redeem a co-tenant's backing off the shared LT.
uint256 owned = backingLtShares[meme];
if (ltToRedeem > owned) revert InsufficientBacking(ltToRedeem, owned);
backingLtShares[meme] = owned - ltToRedeem;
uint256 usdgOut = ISSLTVault(m.lt).redeem(ltToRedeem, 1);
uint256 wethOut = usdgOut == 0 ? 0 : _swap(address(usdc), weth, wethUsdgFee, usdgOut);
if (wethOut < minWethOut) revert Slippage(wethOut, minWethOut);
// Seed the contract's FULL WETH balance (sweeps any WETH an earlier partial add left).
uint256 wethOnHand = _bal(weth);
wethAdded = wethOnHand == 0 ? 0 : _reseedWethFloor(m, wethOnHand);
emit Expanded(meme, ltToRedeem, usdgOut, wethAdded);
}
// ------------------------------------------------------------------
// Reanchor (keeper): re-hug the ladder to spot so no gap opens at the price
// ------------------------------------------------------------------
/// @notice Pull the whole MEME ladder and re-seed it adjacent to the live tick, sending any
/// WETH it had already taken in to the floor.
///
/// This closes the hole RUN 16 found (docs/LIVE-VALIDATION.md): after a harvest the
/// ladder is re-seeded relative to the tick AT THAT MOMENT, so a later move leaves it
/// stranded where the price used to be - the pool's ACTIVE liquidity at spot drops to
/// zero and a third-party LP can own the whole flow (measured live: 23x our
/// liquidity, 100% third-party, and the coin's hedge stopped growing entirely).
/// These pools are canonical and permissionless by design - being tradeable by every
/// bot from block one is the point - so the answer is not to forbid other LPs but to
/// never leave the price unattended. With the ladder always at spot, a competitor has
/// to match this position's size to take a real share of the flow.
///
/// Safe to call at any time: it is a no-op when the position is already at spot, and
/// it reverts cleanly (`PoolPriceOutOfRange`) if a book-sweeping move has pushed the
/// price where no valid band remains, so the keeper's simulation just skips it.
function reanchor(address meme) external onlyKeeper nonReentrant returns (uint256 memeRedeployed) {
Market storage m = markets[meme];
if (m.lt == address(0)) revert MarketUnknown(meme);
(,,,,,,, uint128 liquidity,,,,) = positionManager.positions(m.tokenId);
// Fees first, exactly as harvest does: decreaseLiquidity moves principal into the same
// tokensOwed bucket the fees sit in, so collecting after would hand the creator's and
// the platform's share back to the pool as depth.
uint256 wethAtStart = _bal(weth);
uint256 memeAtStart = _bal(meme);
_collect(m.tokenId);
_accrueFees(meme, _bal(weth) - wethAtStart, _bal(meme) - memeAtStart);
uint256 wethBefore = _bal(weth);
if (liquidity != 0) {
positionManager.decreaseLiquidity(
INonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: m.tokenId,
liquidity: liquidity,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
})
);
_collect(m.tokenId);
}
uint256 wethFreed = _bal(weth) - wethBefore;
uint256 memeReserved = reservedMeme[meme];
uint256 memeBal = _bal(meme);
uint256 memeOnHand = memeBal > memeReserved ? memeBal - memeReserved : 0;
memeRedeployed = memeOnHand == 0 ? 0 : _reseedSingleSided(m, memeOnHand);
// The WETH the ladder had already taken in is realized buy-side depth, so it belongs to
// the floor, not back into the ask ladder.
if (wethFreed != 0) _reseedWethFloor(m, wethFreed);
emit Reanchored(meme, m.tokenId, memeRedeployed, wethFreed);
}
// ------------------------------------------------------------------
// Buyback-and-burn (keeper): backing LT gains -> BUY the meme -> burn
// ------------------------------------------------------------------
/// @notice Transmit the underlying's upside to the meme's VISIBLE mark price. Unlike
/// `expand` (which seeds passive WETH depth below spot - a floor that does not move
/// the mark), this redeems backing LT to WETH and MARKET-BUYS the meme, walking the
/// price UP, then burns `burnBps` of what it bought to DEAD (deflationary) and leaves
/// the rest as protocol-owned MEME redeployed as depth - so the pump is capital-
/// efficient and recyclable, with the burn share tunable. burnBps=0 keeps it fully
/// reversible; 10000 burns everything.
/// @param ltToRedeem backing LT shares to realize this buyback from (perp gains).
/// @param burnBps share (bps) of the bought MEME to burn; the rest is redeployed as depth.
function buybackAndBurn(address meme, uint256 ltToRedeem, uint256 minMemeBought, uint256 burnBps)
external
onlyKeeper
nonReentrant
returns (uint256 memeBought, uint256 memeBurned)
{
Market storage m = markets[meme];
if (m.lt == address(0)) revert MarketUnknown(meme);
if (ltToRedeem == 0) revert ZeroAmount();
if (burnBps > 10_000) revert ZeroAmount();
uint256 ownedForBuyback = backingLtShares[meme];
if (ltToRedeem > ownedForBuyback) revert InsufficientBacking(ltToRedeem, ownedForBuyback);
backingLtShares[meme] = ownedForBuyback - ltToRedeem;
uint256 usdgOut = ISSLTVault(m.lt).redeem(ltToRedeem, 1);
uint256 wethMid = usdgOut == 0 ? 0 : _swap(address(usdc), weth, wethUsdgFee, usdgOut);
// MARKET BUY meme with the WETH: this is the leg that lifts the mark price.
memeBought = wethMid == 0 ? 0 : _swap(weth, meme, memeFee, wethMid);
if (memeBought < minMemeBought) revert Slippage(memeBought, minMemeBought);
memeBurned = (memeBought * burnBps) / 10_000;
if (memeBurned != 0) IERC20(meme).safeTransfer(DEAD, memeBurned);
// the un-burned remainder is redeployed as depth (protocol-owned, recyclable).
uint256 keepMeme = _bal(meme);
if (keepMeme != 0) _reseedSingleSided(m, keepMeme);
emit BoughtBackAndBurned(meme, ltToRedeem, wethMid, memeBought, memeBurned);
}
/// @dev Add WETH single-sided just below spot: the side the position is 100% WETH on, so as
/// the price dips into it the WETH buys MEME (a floor). Mirror of `_reseedSingleSided`
/// on the opposite tick side; folds into one tracked floor NFT per market.
function _reseedWethFloor(Market storage m, uint256 wethAmount) private returns (uint256 used) {
int24 spacing = v3Factory.feeAmountTickSpacing(memeFee);
(, int24 tick,,,,,) = IUniswapV3PoolState(m.pool).slot0();
int24 width = _roundTicks(rangeWidthTicks, spacing);
int24 lower;
int24 upper;
if (m.memeIsToken0) {
// WETH = token1 -> 100% token1 BELOW spot
upper = _roundTicks(tick, spacing) - spacing;
lower = upper - width;
} else {
// WETH = token0 -> 100% token0 ABOVE spot
lower = _roundTicks(tick, spacing) + spacing;
upper = lower + width;
}
(lower, upper) = _boundTicks(lower, upper, spacing, tick);
(address t0, address t1) = m.memeIsToken0 ? (address(_meme(m)), weth) : (weth, address(_meme(m)));
IERC20(weth).forceApprove(address(positionManager), wethAmount);
(uint256 a0, uint256 a1) = m.memeIsToken0 ? (uint256(0), wethAmount) : (wethAmount, uint256(0));
uint256 fid = floorTokenId[address(_meme(m))];
if (fid != 0) {
try positionManager.increaseLiquidity(
INonfungiblePositionManager.IncreaseLiquidityParams({
tokenId: fid,
amount0Desired: a0,
amount1Desired: a1,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
})
) returns (uint128, uint256 used0, uint256 used1) {
return m.memeIsToken0 ? used1 : used0;
} catch {}
}
(uint256 newId,,,) = positionManager.mint(
INonfungiblePositionManager.MintParams({
token0: t0,
token1: t1,
fee: memeFee,
tickLower: lower,
tickUpper: upper,
amount0Desired: a0,
amount1Desired: a1,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: block.timestamp
})
);
floorTokenId[address(_meme(m))] = newId;
used = wethAmount;
}
function _reseedSingleSided(Market storage m, uint256 memeAmount) private returns (uint256 used) {
int24 spacing = v3Factory.feeAmountTickSpacing(memeFee);
(, int24 tick,,,,,) = IUniswapV3PoolState(m.pool).slot0();
int24 width = _roundTicks(rangeWidthTicks, spacing);
int24 lower;
int24 upper;
if (m.memeIsToken0) {
lower = _roundTicks(tick, spacing) + spacing; // just above spot -> 100% token0 (MEME)
upper = lower + width;
} else {
upper = _roundTicks(tick, spacing) - spacing; // just below spot -> 100% token1 (MEME)
lower = upper - width;
}
(lower, upper) = _boundTicks(lower, upper, spacing, tick);
(address t0, address t1) = m.memeIsToken0 ? (address(_meme(m)), weth) : (weth, address(_meme(m)));
IERC20(t1 == weth ? t0 : t1).forceApprove(address(positionManager), memeAmount);
(uint256 a0, uint256 a1) = m.memeIsToken0 ? (memeAmount, uint256(0)) : (uint256(0), memeAmount);
// Fold into the existing NFT so the market keeps ONE tracked position.
try positionManager.increaseLiquidity(
INonfungiblePositionManager.IncreaseLiquidityParams({
tokenId: m.tokenId,
amount0Desired: a0,
amount1Desired: a1,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
})
) returns (uint128, uint256 used0, uint256 used1) {
used = m.memeIsToken0 ? used0 : used1;
} catch {
// The old range no longer brackets spot after a big move: mint a fresh position
// and re-point the market at it.
(uint256 newId,,,) = positionManager.mint(
INonfungiblePositionManager.MintParams({
token0: t0,
token1: t1,
fee: memeFee,
tickLower: lower,
tickUpper: upper,
amount0Desired: a0,
amount1Desired: a1,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: block.timestamp
})
);
m.tokenId = newId;
used = memeAmount;
}
}
// ------------------------------------------------------------------
// Views + admin
// ------------------------------------------------------------------
/// @notice The pool's WETH balance valued in USDG, the keeper's hedge-start signal.
function poolWethValueUsdg(address meme) external view returns (uint256) {
return _poolWethValueUsdg(markets[meme].pool);
}
function memesLength() external view returns (uint256) {
return memes.length;
}
function allMemes() external view returns (address[] memory) {
return memes;
}
function setHedgeStart(uint256 usdgValue) external onlyOwner {
hedgeStartUsdgValue = usdgValue;
emit HedgeStartSet(usdgValue);
}
function setLaunchParams(uint256 supply_, uint24 fee_, int24 rangeWidth_) external onlyOwner {
if (supply_ == 0 || fee_ == 0 || rangeWidth_ <= 0) revert ZeroAmount();
defaultSupply = supply_;
memeFee = fee_;
rangeWidthTicks = rangeWidth_;
}
function setKeeper(address account, bool allowed) external onlyOwner {
if (account == address(0)) revert ZeroAddress();
keeper[account] = allowed;
emit KeeperSet(account, allowed);
}
/// @notice Move accrued backing OUT of the contract: the keeper redeems the swept LT to
/// USDG and bridges it to the Lighter hedge (the on-chain LT is only the staging
/// form of the hedge), and it doubles as the owner's recovery path for the WETH a
/// harvest skims but leaves parked. A registered MEME can NEVER be swept - that
/// would let the owner pull the pool's depth and rug holders; MEME only ever moves
/// via launch/harvest redeploy.
function sweep(address token, address to, uint256 amount) external onlyOwner {
if (to == address(0)) revert ZeroAddress();
if (markets[token].lt != address(0)) revert MarketExists(token); // never a live meme
// Accrued fees are owed to creators and the buyback; the owner is not entitled to them,
// so the sweep is bounded to whatever sits above the reservation.
if (token == weth) {
uint256 free = _bal(weth) > reservedWeth ? _bal(weth) - reservedWeth : 0;
if (amount > free) revert ReservedFunds(amount, free);
}
IERC20(token).safeTransfer(to, amount);
emit Swept(token, to, amount);
}
// ------------------------------------------------------------------
// LP fees: 0.5% to the coin's creator, 0.5% to the platform buyback
// ------------------------------------------------------------------
/// @dev Splits a freshly collected fee amount and books it. Both sides are reserved so the
/// hedge and the reseed leave them alone.
function _accrueFees(address meme, uint256 feeWeth, uint256 feeMeme) private {
if (feeWeth == 0 && feeMeme == 0) return;
uint256 cWeth = (feeWeth * creatorFeeShareBps) / BPS;
uint256 cMeme = (feeMeme * creatorFeeShareBps) / BPS;
// Remainder to the platform so rounding dust is never stranded unowned.
uint256 pWeth = feeWeth - cWeth;
uint256 pMeme = feeMeme - cMeme;
creatorFeesWeth[meme] += cWeth;
creatorFeesMeme[meme] += cMeme;
platformFeesWeth += pWeth;
platformFeesMeme[meme] += pMeme;
reservedWeth += feeWeth;
reservedMeme[meme] += feeMeme;
emit FeesAccrued(meme, cWeth, cMeme, pWeth, pMeme);
}
/// @notice Withdraw the LP fees this coin has earned for whoever launched it. Callable only
/// by that address; pays in both sides of the pool, WETH and the meme itself.
function claimCreatorFees(address meme)
external
nonReentrant
returns (uint256 wethOut, uint256 memeOut)
{
Market storage m = markets[meme];
if (m.lt == address(0)) revert MarketUnknown(meme);
if (msg.sender != m.creator) revert NotCreator(msg.sender, m.creator);
wethOut = creatorFeesWeth[meme];
memeOut = creatorFeesMeme[meme];
if (wethOut == 0 && memeOut == 0) revert NothingToClaim();
// Zero before transferring - nonReentrant already covers this, but the meme is an
// arbitrary ERC-20 clone and the ordering costs nothing.
creatorFeesWeth[meme] = 0;
creatorFeesMeme[meme] = 0;
reservedWeth -= wethOut;
reservedMeme[meme] -= memeOut;
if (wethOut != 0) IERC20(weth).safeTransfer(m.creator, wethOut);
if (memeOut != 0) IERC20(meme).safeTransfer(m.creator, memeOut);
emit CreatorFeesClaimed(meme, m.creator, wethOut, memeOut);
}
/// @notice Spend accrued platform WETH on the platform coin and burn it. Reverts while
/// `platformToken` is unset, which is the state before that coin exists - the fees
/// keep accruing meanwhile rather than being lost.
function buybackAndBurnPlatform(uint256 wethIn, uint256 minTokensOut)
external
onlyKeeper
nonReentrant
returns (uint256 bought)
{
if (platformToken == address(0)) revert PlatformTokenUnset();
if (wethIn == 0) revert ZeroAmount();
if (wethIn > platformFeesWeth) revert InsufficientPlatformFees(wethIn, platformFeesWeth);
platformFeesWeth -= wethIn;
reservedWeth -= wethIn;
bought = _swap(weth, platformToken, platformPoolFee, wethIn);
if (bought < minTokensOut) revert Slippage(bought, minTokensOut);
IERC20(platformToken).safeTransfer(DEAD, bought);
emit PlatformBuyback(wethIn, bought, bought);
}
function setPlatformToken(address token, uint24 poolFee) external onlyOwner {
if (poolFee == 0) revert ZeroAmount();
platformToken = token;
platformPoolFee = poolFee;
emit PlatformTokenSet(token, poolFee);
}
function setCreatorFeeShareBps(uint16 bps) external onlyOwner {
if (bps > BPS) revert ShareTooHigh(bps);
creatorFeeShareBps = bps;
emit CreatorFeeShareSet(bps);
}
/// @notice What `meme`'s creator can currently claim, for the UI's claim panel.
function claimableCreatorFees(address meme) external view returns (uint256 wethOut, uint256 memeOut) {
return (creatorFeesWeth[meme], creatorFeesMeme[meme]);
}
/// @notice Unwind liquidity from ANY position this contract owns - including one an earlier
/// reseed re-pointed away from - back into the contract as WETH+MEME, so the parked
/// value in orphaned NFTs is always recoverable (WETH via `sweep`; the MEME stays as
/// supply). Owner-only; the harvest path handles the tracked position itself.
function unwind(uint256 tokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min)
external
onlyOwner
nonReentrant
{
if (liquidity > 0) {
positionManager.decreaseLiquidity(
INonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: tokenId,
liquidity: liquidity,
amount0Min: amount0Min,
amount1Min: amount1Min,
deadline: block.timestamp
})
);
}
(uint256 a0, uint256 a1) = positionManager.collect(
INonfungiblePositionManager.CollectParams({
tokenId: tokenId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
emit Unwound(tokenId, a0, a1);
}
// ------------------------------------------------------------------
// internals
// ------------------------------------------------------------------
function _poolWethValueUsdg(address pool) private view returns (uint256) {
// Value the pool's WETH in USDG (6dp) off the live WETH/USDG pool spot.
uint256 wethBal = IERC20(weth).balanceOf(pool);
if (wethBal == 0) return 0;
address wethUsdgPool = v3Factory.getPool(weth, address(usdc), wethUsdgFee);
(uint160 sqrtP,,,,,,) = IUniswapV3PoolState(wethUsdgPool).slot0();
uint256 sp = uint256(sqrtP);
uint256 q96 = 1 << 96;
// raw price R = (sqrtP/2^96)^2 = token1_raw per token0_raw. Working in RAW units, the
// USDG-raw value of wethBal-raw is wethBal*R when WETH is token0, else wethBal/R.
// Since usdc is USDG (6dp), the raw result IS the 6dp USDG value. Math.mulDiv is
// full-512-bit so sqrtP^2 never overflows.
if (weth < address(usdc)) {
return Math.mulDiv(Math.mulDiv(wethBal, sp, q96), sp, q96);
}
return Math.mulDiv(Math.mulDiv(wethBal, q96, sp), q96, sp);
}
function _swap(address tokenIn, address tokenOut, uint24 fee, uint256 amountIn) private returns (uint256 out) {
if (amountIn == 0) return 0;
IERC20(tokenIn).forceApprove(address(swapRouter), amountIn);
uint256 before = _bal(tokenOut);
swapRouter.exactInputSingle(
ISwapRouter02.ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: tokenOut,
fee: fee,
recipient: address(this),
amountIn: amountIn,
amountOutMinimum: 1,
sqrtPriceLimitX96: 0
})
);
out = _bal(tokenOut) - before;
}
function _bal(address token) private view returns (uint256) {
return IERC20(token).balanceOf(address(this));
}
/// @dev Sweeps whatever the position currently owes this contract. Called once before
/// decreaseLiquidity (fees only) and once after (principal), so the two are separable.
function _collect(uint256 tokenId) private {
positionManager.collect(
INonfungiblePositionManager.CollectParams({
tokenId: tokenId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
}
function _meme(Market storage m) private view returns (IERC20) {
// recover the meme address from either token slot
return IERC20(m.memeIsToken0 ? IUniswapV3PoolState(m.pool).token0() : IUniswapV3PoolState(m.pool).token1());
}
function _roundTicks(int24 t, int24 s) private pure returns (int24) {
return (t / s) * s;
}
/// @dev Clamp a computed [lower, upper] range to the valid initializable tick bounds and
/// revert cleanly when the pool price is so extreme (a pool drained or pumped to the
/// edge) that no valid band remains — instead of letting the Uniswap mint bubble an
/// opaque "T". Callers (`expand` / `buybackAndBurn`) run the reseed inside one atomic
/// tx after the redeem/swap, so this revert safely rolls the whole operation back and
/// the keeper's simulation skips the market until price returns to a tradeable range.
function _boundTicks(int24 lower, int24 upper, int24 spacing, int24 tick)
private
pure
returns (int24, int24)
{
int24 minUsable = (TickMath.MIN_TICK / spacing) * spacing;
int24 maxUsable = (TickMath.MAX_TICK / spacing) * spacing;
if (lower < minUsable) lower = minUsable;
if (lower > maxUsable) lower = maxUsable;
if (upper < minUsable) upper = minUsable;
if (upper > maxUsable) upper = maxUsable;
if (lower >= upper) revert PoolPriceOutOfRange(tick);
return (lower, upper);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "positionManager_",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
},
{
"name": "swapRouter_",
"type": "address",
"internalType": "contract ISwapRouter02"
},
{
"name": "v3Factory_",
"type": "address",
"internalType": "contract IUniswapV3Factory"
},
{
"name": "usdc_",
"type": "address",
"internalType": "contract IERC20"
},
{
"name": "memeImpl_",
"type": "address",
"internalType": "address"
},
{
"name": "ltFactory_",
"type": "address",
"internalType": "contract ISSLtFactory"
},
{
"name": "wethUsdgFee_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BelowHedgeStart",
"type": "error",
"inputs": [
{
"name": "poolWethValue",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "threshold",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "FailedDeployment",
"type": "error",
"inputs": []
},
{
"name": "InsufficientBacking",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "available",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InsufficientPlatformFees",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "available",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidBackingLt",
"type": "error",
"inputs": [
{
"name": "lt",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MarketExists",
"type": "error",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MarketUnknown",
"type": "error",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "NotCreator",
"type": "error",
"inputs": [
{
"name": "caller",
"type": "address",
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "NotKeeper",
"type": "error",
"inputs": [
{
"name": "caller",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PlatformTokenUnset",
"type": "error",
"inputs": []
},
{
"name": "PoolPriceOutOfRange",
"type": "error",
"inputs": [
{
"name": "tick",
"type": "int24",
"internalType": "int24"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "ReservedFunds",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "free",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ShareTooHigh",
"type": "error",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "Slippage",
"type": "error",
"inputs": [
{
"name": "out",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "min",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "BoughtBackAndBurned",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ltRedeemed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethSpent",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "memeBought",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "memeBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CreatorFeeShareSet",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "CreatorFeesClaimed",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "memeOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Expanded",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ltRedeemed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "usdgOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethAdded",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeesAccrued",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creatorWeth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "creatorMeme",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "platformWeth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "platformMeme",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Harvested",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethPulled",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "usdgOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ltMinted",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "memeRedeployed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "HedgeStartSet",
"type": "event",
"inputs": [
{
"name": "usdgValue",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "KeeperSet",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "Launched",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "lt",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"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": "PlatformBuyback",
"type": "event",
"inputs": [
{
"name": "wethSpent",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensBought",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PlatformTokenSet",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "poolFee",
"type": "uint24",
"indexed": false,
"internalType": "uint24"
}
],
"anonymous": false
},
{
"name": "Reanchored",
"type": "event",
"inputs": [
{
"name": "meme",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "memeRedeployed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethToFloor",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Swept",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Unwound",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "allMemes",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "view"
},
{
"name": "backingLtShares",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buybackAndBurn",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "ltToRedeem",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minMemeBought",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "burnBps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "memeBought",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeBurned",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "buybackAndBurnPlatform",
"type": "function",
"inputs": [
{
"name": "wethIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minTokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "bought",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimCreatorFees",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "wethOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimableCreatorFees",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "wethOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorFeeShareBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "creatorFeesMeme",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorFeesWeth",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "defaultSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "expand",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "ltToRedeem",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minWethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "wethAdded",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "floorTokenId",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "harvest",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "liquidityToPull",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "minUsdgOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ltMinted",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "hedgeStartUsdgValue",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "allowed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "metadataURI",
"type": "string",
"internalType": "string"
},
{
"name": "backingLt",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ltFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISSLtFactory"
}
],
"stateMutability": "view"
},
{
"name": "markets",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "lt",
"type": "address",
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeIsToken0",
"type": "bool",
"internalType": "bool"
},
{
"name": "live",
"type": "bool",
"internalType": "bool"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "memeFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "memeImpl",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "memes",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "memesLength",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"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": "platformFeesMeme",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "platformFeesWeth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "platformPoolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "platformToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolWethValueUsdg",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "rangeWidthTicks",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "reanchor",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "memeRedeployed",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "reservedMeme",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "reservedWeth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setCreatorFeeShareBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setHedgeStart",
"type": "function",
"inputs": [
{
"name": "usdgValue",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLaunchParams",
"type": "function",
"inputs": [
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fee_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "rangeWidth_",
"type": "int24",
"internalType": "int24"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPlatformToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "poolFee",
"type": "uint24",
"internalType": "uint24"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapRouter02"
}
],
"stateMutability": "view"
},
{
"name": "sweep",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unwind",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "amount0Min",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1Min",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "usdc",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "v3Factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV3Factory"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "wethUsdgFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
}
]0x61018080604052346103de57610100816147ab80380380916100218285610454565b8339810103126103de5780516001600160a01b0381168082036103de5760208301516001600160a01b038116928382036103de5760408501516001600160a01b038116959093908685036103de576060810151956001600160a01b038716908188036103de576100936080840161048b565b60a0840151929091906001600160a01b038416908185036103de5760c08601519562ffffff871687036103de576001600160a01b03906100d59060e00161048b565b169b8c1561044157600180546001600160a01b03199081169091555f80549182168f1781556040519e916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556b033b2e3c9fd0803ce8000000600255642ee000271065ffffffffffff1960035416176003556402b369f4006004557727100000000000000000000000000000000000000000138878ffffff0000000000000000000000000000000000000000ffff1960055416176005558715938415610438575b50831561042f575b508215610426575b508115610414575b811561040b575b508015610404575b6103f5576020978997600497899760805260a05260c052610100526101205261014052610160526312a9293f60e21b82525afa9081156103ea575f916103ac575b5060e05260405161430b90816104a08239608051818181610ef101528181611705015281816117fd01528181611b6701528181611dd4015281816122c2015281816133c30152818161393f0152613cf2015260a051818181610a780152612f4f015260c051818181610e6e01528181611ab1015281816132ba015281816137bf0152613bbf015260e0518181816104d001528181610521015281816108ec01528181610e0f01528181611c8101528181611e1a015281816121380152818161220d0152818161279a015281816128230152818161297701528181613398015281816133f0015281816136110152818161370201528181613c8e01528181613cbe0152613eac015261010051818181610542015281816123b1015281816124c90152818161257d01528181612844015261375e015261012051818181610d1201526125c1015261014051818181610b010152610cc201526101605181818161050001528181610bef015281816124a701528181612802015261378c0152f35b90506020813d6020116103e2575b816103c760209383610454565b810103126103de576103d89061048b565b5f61022e565b5f80fd5b3d91506103ba565b6040513d5f823e3d90fd5b63d92e233d60e01b5f5260045ffd5b505f6101ed565b9050155f6101e5565b6001600160a01b0383161591506101de565b1591505f6101d6565b1592505f6101ce565b1593505f6101c6565b631e4fbdf760e01b5f525f60045260245ffd5b601f909101601f19168101906001600160401b0382119082101761047757604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036103de5756fe60806040526004361015610011575f80fd5b5f803560e01c80620d15e214612aa657806304cada1f14612a5e5780630bf3fd2f146128ec5780631fa2ca501461268d578063298278261461266c5780632e99d9381461264f57806337d1204a14612632578063388f6064146125f0578063398fc86b146125ac5780633e413bee146125685780633f88d862146121675780633fc8cef31461212357806340a2f4e5146120eb578063451a135414611d5857806362c0676714611c1e578063715018a614611bce57806373c1b91d14611b96578063791b98bc14611b5257806379ba509714611ae05780637c887c5914611a9c5780638b41e67914611a7f5780638d1694fd14611a025780638da5cb5b146119db5780638e8f294b1461194c5780639d193cd41461192f5780639eec44221461190c578063a13c2930146118d4578063a619ace81461189c578063aa9dc14b14611850578063ac4ff7c01461167d578063ac81391614610c13578063b85c470d14610bd3578063b8d5c21514610b30578063be46251f14610aeb578063bf08be3314610acd578063c1057ab414610aa7578063c31c9c0714610a62578063c4bdd78514610a29578063d1b812cd146109fc578063d1b9e8531461095a578063d6ae6e4414610783578063ddd4a13e1461074a578063e30c397814610721578063e820c8d214610659578063e8cf86081461061a578063ed34ee7714610314578063eea4a5c0146102f1578063f2fde38b146102845763fc3cd29a14610234575f80fd5b3461028157602036600319011261028157602090610279906001600160a01b0361025c612b4a565b1681526006835260409020600101546001600160a01b03166136e2565b604051908152f35b80fd5b50346102815760203660031901126102815761029e612b4a565b6102a6612eec565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5034610281578060031936011261028157602062ffffff60035416604051908152f35b50346102815760803660031901126102815761032e612b4a565b60243590604435916064359060018060a01b0385541633141580610603575b6105f057610359612eff565b6001600160a01b03838116808752600660205260408720805491949092909116156105dc5782156105cd5761271081116105cd57838752600e60205260408720548084116105b657836103ab91612be1565b848852600e602052604088205586602060018060a01b03845416604460405180948193637cbc237360e01b8352896004840152600160248401525af19081156105ab578891610575575b50806104fa5750865b876104c15780965b8088106104a957505091604096916104516127106104457f5075ef60d7f7067af9cf7369968d13f49152324fb8520194ef5e0012bf52977b968a612ed9565b04968761049a57613150565b80610489575b50506104698587895194859485612d1a565b0390a260015f805160206142b68339815191525582519182526020820152f35b61049291613b9b565b505f80610457565b6104a48888613095565b613150565b6313a30a9560e11b8252600488905260245260449150fd5b6104f48862ffffff60035416887f0000000000000000000000000000000000000000000000000000000000000000612f37565b96610406565b61056f907f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612f37565b966103fe565b90506020813d6020116105a3575b8161059060209383612c99565b8101031261059f57515f6103f5565b5f80fd5b3d9150610583565b6040513d8a823e3d90fd5b63de5ce41960e01b88526004849052602452604487fd5b631f2a200560e01b8752600487fd5b632464ae5360e11b87526004849052602487fd5b63ccf79b6760e01b855233600452602485fd5b50338552600f60205260ff6040862054161561034d565b50346102815760203660031901126102815760209060ff906040906001600160a01b03610645612b4a565b168152600f84522054166040519015158152f35b503461028157806003193601126102815760405160078054808352908352602082019081907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890855b81811061070257505050826106b8910383612c99565b604051928392602084019060208552518091526040840192915b8181106106e0575050500390f35b82516001600160a01b03168452859450602093840193909201916001016106d2565b82546001600160a01b03168452602090930192600192830192016106a2565b50346102815780600319360112610281576001546040516001600160a01b039091168152602090f35b5034610281576020366003190112610281576020906040906001600160a01b03610772612b4a565b168152600983522054604051908152f35b50346102815760203660031901126102815761079d612b4a565b6107a5612eff565b6001600160a01b03908116808352600660205260408320805491929091161561094657600301805460101c6001600160a01b03163381900361092d5750818352600860205260408320549180845260096020526040842054918315808091610925575b6109165760408684829852600860205280828120558481526009602052808281205561083687600c54612be1565b600c55848152600d6020522061084d858254612be1565b9055156108d3575b826108b4575b60018060a01b03905460101c16907fb09c03188c25eacb7a7bd579b1f9880329bc5336a7b2acaad2f6624ef107bd1e858051868152856020820152a360015f805160206142b68339815191525582519182526020820152f35b80546108ce90849060101c6001600160a01b031684613111565b61085b565b805461091190859060101c6001600160a01b03908116907f000000000000000000000000000000000000000000000000000000000000000016613111565b610855565b6312d37ee560e31b8652600486fd5b508315610808565b60016223c24760e11b0319845233600452602452604483fd5b632464ae5360e11b83526004829052602483fd5b503461028157604036600319011261028157610974612b4a565b60243590811515908183036109f85761098b612eec565b6001600160a01b03169182156109e9577f8dd62d4e1f60b96148552898e743aa2b571686baa26f4f1b647565dc3996c1a7916109df602092858752600f8452604087209060ff801983541691151516179055565b604051908152a280f35b63d92e233d60e01b8452600484fd5b8380fd5b503461028157806003193601126102815760055460405160109190911c6001600160a01b03168152602090f35b5034610281576020366003190112610281576020906040906001600160a01b03610a51612b4a565b168152600883522054604051908152f35b50346102815780600319360112610281576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610281578060031936011261028157602062ffffff60055460b01c16604051908152f35b50346102815780600319360112610281576020600c54604051908152f35b50346102815780600319360112610281576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461028157606036600319011261028157600435610b4d612b60565b90604435908160020b808303610bcf57610b65612eec565b848215918215610bc1575b8215610bb6575b5050610ba75760025562ffffff6003549160181b65ffffff0000001692169065ffffffffffff1916171760035580f35b631f2a200560e01b8452600484fd5b13159050845f610b77565b62ffffff8616159250610b70565b8480fd5b5034610281578060031936011261028157602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461059f57608036600319011261059f576004356001600160401b03811161059f57610c44903690600401612bb4565b90916024356001600160401b03811161059f57610c65903690600401612bb4565b9093906044356001600160401b03811161059f57610c87903690600401612bb4565b9190926064359560018060a01b03871680970361059f57610ca6612eff565b60405163a2f5596760e01b8152600481018890526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611616575f91611643575b5015611630576e5af43d82803e903d91602b57fd5bf37f0000000000000000000000000000000000000000000000000000000000000000763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c16175f5260781b17602052603760095ff06001600160a01b03811698909590891561162157600254918a3b1561059f57610db196610dc3610dd5935f986040519a8b998a9963b2ecc0e160e01b8b5260a060048c015260a48b0191612dbc565b8881036003190160248a015291612dbc565b85810360031901604487015291612dbc565b903060648401526084830152038183895af1801561161657611601575b50838252600660205260408220546001600160a01b03166115ed577f0000000000000000000000000000000000000000000000000000000000000000936001600160a01b03851681109182156115e75794915b6003546040516322afcccb60e01b815262ffffff821660048201819052909490916020866024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9586156115dc57879661158e575b5085610ebb81610ec09360181c60020b613f5b565b613f91565b948315611564578060020b801561155057610ee1919062030d3f1905613f91565b91610eed839684612df9565b955b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169360020b60ff81901d8082011890620d89e8821161153e57600160801b7001fffcb933bd6fad37aa2d162d1a594001600184160218918a919060028116611522575b60048116611506575b600881166114ea575b601081166114ce575b602081166114b2575b60408116611496575b6080811661147a575b610100811661145e575b6102008116611442575b6104008116611426575b610800811661140a575b61100081166113ee575b61200081166113d2575b61400081166113b6575b618000811661139a575b62010000811661137e575b620200008116611363575b620400008116611348575b6208000016611330575b13611328575b6040516309f56ab160e11b81526001600160a01b039b8c1660048201819052948c1660248201819052604482019490945263ffffffff91909101602090811c909b166064820152998a6084818b885af19687156105ab5788999a8997986112d2575b509161110b93916080959361108c600254868c613aa6565b87156112c6576002549189935b62ffffff6003541690604051966110af88612c62565b87526020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af19182156112bb578592611287575b506040519361112b85612c7e565b8685526001600160a01b039081166020808701828152604080890187815260608a01968752600160808b018181523360a08d019081528b8e526006909652928c209a518b549088166001600160a01b0319918216178c559351908b0180549190971693169290921790945551600288015592516003909601805460ff191696151560ff169690961786559491905182549151610100600160b01b031990921690151560081b61ff00161760109190911b62010000600160b01b031617905560075494600160401b8610156112735761120b86600160409801600755612b72565b81549060031b9085821b9160018060a01b03901b19161790558551918483526020830152827f71ab13a7d0b6a0937ce9c0fd647028927024713a7113b5eb994d613e4d72d288873394a460015f805160206142b6833981519152558351925082526020820152f35b634e487b7160e01b85526041600452602485fd5b6112aa91925060803d6080116112b4575b6112a28183612c99565b810190612e17565b505050905f61111d565b503d611298565b6040513d87823e3d90fd5b60025491899293611099565b9192939495965097506020813d602011611320575b816112f460209383612c99565b8101031261131c579261110b9289969592611310608096612d36565b99919395509193611074565b8880fd5b3d91506112e7565b5f1904611012565b916b048a170391f7dc42444e8fa20260801c9161100c565b6d2216e584f5fa1ea926041bedfe9890930260801c92611002565b926e5d6af8dedb81196699c329225ee6040260801c92610ff7565b926f09aa508b5b7a84e1c677de54f3e99bc90260801c92610fec565b926f31be135f97d08fd981231505542fcfa60260801c92610fe1565b926f70d869a156d2a1b890bb3df62baf32f70260801c92610fd7565b926fa9f746462d870fdf8a65dc1f90e061e50260801c92610fcd565b926fd097f3bdfd2022b8845ad8f792aa58250260801c92610fc3565b926fe7159475a2c29b7443b29c7fa6e889d90260801c92610fb9565b926ff3392b0822b70005940c7a398e4b70f30260801c92610faf565b926ff987a7253ac413176f2b074cf7815e540260801c92610fa5565b926ffcbe86c7900a88aedcffc83b479aa3a40260801c92610f9b565b926ffe5dee046a99a2a811c461f1969c30530260801c92610f91565b926fff2ea16466c96a3843ec78b326b528610260801c92610f88565b926fff973b41fa98c081472e6896dfb254c00260801c92610f7f565b926fffcb9843d60f6159c9db58835c9266440260801c92610f76565b926fffe5caca7e10e4e61c3624eaa0941cd00260801c92610f6d565b926ffff2e50f5f656932ef12357cf3c7fdcc0260801c92610f64565b926ffff97272373d413259a46990580e213a0260801c92610f5b565b6345c3193d60e11b8a52600452602489fd5b634e487b7160e01b88526012600452602488fd5b8060020b8015611550579061157d9162030d4005613f91565b91611589839684612ddc565b610eef565b9098979695506020813d6020116115d4575b816115ad60209383612c99565b810103126115d057610ebb959697986115c8610ec092612d4a565b965090610ea6565b8580fd5b3d91506115a0565b6040513d89823e3d90fd5b91610e45565b631cd614bf60e21b82526004849052602482fd5b61160e9192505f90612c99565b5f905f610df2565b6040513d5f823e3d90fd5b63b06ebf3d60e01b5f5260045ffd5b866363544aa960e01b5f5260045260245ffd5b90506020813d602011611675575b8161165e60209383612c99565b8101031261059f5761166f90612daf565b5f610cfa565b3d9150611651565b3461059f57608036600319011261059f57600435611699612b9e565b6116a1612eec565b6116a9612eff565b6001600160801b0316806117b1575b50611700604080516116c981612c47565b8381523060208201526001600160801b038282018190526060820152815163fc6f786560e01b815292839182919060048301612d6c565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611616577f4c3d23f4b0edde833cd41eed293a18401cc8c74f41aaa1889f89e75d05abf994916040915f915f91611782575b5082519182526020820152a260015f805160206142b683398151915255005b90506117a49150823d84116117aa575b61179c8183612c99565b810190612cbc565b85611763565b503d611792565b604080516117f8926117c282612c18565b8482526020820152604435828201526064356060820152426080820152815180938192630624e65f60e11b835260048301612cd2565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561161657156116b85761184a9060403d6040116117aa5761179c8183612c99565b506116b8565b3461059f57602036600319011261059f577f108bc1374c20c702ecd957d46bb96e67c99a7f411fe9eae95b80a929d5cd67f2602060043561188f612eec565b80600455604051908152a1005b3461059f57602036600319011261059f576001600160a01b036118bd612b4a565b165f52600d602052602060405f2054604051908152f35b3461059f57602036600319011261059f576001600160a01b036118f5612b4a565b165f52600a602052602060405f2054604051908152f35b3461059f575f36600319011261059f57602060035460181c60020b604051908152f35b3461059f575f36600319011261059f576020600254604051908152f35b3461059f57602036600319011261059f576001600160a01b0361196d612b4a565b165f52600660205260c060405f2060018060a01b038154169060018060a01b036001820154169060036002820154910154916040519384526020840152604083015260ff81161515606083015260ff8160081c161515608083015260018060a01b039060101c1660a0820152f35b3461059f575f36600319011261059f575f546040516001600160a01b039091168152602090f35b3461059f57602036600319011261059f5760043561ffff811680910361059f57611a2a612eec565b6127108111611a6d576020817f78fcb693de6636b8f518fc276c4dbe4535ce5d8cb0f5212f2ac6d7f965f93c519261ffff196005541617600555604051908152a1005b635afd6e4360e01b5f5260045260245ffd5b3461059f575f36600319011261059f576020600b54604051908152f35b3461059f575f36600319011261059f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461059f575f36600319011261059f57600154336001600160a01b0390911603611b3f57600180546001600160a01b03199081169091555f805433928116831782556001600160a01b0316905f805160206142968339815191529080a3005b63118cdaa760e01b5f523360045260245ffd5b3461059f575f36600319011261059f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461059f57602036600319011261059f576001600160a01b03611bb7612b4a565b165f52600e602052602060405f2054604051908152f35b3461059f575f36600319011261059f57611be6612eec565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03165f805160206142968339815191528280a3005b3461059f57606036600319011261059f57611c37612b4a565b6024356001600160a01b0381169182820361059f5760443590611c58612eec565b8315611d49576001600160a01b039081165f8181526006602052604090205490939116611d36577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381168414611cea575b5081611ce17f7b09c29f9106defeccc9ac3b823f3aad0b470d120e5df7aed033b5c43a4bf7189360209386613111565b604051908152a3005b611cf381613150565b600c548091115f14611d2e57611d0b611d1092613150565b612be1565b80831115611cb1578263f278b92160e01b5f5260045260245260445ffd5b50505f611d10565b82631cd614bf60e21b5f5260045260245ffd5b63d92e233d60e01b5f5260045ffd5b3461059f57602036600319011261059f57611d71612b4a565b5f546001600160a01b0316331415806120d4575b6120c157611d91612eff565b6001600160a01b038181165f818152600660205260409020805490939216156120af5760028301805460405163133f757160e31b815260048101829052949193907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661018087602481845afa968715611616575f97611ff1575b50611e757f000000000000000000000000000000000000000000000000000000000000000092611e6e611e64611e4986613150565b611e5b611e5589613150565b946138f3565b611d0b87613150565b91611d0b87613150565b9085613992565b611e7e82613150565b966001600160801b031680611f46575b505090611eaf602096611d0b5f805160206142568339815191529594613150565b90845f52600d8752611ec560405f205491613150565b9080821115611f3e57611ed791612be1565b80611f295750611efc5f9586935b8380611f18575b5050549160405193849384612c02565b0390a260015f805160206142b683398151915255604051908152f35b611f2191613296565b508883611eec565b611f36611efc9184613b9b565b958693611ee5565b50505f611ed7565b611f945f9260409289979695975490845191611f6183612c18565b8252602082015284848201528460608201524260808201528351948580948193630624e65f60e11b835260048301612cd2565b03925af196871561161657611d0b5f8051602061425683398151915295611eaf9360209a611fd3575b50611fc889546138f3565b939495505096611e8e565b611feb9060403d6040116117aa5761179c8183612c99565b50611fbd565b909650610180813d82116120a7575b8161200e6101809383612c99565b8101031261059f5780516001600160601b0381160361059f5761203360208201612d36565b5061204060408201612d36565b5061204d60608201612d36565b50608081015162ffffff81160361059f5761206a60a08201612d4a565b5061207760c08201612d4a565b5061209f61016061208a60e08401612d58565b926120986101408201612d58565b5001612d58565b509587611e14565b3d9150612000565b632464ae5360e11b5f5260045260245ffd5b63ccf79b6760e01b5f523360045260245ffd5b50335f52600f60205260ff60405f20541615611d85565b3461059f57602036600319011261059f576001600160a01b0361210c612b4a565b165f526010602052602060405f2054604051908152f35b3461059f575f36600319011261059f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461059f57606036600319011261059f57612180612b4a565b612188612b9e565b906044359060018060a01b035f541633141580612551575b6120c1576121ac612eff565b6001600160a01b038181165f81815260066020526040812080549096919592949293161561253e576001600160801b031690811561252f5760018601546121fb906001600160a01b03166136e2565b6004549081811061251b5750506122bd7f00000000000000000000000000000000000000000000000000000000000000009261223684613150565b61227161224285613150565b61226a61226060028d019461225786546138f3565b611d0b8a613150565b91611d0b88613150565b9086613992565b604061227c86613150565b9282549082519161228c83612c18565b825260208201525f828201525f6060820152426080820152815180958192630624e65f60e11b835260048301612cd2565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156116165761231093612307926124fd575b50546138f3565b611d0b84613150565b9182806124a15750505f925b80841061248b57508261239b575b906020955f805160206142768339815191529392855f52600d885261235360405f205491613150565b90808211156123925761236591612be1565b905b81612380575050611efc5f5b8660405194859485612d1a565b611efc9161238d91613b9b565b612373565b50505f90612367565b85545f95506123d59084906001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000613aa6565b8554604051630d9778e560e11b815260048101859052600160248201529560209187916044918391906001600160a01b03165af1948515611616575f95612450575b50906020955f80516020614276833981519152939286865f52600e895261244360405f20918254612d0d565b905591929350955061232a565b92919094506020833d602011612483575b8161246e60209383612c99565b8101031261059f579151939091906020612417565b3d9150612461565b836313a30a9560e11b5f5260045260245260445ffd5b6124f7917f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690612f37565b9261231c565b6125159060403d6040116117aa5761179c8183612c99565b50612300565b6213e1ab60e51b5f5260045260245260445ffd5b631f2a200560e01b5f5260045ffd5b83632464ae5360e11b5f5260045260245ffd5b50335f52600f60205260ff60405f205416156121a0565b3461059f575f36600319011261059f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461059f575f36600319011261059f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461059f57602036600319011261059f5760043560075481101561059f57612619602091612b72565b905460405160039290921b1c6001600160a01b03168152f35b3461059f575f36600319011261059f576020600754604051908152f35b3461059f575f36600319011261059f576020600454604051908152f35b3461059f575f36600319011261059f57602061ffff60055416604051908152f35b3461059f57606036600319011261059f576126a6612b4a565b6024356044359160018060a01b035f5416331415806128d5575b6120c1576126cc612eff565b6001600160a01b039081165f81815260066020526040902080549192909116156128c257821561252f57815f52600e60205260405f2054938484116128aa57612716845f96612be1565b838652600e6020526040862055602060018060a01b03835416604460405180988193637cbc237360e01b8352896004840152600160248401525af1948515611616575f95612876575b50846127fc575f5b8181106127e75750506020937f65328af737ef86688c09b113e0eef5f0a2fc646ddfa33da808b36021c9e7aef5916127be7f0000000000000000000000000000000000000000000000000000000000000000613150565b806127d85750505f935b611efc8560405193849384612c02565b6127e191613296565b936127c8565b6313a30a9560e11b5f5260045260245260445ffd5b612871857f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612f37565b612767565b9094506020813d6020116128a2575b8161289260209383612c99565b8101031261059f5751938561275f565b3d9150612885565b50505063de5ce41960e01b5f5260045260245260445ffd5b50632464ae5360e11b5f5260045260245ffd5b50335f52600f60205260ff60405f205416156126c0565b3461059f57604036600319011261059f5760043560243560018060a01b035f541633141580612a47575b6120c157612922612eff565b600554601081901c6001600160a01b0316908115612a3857831561252f57600b54808511612a22579162ffffff859261295e8461299b96612be1565b600b5561296d84600c54612be1565b600c5560b01c16907f0000000000000000000000000000000000000000000000000000000000000000612f37565b90808210612a0c57507f39bde8339ff3dbefd5361a79319d311700551267327178299f24925b163efae3816020936129e08260018060a01b0360055460101c16613095565b6129f08260405193849384612c02565b0390a160015f805160206142b683398151915255604051908152f35b906313a30a9560e11b5f5260045260245260445ffd5b846309f2437360e11b5f5260045260245260445ffd5b6345cf7c6960e01b5f5260045ffd5b50335f52600f60205260ff60405f20541615612916565b3461059f57602036600319011261059f5760406001600160a01b03612a81612b4a565b16805f526008602052815f2054905f526009602052815f205482519182526020820152f35b3461059f57604036600319011261059f57612abf612b4a565b612ac7612b60565b90612ad0612eec565b62ffffff821691821561252f576005805462010000600160c81b031916601084901b62010000600160b01b03161760b09290921b62ffffff60b01b169190911790556040519182526001600160a01b0316907ffeb92d7b096f4dae7e0c63c9819182f5d8219382b275b3f55696916bbe08bff890602090a2005b600435906001600160a01b038216820361059f57565b6024359062ffffff8216820361059f57565b600754811015612b8a5760075f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b602435906001600160801b038216820361059f57565b9181601f8401121561059f578235916001600160401b03831161059f576020838186019501011161059f57565b91908203918211612bee57565b634e487b7160e01b5f52601160045260245ffd5b6040919493926060820195825260208201520152565b60a081019081106001600160401b03821117612c3357604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117612c3357604052565b61016081019081106001600160401b03821117612c3357604052565b60c081019081106001600160401b03821117612c3357604052565b601f909101601f19168101906001600160401b03821190821017612c3357604052565b919082604091031261059f576020825192015190565b91909160808060a083019480518452600180831b03602082015116602085015260408101516040850152606081015160608501520151910152565b91908201809211612bee57565b9094939260609260808301968352602083015260408201520152565b51906001600160a01b038216820361059f57565b51908160020b820361059f57565b51906001600160801b038216820361059f57565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5190811515820361059f57565b908060209392818452848401375f828201840152601f01601f1916010190565b600291820b910b0390627fffff198212627fffff831317612bee57565b9060020b9060020b0190627fffff198212627fffff831317612bee57565b919082608091031261059f57815191612e3260208201612d58565b916060604083015192015190565b9190916101408061016083019460018060a01b03815116845260018060a01b03602082015116602085015262ffffff6040820151166040850152606081015160020b6060850152608081015160020b608085015260a081015160a085015260c081015160c085015260e081015160e085015261010081015161010085015260018060a01b03610120820151166101208501520151910152565b81810292918115918404141715612bee57565b5f546001600160a01b03163303611b3f57565b60025f805160206142b68339815191525414612f285760025f805160206142b683398151915255565b633ee5aeb560e01b5f5260045ffd5b92919092821561308d576001600160a01b03908116927f000000000000000000000000000000000000000000000000000000000000000090911690612f7d818386613aa6565b612f8685613150565b60405190949060e081016001600160401b03811182821017612c335760409081529181526001600160a01b03878116602083810191825262ffffff978816848601908152306060860190815260808601978852600160a087019081525f60c0880181815298516304e45aaf60e01b81529751871660048901529451861660248801529151909916604486015297518316606485015294516084840152955160a4830152915190911660c4820152929091839160e4918391905af180156116165761305b575b50611d0b61305892613150565b90565b6020813d602011613085575b8161307460209383612c99565b8101031261059f5750611d0b61304b565b3d9150613067565b505050505f90565b906040519063a9059cbb60e01b5f5261dead60045260245260205f60448180865af19060015f51148216156130f0575b604052156130d05750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661310857823b15153d151616906130c5565b503d5f823e3d90fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156130f057604052156130d05750565b6040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa908115611616575f9161318a575090565b90506020813d6020116131b1575b816131a560209383612c99565b8101031261059f575190565b3d9150613198565b519061ffff8216820361059f57565b908160e091031261059f5780516001600160a01b038116810361059f57916131f260208301612d4a565b916131ff604082016131b9565b9161320c606083016131b9565b91613219608082016131b9565b9160a082015160ff8116810361059f5760c0613058919301612daf565b9081606091031261059f5761324a81612d58565b916040602083015192015190565b91909160a08060c083019480518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b6003546040516322afcccb60e01b815262ffffff82166004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611616575f916136a6575b6001840154604051633850c7bd60e01b8152935060e090849060049082906001600160a01b03165afa928315611616575f9361365e575b5061334182610ebb8161337a9460181c60020b613f5b565b92600385019260ff84541694855f146136375761337561336e8361336981610ebb8189613f5b565b612ddc565b9182612ddc565b613fa8565b9190925f146135fc576001600160a01b0361339485614057565b16917f0000000000000000000000000000000000000000000000000000000000000000905b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116959061341590899088907f000000000000000000000000000000000000000000000000000000000000000016613aa6565b835460ff16156135f3575f9288945b6001600160a01b036134358a614057565b165f52601060205260405f205480613533575b505092608095926134da95925f99989562ffffff60035416906040519661346e88612c62565b60018060a01b0316875260018060a01b03166020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af1918215611616575f9261350f575b506001600160a01b03906134ff90614057565b165f52601060205260405f205590565b61352991925060803d6080116112b4576112a28183612c99565b505050905f6134ec565b606061357f916040519061354682612c7e565b81528760208201528860408201525f828201525f60808201524260a08201526040518093819263219f5d1760e01b835260048301613258565b03815f8d5af191825f925f946135bb575b5061359b5750613448565b975098509850505050505060ff915054165f146135b6575090565b905090565b9093506135e191925060603d6060116135ec575b6135d98183612c99565b810190613236565b92915091925f613590565b503d6135cf565b87925f94613424565b6001600160a01b0361360d85614057565b16917f000000000000000000000000000000000000000000000000000000000000000092906133b9565b6136586136518361364c81610ebb8189613f5b565b612df9565b9182612df9565b90613fa8565b61337a91935082610ebb8161368d6133419460e03d60e01161369f575b6136858183612c99565b8101906131c8565b50505050509050969450505050613329565b503d61367b565b90506020823d6020116136da575b816136c160209383612c99565b8101031261059f576136d4600492612d4a565b906132f2565b3d91506136b4565b6040516370a0823160e01b81526001600160a01b039182166004820152907f000000000000000000000000000000000000000000000000000000000000000016602082602481845afa918215611616575f926138bf575b5081156138b957604051630b4c774160e11b8152600481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830181905262ffffff7f00000000000000000000000000000000000000000000000000000000000000001660448401529190602090829060649082907f0000000000000000000000000000000000000000000000000000000000000000165afa908115611616575f9161387a575b50604051633850c7bd60e01b81529060e090829060049082906001600160a01b03165afa908115611616575f91613855575b506001600160a01b031691106138435761383e81613058936141af565b6141af565b6138508161305893614150565b614150565b61386e915060e03d60e01161369f576136858183612c99565b5050505050505f613821565b90506020813d6020116138b1575b8161389560209383612c99565b8101031261059f5760e06138aa600492612d36565b91506137ef565b3d9150613888565b50505f90565b9091506020813d6020116138eb575b816138db60209383612c99565b8101031261059f5751905f613739565b3d91506138ce565b6040805161393a9261390482612c47565b81523060208201526001600160801b038282018190526060820152815163fc6f786560e01b815292839182919060048301612d6c565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611616576139765750565b61398e9060403d6040116117aa5761179c8183612c99565b5050565b9091821580613a9e575b613a99577f02a6ea472aeabcfff55c126e437d0b1734121e091e5180d3d41f6778cd24f0c291613a9461ffff60055416916127106139e6816139de868a612ed9565b049486612ed9565b04936139f28488612be1565b90613a6c613a008783612be1565b9360018060a01b031698895f52600860205260405f20613a21888254612d0d565b9055895f52600960205260405f20613a3a898254612d0d565b9055613a4884600b54612d0d565b600b55895f52600a60205260405f20613a62868254612d0d565b9055600c54612d0d565b600c55875f52600d602052613a8660405f20918254612d0d565b905560405194859485612d1a565b0390a2565b505050565b50801561399c565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f5114821615613b8c575b60405215613aeb57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f5114821615613b74575b60405215613b56576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f51148216156130f057604052156130d05750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b90600181151661310857843b15153d15161690613b18565b90843b15153d15161690613ade565b6003546040516322afcccb60e01b815262ffffff82166004820152916020836024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315611616575f93613f1f575b506001810154604051633850c7bd60e01b81529060e090829060049082906001600160a01b03165afa9283156116165784915f94613ee7575b5081610ebb613c7093613c489360181c60020b613f5b565b92600383019460ff86541694855f14613ed2576136586136518361364c81610ebb8189613f5b565b9190925f14613e97576001600160a01b03613c8a82614057565b16917f0000000000000000000000000000000000000000000000000000000000000000905b6001600160a01b0382811692907f0000000000000000000000000000000000000000000000000000000000000000168303613e91575083945b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811696613d22918a91899116613aa6565b865460ff1615613e83578792613d8260025f965b019860608a5460405190613d4982612c7e565b81528760208201528860408201525f828201525f60808201524260a08201526040518094819263219f5d1760e01b835260048301613258565b03815f8d5af190815f935f93613e5b575b5061359b575050509260809592613e2395925f99989562ffffff600354169060405196613dbf88612c62565b60018060a01b031687526020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af1918215611616575f92613e3957505590565b613e5391925060803d6080116112b4576112a28183612c99565b505050905590565b909250613e7891935060603d6060116135ec576135d98183612c99565b93915092915f613d93565b5f92613d8260028a96613d36565b94613ce8565b6001600160a01b03613ea882614057565b16917f00000000000000000000000000000000000000000000000000000000000000009290613caf565b61337561336e8361336981610ebb8189613f5b565b613c4891945091610ebb81613f0d613c709560e03d60e01161369f576136858183612c99565b50505050509050969350935050613c30565b9092506020813d602011613f53575b81613f3b60209383612c99565b8101031261059f57613f4c90612d4a565b915f613bf7565b3d9150613f2e565b60020b9060020b908115613f7d57627fffff1981145f19831416612bee570590565b634e487b7160e01b5f52601260045260245ffd5b9060020b9060020b02908160020b918203612bee57565b91939290938060020b908115613f7d57613fd790613fcc8184620d89e71905613f91565b92620d89e805613f91565b908060020b90818560020b1261404f575b8260020b91828660020b13614046575b8760020b1261403e575b508560020b13614036575b508360020b8260020b121561402157509190565b632ff9b42b60e11b5f5260020b60045260245ffd5b93505f61400d565b95505f614002565b94508294613ff8565b935083613fe8565b602060049160ff6003820154165f146140e15760010154604051630dfe168160e01b815292839182906001600160a01b03165afa908115611616575f916140a7575b505b6001600160a01b031690565b90506020813d6020116140d9575b816140c260209383612c99565b8101031261059f576140d390612d36565b5f614099565b3d91506140b5565b6001015460405163d21220a760e01b815292839182906001600160a01b03165afa908115611616575f91614116575b5061409b565b90506020813d602011614148575b8161413160209383612c99565b8101031261059f5761414290612d36565b5f614110565b3d9150614124565b5f91905f1982820991808202938480851094039380850394146141a557600160601b8410156141935750600160601b910990828211900360a01b910360601c1790565b634e487b71905260116020526024601cfd5b5050505060601c90565b5f19600160601b8209918160601b918280851094039380850394146142485783821115614230578190600160601b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5091508115613f7d57049056fe503d77b4922108370170aa310e56a811abc33e1232715a821e609161f2557ff4e7d9801d1d042469575a53334cb3601a4d973e612b19b1d06b1ed01606e725ff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220eab28deceb8f019f85d95877e4fba81dfcabae7e0e3ff1160a10ca8524d5fb1264736f6c634300081a003300000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3000000000000000000000000caf681a66d020601342297493863e78c959e5cb20000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16800000000000000000000000012c7afa0397a42e61fcec06c65ac816276ef5f1c000000000000000000000000c96c76898d2642a7c57d0f7676acb9409e00504c00000000000000000000000000000000000000000000000000000000000001f400000000000000000000000086bbc9a578397c80a55063a8c3b2897fa9986582
0x60806040526004361015610011575f80fd5b5f803560e01c80620d15e214612aa657806304cada1f14612a5e5780630bf3fd2f146128ec5780631fa2ca501461268d578063298278261461266c5780632e99d9381461264f57806337d1204a14612632578063388f6064146125f0578063398fc86b146125ac5780633e413bee146125685780633f88d862146121675780633fc8cef31461212357806340a2f4e5146120eb578063451a135414611d5857806362c0676714611c1e578063715018a614611bce57806373c1b91d14611b96578063791b98bc14611b5257806379ba509714611ae05780637c887c5914611a9c5780638b41e67914611a7f5780638d1694fd14611a025780638da5cb5b146119db5780638e8f294b1461194c5780639d193cd41461192f5780639eec44221461190c578063a13c2930146118d4578063a619ace81461189c578063aa9dc14b14611850578063ac4ff7c01461167d578063ac81391614610c13578063b85c470d14610bd3578063b8d5c21514610b30578063be46251f14610aeb578063bf08be3314610acd578063c1057ab414610aa7578063c31c9c0714610a62578063c4bdd78514610a29578063d1b812cd146109fc578063d1b9e8531461095a578063d6ae6e4414610783578063ddd4a13e1461074a578063e30c397814610721578063e820c8d214610659578063e8cf86081461061a578063ed34ee7714610314578063eea4a5c0146102f1578063f2fde38b146102845763fc3cd29a14610234575f80fd5b3461028157602036600319011261028157602090610279906001600160a01b0361025c612b4a565b1681526006835260409020600101546001600160a01b03166136e2565b604051908152f35b80fd5b50346102815760203660031901126102815761029e612b4a565b6102a6612eec565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5034610281578060031936011261028157602062ffffff60035416604051908152f35b50346102815760803660031901126102815761032e612b4a565b60243590604435916064359060018060a01b0385541633141580610603575b6105f057610359612eff565b6001600160a01b03838116808752600660205260408720805491949092909116156105dc5782156105cd5761271081116105cd57838752600e60205260408720548084116105b657836103ab91612be1565b848852600e602052604088205586602060018060a01b03845416604460405180948193637cbc237360e01b8352896004840152600160248401525af19081156105ab578891610575575b50806104fa5750865b876104c15780965b8088106104a957505091604096916104516127106104457f5075ef60d7f7067af9cf7369968d13f49152324fb8520194ef5e0012bf52977b968a612ed9565b04968761049a57613150565b80610489575b50506104698587895194859485612d1a565b0390a260015f805160206142b68339815191525582519182526020820152f35b61049291613b9b565b505f80610457565b6104a48888613095565b613150565b6313a30a9560e11b8252600488905260245260449150fd5b6104f48862ffffff60035416887f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73612f37565b96610406565b61056f907f00000000000000000000000000000000000000000000000000000000000001f47f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad737f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316612f37565b966103fe565b90506020813d6020116105a3575b8161059060209383612c99565b8101031261059f57515f6103f5565b5f80fd5b3d9150610583565b6040513d8a823e3d90fd5b63de5ce41960e01b88526004849052602452604487fd5b631f2a200560e01b8752600487fd5b632464ae5360e11b87526004849052602487fd5b63ccf79b6760e01b855233600452602485fd5b50338552600f60205260ff6040862054161561034d565b50346102815760203660031901126102815760209060ff906040906001600160a01b03610645612b4a565b168152600f84522054166040519015158152f35b503461028157806003193601126102815760405160078054808352908352602082019081907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68890855b81811061070257505050826106b8910383612c99565b604051928392602084019060208552518091526040840192915b8181106106e0575050500390f35b82516001600160a01b03168452859450602093840193909201916001016106d2565b82546001600160a01b03168452602090930192600192830192016106a2565b50346102815780600319360112610281576001546040516001600160a01b039091168152602090f35b5034610281576020366003190112610281576020906040906001600160a01b03610772612b4a565b168152600983522054604051908152f35b50346102815760203660031901126102815761079d612b4a565b6107a5612eff565b6001600160a01b03908116808352600660205260408320805491929091161561094657600301805460101c6001600160a01b03163381900361092d5750818352600860205260408320549180845260096020526040842054918315808091610925575b6109165760408684829852600860205280828120558481526009602052808281205561083687600c54612be1565b600c55848152600d6020522061084d858254612be1565b9055156108d3575b826108b4575b60018060a01b03905460101c16907fb09c03188c25eacb7a7bd579b1f9880329bc5336a7b2acaad2f6624ef107bd1e858051868152856020820152a360015f805160206142b68339815191525582519182526020820152f35b80546108ce90849060101c6001600160a01b031684613111565b61085b565b805461091190859060101c6001600160a01b03908116907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316613111565b610855565b6312d37ee560e31b8652600486fd5b508315610808565b60016223c24760e11b0319845233600452602452604483fd5b632464ae5360e11b83526004829052602483fd5b503461028157604036600319011261028157610974612b4a565b60243590811515908183036109f85761098b612eec565b6001600160a01b03169182156109e9577f8dd62d4e1f60b96148552898e743aa2b571686baa26f4f1b647565dc3996c1a7916109df602092858752600f8452604087209060ff801983541691151516179055565b604051908152a280f35b63d92e233d60e01b8452600484fd5b8380fd5b503461028157806003193601126102815760055460405160109190911c6001600160a01b03168152602090f35b5034610281576020366003190112610281576020906040906001600160a01b03610a51612b4a565b168152600883522054604051908152f35b50346102815780600319360112610281576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b5034610281578060031936011261028157602062ffffff60055460b01c16604051908152f35b50346102815780600319360112610281576020600c54604051908152f35b50346102815780600319360112610281576040517f000000000000000000000000c96c76898d2642a7c57d0f7676acb9409e00504c6001600160a01b03168152602090f35b503461028157606036600319011261028157600435610b4d612b60565b90604435908160020b808303610bcf57610b65612eec565b848215918215610bc1575b8215610bb6575b5050610ba75760025562ffffff6003549160181b65ffffff0000001692169065ffffffffffff1916171760035580f35b631f2a200560e01b8452600484fd5b13159050845f610b77565b62ffffff8616159250610b70565b8480fd5b5034610281578060031936011261028157602060405162ffffff7f00000000000000000000000000000000000000000000000000000000000001f4168152f35b503461059f57608036600319011261059f576004356001600160401b03811161059f57610c44903690600401612bb4565b90916024356001600160401b03811161059f57610c65903690600401612bb4565b9093906044356001600160401b03811161059f57610c87903690600401612bb4565b9190926064359560018060a01b03871680970361059f57610ca6612eff565b60405163a2f5596760e01b8152600481018890526020816024817f000000000000000000000000c96c76898d2642a7c57d0f7676acb9409e00504c6001600160a01b03165afa908115611616575f91611643575b5015611630576e5af43d82803e903d91602b57fd5bf37f00000000000000000000000012c7afa0397a42e61fcec06c65ac816276ef5f1c763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c16175f5260781b17602052603760095ff06001600160a01b03811698909590891561162157600254918a3b1561059f57610db196610dc3610dd5935f986040519a8b998a9963b2ecc0e160e01b8b5260a060048c015260a48b0191612dbc565b8881036003190160248a015291612dbc565b85810360031901604487015291612dbc565b903060648401526084830152038183895af1801561161657611601575b50838252600660205260408220546001600160a01b03166115ed577f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73936001600160a01b03851681109182156115e75794915b6003546040516322afcccb60e01b815262ffffff821660048201819052909490916020866024817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa9586156115dc57879661158e575b5085610ebb81610ec09360181c60020b613f5b565b613f91565b948315611564578060020b801561155057610ee1919062030d3f1905613f91565b91610eed839684612df9565b955b7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03169360020b60ff81901d8082011890620d89e8821161153e57600160801b7001fffcb933bd6fad37aa2d162d1a594001600184160218918a919060028116611522575b60048116611506575b600881166114ea575b601081166114ce575b602081166114b2575b60408116611496575b6080811661147a575b610100811661145e575b6102008116611442575b6104008116611426575b610800811661140a575b61100081166113ee575b61200081166113d2575b61400081166113b6575b618000811661139a575b62010000811661137e575b620200008116611363575b620400008116611348575b6208000016611330575b13611328575b6040516309f56ab160e11b81526001600160a01b039b8c1660048201819052948c1660248201819052604482019490945263ffffffff91909101602090811c909b166064820152998a6084818b885af19687156105ab5788999a8997986112d2575b509161110b93916080959361108c600254868c613aa6565b87156112c6576002549189935b62ffffff6003541690604051966110af88612c62565b87526020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af19182156112bb578592611287575b506040519361112b85612c7e565b8685526001600160a01b039081166020808701828152604080890187815260608a01968752600160808b018181523360a08d019081528b8e526006909652928c209a518b549088166001600160a01b0319918216178c559351908b0180549190971693169290921790945551600288015592516003909601805460ff191696151560ff169690961786559491905182549151610100600160b01b031990921690151560081b61ff00161760109190911b62010000600160b01b031617905560075494600160401b8610156112735761120b86600160409801600755612b72565b81549060031b9085821b9160018060a01b03901b19161790558551918483526020830152827f71ab13a7d0b6a0937ce9c0fd647028927024713a7113b5eb994d613e4d72d288873394a460015f805160206142b6833981519152558351925082526020820152f35b634e487b7160e01b85526041600452602485fd5b6112aa91925060803d6080116112b4575b6112a28183612c99565b810190612e17565b505050905f61111d565b503d611298565b6040513d87823e3d90fd5b60025491899293611099565b9192939495965097506020813d602011611320575b816112f460209383612c99565b8101031261131c579261110b9289969592611310608096612d36565b99919395509193611074565b8880fd5b3d91506112e7565b5f1904611012565b916b048a170391f7dc42444e8fa20260801c9161100c565b6d2216e584f5fa1ea926041bedfe9890930260801c92611002565b926e5d6af8dedb81196699c329225ee6040260801c92610ff7565b926f09aa508b5b7a84e1c677de54f3e99bc90260801c92610fec565b926f31be135f97d08fd981231505542fcfa60260801c92610fe1565b926f70d869a156d2a1b890bb3df62baf32f70260801c92610fd7565b926fa9f746462d870fdf8a65dc1f90e061e50260801c92610fcd565b926fd097f3bdfd2022b8845ad8f792aa58250260801c92610fc3565b926fe7159475a2c29b7443b29c7fa6e889d90260801c92610fb9565b926ff3392b0822b70005940c7a398e4b70f30260801c92610faf565b926ff987a7253ac413176f2b074cf7815e540260801c92610fa5565b926ffcbe86c7900a88aedcffc83b479aa3a40260801c92610f9b565b926ffe5dee046a99a2a811c461f1969c30530260801c92610f91565b926fff2ea16466c96a3843ec78b326b528610260801c92610f88565b926fff973b41fa98c081472e6896dfb254c00260801c92610f7f565b926fffcb9843d60f6159c9db58835c9266440260801c92610f76565b926fffe5caca7e10e4e61c3624eaa0941cd00260801c92610f6d565b926ffff2e50f5f656932ef12357cf3c7fdcc0260801c92610f64565b926ffff97272373d413259a46990580e213a0260801c92610f5b565b6345c3193d60e11b8a52600452602489fd5b634e487b7160e01b88526012600452602488fd5b8060020b8015611550579061157d9162030d4005613f91565b91611589839684612ddc565b610eef565b9098979695506020813d6020116115d4575b816115ad60209383612c99565b810103126115d057610ebb959697986115c8610ec092612d4a565b965090610ea6565b8580fd5b3d91506115a0565b6040513d89823e3d90fd5b91610e45565b631cd614bf60e21b82526004849052602482fd5b61160e9192505f90612c99565b5f905f610df2565b6040513d5f823e3d90fd5b63b06ebf3d60e01b5f5260045ffd5b866363544aa960e01b5f5260045260245ffd5b90506020813d602011611675575b8161165e60209383612c99565b8101031261059f5761166f90612daf565b5f610cfa565b3d9150611651565b3461059f57608036600319011261059f57600435611699612b9e565b6116a1612eec565b6116a9612eff565b6001600160801b0316806117b1575b50611700604080516116c981612c47565b8381523060208201526001600160801b038282018190526060820152815163fc6f786560e01b815292839182919060048301612d6c565b03815f7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af18015611616577f4c3d23f4b0edde833cd41eed293a18401cc8c74f41aaa1889f89e75d05abf994916040915f915f91611782575b5082519182526020820152a260015f805160206142b683398151915255005b90506117a49150823d84116117aa575b61179c8183612c99565b810190612cbc565b85611763565b503d611792565b604080516117f8926117c282612c18565b8482526020820152604435828201526064356060820152426080820152815180938192630624e65f60e11b835260048301612cd2565b03815f7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af1801561161657156116b85761184a9060403d6040116117aa5761179c8183612c99565b506116b8565b3461059f57602036600319011261059f577f108bc1374c20c702ecd957d46bb96e67c99a7f411fe9eae95b80a929d5cd67f2602060043561188f612eec565b80600455604051908152a1005b3461059f57602036600319011261059f576001600160a01b036118bd612b4a565b165f52600d602052602060405f2054604051908152f35b3461059f57602036600319011261059f576001600160a01b036118f5612b4a565b165f52600a602052602060405f2054604051908152f35b3461059f575f36600319011261059f57602060035460181c60020b604051908152f35b3461059f575f36600319011261059f576020600254604051908152f35b3461059f57602036600319011261059f576001600160a01b0361196d612b4a565b165f52600660205260c060405f2060018060a01b038154169060018060a01b036001820154169060036002820154910154916040519384526020840152604083015260ff81161515606083015260ff8160081c161515608083015260018060a01b039060101c1660a0820152f35b3461059f575f36600319011261059f575f546040516001600160a01b039091168152602090f35b3461059f57602036600319011261059f5760043561ffff811680910361059f57611a2a612eec565b6127108111611a6d576020817f78fcb693de6636b8f518fc276c4dbe4535ce5d8cb0f5212f2ac6d7f965f93c519261ffff196005541617600555604051908152a1005b635afd6e4360e01b5f5260045260245ffd5b3461059f575f36600319011261059f576020600b54604051908152f35b3461059f575f36600319011261059f576040517f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03168152602090f35b3461059f575f36600319011261059f57600154336001600160a01b0390911603611b3f57600180546001600160a01b03199081169091555f805433928116831782556001600160a01b0316905f805160206142968339815191529080a3005b63118cdaa760e01b5f523360045260245ffd5b3461059f575f36600319011261059f576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b3461059f57602036600319011261059f576001600160a01b03611bb7612b4a565b165f52600e602052602060405f2054604051908152f35b3461059f575f36600319011261059f57611be6612eec565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03165f805160206142968339815191528280a3005b3461059f57606036600319011261059f57611c37612b4a565b6024356001600160a01b0381169182820361059f5760443590611c58612eec565b8315611d49576001600160a01b039081165f8181526006602052604090205490939116611d36577f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0381168414611cea575b5081611ce17f7b09c29f9106defeccc9ac3b823f3aad0b470d120e5df7aed033b5c43a4bf7189360209386613111565b604051908152a3005b611cf381613150565b600c548091115f14611d2e57611d0b611d1092613150565b612be1565b80831115611cb1578263f278b92160e01b5f5260045260245260445ffd5b50505f611d10565b82631cd614bf60e21b5f5260045260245ffd5b63d92e233d60e01b5f5260045ffd5b3461059f57602036600319011261059f57611d71612b4a565b5f546001600160a01b0316331415806120d4575b6120c157611d91612eff565b6001600160a01b038181165f818152600660205260409020805490939216156120af5760028301805460405163133f757160e31b815260048101829052949193907f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b031661018087602481845afa968715611616575f97611ff1575b50611e757f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7392611e6e611e64611e4986613150565b611e5b611e5589613150565b946138f3565b611d0b87613150565b91611d0b87613150565b9085613992565b611e7e82613150565b966001600160801b031680611f46575b505090611eaf602096611d0b5f805160206142568339815191529594613150565b90845f52600d8752611ec560405f205491613150565b9080821115611f3e57611ed791612be1565b80611f295750611efc5f9586935b8380611f18575b5050549160405193849384612c02565b0390a260015f805160206142b683398151915255604051908152f35b611f2191613296565b508883611eec565b611f36611efc9184613b9b565b958693611ee5565b50505f611ed7565b611f945f9260409289979695975490845191611f6183612c18565b8252602082015284848201528460608201524260808201528351948580948193630624e65f60e11b835260048301612cd2565b03925af196871561161657611d0b5f8051602061425683398151915295611eaf9360209a611fd3575b50611fc889546138f3565b939495505096611e8e565b611feb9060403d6040116117aa5761179c8183612c99565b50611fbd565b909650610180813d82116120a7575b8161200e6101809383612c99565b8101031261059f5780516001600160601b0381160361059f5761203360208201612d36565b5061204060408201612d36565b5061204d60608201612d36565b50608081015162ffffff81160361059f5761206a60a08201612d4a565b5061207760c08201612d4a565b5061209f61016061208a60e08401612d58565b926120986101408201612d58565b5001612d58565b509587611e14565b3d9150612000565b632464ae5360e11b5f5260045260245ffd5b63ccf79b6760e01b5f523360045260245ffd5b50335f52600f60205260ff60405f20541615611d85565b3461059f57602036600319011261059f576001600160a01b0361210c612b4a565b165f526010602052602060405f2054604051908152f35b3461059f575f36600319011261059f576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b3461059f57606036600319011261059f57612180612b4a565b612188612b9e565b906044359060018060a01b035f541633141580612551575b6120c1576121ac612eff565b6001600160a01b038181165f81815260066020526040812080549096919592949293161561253e576001600160801b031690811561252f5760018601546121fb906001600160a01b03166136e2565b6004549081811061251b5750506122bd7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad739261223684613150565b61227161224285613150565b61226a61226060028d019461225786546138f3565b611d0b8a613150565b91611d0b88613150565b9086613992565b604061227c86613150565b9282549082519161228c83612c18565b825260208201525f828201525f6060820152426080820152815180958192630624e65f60e11b835260048301612cd2565b03815f7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af19081156116165761231093612307926124fd575b50546138f3565b611d0b84613150565b9182806124a15750505f925b80841061248b57508261239b575b906020955f805160206142768339815191529392855f52600d885261235360405f205491613150565b90808211156123925761236591612be1565b905b81612380575050611efc5f5b8660405194859485612d1a565b611efc9161238d91613b9b565b612373565b50505f90612367565b85545f95506123d59084906001600160a01b03167f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168613aa6565b8554604051630d9778e560e11b815260048101859052600160248201529560209187916044918391906001600160a01b03165af1948515611616575f95612450575b50906020955f80516020614276833981519152939286865f52600e895261244360405f20918254612d0d565b905591929350955061232a565b92919094506020833d602011612483575b8161246e60209383612c99565b8101031261059f579151939091906020612417565b3d9150612461565b836313a30a9560e11b5f5260045260245260445ffd5b6124f7917f00000000000000000000000000000000000000000000000000000000000001f4907f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b031690612f37565b9261231c565b6125159060403d6040116117aa5761179c8183612c99565b50612300565b6213e1ab60e51b5f5260045260245260445ffd5b631f2a200560e01b5f5260045ffd5b83632464ae5360e11b5f5260045260245ffd5b50335f52600f60205260ff60405f205416156121a0565b3461059f575f36600319011261059f576040517f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b03168152602090f35b3461059f575f36600319011261059f576040517f00000000000000000000000012c7afa0397a42e61fcec06c65ac816276ef5f1c6001600160a01b03168152602090f35b3461059f57602036600319011261059f5760043560075481101561059f57612619602091612b72565b905460405160039290921b1c6001600160a01b03168152f35b3461059f575f36600319011261059f576020600754604051908152f35b3461059f575f36600319011261059f576020600454604051908152f35b3461059f575f36600319011261059f57602061ffff60055416604051908152f35b3461059f57606036600319011261059f576126a6612b4a565b6024356044359160018060a01b035f5416331415806128d5575b6120c1576126cc612eff565b6001600160a01b039081165f81815260066020526040902080549192909116156128c257821561252f57815f52600e60205260405f2054938484116128aa57612716845f96612be1565b838652600e6020526040862055602060018060a01b03835416604460405180988193637cbc237360e01b8352896004840152600160248401525af1948515611616575f95612876575b50846127fc575f5b8181106127e75750506020937f65328af737ef86688c09b113e0eef5f0a2fc646ddfa33da808b36021c9e7aef5916127be7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73613150565b806127d85750505f935b611efc8560405193849384612c02565b6127e191613296565b936127c8565b6313a30a9560e11b5f5260045260245260445ffd5b612871857f00000000000000000000000000000000000000000000000000000000000001f47f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad737f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316612f37565b612767565b9094506020813d6020116128a2575b8161289260209383612c99565b8101031261059f5751938561275f565b3d9150612885565b50505063de5ce41960e01b5f5260045260245260445ffd5b50632464ae5360e11b5f5260045260245ffd5b50335f52600f60205260ff60405f205416156126c0565b3461059f57604036600319011261059f5760043560243560018060a01b035f541633141580612a47575b6120c157612922612eff565b600554601081901c6001600160a01b0316908115612a3857831561252f57600b54808511612a22579162ffffff859261295e8461299b96612be1565b600b5561296d84600c54612be1565b600c5560b01c16907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73612f37565b90808210612a0c57507f39bde8339ff3dbefd5361a79319d311700551267327178299f24925b163efae3816020936129e08260018060a01b0360055460101c16613095565b6129f08260405193849384612c02565b0390a160015f805160206142b683398151915255604051908152f35b906313a30a9560e11b5f5260045260245260445ffd5b846309f2437360e11b5f5260045260245260445ffd5b6345cf7c6960e01b5f5260045ffd5b50335f52600f60205260ff60405f20541615612916565b3461059f57602036600319011261059f5760406001600160a01b03612a81612b4a565b16805f526008602052815f2054905f526009602052815f205482519182526020820152f35b3461059f57604036600319011261059f57612abf612b4a565b612ac7612b60565b90612ad0612eec565b62ffffff821691821561252f576005805462010000600160c81b031916601084901b62010000600160b01b03161760b09290921b62ffffff60b01b169190911790556040519182526001600160a01b0316907ffeb92d7b096f4dae7e0c63c9819182f5d8219382b275b3f55696916bbe08bff890602090a2005b600435906001600160a01b038216820361059f57565b6024359062ffffff8216820361059f57565b600754811015612b8a5760075f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b602435906001600160801b038216820361059f57565b9181601f8401121561059f578235916001600160401b03831161059f576020838186019501011161059f57565b91908203918211612bee57565b634e487b7160e01b5f52601160045260245ffd5b6040919493926060820195825260208201520152565b60a081019081106001600160401b03821117612c3357604052565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b03821117612c3357604052565b61016081019081106001600160401b03821117612c3357604052565b60c081019081106001600160401b03821117612c3357604052565b601f909101601f19168101906001600160401b03821190821017612c3357604052565b919082604091031261059f576020825192015190565b91909160808060a083019480518452600180831b03602082015116602085015260408101516040850152606081015160608501520151910152565b91908201809211612bee57565b9094939260609260808301968352602083015260408201520152565b51906001600160a01b038216820361059f57565b51908160020b820361059f57565b51906001600160801b038216820361059f57565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5190811515820361059f57565b908060209392818452848401375f828201840152601f01601f1916010190565b600291820b910b0390627fffff198212627fffff831317612bee57565b9060020b9060020b0190627fffff198212627fffff831317612bee57565b919082608091031261059f57815191612e3260208201612d58565b916060604083015192015190565b9190916101408061016083019460018060a01b03815116845260018060a01b03602082015116602085015262ffffff6040820151166040850152606081015160020b6060850152608081015160020b608085015260a081015160a085015260c081015160c085015260e081015160e085015261010081015161010085015260018060a01b03610120820151166101208501520151910152565b81810292918115918404141715612bee57565b5f546001600160a01b03163303611b3f57565b60025f805160206142b68339815191525414612f285760025f805160206142b683398151915255565b633ee5aeb560e01b5f5260045ffd5b92919092821561308d576001600160a01b03908116927f000000000000000000000000caf681a66d020601342297493863e78c959e5cb290911690612f7d818386613aa6565b612f8685613150565b60405190949060e081016001600160401b03811182821017612c335760409081529181526001600160a01b03878116602083810191825262ffffff978816848601908152306060860190815260808601978852600160a087019081525f60c0880181815298516304e45aaf60e01b81529751871660048901529451861660248801529151909916604486015297518316606485015294516084840152955160a4830152915190911660c4820152929091839160e4918391905af180156116165761305b575b50611d0b61305892613150565b90565b6020813d602011613085575b8161307460209383612c99565b8101031261059f5750611d0b61304b565b3d9150613067565b505050505f90565b906040519063a9059cbb60e01b5f5261dead60045260245260205f60448180865af19060015f51148216156130f0575b604052156130d05750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661310857823b15153d151616906130c5565b503d5f823e3d90fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156130f057604052156130d05750565b6040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa908115611616575f9161318a575090565b90506020813d6020116131b1575b816131a560209383612c99565b8101031261059f575190565b3d9150613198565b519061ffff8216820361059f57565b908160e091031261059f5780516001600160a01b038116810361059f57916131f260208301612d4a565b916131ff604082016131b9565b9161320c606083016131b9565b91613219608082016131b9565b9160a082015160ff8116810361059f5760c0613058919301612daf565b9081606091031261059f5761324a81612d58565b916040602083015192015190565b91909160a08060c083019480518452602081015160208501526040810151604085015260608101516060850152608081015160808501520151910152565b6003546040516322afcccb60e01b815262ffffff82166004820152906020826024817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa908115611616575f916136a6575b6001840154604051633850c7bd60e01b8152935060e090849060049082906001600160a01b03165afa928315611616575f9361365e575b5061334182610ebb8161337a9460181c60020b613f5b565b92600385019260ff84541694855f146136375761337561336e8361336981610ebb8189613f5b565b612ddc565b9182612ddc565b613fa8565b9190925f146135fc576001600160a01b0361339485614057565b16917f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73905b6001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d38116959061341590899088907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316613aa6565b835460ff16156135f3575f9288945b6001600160a01b036134358a614057565b165f52601060205260405f205480613533575b505092608095926134da95925f99989562ffffff60035416906040519661346e88612c62565b60018060a01b0316875260018060a01b03166020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af1918215611616575f9261350f575b506001600160a01b03906134ff90614057565b165f52601060205260405f205590565b61352991925060803d6080116112b4576112a28183612c99565b505050905f6134ec565b606061357f916040519061354682612c7e565b81528760208201528860408201525f828201525f60808201524260a08201526040518093819263219f5d1760e01b835260048301613258565b03815f8d5af191825f925f946135bb575b5061359b5750613448565b975098509850505050505060ff915054165f146135b6575090565b905090565b9093506135e191925060603d6060116135ec575b6135d98183612c99565b810190613236565b92915091925f613590565b503d6135cf565b87925f94613424565b6001600160a01b0361360d85614057565b16917f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7392906133b9565b6136586136518361364c81610ebb8189613f5b565b612df9565b9182612df9565b90613fa8565b61337a91935082610ebb8161368d6133419460e03d60e01161369f575b6136858183612c99565b8101906131c8565b50505050509050969450505050613329565b503d61367b565b90506020823d6020116136da575b816136c160209383612c99565b8101031261059f576136d4600492612d4a565b906132f2565b3d91506136b4565b6040516370a0823160e01b81526001600160a01b039182166004820152907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602082602481845afa918215611616575f926138bf575b5081156138b957604051630b4c774160e11b8152600481018290526001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881166024830181905262ffffff7f00000000000000000000000000000000000000000000000000000000000001f41660448401529190602090829060649082907f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa165afa908115611616575f9161387a575b50604051633850c7bd60e01b81529060e090829060049082906001600160a01b03165afa908115611616575f91613855575b506001600160a01b031691106138435761383e81613058936141af565b6141af565b6138508161305893614150565b614150565b61386e915060e03d60e01161369f576136858183612c99565b5050505050505f613821565b90506020813d6020116138b1575b8161389560209383612c99565b8101031261059f5760e06138aa600492612d36565b91506137ef565b3d9150613888565b50505f90565b9091506020813d6020116138eb575b816138db60209383612c99565b8101031261059f5751905f613739565b3d91506138ce565b6040805161393a9261390482612c47565b81523060208201526001600160801b038282018190526060820152815163fc6f786560e01b815292839182919060048301612d6c565b03815f7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af18015611616576139765750565b61398e9060403d6040116117aa5761179c8183612c99565b5050565b9091821580613a9e575b613a99577f02a6ea472aeabcfff55c126e437d0b1734121e091e5180d3d41f6778cd24f0c291613a9461ffff60055416916127106139e6816139de868a612ed9565b049486612ed9565b04936139f28488612be1565b90613a6c613a008783612be1565b9360018060a01b031698895f52600860205260405f20613a21888254612d0d565b9055895f52600960205260405f20613a3a898254612d0d565b9055613a4884600b54612d0d565b600b55895f52600a60205260405f20613a62868254612d0d565b9055600c54612d0d565b600c55875f52600d602052613a8660405f20918254612d0d565b905560405194859485612d1a565b0390a2565b505050565b50801561399c565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f5114821615613b8c575b60405215613aeb57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f5114821615613b74575b60405215613b56576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f51148216156130f057604052156130d05750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b90600181151661310857843b15153d15161690613b18565b90843b15153d15161690613ade565b6003546040516322afcccb60e01b815262ffffff82166004820152916020836024817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa928315611616575f93613f1f575b506001810154604051633850c7bd60e01b81529060e090829060049082906001600160a01b03165afa9283156116165784915f94613ee7575b5081610ebb613c7093613c489360181c60020b613f5b565b92600383019460ff86541694855f14613ed2576136586136518361364c81610ebb8189613f5b565b9190925f14613e97576001600160a01b03613c8a82614057565b16917f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73905b6001600160a01b0382811692907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168303613e91575083945b6001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3811696613d22918a91899116613aa6565b865460ff1615613e83578792613d8260025f965b019860608a5460405190613d4982612c7e565b81528760208201528860408201525f828201525f60808201524260a08201526040518094819263219f5d1760e01b835260048301613258565b03815f8d5af190815f935f93613e5b575b5061359b575050509260809592613e2395925f99989562ffffff600354169060405196613dbf88612c62565b60018060a01b031687526020870152604086015260020b606085015260020b8684015260a083015260c08201528560e0820152856101008201523061012082015242610140820152604051958680948193634418b22b60e11b835260048301612e40565b03925af1918215611616575f92613e3957505590565b613e5391925060803d6080116112b4576112a28183612c99565b505050905590565b909250613e7891935060603d6060116135ec576135d98183612c99565b93915092915f613d93565b5f92613d8260028a96613d36565b94613ce8565b6001600160a01b03613ea882614057565b16917f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad739290613caf565b61337561336e8361336981610ebb8189613f5b565b613c4891945091610ebb81613f0d613c709560e03d60e01161369f576136858183612c99565b50505050509050969350935050613c30565b9092506020813d602011613f53575b81613f3b60209383612c99565b8101031261059f57613f4c90612d4a565b915f613bf7565b3d9150613f2e565b60020b9060020b908115613f7d57627fffff1981145f19831416612bee570590565b634e487b7160e01b5f52601260045260245ffd5b9060020b9060020b02908160020b918203612bee57565b91939290938060020b908115613f7d57613fd790613fcc8184620d89e71905613f91565b92620d89e805613f91565b908060020b90818560020b1261404f575b8260020b91828660020b13614046575b8760020b1261403e575b508560020b13614036575b508360020b8260020b121561402157509190565b632ff9b42b60e11b5f5260020b60045260245ffd5b93505f61400d565b95505f614002565b94508294613ff8565b935083613fe8565b602060049160ff6003820154165f146140e15760010154604051630dfe168160e01b815292839182906001600160a01b03165afa908115611616575f916140a7575b505b6001600160a01b031690565b90506020813d6020116140d9575b816140c260209383612c99565b8101031261059f576140d390612d36565b5f614099565b3d91506140b5565b6001015460405163d21220a760e01b815292839182906001600160a01b03165afa908115611616575f91614116575b5061409b565b90506020813d602011614148575b8161413160209383612c99565b8101031261059f5761414290612d36565b5f614110565b3d9150614124565b5f91905f1982820991808202938480851094039380850394146141a557600160601b8410156141935750600160601b910990828211900360a01b910360601c1790565b634e487b71905260116020526024601cfd5b5050505060601c90565b5f19600160601b8209918160601b918280851094039380850394146142485783821115614230578190600160601b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5091508115613f7d57049056fe503d77b4922108370170aa310e56a811abc33e1232715a821e609161f2557ff4e7d9801d1d042469575a53334cb3601a4d973e612b19b1d06b1ed01606e725ff8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220eab28deceb8f019f85d95877e4fba81dfcabae7e0e3ff1160a10ca8524d5fb1264736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Global Dollar (USDG) | USDG | 10.25 | $1 | $10.25 |
| HoodTEST (HOODTEST) | HOODTEST | 0.000000 | $0.00000389 | $0 |
| NVDA 5x Long (NVDA5L) | NVDA5L | 37.374268 | — | — |
| Uniswap V3 Positions NFT-V1 (UNI-V3-POS) | UNI-V3-POS | 14 | — | — |
| HOOD 3x Long (HOOD3L) | HOOD3L | 4.301409 | — | — |
| BTC 5x Long (BTC5L) | BTC5L | 3.517119 | — | — |
| Hood Test 3x (HOOD3T) | HOOD3T | 0.000000 | — | — |
| BTC5LTEST (BTC5LTEST) | BTC5LTEST | 0.000000 | — | — |
| Nvidia Rocket (NVDR) | NVDR | 0.000000 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xdc9648…002d5d | reanchor | 15,625,450 | 25 days agoTue, 21 Jul 2026 14:12:41 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001769 | |
| 0xb4f036…1f4da4 | reanchor | 15,625,434 | 25 days agoTue, 21 Jul 2026 14:12:39 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001787 | |
| 0xbd3d71…6ce550 | reanchor | 15,625,399 | 25 days agoTue, 21 Jul 2026 14:12:36 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001767 | |
| 0x43006e…5c06d4 | reanchor | 15,625,383 | 25 days agoTue, 21 Jul 2026 14:12:34 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001792 | |
| 0x1f1be6…b5bbe0 | reanchor | 15,624,619 | 25 days agoTue, 21 Jul 2026 14:11:17 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001781 | |
| 0x25efda…ae965d | reanchor | 15,624,601 | 25 days agoTue, 21 Jul 2026 14:11:15 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001805 | |
| 0x7b2134…6a93dd | reanchor | 15,624,583 | 25 days agoTue, 21 Jul 2026 14:11:14 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001827 | |
| 0x65629c…cbe457 | reanchor | 15,624,565 | 25 days agoTue, 21 Jul 2026 14:11:12 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001769 | |
| 0xe23e56…4383e4 | reanchor | 15,623,809 | 25 days agoTue, 21 Jul 2026 14:09:56 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001770 | |
| 0x880fe3…2d623d | reanchor | 15,623,793 | 25 days agoTue, 21 Jul 2026 14:09:54 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001791 | |
| 0x9cc76b…7dcd01 | reanchor | 15,623,777 | 25 days agoTue, 21 Jul 2026 14:09:53 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001812 | |
| 0x0f35aa…ed7def | reanchor | 15,623,762 | 25 days agoTue, 21 Jul 2026 14:09:51 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001774 | |
| 0x666df7…128beb | reanchor | 15,622,940 | 25 days agoTue, 21 Jul 2026 14:08:30 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001774 | |
| 0xbc87dd…91b55d | reanchor | 15,622,925 | 25 days agoTue, 21 Jul 2026 14:08:29 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001768 | |
| 0x9372fe…50778a | reanchor | 15,622,909 | 25 days agoTue, 21 Jul 2026 14:08:27 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001771 | |
| 0xa3df61…dcd2d4 | reanchor | 15,622,893 | 25 days agoTue, 21 Jul 2026 14:08:26 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001752 | |
| 0xe00c7e…f15a82 | reanchor | 15,622,135 | 25 days agoTue, 21 Jul 2026 14:07:10 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001805 | |
| 0xd2d30d…fe58de | reanchor | 15,622,119 | 25 days agoTue, 21 Jul 2026 14:07:08 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001763 | |
| 0x507aab…26da81 | reanchor | 15,622,101 | 25 days agoTue, 21 Jul 2026 14:07:06 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001779 | |
| 0xf22770…4e863a | reanchor | 15,622,086 | 25 days agoTue, 21 Jul 2026 14:07:05 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001786 | |
| 0x82af83…e1b912 | reanchor | 15,621,291 | 25 days agoTue, 21 Jul 2026 14:05:45 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001748 | |
| 0x4b5fe6…13db70 | reanchor | 15,621,272 | 25 days agoTue, 21 Jul 2026 14:05:43 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001756 | |
| 0xa453e6…7fee8a | reanchor | 15,621,254 | 25 days agoTue, 21 Jul 2026 14:05:41 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001762 | |
| 0xe233c0…607c3b | reanchor | 15,621,237 | 25 days agoTue, 21 Jul 2026 14:05:39 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001774 | |
| 0x38b381…d2fba8 | reanchor | 15,620,447 | 25 days agoTue, 21 Jul 2026 14:04:20 UTC | 0x86bb…6582 | IN | SingleSidedMeme | $0.000 ETH | 0.00001748 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xdc9648…002d5d | 25 days agoTue, 21 Jul 2026 14:12:41 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0xb4f036…1f4da4 | 25 days agoTue, 21 Jul 2026 14:12:39 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0xbd3d71…6ce550 | 25 days agoTue, 21 Jul 2026 14:12:36 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0x43006e…5c06d4 | 25 days agoTue, 21 Jul 2026 14:12:34 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0x1f1be6…b5bbe0 | 25 days agoTue, 21 Jul 2026 14:11:17 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0x25efda…ae965d | 25 days agoTue, 21 Jul 2026 14:11:15 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0x7b2134…6a93dd | 25 days agoTue, 21 Jul 2026 14:11:14 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0x65629c…cbe457 | 25 days agoTue, 21 Jul 2026 14:11:12 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0xe23e56…4383e4 | 25 days agoTue, 21 Jul 2026 14:09:56 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0x880fe3…2d623d | 25 days agoTue, 21 Jul 2026 14:09:54 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0x9cc76b…7dcd01 | 25 days agoTue, 21 Jul 2026 14:09:53 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0x0f35aa…ed7def | 25 days agoTue, 21 Jul 2026 14:09:51 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0x666df7…128beb | 25 days agoTue, 21 Jul 2026 14:08:30 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0xbc87dd…91b55d | 25 days agoTue, 21 Jul 2026 14:08:29 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0x9372fe…50778a | 25 days agoTue, 21 Jul 2026 14:08:27 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0xa3df61…dcd2d4 | 25 days agoTue, 21 Jul 2026 14:08:26 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0xe00c7e…f15a82 | 25 days agoTue, 21 Jul 2026 14:07:10 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0xd2d30d…fe58de | 25 days agoTue, 21 Jul 2026 14:07:08 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0x507aab…26da81 | 25 days agoTue, 21 Jul 2026 14:07:06 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0xf22770…4e863a | 25 days agoTue, 21 Jul 2026 14:07:05 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0x82af83…e1b912 | 25 days agoTue, 21 Jul 2026 14:05:45 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| 0x4b5fe6…13db70 | 25 days agoTue, 21 Jul 2026 14:05:43 UTC | 0x503d77…7ff4 | [0] 0x000000000000…2b99a625 data: 0x000000000000000000…00000000 |
| 0xa453e6…7fee8a | 25 days agoTue, 21 Jul 2026 14:05:41 UTC | 0x503d77…7ff4 | [0] 0x000000000000…89ac72d6 data: 0x000000000000000000…00000000 |
| 0xe233c0…607c3b | 25 days agoTue, 21 Jul 2026 14:05:39 UTC | 0x503d77…7ff4 | [0] 0x000000000000…377c531d data: 0x000000000000000000…00000000 |
| 0x38b381…d2fba8 | 25 days agoTue, 21 Jul 2026 14:04:20 UTC | 0x503d77…7ff4 | [0] 0x000000000000…6193637f data: 0x000000000000000000…00000000 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xdc964864…002d5d | Transfer | 15,625,450 | 25 days agoTue, 21 Jul 2026 14:12:41 UTC | 0xee37…d988 | OUT | 0xa38b…1f2a | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0xdc964864…002d5d | Transfer | 15,625,450 | 25 days agoTue, 21 Jul 2026 14:12:41 UTC | 0xa38b…1f2a | IN | 0xee37…d988 | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0xb4f0360e…1f4da4 | Transfer | 15,625,434 | 25 days agoTue, 21 Jul 2026 14:12:39 UTC | 0xee37…d988 | OUT | 0xf225…d790 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0xb4f0360e…1f4da4 | Transfer | 15,625,434 | 25 days agoTue, 21 Jul 2026 14:12:39 UTC | 0xf225…d790 | IN | 0xee37…d988 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0xbd3d7109…6ce550 | Transfer | 15,625,399 | 25 days agoTue, 21 Jul 2026 14:12:36 UTC | 0xee37…d988 | OUT | 0xcaff…84ff | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0xbd3d7109…6ce550 | Transfer | 15,625,399 | 25 days agoTue, 21 Jul 2026 14:12:36 UTC | 0xcaff…84ff | IN | 0xee37…d988 | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0x43006eae…5c06d4 | Transfer | 15,625,383 | 25 days agoTue, 21 Jul 2026 14:12:34 UTC | 0xee37…d988 | OUT | 0x9b6e…5402 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0x43006eae…5c06d4 | Transfer | 15,625,383 | 25 days agoTue, 21 Jul 2026 14:12:34 UTC | 0x9b6e…5402 | IN | 0xee37…d988 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0x1f1be60e…b5bbe0 | Transfer | 15,624,619 | 25 days agoTue, 21 Jul 2026 14:11:17 UTC | 0xee37…d988 | OUT | 0xa38b…1f2a | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0x1f1be60e…b5bbe0 | Transfer | 15,624,619 | 25 days agoTue, 21 Jul 2026 14:11:17 UTC | 0xa38b…1f2a | IN | 0xee37…d988 | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0x25efdad7…ae965d | Transfer | 15,624,601 | 25 days agoTue, 21 Jul 2026 14:11:15 UTC | 0xee37…d988 | OUT | 0xf225…d790 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0x25efdad7…ae965d | Transfer | 15,624,601 | 25 days agoTue, 21 Jul 2026 14:11:15 UTC | 0xf225…d790 | IN | 0xee37…d988 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0x7b213479…6a93dd | Transfer | 15,624,583 | 25 days agoTue, 21 Jul 2026 14:11:14 UTC | 0xee37…d988 | OUT | 0xcaff…84ff | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0x7b213479…6a93dd | Transfer | 15,624,583 | 25 days agoTue, 21 Jul 2026 14:11:14 UTC | 0xcaff…84ff | IN | 0xee37…d988 | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0x65629c50…cbe457 | Transfer | 15,624,565 | 25 days agoTue, 21 Jul 2026 14:11:12 UTC | 0xee37…d988 | OUT | 0x9b6e…5402 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0x65629c50…cbe457 | Transfer | 15,624,565 | 25 days agoTue, 21 Jul 2026 14:11:12 UTC | 0x9b6e…5402 | IN | 0xee37…d988 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0xe23e5637…4383e4 | Transfer | 15,623,809 | 25 days agoTue, 21 Jul 2026 14:09:56 UTC | 0xee37…d988 | OUT | 0xa38b…1f2a | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0xe23e5637…4383e4 | Transfer | 15,623,809 | 25 days agoTue, 21 Jul 2026 14:09:56 UTC | 0xa38b…1f2a | IN | 0xee37…d988 | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) | |
| 0x880fe376…2d623d | Transfer | 15,623,793 | 25 days agoTue, 21 Jul 2026 14:09:54 UTC | 0xee37…d988 | OUT | 0xf225…d790 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0x880fe376…2d623d | Transfer | 15,623,793 | 25 days agoTue, 21 Jul 2026 14:09:54 UTC | 0xf225…d790 | IN | 0xee37…d988 | 292,175,907.177564 SOLR | Sol Rocket (SOLR) | |
| 0x9cc76b36…7dcd01 | Transfer | 15,623,777 | 25 days agoTue, 21 Jul 2026 14:09:53 UTC | 0xee37…d988 | OUT | 0xcaff…84ff | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0x9cc76b36…7dcd01 | Transfer | 15,623,777 | 25 days agoTue, 21 Jul 2026 14:09:53 UTC | 0xcaff…84ff | IN | 0xee37…d988 | 292,175,907.177564 ETHR | Eth Rocket (ETHR) | |
| 0x0f35aa65…ed7def | Transfer | 15,623,762 | 25 days agoTue, 21 Jul 2026 14:09:51 UTC | 0xee37…d988 | OUT | 0x9b6e…5402 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0x0f35aa65…ed7def | Transfer | 15,623,762 | 25 days agoTue, 21 Jul 2026 14:09:51 UTC | 0x9b6e…5402 | IN | 0xee37…d988 | 296,420,620.995909 HOOD3T | Hood Test 3x (HOOD3T) | |
| 0x666df70f…128beb | Transfer | 15,622,940 | 25 days agoTue, 21 Jul 2026 14:08:30 UTC | 0xee37…d988 | OUT | 0xa38b…1f2a | 290,773,084.912977 NVDR | Nvidia Rocket (NVDR) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 15,596,895 | 25 days agoTue, 21 Jul 2026 13:25:01 UTC | 0x90d272…2b38f5 | CREATE | launch | 0xee37…d988 | OUT | 0xdaa6…637f | 0 ETH |
| 15,557,667 | 25 days agoTue, 21 Jul 2026 12:19:32 UTC | 0x5324d3…c6ae89 | CREATE | launch | 0xee37…d988 | OUT | 0x6eab…a625 | 0 ETH |
| 15,557,658 | 25 days agoTue, 21 Jul 2026 12:19:31 UTC | 0x5b223c…e8d85b | CREATE | launch | 0xee37…d988 | OUT | 0x3158…72d6 | 0 ETH |
| 15,512,723 | 25 days agoTue, 21 Jul 2026 11:04:21 UTC | 0x7189bf…6cc7e1 | CREATE | launch | 0xee37…d988 | OUT | 0xc331…531d | 0 ETH |
| 14,818,057 | 26 days agoMon, 20 Jul 2026 15:43:48 UTC | 0x7ad61f…d6e18f | CREATE | launch | 0xee37…d988 | OUT | 0x3e63…108c | 0 ETH |
| 14,817,594 | 26 days agoMon, 20 Jul 2026 15:43:01 UTC | 0x4e460d…1984b6 | CREATE | launch | 0xee37…d988 | OUT | 0xdb29…4cd1 | 0 ETH |