| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {BaseHook} from "@openzeppelin/uniswap-hooks/src/base/BaseHook.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol";
import {IPoolManager, SwapParams} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol";
import {PoolId, PoolIdLibrary} from "@uniswap/v4-core/src/types/PoolId.sol";
import {BalanceDelta} from "@uniswap/v4-core/src/types/BalanceDelta.sol";
import {BeforeSwapDelta, BeforeSwapDeltaLibrary, toBeforeSwapDelta} from "@uniswap/v4-core/src/types/BeforeSwapDelta.sol";
import {Currency, CurrencyLibrary} from "@uniswap/v4-core/src/types/Currency.sol";
import {StateLibrary} from "@uniswap/v4-core/src/libraries/StateLibrary.sol";
import {TickMath} from "@uniswap/v4-core/src/libraries/TickMath.sol";
import {FullMath} from "@uniswap/v4-core/src/libraries/FullMath.sol";
/// @title Test
/// @notice ERC-20 + Uniswap v4 hook. Every swap pays 3% in native ETH, split three ways:
///
/// treasury 1.5% → creator revenue, accrued and pulled, never touches the floor
/// reserve 0.75% → any holder may burn tokens and withdraw `reserve / totalSupply` at
/// any time. A 2% exit fee stays behind, so every redemption lifts the floor.
/// fund 0.75% → idle in a calm market. Deploys only on drawdowns from a decaying
/// trailing high, on a fixed ladder, with a cooldown. Everything bought burns.
///
/// Both floor operations are accretive by construction:
/// redeem f'/f = (S - 0.98·Δ)/(S - Δ) > 1
/// buyback R unchanged, S falls ⇒ f = R/S rises
/// so `floorWeiPerToken()` is monotonically non-decreasing in ETH terms.
///
/// @dev No owner, no admin key, no upgrade path, no mint. TREASURY is immutable and can only
/// ever receive its own accrued share — it cannot reach the reserve or the fund.
contract Test is ERC20, BaseHook {
using PoolIdLibrary for PoolKey;
using StateLibrary for IPoolManager;
// ░░░░░ constants ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
uint256 public constant TOTAL_SUPPLY = 1_000_000 * 10 ** 18;
/// @notice Total swap fee, both directions, charged in native ETH.
/// @dev With LP_FEE on top the trader pays 3.3% per side, 6.6% round trip. That is steep, and
/// volume is the only thing that feeds the floor — see TREASURY_FEE_BPS.
uint16 public constant FEE_BPS = 300;
/// @notice The creator's cut of FEE_BPS. The remainder splits 50/50 into reserve and fund.
/// @dev Every bp here is a bp that does not reach the floor: the floor accrues at
/// (FEE_BPS - TREASURY_FEE_BPS)/2 = 0.75% of volume either way, so raising this does not
/// slow the floor directly — it only raises the toll, which suppresses the volume the
/// floor is built from.
uint16 public constant TREASURY_FEE_BPS = 150;
/// @notice Withheld on redemption. Stays in the reserve and lifts the floor for everyone else.
uint16 public constant REDEEM_FEE_BPS = 200;
/// @notice The pool's own LP fee, pinned so only one pool shape can ever bind to this hook.
/// @dev 3000 matches the house launch pattern, and it stacks: the trader pays FEE_BPS on top,
/// ~1.8% per side. It also means the launch LP position earns real income, so locking it
/// by burning the NFT forfeits that — a factory-held position does not. Set to 0 to make
/// the hook fee the trader's entire cost.
uint24 public constant LP_FEE = 3000;
// ── drawdown ladder ─────────────────────────────────────────
// Measured in ticks against the trailing high. currency0 is native ETH, so the token's
// price is 1.0001^(-tick): the token makes a new high when the tick makes a new LOW, and a
// drawdown is the tick rising above `refTick`.
// -8% → ln(0.92)/ln(1.0001) ≈ +834 ticks
// -15% → ln(0.85)/ln(1.0001) ≈ +1625 ticks
// -25% → ln(0.75)/ln(1.0001) ≈ +2877 ticks
int24 public constant TIER1_TICKS = 834;
int24 public constant TIER2_TICKS = 1625;
int24 public constant TIER3_TICKS = 2877;
uint16 public constant TIER1_BPS = 1000; // 10% of fund
uint16 public constant TIER2_BPS = 2500; // 25%
uint16 public constant TIER3_BPS = 5000; // 50%
uint16 public constant TIER_FLOOR_BPS = 10_000; // at the floor: everything
uint64 public constant BUYBACK_COOLDOWN = 30 minutes;
// ── oracle ──────────────────────────────────────────────────
// Truncated, time-weighted EMA of the pool tick. Two independent costs to move it: a single
// observation can shift it by at most MAX_TICK_MOVE, and the weight of any observation is
// dt/(dt+TAU), so holding a manipulated price costs wall-clock time, not just capital.
uint64 public constant EMA_TAU = 30 minutes;
int24 public constant MAX_TICK_MOVE = 400; // ~4% per observation
// ── trailing-high decay ─────────────────────────────────────
// Without decay a single wick pins `refTick` forever and every later price reads as a deep
// drawdown, draining the fund one cooldown at a time. The high therefore bleeds back toward
// the market after a week of no new high.
uint64 public constant HIGH_STALE_AFTER = 7 days;
int24 public constant HIGH_DECAY_TICKS_PER_DAY = 100; // ~1%/day
uint160 public constant HOOK_FLAGS = uint160(
Hooks.BEFORE_SWAP_FLAG | Hooks.AFTER_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG
| Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG | Hooks.BEFORE_INITIALIZE_FLAG
);
uint256 private constant Q96 = 1 << 96;
/// @dev Transient slot guarding the hook's own buyback swap against re-entering its own fee
/// and trigger logic. Requires the cancun evm_version already set in foundry.toml.
uint256 private constant LOCK_SLOT = 0;
// ░░░░░ vaults ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
/// @notice Backs the redemption floor. Only `redeem` may reduce it.
uint128 public reserveWei;
/// @notice Counter-cyclical buyback fund. Only `_buyback` may reduce it.
uint128 public buybackWei;
/// @notice Accrued creator revenue, awaiting `claimTreasury`.
/// @dev Accrued and pulled rather than pushed inside the swap. A push would put an external
/// call on the hot path of every trade: a TREASURY that reverts on receive would brick
/// every swap and kill the token outright.
uint128 public treasuryWei;
/// @notice Immutable recipient of TREASURY_FEE_BPS. Set once at deploy, never changeable.
address public immutable TREASURY;
// ░░░░░ oracle state ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
PoolId public poolId;
bool public poolBound;
int24 public emaTick;
int24 public refTick; // trailing high of the token = lowest EMA tick seen
uint64 public lastObsTime;
uint64 public lastHighTime;
uint64 public lastDecayTime;
uint64 public lastBuybackTime;
/// @dev bit0/1/2 = tier fired during this descent, bit3 = fund emptied at the floor.
/// Cleared when the price recovers to within TIER1 of the high.
uint8 public firedMask;
// ░░░░░ stats ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
uint128 public totalFeesWei;
uint128 public totalRedeemedWei;
uint128 public totalBuybackWei;
uint128 public totalTreasuryWei;
uint256 public totalBurned;
uint64 public totalSwaps;
// ░░░░░ events ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
event FeeTaken(address indexed trader, uint128 toReserve, uint128 toFund, uint128 toTreasury, bool isBuy);
event TreasuryClaimed(address indexed to, uint256 amount);
event Redeemed(address indexed holder, uint256 burned, uint256 paidWei, uint256 keptWei);
event NewHigh(int24 tick, uint64 at);
event HighDecayed(int24 from, int24 to);
event Buyback(uint16 tierBps, uint256 spentWei, uint256 burnedTokens, int24 drawdownTicks);
// ░░░░░ errors ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
error BadPoolShape();
error AlreadyBound();
error NothingToRedeem();
error EmptyReserve();
error PayoutFailed();
// ░░░░░ constructor ░░░━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
constructor(IPoolManager _poolManager, address _owner, address _treasury)
ERC20("Test", "TEST")
BaseHook(_poolManager)
{
if (_treasury == address(0)) revert BadPoolShape();
TREASURY = _treasury;
_mint(_owner, TOTAL_SUPPLY);
}
receive() external payable {}
// ░░░░░ views ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
/// @notice Wei backing one whole token. Never decreases.
function floorWeiPerToken() public view returns (uint256) {
uint256 supply = totalSupply();
if (supply == 0) return 0;
return FullMath.mulDiv(reserveWei, 1e18, supply);
}
/// @notice Pool price in wei per whole token, from live slot0.
function marketWeiPerToken() public view returns (uint256) {
if (!poolBound) return 0;
(uint160 sqrtPriceX96,,,) = poolManager.getSlot0(poolId);
return _marketWeiPerToken(sqrtPriceX96);
}
/// @notice Current drawdown against the trailing high, in ticks. 0 when at or above the high.
function drawdownTicks() public view returns (int24) {
int24 dd = emaTick - refTick;
return dd > 0 ? dd : int24(0);
}
/// @notice What `redeem(amount)` pays out right now.
function quoteRedeem(uint256 amount) public view returns (uint256 payout, uint256 kept) {
uint256 supply = totalSupply();
if (supply == 0 || amount == 0) return (0, 0);
uint256 gross = FullMath.mulDiv(amount, reserveWei, supply);
kept = (gross * REDEEM_FEE_BPS + 9_999) / 10_000; // round the exit fee up
payout = gross - kept;
}
// ░░░░░ redemption ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
/// @notice Burn `amount` and withdraw its share of the reserve, less the 2% exit fee.
/// @dev Payout rounds down and the exit fee rounds up, so rounding can only favour the
/// reserve — the floor invariant survives integer division.
function redeem(uint256 amount) external {
if (amount == 0) revert NothingToRedeem();
if (reserveWei == 0) revert EmptyReserve();
(uint256 payout, uint256 kept) = quoteRedeem(amount);
// effects before interaction: burn, then debit the reserve, then pay.
_burn(msg.sender, amount);
reserveWei -= uint128(payout);
totalRedeemedWei += uint128(payout);
totalBurned += amount;
emit Redeemed(msg.sender, amount, payout, kept);
if (payout != 0) {
(bool ok,) = msg.sender.call{value: payout}("");
if (!ok) revert PayoutFailed();
}
}
// ░░░░░ hook wiring ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
function getHookPermissions() public pure override returns (Hooks.Permissions memory) {
return Hooks.Permissions({
beforeInitialize: true,
afterInitialize: false,
beforeAddLiquidity: false,
afterAddLiquidity: false,
beforeRemoveLiquidity: false,
afterRemoveLiquidity: false,
beforeSwap: true,
afterSwap: true,
beforeDonate: false,
afterDonate: false,
beforeSwapReturnDelta: true,
afterSwapReturnDelta: true,
afterAddLiquidityReturnDelta: false,
afterRemoveLiquidityReturnDelta: false
});
}
/// @dev Binds to exactly one pool: native ETH / this token at LP_FEE. Anything else is
/// rejected, so the oracle and the ladder can never be pointed at a second market.
function _beforeInitialize(address, PoolKey calldata key, uint160 sqrtPriceX96)
internal
override
returns (bytes4)
{
if (poolBound) revert AlreadyBound();
if (
!key.currency0.isAddressZero() || Currency.unwrap(key.currency1) != address(this)
|| key.fee != LP_FEE || address(key.hooks) != address(this)
) revert BadPoolShape();
poolId = key.toId();
poolBound = true;
int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96);
emaTick = tick;
refTick = tick;
lastObsTime = uint64(block.timestamp);
lastHighTime = uint64(block.timestamp);
lastDecayTime = uint64(block.timestamp);
return BaseHook.beforeInitialize.selector;
}
// ░░░░░ BUY: fee on ETH in ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
function _beforeSwap(address, PoolKey calldata key, SwapParams calldata params, bytes calldata)
internal
override
returns (bytes4, BeforeSwapDelta, uint24)
{
// the hook's own buyback pays no fee and triggers nothing
if (_locked()) return (BaseHook.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
// exact-input buy only; exact-output buys are charged in _afterSwap, where the ETH
// actually paid is known.
if (!params.zeroForOne || params.amountSpecified >= 0) {
return (BaseHook.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
}
uint256 inputEth = uint256(-params.amountSpecified);
uint128 fee = uint128((inputEth * FEE_BPS) / 10_000);
if (fee == 0) return (BaseHook.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
poolManager.take(key.currency0, address(this), fee);
_credit(fee, true);
return (BaseHook.beforeSwap.selector, toBeforeSwapDelta(int128(int256(uint256(fee))), 0), 0);
}
// ░░░░░ SELL: fee on ETH out · then observe · then maybe buy ░░
function _afterSwap(address, PoolKey calldata key, SwapParams calldata params, BalanceDelta delta, bytes calldata)
internal
override
returns (bytes4, int128)
{
if (_locked()) return (BaseHook.afterSwap.selector, 0);
unchecked {
totalSwaps++;
}
int128 amount0 = delta.amount0();
int128 hookDelta = 0;
if (amount0 > 0) {
// sell: pool owes ETH to the swapper, skim the fee off the output
uint128 fee = uint128((uint256(uint128(amount0)) * FEE_BPS) / 10_000);
if (fee != 0) {
poolManager.take(key.currency0, address(this), fee);
_credit(fee, false);
hookDelta = int128(int256(uint256(fee)));
}
} else if (amount0 < 0 && params.zeroForOne && params.amountSpecified > 0) {
// exact-output buy: ETH in was unknown in _beforeSwap, charge it here on the
// unspecified currency so the exact-output path cannot be used to dodge the fee.
uint128 fee = uint128((uint256(uint128(-amount0)) * FEE_BPS) / 10_000);
if (fee != 0) {
poolManager.take(key.currency0, address(this), fee);
_credit(fee, true);
hookDelta = int128(int256(uint256(fee)));
}
}
// An empty pool has no meaningful tick: the price sits wherever the last swap ran out of
// liquidity, which is free to place anywhere. Feed the oracle nothing in that state.
if (poolManager.getLiquidity(poolId) != 0) {
(, int24 tick,,) = poolManager.getSlot0(poolId);
_observe(tick);
_maybeBuyback(key);
}
return (BaseHook.afterSwap.selector, hookDelta);
}
// ░░░░░ fee split ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
function _credit(uint128 fee, bool isBuy) private {
uint128 toTreasury = uint128((uint256(fee) * TREASURY_FEE_BPS) / FEE_BPS);
uint128 rest = fee - toTreasury;
uint128 toReserve = rest / 2;
uint128 toFund = rest - toReserve; // odd wei goes to the fund
reserveWei += toReserve;
buybackWei += toFund;
treasuryWei += toTreasury;
totalFeesWei += fee;
totalTreasuryWei += toTreasury;
emit FeeTaken(msg.sender, toReserve, toFund, toTreasury, isBuy);
}
/// @notice Send the accrued creator revenue to TREASURY. Permissionless: the destination is
/// immutable, so it does not matter who pays the gas to push it.
function claimTreasury() external {
uint256 amount = treasuryWei;
if (amount == 0) return;
treasuryWei = 0;
(bool ok,) = TREASURY.call{value: amount}("");
if (!ok) revert PayoutFailed();
emit TreasuryClaimed(TREASURY, amount);
}
// ░░░░░ oracle ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
/// @dev Time-weighted EMA with a per-observation truncation. Two swaps in the same second
/// move it once; a flash move is capped at MAX_TICK_MOVE and decays out.
function _observe(int24 tick) private {
uint64 nowTs = uint64(block.timestamp);
uint64 dt = nowTs - lastObsTime;
if (dt == 0) return; // same-timestamp swaps carry no oracle weight
int256 diff = int256(tick) - int256(emaTick);
if (diff > int256(MAX_TICK_MOVE)) diff = int256(MAX_TICK_MOVE);
if (diff < -int256(MAX_TICK_MOVE)) diff = -int256(MAX_TICK_MOVE);
int256 step = (diff * int256(uint256(dt))) / int256(uint256(dt) + uint256(EMA_TAU));
emaTick = int24(int256(emaTick) + step);
lastObsTime = nowTs;
_decayHigh(nowTs);
if (emaTick < refTick) {
// lower tick = higher token price = new high
refTick = emaTick;
lastHighTime = nowTs;
lastDecayTime = nowTs;
firedMask = 0;
emit NewHigh(emaTick, nowTs);
} else if (emaTick - refTick < TIER1_TICKS) {
// recovered to within the first rung: the whole ladder re-arms
firedMask = 0;
}
}
function _decayHigh(uint64 nowTs) private {
if (nowTs <= lastHighTime + HIGH_STALE_AFTER) return;
uint64 elapsed = nowTs - lastDecayTime;
if (elapsed < 1 days) return;
uint64 steps = elapsed / 1 days;
int24 from = refTick;
int256 moved = int256(refTick) + int256(uint256(steps)) * int256(HIGH_DECAY_TICKS_PER_DAY);
if (moved > int256(emaTick)) moved = int256(emaTick);
refTick = int24(moved);
lastDecayTime += steps * 1 days;
if (from != refTick) emit HighDecayed(from, refTick);
}
// ░░░░░ counter-cyclical buyback ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
function _maybeBuyback(PoolKey calldata key) private {
if (buybackWei == 0) return;
if (block.timestamp < uint256(lastBuybackTime) + BUYBACK_COOLDOWN) return;
// a tick with no liquidity behind it is not a price; never act on one
if (poolManager.getLiquidity(poolId) == 0) return;
uint16 bps = _armTier();
if (bps == 0) return;
uint256 spend = (uint256(buybackWei) * bps) / 10_000;
if (spend == 0) return;
lastBuybackTime = uint64(block.timestamp);
_buyback(key, spend, bps);
}
/// @dev Returns the share of the fund to deploy and marks the rung as fired. Each rung fires
/// once per descent; a higher rung also consumes the ones beneath it, so a gap-down
/// straight to -25% does not later re-fire -8% and -15% on the way back up.
function _armTier() private returns (uint16) {
if (_atFloor()) {
if (firedMask & 8 != 0) return 0;
firedMask = 0x0F;
return TIER_FLOOR_BPS;
}
int24 dd = emaTick - refTick;
if (dd >= TIER3_TICKS && firedMask & 4 == 0) {
firedMask |= 0x07;
return TIER3_BPS;
}
if (dd >= TIER2_TICKS && firedMask & 2 == 0) {
firedMask |= 0x03;
return TIER2_BPS;
}
if (dd >= TIER1_TICKS && firedMask & 1 == 0) {
firedMask |= 0x01;
return TIER1_BPS;
}
return 0;
}
/// @dev EMA, never spot. Spot looks like the right input — "at the floor" reads as a live
/// arbitrage condition — but a swap that exhausts in-range liquidity leaves the tick in
/// a region with no liquidity behind it, where it travels to MAX_TICK for free. Spot
/// then reports a token price of ~0 and this branch hands over the entire fund on
/// demand, at any time, with no drawdown and no capital. Observed on testnet: one sell
/// pushed the tick to 887271 with liquidity 0 and drained the fund in a single tx.
/// The EMA truncation absorbed that same jump down to 1 tick, so route through it.
function _atFloor() private view returns (bool) {
uint256 f = floorWeiPerToken();
if (f == 0) return false;
return _marketWeiPerToken(TickMath.getSqrtPriceAtTick(emaTick)) <= f;
}
function _marketWeiPerToken(uint160 sqrtPriceX96) private pure returns (uint256) {
// currency0 = ETH, currency1 = token, so sqrtPriceX96 = sqrt(tokens per wei) · 2^96
// wei per whole token = 1e18 · (2^96 / sqrtPriceX96)^2
uint256 x = FullMath.mulDiv(1e18, Q96, sqrtPriceX96);
return FullMath.mulDiv(x, Q96, sqrtPriceX96);
}
/// @dev Re-enters PoolManager.swap inside afterSwap. The global lock is already held by the
/// original unlocker, so the nested swap only has to settle its own deltas before
/// returning. The transient flag stops it from paying our own fee or arming the ladder.
function _buyback(PoolKey calldata key, uint256 spend, uint16 bps) private {
_lock();
BalanceDelta d = poolManager.swap(
key,
SwapParams({
zeroForOne: true, // ETH in, token out
amountSpecified: -int256(spend), // exact input
sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1
}),
""
);
// we owe currency0, we are owed currency1
poolManager.sync(CurrencyLibrary.ADDRESS_ZERO); // reset synced currency → settle native
poolManager.settle{value: spend}();
uint256 got = uint256(uint128(d.amount1()));
poolManager.take(key.currency1, address(this), got);
buybackWei -= uint128(spend);
totalBuybackWei += uint128(spend);
totalBurned += got;
_burn(address(this), got);
_unlock();
emit Buyback(bps, spend, got, emaTick - refTick);
}
// ░░░░░ transient re-entrancy flag ░░░░░░░░░░░░░░░░░░░░░░░░░░░
function _lock() private {
assembly ("memory-safe") {
tstore(LOCK_SLOT, 1)
}
}
function _unlock() private {
assembly ("memory-safe") {
tstore(LOCK_SLOT, 0)
}
}
function _locked() private view returns (bool f) {
assembly ("memory-safe") {
f := tload(LOCK_SLOT)
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_poolManager",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
},
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyBound",
"type": "error",
"inputs": []
},
{
"name": "BadPoolShape",
"type": "error",
"inputs": []
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "EmptyReserve",
"type": "error",
"inputs": []
},
{
"name": "HookNotImplemented",
"type": "error",
"inputs": []
},
{
"name": "NotPoolManager",
"type": "error",
"inputs": []
},
{
"name": "NothingToRedeem",
"type": "error",
"inputs": []
},
{
"name": "PayoutFailed",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Buyback",
"type": "event",
"inputs": [
{
"name": "tierBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "spentWei",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "burnedTokens",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "drawdownTicks",
"type": "int24",
"indexed": false,
"internalType": "int24"
}
],
"anonymous": false
},
{
"name": "FeeTaken",
"type": "event",
"inputs": [
{
"name": "trader",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "toReserve",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "toFund",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "toTreasury",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "isBuy",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "HighDecayed",
"type": "event",
"inputs": [
{
"name": "from",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "to",
"type": "int24",
"indexed": false,
"internalType": "int24"
}
],
"anonymous": false
},
{
"name": "NewHigh",
"type": "event",
"inputs": [
{
"name": "tick",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "at",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "Redeemed",
"type": "event",
"inputs": [
{
"name": "holder",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "burned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "paidWei",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "keptWei",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TreasuryClaimed",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BUYBACK_COOLDOWN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "EMA_TAU",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "HIGH_DECAY_TICKS_PER_DAY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "HIGH_STALE_AFTER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "HOOK_FLAGS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "LP_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "MAX_TICK_MOVE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "REDEEM_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER1_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER1_TICKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TIER2_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER2_TICKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TIER3_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER3_TICKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TIER_FLOOR_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TREASURY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "TREASURY_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "afterAddLiquidity",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "liquidityDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"internalType": "struct ModifyLiquidityParams"
},
{
"name": "delta0",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "delta1",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
}
],
"stateMutability": "nonpayable"
},
{
"name": "afterDonate",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "afterInitialize",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "sqrtPriceX96",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "tick",
"type": "int24",
"internalType": "int24"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "afterRemoveLiquidity",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "liquidityDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"internalType": "struct ModifyLiquidityParams"
},
{
"name": "delta0",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "delta1",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
}
],
"stateMutability": "nonpayable"
},
{
"name": "afterSwap",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "zeroForOne",
"type": "bool",
"internalType": "bool"
},
{
"name": "amountSpecified",
"type": "int256",
"internalType": "int256"
},
{
"name": "sqrtPriceLimitX96",
"type": "uint160",
"internalType": "uint160"
}
],
"internalType": "struct SwapParams"
},
{
"name": "delta",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int128",
"internalType": "int128"
}
],
"stateMutability": "nonpayable"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "beforeAddLiquidity",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "liquidityDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"internalType": "struct ModifyLiquidityParams"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeDonate",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeInitialize",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "sqrtPriceX96",
"type": "uint160",
"internalType": "uint160"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeRemoveLiquidity",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "liquidityDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"internalType": "struct ModifyLiquidityParams"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeSwap",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
},
{
"name": "params",
"type": "tuple",
"components": [
{
"name": "zeroForOne",
"type": "bool",
"internalType": "bool"
},
{
"name": "amountSpecified",
"type": "int256",
"internalType": "int256"
},
{
"name": "sqrtPriceLimitX96",
"type": "uint160",
"internalType": "uint160"
}
],
"internalType": "struct SwapParams"
},
{
"name": "hookData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BeforeSwapDelta"
},
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "nonpayable"
},
{
"name": "buybackWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "claimTreasury",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "drawdownTicks",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "emaTick",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "firedMask",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "floorWeiPerToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "getHookPermissions",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "beforeInitialize",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterInitialize",
"type": "bool",
"internalType": "bool"
},
{
"name": "beforeAddLiquidity",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterAddLiquidity",
"type": "bool",
"internalType": "bool"
},
{
"name": "beforeRemoveLiquidity",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterRemoveLiquidity",
"type": "bool",
"internalType": "bool"
},
{
"name": "beforeSwap",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterSwap",
"type": "bool",
"internalType": "bool"
},
{
"name": "beforeDonate",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterDonate",
"type": "bool",
"internalType": "bool"
},
{
"name": "beforeSwapReturnDelta",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterSwapReturnDelta",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterAddLiquidityReturnDelta",
"type": "bool",
"internalType": "bool"
},
{
"name": "afterRemoveLiquidityReturnDelta",
"type": "bool",
"internalType": "bool"
}
],
"internalType": "struct Hooks.Permissions"
}
],
"stateMutability": "pure"
},
{
"name": "lastBuybackTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "lastDecayTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "lastHighTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "lastObsTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "marketWeiPerToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "poolBound",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "poolId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "PoolId"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "quoteRedeem",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "payout",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "kept",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "redeem",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "refTick",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "reserveWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalBurned",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalBuybackWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "totalFeesWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "totalRedeemedWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalSwaps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "totalTreasuryWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "treasuryWei",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6080604052600436106103b5575f3560e01c8063924c8e30116101e9578063d438686f11610108578063dd62ed3e1161009d578063ed5226c11161006d578063ed5226c114610c5d578063f0bfb2d914610742578063fc8f1bd714610c73578063fd79393314610c99575f80fd5b8063dd62ed3e14610bdf578063e1b4af6914610991578063e7d1f51814610c23578063e9d4bd2714610c37575f80fd5b8063da329499116100d8578063da32949914610b4f578063db006a7514610b6e578063dc4c90d314610b8d578063dc98354e14610bc0575f80fd5b8063d438686f14610afd578063d63078cc14610b11578063d642aa0214610b26578063d89135cd14610b3a575f80fd5b8063a9e260841161017e578063bafbbcff1161014e578063bafbbcff146109b0578063bf333f2c146109cf578063c4e833ce146109e4578063cc8567eb14610ae4575f80fd5b8063a9e260841461091b578063b47b2fb114610930578063b4a800ce14610972578063b6a8b0fa14610991575f80fd5b80639f063efc116101b95780639f063efc14610757578063a2cdc401146108d2578063a8c81830146108e7578063a9059cbb146108fc575f80fd5b8063924c8e301461085a57806395d89b411461087a5780639deda9731461088e5780639ed069a9146108b4575f80fd5b806338fd6bdb116102d55780636bbce1c41161026a57806370a082311161023a57806370a08231146107d45780637752d2df146108085780637ac776be1461081d578063902d55a51461083d575f80fd5b80636bbce1c4146107425780636c2bbe7e146107575780636c7888e9146107965780636fe7e6eb146107b5575f80fd5b80635a0baa39116102a55780635a0baa39146106ca5780635ae7eb96146106f05780635e3f27271461070557806367d16ecb1461072e575f80fd5b806338fd6bdb1461063057806339043824146106445780633e0dc34e1461066b578063575e24b414610680575f80fd5b806323b872dd1161034b5780632a1d135e1161031b5780632a1d135e146105795780632d2c5565146105bd578063313ce567146105f057806334cb680c14610611575f80fd5b806323b872dd14610511578063259982e5146104d957806326880c3d146105305780632711be4414610545575f80fd5b806316cbb34f1161038657806316cbb34f1461045c57806317b1b1031461049357806318160ddd146104bb57806321d0ee70146104d9575f80fd5b80623bdc74146103c057806306fdde03146103d657806308b6637214610400578063095ea7b31461042d575f80fd5b366103bc57005b5f80fd5b3480156103cb575f80fd5b506103d4610cbf565b005b3480156103e1575f80fd5b506103ea610ddc565b6040516103f7919061326f565b60405180910390f35b34801561040b575f80fd5b506104156120cc81565b6040516001600160a01b0390911681526020016103f7565b348015610438575f80fd5b5061044c6104473660046132c6565b610e6c565b60405190151581526020016103f7565b348015610467575f80fd5b5060095461047b906001600160401b031681565b6040516001600160401b0390911681526020016103f7565b34801561049e575f80fd5b506104a861271081565b60405161ffff90911681526020016103f7565b3480156104c6575f80fd5b506002545b6040519081526020016103f7565b3480156104e4575f80fd5b506104f86104f336600461335a565b610e85565b6040516001600160e01b031990911681526020016103f7565b34801561051c575f80fd5b5061044c61052b3660046133d0565b610ee6565b34801561053b575f80fd5b506104a861138881565b348015610550575f80fd5b5061056461055f36600461340e565b610f0b565b604080519283526020830191909152016103f7565b348015610584575f80fd5b506009546105a590690100000000000000000090046001600160801b031681565b6040516001600160801b0390911681526020016103f7565b3480156105c8575f80fd5b506104157f000000000000000000000000a29c56b1ca1cf4bb69796af071255e8fd1c45d0281565b3480156105fb575f80fd5b5060125b60405160ff90911681526020016103f7565b34801561061c575f80fd5b506006546105a5906001600160801b031681565b34801561063b575f80fd5b506104a860c881565b34801561064f575f80fd5b50610658606481565b60405160029190910b81526020016103f7565b348015610676575f80fd5b506104cb60075481565b34801561068b575f80fd5b5061069f61069a366004613435565b610f89565b604080516001600160e01b03199094168452602084019290925262ffffff16908201526060016103f7565b3480156106d5575f80fd5b506005546105a590600160801b90046001600160801b031681565b3480156106fb575f80fd5b5061065861019081565b348015610710575f80fd5b5061071a610bb881565b60405162ffffff90911681526020016103f7565b348015610739575f80fd5b506104cb610ff4565b34801561074d575f80fd5b5061047b61070881565b348015610762575f80fd5b5061077661077136600461348e565b611058565b604080516001600160e01b031990931683526020830191909152016103f7565b3480156107a1575f80fd5b50600a546105a5906001600160801b031681565b3480156107c0575f80fd5b506104f86107cf366004613529565b6110c2565b3480156107df575f80fd5b506104cb6107ee366004613580565b6001600160a01b03165f9081526020819052604090205490565b348015610813575f80fd5b506104a86109c481565b348015610828575f80fd5b5060085461065890600160201b900460020b81565b348015610848575f80fd5b506104cb69d3c21bcecceda100000081565b348015610865575f80fd5b506009546105ff90600160401b900460ff1681565b348015610885575f80fd5b506103ea611121565b348015610899575f80fd5b50600a546105a590600160801b90046001600160801b031681565b3480156108bf575f80fd5b5060085461065890610100900460020b81565b3480156108dd575f80fd5b506104a86103e881565b3480156108f2575f80fd5b5061065861065981565b348015610907575f80fd5b5061044c6109163660046132c6565b611130565b348015610926575f80fd5b5061065861034281565b34801561093b575f80fd5b5061094f61094a36600461359b565b61113d565b604080516001600160e01b03199093168352600f9190910b6020830152016103f7565b34801561097d575f80fd5b50600d5461047b906001600160401b031681565b34801561099c575f80fd5b506104f86109ab36600461361b565b6111a6565b3480156109bb575f80fd5b506005546105a5906001600160801b031681565b3480156109da575f80fd5b506104a861012c81565b3480156109ef575f80fd5b50610ad7604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c08101825260018082525f60208301819052928201839052606082018390526080820183905260a0820183905260c0820181905260e0820181905261010082018390526101208201839052610140820181905261016082015261018081018290526101a081019190915290565b6040516103f79190613674565b348015610aef575f80fd5b5060085461044c9060ff1681565b348015610b08575f80fd5b506104cb611209565b348015610b1c575f80fd5b50610658610b3d81565b348015610b31575f80fd5b506104a8609681565b348015610b45575f80fd5b506104cb600c5481565b348015610b5a575f80fd5b50600b546105a5906001600160801b031681565b348015610b79575f80fd5b506103d4610b8836600461340e565b611243565b348015610b98575f80fd5b506104157f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b348015610bcb575f80fd5b506104f8610bda366004613795565b6113fb565b348015610bea575f80fd5b506104cb610bf93660046137dc565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610c2e575f80fd5b50610658611458565b348015610c42575f80fd5b5060085461047b90600160b81b90046001600160401b031681565b348015610c68575f80fd5b5061047b62093a8081565b348015610c7e575f80fd5b5060085461047b90600160381b90046001600160401b031681565b348015610ca4575f80fd5b5060085461047b90600160781b90046001600160401b031681565b6006546001600160801b03165f819003610cd65750565b600680546001600160801b03191690556040515f907f000000000000000000000000a29c56b1ca1cf4bb69796af071255e8fd1c45d026001600160a01b03169083908381818185875af1925050503d805f8114610d4e576040519150601f19603f3d011682016040523d82523d5f602084013e610d53565b606091505b5050905080610d7557604051630ec6ac4160e21b815260040160405180910390fd5b7f000000000000000000000000a29c56b1ca1cf4bb69796af071255e8fd1c45d026001600160a01b03167f0dafe5fda3d3c12f5534ba82c4393aaf90fe68d6198d310d71a7d9a6ea3cc1e083604051610dd091815260200190565b60405180910390a25050565b606060038054610deb90613813565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1790613813565b8015610e625780601f10610e3957610100808354040283529160200191610e62565b820191905f5260205f20905b815481529060010190602001808311610e4557829003601f168201915b5050505050905090565b5f33610e79818585611493565b60019150505b92915050565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614610ecf5760405163570c108560e11b815260040160405180910390fd5b610edc86868686866114a0565b9695505050505050565b5f33610ef38582856114ba565b610efe858585611535565b60019150505b9392505050565b5f805f610f1760025490565b9050801580610f24575083155b15610f3457505f93849350915050565b6005545f90610f4e9086906001600160801b031684611592565b9050612710610f5e60c883613859565b610f6a9061270f613870565b610f749190613897565b9250610f8083826138aa565b93505050915091565b5f8080336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614610fd55760405163570c108560e11b815260040160405180910390fd5b610fe2888888888861162e565b9250925092505b955095509592505050565b6008545f9060ff1661100557505f90565b5f6110446007547f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031661179290919063ffffffff16565b505050905061105281611844565b91505090565b5f80336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146110a35760405163570c108560e11b815260040160405180910390fd5b6110b289898989898989611880565b9150915097509795505050505050565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951161461110c5760405163570c108560e11b815260040160405180910390fd5b611118858585856114a0565b95945050505050565b606060048054610deb90613813565b5f33610e79818585611535565b5f80336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146111885760405163570c108560e11b815260040160405180910390fd5b61119688888888888861189b565b915091505b965096945050505050565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146111f05760405163570c108560e11b815260040160405180910390fd5b6111fe8787878787876114a0565b979650505050505050565b5f8061121460025490565b9050805f03611224575f91505090565b600554611052906001600160801b0316670de0b6b3a764000083611592565b805f03611263576040516304c4857b60e51b815260040160405180910390fd5b6005546001600160801b03165f0361128e576040516308d9b03560e31b815260040160405180910390fd5b5f8061129983610f0b565b915091506112a73384611b8e565b600580548391905f906112c49084906001600160801b03166138bd565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555081600a5f8282829054906101000a90046001600160801b031661130b91906138dc565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555082600c5f8282546113409190613870565b9091555050604080518481526020810184905290810182905233907f484c40561359f3e3b8be9101897f8680aa82fbe1df9fd9038e0dbc62840326469060600160405180910390a281156113f6576040515f90339084908381818185875af1925050503d805f81146113cd576040519150601f19603f3d011682016040523d82523d5f602084013e6113d2565b606091505b50509050806113f457604051630ec6ac4160e21b815260040160405180910390fd5b505b505050565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146114455760405163570c108560e11b815260040160405180910390fd5b611450848484611bc6565b949350505050565b6008545f90819061147c90600160201b8104600290810b916101009004900b6138fb565b90505f8160020b1361148e575f611052565b919050565b6113f68383836001611d67565b5f604051630a85dc2960e01b815260040160405180910390fd5b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156113f4578181101561152757604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064015b60405180910390fd5b6113f484848484035f611d67565b6001600160a01b03831661155e57604051634b637e8f60e11b81525f600482015260240161151e565b6001600160a01b0382166115875760405163ec442f0560e01b81525f600482015260240161151e565b6113f6838383611e39565b5f838302815f19858709828110838203039150508084116115b1575f80fd5b805f036115c357508290049050610f04565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f8080805c1561164c57506315d7892d60e21b91505f905080610fe9565b6116596020870187613920565b158061166957505f866020013512155b1561168257506315d7892d60e21b91505f905080610fe9565b5f611690602088013561393f565b90505f6127106116a261012c84613859565b6116ac9190613897565b9050806001600160801b03165f036116d657506315d7892d60e21b93505f9250829150610fe99050565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116630b0d9c0961171260208c018c613580565b30846040518463ffffffff1660e01b815260040161173293929190613959565b5f604051808303815f87803b158015611749575f80fd5b505af115801561175b573d5f803e3d5ffd5b5050505061176a816001611f5f565b6315d7892d60e21b9a60809190911b6001600160801b03191699505f98509650505050505050565b5f805f805f6117a08661215d565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156117e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180c9190613985565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b5f80611866670de0b6b3a7640000600160601b856001600160a01b0316611592565b9050610f0481600160601b856001600160a01b0316611592565b5f80604051630a85dc2960e01b815260040160405180910390fd5b5f80805c156118b5575063b47b2fb160e01b90505f61119b565b600d80546001600160401b038082166001011667ffffffffffffffff199091161790555f6118e38660801d90565b90505f8082600f0b13156119cb575f61271061190a61012c6001600160801b038616613859565b6119149190613897565b90506001600160801b038116156119c5576001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116630b0d9c0961196160208d018d613580565b30846040518463ffffffff1660e01b815260040161198193929190613959565b5f604051808303815f87803b158015611998575f80fd5b505af11580156119aa573d5f803e3d5ffd5b505050506119b8815f611f5f565b806001600160801b031691505b50611ada565b5f82600f0b1280156119e557506119e56020890189613920565b80156119f457505f8860200135135b15611ada575f61271061012c611a098561399c565b6001600160801b0316611a1c9190613859565b611a269190613897565b90506001600160801b03811615611ad8576001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116630b0d9c09611a7360208d018d613580565b30846040518463ffffffff1660e01b8152600401611a9393929190613959565b5f604051808303815f87803b158015611aaa575f80fd5b505af1158015611abc573d5f803e3d5ffd5b50505050611acb816001611f5f565b806001600160801b031691505b505b600754611b11906001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511690612199565b6001600160801b031615611b77575f611b5e6007547f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031661179290919063ffffffff16565b5050915050611b6c8161221c565b611b758a612462565b505b63b47b2fb160e01b9a909950975050505050505050565b6001600160a01b038216611bb757604051634b637e8f60e11b81525f600482015260240161151e565b611bc2825f83611e39565b5050565b6008545f9060ff1615611bec5760405163682a906560e01b815260040160405180910390fd5b611c09611bfc6020850185613580565b6001600160a01b03161590565b1580611c2d575030611c216040850160208601613580565b6001600160a01b031614155b80611c4e5750610bb8611c4660608501604086016139db565b62ffffff1614155b80611c71575030611c6560a0850160808601613580565b6001600160a01b031614155b15611c8f5760405163e413ee7360e01b815260040160405180910390fd5b611ca8611ca1368590038501856139f4565b60a0902090565b6007556008805460ff191660011790555f611cc28361256b565b6008805466ffffffffffff00191661010062ffffff9390931692830266ffffff00000000191617600160201b929092029190911776ffffffffffffffffffffffffffffffff000000000000001916600160381b426001600160401b031690810267ffffffffffffffff60781b191691909117600160781b82021767ffffffffffffffff60b81b1916600160b81b9190910217905550636e4c1aa760e11b949350505050565b6001600160a01b038416611d905760405163e602df0560e01b81525f600482015260240161151e565b6001600160a01b038316611db957604051634a1406b160e11b81525f600482015260240161151e565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156113f457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611e2b91815260200190565b60405180910390a350505050565b6001600160a01b038316611e63578060025f828254611e589190613870565b90915550611ed39050565b6001600160a01b0383165f9081526020819052604090205481811015611eb55760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161151e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611eef57600280548290039055611f0d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f5291815260200190565b60405180910390a3505050565b5f61012c611f7760966001600160801b038616613859565b611f819190613897565b90505f611f8e82856138bd565b90505f611f9c600283613a8d565b90505f611fa982846138bd565b6005805491925083915f90611fc89084906001600160801b03166138dc565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555080600560108282829054906101000a90046001600160801b031661201091906138dc565b92506101000a8154816001600160801b0302191690836001600160801b031602179055508360065f8282829054906101000a90046001600160801b031661205791906138dc565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550856009808282829054906101000a90046001600160801b031661209e91906138dc565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083600b5f8282829054906101000a90046001600160801b03166120e591906138dc565b82546101009290920a6001600160801b0381810219909316918316021790915560408051858316815284831660208201529187169082015286151560608201523391507fbb30fb21f1dbaadfc12efb570a153e43cc567dd005f09edda4a8c7a2181f85089060800160405180910390a2505050505050565b6040515f9061217c908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f806121a48361215d565b90505f6121b2600383613870565b604051631e2eaeaf60e01b8152600481018290529091506001600160a01b03861690631e2eaeaf90602401602060405180830381865afa1580156121f8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111189190613985565b60085442905f9061223d90600160381b90046001600160401b031683613aba565b9050806001600160401b03165f0361225457505050565b6008545f90612270906101009004600290810b9086900b613ad9565b905061019081131561228157506101905b61228c61019061393f565b8112156122a15761229e61019061393f565b90505b5f6122b76107086001600160401b038516613870565b6122ca6001600160401b03851684613af8565b6122d49190613b27565b6008549091506122ed908290610100900460020b613b53565b600880546effffffffffffffff000000ffffff00191661010062ffffff93909316929092026effffffffffffffff00000000000000191691909117600160381b6001600160401b03871602179055612344846127f7565b600854600160201b8104600290810b610100909204900b1215612420576008805476ffffffffffffffff0000000000000000ffffff00000000198116600160201b6101009283900462ffffff160267ffffffffffffffff60781b191617600160781b6001600160401b0388169081029190911767ffffffffffffffff60b81b1916600160b81b820217928390556009805460ff60401b19169055604080519290930460020b825260208201527f94d4a254dcd9288264996ff477386dd04f64e1b6b1cfd7b8c96b44d4a0e0b42d910160405180910390a161245b565b6008546103429061244490600160201b8104600290810b916101009004900b6138fb565b60020b121561245b576009805460ff60401b191690555b5050505050565b600554600160801b90046001600160801b03165f0361247e5750565b60095461249790610708906001600160401b0316613870565b4210156124a15750565b6007546124d8906001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511690612199565b6001600160801b03165f036124ea5750565b5f6124f36129b5565b90508061ffff165f03612504575050565b6005545f906127109061252c9061ffff851690600160801b90046001600160801b0316613859565b6125369190613897565b9050805f0361254457505050565b6009805467ffffffffffffffff1916426001600160401b03161790556113f6838284612b0e565b5f73fffd8963efd1fc6a506488495d951d51639616826401000276a21983016001600160a01b031611156125aa576125aa6318521d4960e21b83612ebd565b640100000000600160c01b03602083901b16805f6125c782612ed2565b60ff169050608081106125e257607f810383901c91506125ec565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146127e857886001600160a01b03166127cd82612f5c565b6001600160a01b031611156127e257816127ea565b806127ea565b815b9998505050505050505050565b6008546128189062093a8090600160781b90046001600160401b0316613b7a565b6001600160401b0316816001600160401b0316116128335750565b6008545f9061285290600160b81b90046001600160401b031683613aba565b905062015180816001600160401b0316101561286c575050565b5f61287a6201518083613b99565b600854909150600160201b900460020b5f61289f60646001600160401b038516613af8565b6008546128b69190600160201b900460020b613b53565b600854909150610100900460020b8113156128d85750600854610100900460020b5b6008805466ffffff000000001916600160201b62ffffff8416021790556129028362015180613bc6565b60088054601790612924908490600160b81b90046001600160401b0316613b7a565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550600860049054906101000a900460020b60020b8260020b1461245b5760085460408051600285810b8252600160201b90930490920b60208301527fe75a27525b902dceb988e7f3fabfd7d8450bb0b97b52a99eecdc1a1349518a1c91015b60405180910390a15050505050565b5f6129be613214565b156129f957600954600160401b9004600816156129da57505f90565b506009805460ff60401b1916680f000000000000000017905561271090565b6008545f90612a1b90600160201b8104600290810b916101009004900b6138fb565b9050610b3d600282900b12801590612a3d5750600954600160401b9004600416155b15612a6b5750506009805460ff60401b1981166007600160401b9283900460ff161790910217905561138890565b610659600282900b12801590612a8b5750600954600160401b9004600216155b15612ab95750506009805460ff60401b1981166003600160401b9283900460ff16179091021790556109c490565b610342600282900b12801590612ad95750600954600160401b9004600116155b15612b075750506009805460ff60401b1981166001600160401b9283900460ff16179091021790556103e890565b5f91505090565b612b16613255565b5f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c85604051806060016040528060011515815260200187612b659061393f565b8152602001612b7a6401000276a36001613be8565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401612ba3929190613c07565b6020604051808303815f875af1158015612bbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612be39190613985565b604051632961046560e21b81525f60048201529091507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03169063a5841194906024015f604051808303815f87803b158015612c44575f80fd5b505af1158015612c56573d5f803e3d5ffd5b505050507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166311da60b4846040518263ffffffff1660e01b815260040160206040518083038185885af1158015612cb8573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190612cdd9190613985565b505f612ce982600f0b90565b6001600160801b031690506001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116630b0d9c09612d336040880160208901613580565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018490526064015f604051808303815f87803b158015612d7e575f80fd5b505af1158015612d90573d5f803e3d5ffd5b5050505083600560108282829054906101000a90046001600160801b0316612db891906138bd565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555083600a60108282829054906101000a90046001600160801b0316612e0091906138dc565b92506101000a8154816001600160801b0302191690836001600160801b0316021790555080600c5f828254612e359190613870565b90915550612e4590503082611b8e565b612e4d61325b565b6008547f01a57a3b07c53ddc19824f3ee0274214bdc4c28fa9671b596baa45e8bdff036c90849086908490612e9590600160201b8104600290810b916101009004900b6138fb565b6040805161ffff909516855260208501939093529183015260020b60608201526080016129a6565b815f526001600160a01b03811660045260245ffd5b5f808211612ede575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6001600160801b03841160071b84811c6001600160401b031060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b60020b5f60ff82901d80830118620d89e8811115612f8557612f856345c3193d60e11b84613260565b7001fffcb933bd6fad37aa2d162d1a5940016001821602600160801b186002821615612fc1576ffff97272373d413259a46990580e213a0260801c5b6004821615612fe0576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612fff576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b601082161561301e576fffcb9843d60f6159c9db58835c9266440260801c5b602082161561303d576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561305c576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561307b576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561309b576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156130bb576ff987a7253ac413176f2b074cf7815e540260801c5b6104008216156130db576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156130fb576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161561311b576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161561313b576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561315b576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561317b576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561319c576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156131bc576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156131db576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156131f8576b048a170391f7dc42444e8fa20260801c5b5f841315613204575f19045b63ffffffff0160201c9392505050565b5f8061321e611209565b9050805f0361322e575f91505090565b600854819061324d9061324890610100900460020b612f5c565b611844565b111591505090565b60015f5d565b5f805d565b815f528060020b60045260245ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146132b8575f80fd5b50565b803561148e816132a4565b5f80604083850312156132d7575f80fd5b82356132e2816132a4565b946020939093013593505050565b5f60a08284031215613300575f80fd5b50919050565b5f60808284031215613300575f80fd5b5f8083601f840112613326575f80fd5b5081356001600160401b0381111561333c575f80fd5b602083019150836020828501011115613353575f80fd5b9250929050565b5f805f805f610160868803121561336f575f80fd5b853561337a816132a4565b945061338987602088016132f0565b93506133988760c08801613306565b92506101408601356001600160401b038111156133b3575f80fd5b6133bf88828901613316565b969995985093965092949392505050565b5f805f606084860312156133e2575f80fd5b83356133ed816132a4565b925060208401356133fd816132a4565b929592945050506040919091013590565b5f6020828403121561341e575f80fd5b5035919050565b5f60608284031215613300575f80fd5b5f805f805f610140868803121561344a575f80fd5b8535613455816132a4565b945061346487602088016132f0565b93506134738760c08801613425565b92506101208601356001600160401b038111156133b3575f80fd5b5f805f805f805f6101a0888a0312156134a5575f80fd5b87356134b0816132a4565b96506134bf8960208a016132f0565b95506134ce8960c08a01613306565b9450610140880135935061016088013592506101808801356001600160401b038111156134f9575f80fd5b6135058a828b01613316565b989b979a50959850939692959293505050565b8035600281900b811461148e575f80fd5b5f805f80610100858703121561353d575f80fd5b8435613548816132a4565b935061355786602087016132f0565b925060c0850135613567816132a4565b915061357560e08601613518565b905092959194509250565b5f60208284031215613590575f80fd5b8135610f04816132a4565b5f805f805f8061016087890312156135b1575f80fd5b86356135bc816132a4565b95506135cb88602089016132f0565b94506135da8860c08901613425565b935061012087013592506101408701356001600160401b038111156135fd575f80fd5b61360989828a01613316565b979a9699509497509295939492505050565b5f805f805f806101208789031215613631575f80fd5b863561363c816132a4565b955061364b88602089016132f0565b945060c0870135935060e087013592506101008701356001600160401b038111156135fd575f80fd5b8151151581526101c081016020830151613692602084018215159052565b5060408301516136a6604084018215159052565b5060608301516136ba606084018215159052565b5060808301516136ce608084018215159052565b5060a08301516136e260a084018215159052565b5060c08301516136f660c084018215159052565b5060e083015161370a60e084018215159052565b5061010083015161372061010084018215159052565b5061012083015161373661012084018215159052565b5061014083015161374c61014084018215159052565b5061016083015161376261016084018215159052565b5061018083015161377861018084018215159052565b506101a083015161378e6101a084018215159052565b5092915050565b5f805f60e084860312156137a7575f80fd5b83356137b2816132a4565b92506137c185602086016132f0565b915060c08401356137d1816132a4565b809150509250925092565b5f80604083850312156137ed575f80fd5b82356137f8816132a4565b91506020830135613808816132a4565b809150509250929050565b600181811c9082168061382757607f821691505b60208210810361330057634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610e7f57610e7f613845565b80820180821115610e7f57610e7f613845565b634e487b7160e01b5f52601260045260245ffd5b5f826138a5576138a5613883565b500490565b81810381811115610e7f57610e7f613845565b6001600160801b038281168282160390811115610e7f57610e7f613845565b6001600160801b038181168382160190811115610e7f57610e7f613845565b600282810b9082900b03627fffff198112627fffff82131715610e7f57610e7f613845565b5f60208284031215613930575f80fd5b81358015158114610f04575f80fd5b5f600160ff1b820161395357613953613845565b505f0390565b6001600160a01b0393841681529190921660208201526001600160801b03909116604082015260600190565b5f60208284031215613995575f80fd5b5051919050565b5f81600f0b6f7fffffffffffffffffffffffffffffff1981036139c1576139c1613845565b5f0392915050565b803562ffffff8116811461148e575f80fd5b5f602082840312156139eb575f80fd5b610f04826139c9565b5f60a0828403128015613a05575f80fd5b5060405160a081016001600160401b0381118282101715613a3457634e487b7160e01b5f52604160045260245ffd5b604052613a40836132bb565b8152613a4e602084016132bb565b6020820152613a5f604084016139c9565b6040820152613a7060608401613518565b6060820152613a81608084016132bb565b60808201529392505050565b5f6001600160801b03831680613aa557613aa5613883565b806001600160801b0384160491505092915050565b6001600160401b038281168282160390811115610e7f57610e7f613845565b8181035f83128015838313168383128216171561378e5761378e613845565b8082025f8212600160ff1b84141615613b1357613b13613845565b8181058314821517610e7f57610e7f613845565b5f82613b3557613b35613883565b600160ff1b82145f1984141615613b4e57613b4e613845565b500590565b8082018281125f831280158216821582161715613b7257613b72613845565b505092915050565b6001600160401b038181168382160190811115610e7f57610e7f613845565b5f6001600160401b03831680613bb157613bb1613883565b806001600160401b0384160491505092915050565b6001600160401b03818116838216029081169081811461378e5761378e613845565b6001600160a01b038181168382160190811115610e7f57610e7f613845565b5f8335613c13816132a4565b6001600160a01b031682526020840135613c2c816132a4565b6001600160a01b0316602083015262ffffff613c4a604086016139c9565b166040830152613c5c60608501613518565b60020b60608301526080840135613c72816132a4565b6001600160a01b0390811660808401528351151560a0840152602084015160c084015260408401511660e083015261012061010083015261145061012083015f81526020019056fea2646970667358221220ba19c8a6bfb398cd4f74438612a360d76fec848217edd6e745cd18d76586332d64736f6c634300081a0033
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x35dc17…f81dc0 | 13 days agoTue, 04 Aug 2026 16:06:42 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d1c45d02 data: 0x000000000000000000…381af7de |
| 0xa75723…881166 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d1c45d02 data: 0x000000000000000000…b4e50678 |
| 0xa75723…881166 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | 0xbb30fb…8508 | [0] 0x000000000000…43e40951 data: 0x000000000000000000…00000001 |
| 0xa75723…881166 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | Transfer | [0] 0x000000000000…78e12c56 [1] 0x000000000000…d1c45d02 data: 0x000000000000000000…b40001a9 |
| 0xa75723…881166 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | Transfer | [0] 0x000000000000…78e12c56 [1] 0x000000000000…43e40951 data: 0x000000000000000000…ecfffe57 |
| 0xa75723…881166 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | Approval | [0] 0x000000000000…78e12c56 [1] 0x000000000000…3ac78ba3 data: 0xffffffffffffffffff…ffffffff |
| 0x7e5617…8351b9 | 13 days agoTue, 04 Aug 2026 15:56:43 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…78e12c56 data: 0x000000000000000000…a1000000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 27,749,010 | 13 days agoTue, 04 Aug 2026 15:56:46 UTC | 0xa75723…881166 | CALL | launch | 0x8366…0951 | IN | 0xeb10…e0cc | 0.00015 ETH |
| 27,748,984 | 13 days agoTue, 04 Aug 2026 15:56:43 UTC | 0x7e5617…8351b9 | CREATE2 | optimized_routeFill921336808 | 0x4e59…956c | IN | 0xeb10…e0cc | 0 ETH |