// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {IHooks} from "v4-core/src/interfaces/IHooks.sol";
import {IPoolManager} from "v4-core/src/interfaces/IPoolManager.sol";
import {PoolKey} from "v4-core/src/types/PoolKey.sol";
import {PoolId, PoolIdLibrary} from "v4-core/src/types/PoolId.sol";
import {Currency, CurrencyLibrary} from "v4-core/src/types/Currency.sol";
import {BalanceDelta} from "v4-core/src/types/BalanceDelta.sol";
import {BeforeSwapDelta, toBeforeSwapDelta, BeforeSwapDeltaLibrary} from "v4-core/src/types/BeforeSwapDelta.sol";
import {ModifyLiquidityParams, SwapParams} from "v4-core/src/types/PoolOperation.sol";
import {SafeCast} from "v4-core/src/libraries/SafeCast.sol";
/// @title LoomHook
/// @notice Uniswap v4 hook applying a decaying buy/sell tax that is ALWAYS taken from the ETH
/// side of the swap and forwarded to a development wallet.
///
/// @dev The pool this hook serves is always (currency0 = native ETH, currency1 = token), which is
/// guaranteed because address(0) sorts below every token address. Therefore:
/// - BUY (ETH -> token) is `zeroForOne == true`
/// - SELL (token -> ETH) is `zeroForOne == false`
///
/// v4 names one side of a swap "specified" (the side the caller pinned) and the other
/// "unspecified". For exact-input swaps the specified side is the input; for exact-output it
/// is the output. Working that through for our pool:
///
/// zeroForOne | exactInput | ETH is... | taxed in
/// -----------+------------+-------------+-------------
/// true (buy) | true | specified | beforeSwap
/// true (buy) | false | unspecified | afterSwap
/// false(sell)| true | unspecified | afterSwap
/// false(sell)| false | specified | beforeSwap
///
/// So ETH is the specified currency exactly when `exactInput == zeroForOne`. That is the same
/// predicate v4 itself uses in Hooks.afterSwap to decide whether the hook's specified delta
/// maps onto amount0 or amount1, which is why the accounting below lines up in all four cases.
///
/// The tax is expressed as a fraction of the swapper's TOTAL ETH leg, so that a 6% tax always
/// means "6% of the ETH that entered or left the swapper's wallet":
/// - when we tax a known total (exact-input buy, exact-input sell): tax = total * rate / 1e4
/// - when we tax a net amount and must gross it up (exact-output legs): tax = net * rate / (1e4 - rate)
///
/// @dev Required flag bits in this contract's address (mined via CREATE2): 0x20CC
/// BEFORE_INITIALIZE (1 << 13) = 0x2000
/// BEFORE_SWAP (1 << 7) = 0x0080
/// AFTER_SWAP (1 << 6) = 0x0040
/// BEFORE_SWAP_RETURNS_DELTA (1 << 3) = 0x0008
/// AFTER_SWAP_RETURNS_DELTA (1 << 2) = 0x0004
contract LoomHook is IHooks {
using PoolIdLibrary for PoolKey;
using SafeCast for uint256;
/// @notice Exact flag bits this hook's address must carry.
uint160 internal constant REQUIRED_FLAGS = 0x20CC;
uint256 internal constant BPS = 10_000;
/// @notice Gas forwarded when pushing tax to the dev wallet. Enough for an EOA or a thin
/// receiver, capped so a griefing dev wallet cannot burn a swapper's gas.
uint256 internal constant DEV_PUSH_GAS = 30_000;
IPoolManager public immutable poolManager;
/// @notice The token this hook taxes. Must be currency1 of the pool.
address public immutable token;
/// @notice Receives the ETH tax.
address public immutable devWallet;
/// @notice Starting tax rates in basis points (600 = 6%).
uint16 public immutable startBuyTaxBps;
uint16 public immutable startSellTaxBps;
/// @notice Seconds per 1% (100 bps) decay step. 180 = 3 minutes.
uint32 public immutable stepDuration;
/// @notice Timestamp of pool initialization, i.e. of `Loom.start()`. Anchors the decay.
uint64 public launchTime;
/// @notice The single pool this hook serves. Set on initialize, immutable thereafter.
PoolId public poolId;
event LaunchAnchored(PoolId indexed poolId, uint64 timestamp);
event TaxTaken(address indexed payer, bool isBuy, uint256 ethAmount, uint16 rateBps);
event TaxForwardFailed(uint256 amount);
event Swept(uint256 amount);
error NotPoolManager();
error HookNotImplemented();
error AlreadyLaunched();
error UnauthorizedInitializer();
error BadPoolCurrencies();
error InvalidHookAddress();
error InvalidTaxRate();
error NothingToSweep();
error SweepFailed();
modifier onlyPoolManager() {
if (msg.sender != address(poolManager)) revert NotPoolManager();
_;
}
constructor(
IPoolManager _poolManager,
address _token,
address _devWallet,
uint16 _startBuyTaxBps,
uint16 _startSellTaxBps,
uint32 _stepDuration
) {
// Guarantees the CREATE2 salt was mined correctly; a wrong address would only fail later,
// at pool initialization, after the deploy tx already succeeded.
if (uint160(address(this)) & 0x3FFF != REQUIRED_FLAGS) revert InvalidHookAddress();
// Gross-up divisor (BPS - rate) must stay positive, and a tax at/above 100% is nonsense.
if (_startBuyTaxBps >= BPS || _startSellTaxBps >= BPS) revert InvalidTaxRate();
if (_stepDuration == 0) revert InvalidTaxRate();
poolManager = _poolManager;
token = _token;
devWallet = _devWallet;
startBuyTaxBps = _startBuyTaxBps;
startSellTaxBps = _startSellTaxBps;
stepDuration = _stepDuration;
}
/// @notice PoolManager sends native ETH here when the hook `take`s its tax.
receive() external payable {}
// ---------------------------------------------------------------------------------------
// Tax schedule
// ---------------------------------------------------------------------------------------
/// @notice Tax rate in bps for a given starting rate at the current time.
/// @dev Steps down 100 bps every `stepDuration` seconds, floored at 0. With a 600 bps start and
/// a 180s step this is exactly: 0-3min 6%, 3-6min 5%, ... 15-18min 1%, 18min+ 0%.
function taxBpsAt(uint16 startBps, uint256 timestamp) public view returns (uint16) {
uint64 anchor = launchTime;
if (anchor == 0 || timestamp <= anchor) return startBps;
// Divide-then-multiply is the point: it floors elapsed time into whole steps, which is what
// makes the tax a staircase (6,5,4...) rather than a smooth ramp.
// forge-lint: disable-next-line(divide-before-multiply)
uint256 decayed = ((timestamp - anchor) / stepDuration) * 100;
// Safe: the ternary guarantees decayed < startBps, and startBps is already a uint16.
// forge-lint: disable-next-line(unsafe-typecast)
return decayed >= startBps ? 0 : uint16(startBps - decayed);
}
function currentBuyTaxBps() public view returns (uint16) {
return taxBpsAt(startBuyTaxBps, block.timestamp);
}
function currentSellTaxBps() public view returns (uint16) {
return taxBpsAt(startSellTaxBps, block.timestamp);
}
/// @notice Seconds until the tax reaches 0%, from `launchTime`.
function decayDuration() external view returns (uint256) {
uint16 maxStart = startBuyTaxBps > startSellTaxBps ? startBuyTaxBps : startSellTaxBps;
// ceil(maxStart / 100) steps are needed to reach zero; the division must come first.
// forge-lint: disable-next-line(divide-before-multiply)
return ((uint256(maxStart) + 99) / 100) * stepDuration;
}
// ---------------------------------------------------------------------------------------
// Hooks
// ---------------------------------------------------------------------------------------
/// @notice Anchors the decay schedule and locks this hook to a single ETH/token pool.
function beforeInitialize(address sender, PoolKey calldata key, uint160) external onlyPoolManager returns (bytes4) {
if (launchTime != 0) revert AlreadyLaunched();
// Only the token contract's start() may open this pool; otherwise a third party could
// initialize a junk pool against this hook and burn the one-shot launch anchor.
if (sender != token) revert UnauthorizedInitializer();
if (!key.currency0.isAddressZero() || Currency.unwrap(key.currency1) != token) revert BadPoolCurrencies();
launchTime = uint64(block.timestamp);
poolId = key.toId();
emit LaunchAnchored(poolId, uint64(block.timestamp));
return IHooks.beforeInitialize.selector;
}
/// @notice Taxes the ETH leg when ETH is the swap's *specified* currency.
function beforeSwap(address sender, PoolKey calldata, SwapParams calldata params, bytes calldata)
external
onlyPoolManager
returns (bytes4, BeforeSwapDelta, uint24)
{
bool exactInput = params.amountSpecified < 0;
// ETH is the unspecified side here; afterSwap handles it once the amount is known.
if (exactInput != params.zeroForOne) {
return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
}
uint16 rate = params.zeroForOne ? currentBuyTaxBps() : currentSellTaxBps();
if (rate == 0) return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
uint256 tax;
if (exactInput) {
// BUY, exact ETH in. amountSpecified = -total. Tax a slice of the total; the
// remainder is what actually swaps. 0.5 ETH @ 6% -> 0.03 dev, 0.47 swapped.
tax = (uint256(-params.amountSpecified) * rate) / BPS;
} else {
// SELL, exact ETH out. The caller pinned the ETH they want to *receive*, so pull that
// much extra out of the pool and skim it, leaving their requested amount intact.
tax = (uint256(params.amountSpecified) * rate) / (BPS - rate);
}
if (tax == 0) return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
_collect(tax);
emit TaxTaken(sender, params.zeroForOne, tax, rate);
// Positive specified delta: v4 adds it to amountSpecified (shrinking an exact-input swap,
// growing an exact-output one) and credits this hook the difference.
return (IHooks.beforeSwap.selector, toBeforeSwapDelta(tax.toInt128(), 0), 0);
}
/// @notice Taxes the ETH leg when ETH is the swap's *unspecified* currency.
function afterSwap(address sender, PoolKey calldata, SwapParams calldata params, BalanceDelta delta, bytes calldata)
external
onlyPoolManager
returns (bytes4, int128)
{
bool exactInput = params.amountSpecified < 0;
// ETH was the specified side; beforeSwap already took the tax.
if (exactInput == params.zeroForOne) return (IHooks.afterSwap.selector, 0);
uint16 rate = params.zeroForOne ? currentBuyTaxBps() : currentSellTaxBps();
if (rate == 0) return (IHooks.afterSwap.selector, 0);
// amount0 is the ETH leg: negative = swapper owes it, positive = swapper receives it.
int128 ethDelta = delta.amount0();
uint256 tax;
if (params.zeroForOne) {
// BUY, exact token out. The pool consumed `ethIn`; gross up so the tax is `rate` of
// what the swapper pays in total (ethIn + tax).
if (ethDelta >= 0) return (IHooks.afterSwap.selector, 0);
// Safe: ethDelta is a negative int128, so -ethDelta is a positive int128.
// forge-lint: disable-next-line(unsafe-typecast)
tax = (uint256(int256(-ethDelta)) * rate) / (BPS - rate);
} else {
// SELL, exact token in. Skim the tax off the ETH the pool is paying out.
// 0.5 ETH out @ 6% -> 0.03 dev, 0.47 to the seller.
if (ethDelta <= 0) return (IHooks.afterSwap.selector, 0);
// Safe: ethDelta is checked positive immediately above.
// forge-lint: disable-next-line(unsafe-typecast)
tax = (uint256(int256(ethDelta)) * rate) / BPS;
}
if (tax == 0) return (IHooks.afterSwap.selector, 0);
_collect(tax);
emit TaxTaken(sender, params.zeroForOne, tax, rate);
// Positive unspecified delta: v4 subtracts it from the swapper's delta and credits the hook.
return (IHooks.afterSwap.selector, tax.toInt128());
}
// ---------------------------------------------------------------------------------------
// Tax collection
// ---------------------------------------------------------------------------------------
/// @dev Pulls `amount` of native ETH out of the PoolManager and pushes it to the dev wallet.
/// Taking to this contract first (rather than straight to `devWallet`) means a dev wallet
/// that reverts on receive cannot brick every swap in the pool -- the ETH just parks here
/// until someone calls `sweep()`.
function _collect(uint256 amount) internal {
poolManager.take(CurrencyLibrary.ADDRESS_ZERO, address(this), amount);
(bool ok,) = devWallet.call{value: amount, gas: DEV_PUSH_GAS}("");
if (!ok) emit TaxForwardFailed(amount);
}
/// @notice Push any tax stranded by a failed forward to the dev wallet. Callable by anyone;
/// the destination is immutable, so there is nothing to steal.
function sweep() external {
uint256 balance = address(this).balance;
if (balance == 0) revert NothingToSweep();
(bool ok,) = devWallet.call{value: balance}("");
if (!ok) revert SweepFailed();
emit Swept(balance);
}
// ---------------------------------------------------------------------------------------
// Unused hooks -- flags are unset so v4 never calls these.
// ---------------------------------------------------------------------------------------
function afterInitialize(address, PoolKey calldata, uint160, int24) external pure returns (bytes4) {
revert HookNotImplemented();
}
function beforeAddLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)
external
pure
returns (bytes4)
{
revert HookNotImplemented();
}
function afterAddLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
BalanceDelta,
BalanceDelta,
bytes calldata
) external pure returns (bytes4, BalanceDelta) {
revert HookNotImplemented();
}
function beforeRemoveLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)
external
pure
returns (bytes4)
{
revert HookNotImplemented();
}
function afterRemoveLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
BalanceDelta,
BalanceDelta,
bytes calldata
) external pure returns (bytes4, BalanceDelta) {
revert HookNotImplemented();
}
function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata) external pure returns (bytes4) {
revert HookNotImplemented();
}
function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata) external pure returns (bytes4) {
revert HookNotImplemented();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_poolManager",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "_token",
"type": "address",
"internalType": "address"
},
{
"name": "_devWallet",
"type": "address",
"internalType": "address"
},
{
"name": "_startBuyTaxBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_startSellTaxBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_stepDuration",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyLaunched",
"type": "error",
"inputs": []
},
{
"name": "BadPoolCurrencies",
"type": "error",
"inputs": []
},
{
"name": "HookNotImplemented",
"type": "error",
"inputs": []
},
{
"name": "InvalidHookAddress",
"type": "error",
"inputs": []
},
{
"name": "InvalidTaxRate",
"type": "error",
"inputs": []
},
{
"name": "NotPoolManager",
"type": "error",
"inputs": []
},
{
"name": "NothingToSweep",
"type": "error",
"inputs": []
},
{
"name": "SweepFailed",
"type": "error",
"inputs": []
},
{
"name": "UnauthorizedInitializer",
"type": "error",
"inputs": []
},
{
"name": "LaunchAnchored",
"type": "event",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "PoolId"
},
{
"name": "timestamp",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "Swept",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TaxForwardFailed",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TaxTaken",
"type": "event",
"inputs": [
{
"name": "payer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "isBuy",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "rateBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "afterAddLiquidity",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"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": "",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
}
],
"stateMutability": "pure"
},
{
"name": "afterDonate",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "afterInitialize",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "afterRemoveLiquidity",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"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": "",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BalanceDelta"
}
],
"stateMutability": "pure"
},
{
"name": "afterSwap",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int128",
"internalType": "int128"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeAddLiquidity",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"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": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "beforeDonate",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"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": "",
"type": "uint160",
"internalType": "uint160"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "beforeRemoveLiquidity",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"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": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "beforeSwap",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "int256",
"internalType": "BeforeSwapDelta"
},
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "nonpayable"
},
{
"name": "currentBuyTaxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "currentSellTaxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "decayDuration",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "devWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "launchTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"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": "startBuyTaxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "startSellTaxBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "stepDuration",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "sweep",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "taxBpsAt",
"type": "function",
"inputs": [
{
"name": "startBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "timestamp",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "token",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60806040526004361061017b575f3560e01c8063790ca413116100d1578063b6a8b0fa1161007c578063dc98354e11610057578063dc98354e146104cd578063e1b4af691461046c578063fc0c546a146104ec575f80fd5b8063b6a8b0fa1461046c578063ba35736e14610486578063dc4c90d31461049a575f80fd5b80639f063efc116100ac5780639f063efc146102f3578063b47b2fb1146103f7578063b60ff9ea14610439575f80fd5b8063790ca413146103605780638ea5220f146103985780639be3c85b146103e3575f80fd5b80634255ea46116101315780636c2bbe7e1161010c5780636c2bbe7e146102f35780636fe7e6eb1461033257806372aba4a91461034c575f80fd5b80634255ea461461022e5780634a4e577614610261578063575e24b4146102a9575f80fd5b8063259982e511610161578063259982e5146101bd57806335faa416146101f55780633e0dc34e1461020b575f80fd5b80630ec8a4641461018657806321d0ee70146101bd575f80fd5b3661018257005b5f80fd5b348015610191575f80fd5b506101a56101a0366004610f89565b61051f565b60405161ffff90911681526020015b60405180910390f35b3480156101c8575f80fd5b506101dc6101d736600461104b565b6105d0565b6040516001600160e01b031990911681526020016101b4565b348015610200575f80fd5b506102096105ea565b005b348015610216575f80fd5b5061022060015481565b6040519081526020016101b4565b348015610239575f80fd5b506101a57f000000000000000000000000000000000000000000000000000000000000025881565b34801561026c575f80fd5b506102947f00000000000000000000000000000000000000000000000000000000000000b481565b60405163ffffffff90911681526020016101b4565b3480156102b4575f80fd5b506102c86102c33660046110d2565b6106d4565b604080516001600160e01b03199094168452602084019290925262ffffff16908201526060016101b4565b3480156102fe575f80fd5b5061031261030d36600461112c565b6108bd565b604080516001600160e01b031990931683526020830191909152016101b4565b34801561033d575f80fd5b506101dc6101d73660046111c8565b348015610357575f80fd5b506101a56108d8565b34801561036b575f80fd5b505f5461037f9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101b4565b3480156103a3575f80fd5b506103cb7f00000000000000000000000020a502ef51d5eac53628fec32a9932d0d5609c7181565b6040516001600160a01b0390911681526020016101b4565b3480156103ee575f80fd5b506101a5610908565b348015610402575f80fd5b5061041661041136600461121f565b610933565b604080516001600160e01b03199093168352600f9190910b6020830152016101b4565b348015610444575f80fd5b506101a57f000000000000000000000000000000000000000000000000000000000000025881565b348015610477575f80fd5b506101dc6101d73660046112a0565b348015610491575f80fd5b50610220610b62565b3480156104a5575f80fd5b506103cb7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b3480156104d8575f80fd5b506101dc6104e73660046112fa565b610c4f565b3480156104f7575f80fd5b506103cb7f0000000000000000000000001385e99bac41c85a777475b5854851e7219cd45b81565b5f805467ffffffffffffffff1680158061054357508067ffffffffffffffff168311155b1561055157839150506105ca565b5f63ffffffff7f00000000000000000000000000000000000000000000000000000000000000b41661058d67ffffffffffffffff841686611355565b6105979190611368565b6105a2906064611387565b90508461ffff168110156105c3576105be8161ffff8716611355565b6105c5565b5f5b925050505b92915050565b5f604051630a85dc2960e01b815260040160405180910390fd5b475f81900361060c57604051630d44987f60e21b815260040160405180910390fd5b5f7f00000000000000000000000020a502ef51d5eac53628fec32a9932d0d5609c716001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610675576040519150601f19603f3d011682016040523d82523d5f602084013e61067a565b606091505b505090508061069c576040516313dd85ff60e31b815260040160405180910390fd5b6040518281527f7f221332ee403570bf4d61630b58189ea566ff1635269001e9df6a890f413dd8906020015b60405180910390a15050565b5f8080336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146107205760405163570c108560e11b815260040160405180910390fd5b5f6020870180359190911290610736908861139e565b15158115151461075657506315d7892d60e21b92505f91508190506108b2565b5f610764602089018961139e565b61077557610770610908565b61077d565b61077d6108d8565b90508061ffff165f036107a257506315d7892d60e21b93505f92508291506108b29050565b5f82156107d95761271061ffff83166107be60208c01356113c4565b6107c89190611387565b6107d29190611368565b9050610808565b6107e961ffff8316612710611355565b6107fb61ffff841660208c0135611387565b6108059190611368565b90505b805f0361082857506315d7892d60e21b94505f93508392506108b2915050565b61083181610e24565b6001600160a01b038b167f8cd2bb102eb2e6878444d9fc5c6430268b6ce797192115a49d8ed8f9a98ed5cc61086960208c018c61139e565b6040805191151582526020820185905261ffff86169082015260600160405180910390a26315d7892d60e21b6108a76108a183610f55565b60801b90565b5f9550955095505050505b955095509592505050565b5f80604051630a85dc2960e01b815260040160405180910390fd5b5f6109037f00000000000000000000000000000000000000000000000000000000000002584261051f565b905090565b5f6109037f00000000000000000000000000000000000000000000000000000000000002584261051f565b5f80336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951161461097e5760405163570c108560e11b815260040160405180910390fd5b5f6020870180359190911290610994908861139e565b1515811515036109b1575063b47b2fb160e01b91505f9050610b57565b5f6109bf602089018961139e565b6109d0576109cb610908565b6109d8565b6109d86108d8565b90508061ffff165f036109fa575063b47b2fb160e01b92505f9150610b579050565b5f610a058860801d90565b90505f610a1560208b018b61139e565b15610a77575f82600f0b12610a3b575063b47b2fb160e01b94505f9350610b5792505050565b610a4b61ffff8416612710611355565b61ffff8416610a59846113de565b600f0b610a669190611387565b610a709190611368565b9050610aba565b5f82600f0b13610a98575063b47b2fb160e01b94505f9350610b5792505050565b612710610aad61ffff8516600f85900b611387565b610ab79190611368565b90505b805f03610ad8575063b47b2fb160e01b94505f9350610b5792505050565b610ae181610e24565b6001600160a01b038c167f8cd2bb102eb2e6878444d9fc5c6430268b6ce797192115a49d8ed8f9a98ed5cc610b1960208d018d61139e565b6040805191151582526020820185905261ffff87169082015260600160405180910390a263b47b2fb160e01b610b4e82610f55565b95509550505050505b965096945050505050565b5f807f000000000000000000000000000000000000000000000000000000000000025861ffff167f000000000000000000000000000000000000000000000000000000000000025861ffff1611610bd9577f0000000000000000000000000000000000000000000000000000000000000258610bfb565b7f00000000000000000000000000000000000000000000000000000000000002585b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000000b4166064610c3561ffff8416606361140b565b610c3f9190611368565b610c499190611387565b91505090565b5f336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614610c995760405163570c108560e11b815260040160405180910390fd5b5f5467ffffffffffffffff1615610cc3576040516319f4db0f60e31b815260040160405180910390fd5b7f0000000000000000000000001385e99bac41c85a777475b5854851e7219cd45b6001600160a01b0316846001600160a01b031614610d1557604051630d622feb60e01b815260040160405180910390fd5b610d32610d25602085018561141e565b6001600160a01b03161590565b1580610d7f57506001600160a01b037f0000000000000000000000001385e99bac41c85a777475b5854851e7219cd45b16610d73604085016020860161141e565b6001600160a01b031614155b15610d9d57604051631e048ac560e31b815260040160405180910390fd5b5f805467ffffffffffffffff19164267ffffffffffffffff16179055610dd2610dcb3685900385018561144b565b60a0902090565b600181905560405167ffffffffffffffff421681527f3d5ce30d78be0c7b1543a499d3251032aab00228a2ed321bfb3466fe38f4352d9060200160405180910390a250636e4c1aa760e11b9392505050565b604051630b0d9c0960e01b81525f6004820152306024820152604481018290527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031690630b0d9c09906064015f604051808303815f87803b158015610e8f575f80fd5b505af1158015610ea1573d5f803e3d5ffd5b505050505f7f00000000000000000000000020a502ef51d5eac53628fec32a9932d0d5609c716001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114610f13576040519150601f19603f3d011682016040523d82523d5f602084013e610f18565b606091505b5050905080610f51576040518281527f5ccf6adc1da1b73f94eb385b82f1fbc3e98479d4f8cc4a6c76fff1678fe67fd4906020016106c8565b5050565b5f6f800000000000000000000000000000008210610f7d57610f7d6393dafdf160e01b610f81565b5090565b805f5260045ffd5b5f8060408385031215610f9a575f80fd5b823561ffff81168114610fab575f80fd5b946020939093013593505050565b6001600160a01b0381168114610fcd575f80fd5b50565b8035610fdb81610fb9565b919050565b5f60a08284031215610ff0575f80fd5b50919050565b5f60808284031215610ff0575f80fd5b5f8083601f840112611016575f80fd5b50813567ffffffffffffffff81111561102d575f80fd5b602083019150836020828501011115611044575f80fd5b9250929050565b5f805f805f6101608688031215611060575f80fd5b853561106b81610fb9565b945061107a8760208801610fe0565b93506110898760c08801610ff6565b925061014086013567ffffffffffffffff8111156110a5575f80fd5b6110b188828901611006565b969995985093965092949392505050565b5f60608284031215610ff0575f80fd5b5f805f805f61014086880312156110e7575f80fd5b85356110f281610fb9565b94506111018760208801610fe0565b93506111108760c088016110c2565b925061012086013567ffffffffffffffff8111156110a5575f80fd5b5f805f805f805f6101a0888a031215611143575f80fd5b873561114e81610fb9565b965061115d8960208a01610fe0565b955061116c8960c08a01610ff6565b94506101408801359350610160880135925061018088013567ffffffffffffffff811115611198575f80fd5b6111a48a828b01611006565b989b979a50959850939692959293505050565b8035600281900b8114610fdb575f80fd5b5f805f8061010085870312156111dc575f80fd5b84356111e781610fb9565b93506111f68660208701610fe0565b925060c085013561120681610fb9565b915061121460e086016111b7565b905092959194509250565b5f805f805f806101608789031215611235575f80fd5b863561124081610fb9565b955061124f8860208901610fe0565b945061125e8860c089016110c2565b9350610120870135925061014087013567ffffffffffffffff811115611282575f80fd5b61128e89828a01611006565b979a9699509497509295939492505050565b5f805f805f8061012087890312156112b6575f80fd5b86356112c181610fb9565b95506112d08860208901610fe0565b945060c0870135935060e0870135925061010087013567ffffffffffffffff811115611282575f80fd5b5f805f60e0848603121561130c575f80fd5b833561131781610fb9565b92506113268560208601610fe0565b915060c084013561133681610fb9565b809150509250925092565b634e487b7160e01b5f52601160045260245ffd5b818103818111156105ca576105ca611341565b5f8261138257634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176105ca576105ca611341565b5f602082840312156113ae575f80fd5b813580151581146113bd575f80fd5b9392505050565b5f600160ff1b82016113d8576113d8611341565b505f0390565b5f81600f0b6f7fffffffffffffffffffffffffffffff19810361140357611403611341565b5f0392915050565b808201808211156105ca576105ca611341565b5f6020828403121561142e575f80fd5b81356113bd81610fb9565b803562ffffff81168114610fdb575f80fd5b5f60a082840312801561145c575f80fd5b5060405160a0810167ffffffffffffffff8111828210171561148c57634e487b7160e01b5f52604160045260245ffd5b60405261149883610fd0565b81526114a660208401610fd0565b60208201526114b760408401611439565b60408201526114c8606084016111b7565b60608201526114d960808401610fd0565b6080820152939250505056fea2646970667358221220150b3dce7816e8eda87f5c4fe3a560452d3b9633e1580a9aca11ed0bc5726ced64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xe3700f…844585 | 9 hrs agoMon, 17 Aug 2026 18:40:37 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…aa9470e0 data: 0x000000000000000000…00000064 |
| 0xc5d0d8…7b4bc6 | 9 hrs agoMon, 17 Aug 2026 18:40:30 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…e9b05d31 data: 0x000000000000000000…00000064 |
| 0xda1583…462b63 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0x6755fe…519fe4 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0x6b40f7…9966e1 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0xb81f6d…ee34a2 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0x962795…e828ac | 9 hrs agoMon, 17 Aug 2026 18:40:24 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…db8c0904 data: 0x000000000000000000…00000064 |
| 0x442c83…9fb806 | 9 hrs agoMon, 17 Aug 2026 18:40:23 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…db8c0904 data: 0x000000000000000000…00000064 |
| 0x7cc6ed…38606f | 9 hrs agoMon, 17 Aug 2026 18:40:15 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xd2ab56…d940b9 | 9 hrs agoMon, 17 Aug 2026 18:40:11 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…65690eba data: 0x000000000000000000…00000064 |
| 0xe22eb5…ebbb3a | 9 hrs agoMon, 17 Aug 2026 18:40:07 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0x073f9f…77f7a1 | 9 hrs agoMon, 17 Aug 2026 18:40:02 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0x413006…f74ff2 | 9 hrs agoMon, 17 Aug 2026 18:40:00 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xb852d4…f94646 | 9 hrs agoMon, 17 Aug 2026 18:39:55 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xee7e32…0cff53 | 10 hrs agoMon, 17 Aug 2026 18:39:49 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xec05f1…00b6b4 | 10 hrs agoMon, 17 Aug 2026 18:39:46 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xa80ac9…1b7ef7 | 10 hrs agoMon, 17 Aug 2026 18:39:44 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xb2eb86…e8eff4 | 10 hrs agoMon, 17 Aug 2026 18:39:39 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…db8c0904 data: 0x000000000000000000…00000064 |
| 0x21e5d1…dcf046 | 10 hrs agoMon, 17 Aug 2026 18:39:30 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…d113f996 data: 0x000000000000000000…00000064 |
| 0x3c4e9f…c37c1d | 10 hrs agoMon, 17 Aug 2026 18:39:29 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0xbd5f3a…e898b4 | 10 hrs agoMon, 17 Aug 2026 18:39:29 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| 0x364428…f86243 | 10 hrs agoMon, 17 Aug 2026 18:39:27 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…6cd7ce2b data: 0x000000000000000000…00000064 |
| 0x101bb3…4158f4 | 10 hrs agoMon, 17 Aug 2026 18:39:27 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…20cbbe5f data: 0x000000000000000000…00000064 |
| 0xb23932…6161d5 | 10 hrs agoMon, 17 Aug 2026 18:39:27 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…db8c0904 data: 0x000000000000000000…00000064 |
| 0x426749…38e270 | 10 hrs agoMon, 17 Aug 2026 18:39:27 UTC | 0x8cd2bb…d5cc | [0] 0x000000000000…262c40dc data: 0x000000000000000000…00000064 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 39,059,516 | 9 hrs agoMon, 17 Aug 2026 18:40:37 UTC | 0xe3700f…844585 | CALL | SigmaSwap | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00031 ETH |
| 39,059,516 | 9 hrs agoMon, 17 Aug 2026 18:40:37 UTC | 0xe3700f…844585 | CALL | SigmaSwap | 0x8366…0951 | IN | 0x6015…20cc | 0.00031 ETH |
| 39,059,448 | 9 hrs agoMon, 17 Aug 2026 18:40:30 UTC | 0xc5d0d8…7b4bc6 | CALL | dagSwapTo | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00001 ETH |
| 39,059,448 | 9 hrs agoMon, 17 Aug 2026 18:40:30 UTC | 0xc5d0d8…7b4bc6 | CALL | dagSwapTo | 0x8366…0951 | IN | 0x6015…20cc | 0.00001 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0xda1583…462b63 | CALL | swap | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00014 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0xda1583…462b63 | CALL | swap | 0x8366…0951 | IN | 0x6015…20cc | 0.00014 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x6755fe…519fe4 | CALL | swap | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00014 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x6755fe…519fe4 | CALL | swap | 0x8366…0951 | IN | 0x6015…20cc | 0.00014 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x6b40f7…9966e1 | CALL | swap | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00014 ETH |
| 39,059,433 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0x6b40f7…9966e1 | CALL | swap | 0x8366…0951 | IN | 0x6015…20cc | 0.00014 ETH |
| 39,059,426 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0xb81f6d…ee34a2 | CALL | permit2TransferAndMulticall | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00156 ETH |
| 39,059,426 | 9 hrs agoMon, 17 Aug 2026 18:40:28 UTC | 0xb81f6d…ee34a2 | CALL | permit2TransferAndMulticall | 0x8366…0951 | IN | 0x6015…20cc | 0.00156 ETH |
| 39,059,392 | 9 hrs agoMon, 17 Aug 2026 18:40:24 UTC | 0x962795…e828ac | CALL | 0x39ecce49 | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00099 ETH |
| 39,059,392 | 9 hrs agoMon, 17 Aug 2026 18:40:24 UTC | 0x962795…e828ac | CALL | 0x39ecce49 | 0x8366…0951 | IN | 0x6015…20cc | 0.00099 ETH |
| 39,059,382 | 9 hrs agoMon, 17 Aug 2026 18:40:23 UTC | 0x442c83…9fb806 | CALL | 0x27772d13 | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00000 ETH |
| 39,059,382 | 9 hrs agoMon, 17 Aug 2026 18:40:23 UTC | 0x442c83…9fb806 | CALL | 0x27772d13 | 0x8366…0951 | IN | 0x6015…20cc | 0.00000 ETH |
| 39,059,300 | 9 hrs agoMon, 17 Aug 2026 18:40:15 UTC | 0x7cc6ed…38606f | CALL | permit2TransferAndMulticall | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00365 ETH |
| 39,059,300 | 9 hrs agoMon, 17 Aug 2026 18:40:15 UTC | 0x7cc6ed…38606f | CALL | permit2TransferAndMulticall | 0x8366…0951 | IN | 0x6015…20cc | 0.00365 ETH |
| 39,059,282 | 9 hrs agoMon, 17 Aug 2026 18:40:13 UTC | 0xc96d5c…02cdbc | CALL | handleOps | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00250 ETH |
| 39,059,282 | 9 hrs agoMon, 17 Aug 2026 18:40:13 UTC | 0xc96d5c…02cdbc | CALL | handleOps | 0x8366…0951 | IN | 0x6015…20cc | 0.00250 ETH |
| 39,059,261 | 9 hrs agoMon, 17 Aug 2026 18:40:11 UTC | 0xd2ab56…d940b9 | CALL | 0x0b1149ec | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00009 ETH |
| 39,059,261 | 9 hrs agoMon, 17 Aug 2026 18:40:11 UTC | 0xd2ab56…d940b9 | CALL | 0x0b1149ec | 0x8366…0951 | IN | 0x6015…20cc | 0.00009 ETH |
| 39,059,223 | 9 hrs agoMon, 17 Aug 2026 18:40:07 UTC | 0xe22eb5…ebbb3a | CALL | handleOps | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00001 ETH |
| 39,059,223 | 9 hrs agoMon, 17 Aug 2026 18:40:07 UTC | 0xe22eb5…ebbb3a | CALL | handleOps | 0x8366…0951 | IN | 0x6015…20cc | 0.00001 ETH |
| 39,059,167 | 9 hrs agoMon, 17 Aug 2026 18:40:02 UTC | 0x073f9f…77f7a1 | CALL | swap | 0x6015…20cc | OUT | 0x20a5…9c71 | 0.00153 ETH |
| 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 → | |||||||||