// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import { IHooks } from "@uniswap/v4-core/src/interfaces/IHooks.sol";
import { IPoolManager } from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
import { Hooks } from "@uniswap/v4-core/src/libraries/Hooks.sol";
import { BalanceDelta, BalanceDeltaLibrary } from "@uniswap/v4-core/src/types/BalanceDelta.sol";
import {
BeforeSwapDelta,
BeforeSwapDeltaLibrary,
toBeforeSwapDelta
} from "@uniswap/v4-core/src/types/BeforeSwapDelta.sol";
import { Currency } from "@uniswap/v4-core/src/types/Currency.sol";
import { ModifyLiquidityParams, SwapParams } from "@uniswap/v4-core/src/types/PoolOperation.sol";
import { PoolId, PoolIdLibrary } from "@uniswap/v4-core/src/types/PoolId.sol";
import { PoolKey } from "@uniswap/v4-core/src/types/PoolKey.sol";
interface IHOODLHookToken {
function owner() external view returns (address);
function hoodlGame() external view returns (address);
function teamWallet() external view returns (address);
}
interface IHOODLHookGame {
function fundSheriffPot(address from, uint256 amount) external payable;
function openSellTaxEscrow(
address settler,
uint256 tokenAmount,
uint256 outputAmount,
address teamRecipient,
uint256 teamTax,
uint256 sheriffTax
) external payable;
function quoteBuyTax(address trader, uint256 taxBaseAmount)
external
view
returns (uint256 totalTax, uint256 teamTax, uint256 sheriffTax);
}
interface IHOODLTradingController {
function finalizeFairLaunchFromHook(PoolKey calldata key)
external
returns (
uint256 revenue,
uint256 nativeLiquidityAmount,
uint256 tokenLiquidityAmount,
uint256 unsoldBurnAmount,
bool closedNow
);
}
/// @title HoodlHook
/// @notice Slim Uniswap v4 hook that owns post-launch HOODL swap-tax settlement.
contract HoodlHook is IHooks {
using BalanceDeltaLibrary for BalanceDelta;
using PoolIdLibrary for PoolKey;
uint256 private constant TRANSIENT_BUY_TOTAL_TAX_SLOT = 0;
uint256 private constant TRANSIENT_BUY_TEAM_TAX_SLOT = 1;
uint256 private constant TRANSIENT_BUY_SHERIFF_TAX_SLOT = 2;
uint256 private constant BPS = 10_000;
uint256 private constant SELL_START_TAX_BPS = 1_000;
uint256 private constant SELL_TEAM_TAX_BPS = 100;
// forge-lint: disable-next-line(screaming-snake-case-immutable)
address public immutable poolManager;
// forge-lint: disable-next-line(screaming-snake-case-immutable)
address public immutable hoodl;
address public owner;
address public teamWallet;
address public sheriff;
address public tradingController;
bool public paused;
mapping(bytes32 poolId => bool enabled) public tradingEnabled;
mapping(address account => uint256 amount) public claimableTeamTax;
error AmountTooLarge();
error ExactOutputNotAllowed();
error GameNotSet();
error HookPaused();
error InvalidPool();
error InvalidTaxQuote();
error NativeTransferFailed();
error NothingToClaim();
error OnlyNativeHoodlPool();
error OnlyOwner();
error OnlyPoolManager();
error OnlyTradingController();
error TraderZeroAddress();
error TradingNotEnabled(bytes32 poolId);
error ZeroAddress();
event HookPausedSet(bool paused);
event HookTaxSettled(
address indexed trader,
bool indexed isBuy,
uint256 taxBaseAmount,
uint256 totalTax,
uint256 teamTax,
uint256 sheriffTax
);
event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);
event SheriffSet(address indexed oldSheriff, address indexed newSheriff);
event NativeWithdrawn(address indexed recipient, uint256 amount);
event TeamTaxClaimed(address indexed account, address indexed recipient, uint256 amount);
event TeamTaxCredited(address indexed account, uint256 amount);
event TeamWalletSet(address indexed oldTeamWallet, address indexed newTeamWallet);
event TradingControllerSet(
address indexed oldTradingController, address indexed newTradingController
);
event TradingEnabled(bytes32 indexed poolId, address indexed caller);
modifier onlyOwner() {
_onlyOwner();
_;
}
modifier onlyPoolManager() {
_onlyPoolManager();
_;
}
// Owner is inherited from the token (like teamWallet and sheriff below), so a
// CREATE2 deploy — where msg.sender is the factory — still gets the real owner
// without an explicit constructor arg.
constructor(address poolManager_, address hoodl_) {
if (poolManager_ == address(0) || hoodl_ == address(0)) revert ZeroAddress();
poolManager = poolManager_;
hoodl = hoodl_;
owner = IHOODLHookToken(hoodl_).owner();
teamWallet = IHOODLHookToken(hoodl_).teamWallet();
sheriff = IHOODLHookToken(hoodl_).hoodlGame();
if (owner == address(0) || teamWallet == address(0)) revert ZeroAddress();
emit OwnershipTransferred(address(0), owner);
emit TeamWalletSet(address(0), teamWallet);
emit SheriffSet(address(0), sheriff);
}
receive() external payable { }
function getHookPermissions() external pure 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
});
}
function setTeamWallet(address newTeamWallet) external onlyOwner {
if (newTeamWallet == address(0)) revert ZeroAddress();
address oldTeamWallet = teamWallet;
teamWallet = newTeamWallet;
emit TeamWalletSet(oldTeamWallet, newTeamWallet);
}
function setSheriff(address newSheriff) external onlyOwner {
if (newSheriff == address(0)) revert ZeroAddress();
address oldSheriff = sheriff;
sheriff = newSheriff;
emit SheriffSet(oldSheriff, newSheriff);
}
function setTradingController(address newTradingController) external onlyOwner {
if (newTradingController == address(0)) revert ZeroAddress();
address oldTradingController = tradingController;
tradingController = newTradingController;
emit TradingControllerSet(oldTradingController, newTradingController);
}
function enableTrading(PoolKey calldata key) external {
if (msg.sender != owner && msg.sender != tradingController) revert OnlyTradingController();
_requireNativeHoodlPool(key);
bytes32 poolId = PoolId.unwrap(key.toId());
tradingEnabled[poolId] = true;
emit TradingEnabled(poolId, msg.sender);
}
function setPaused(bool newPaused) external onlyOwner {
paused = newPaused;
emit HookPausedSet(newPaused);
}
/// @notice Owner escape hatch for any ETH held by the hook, including force-sent
/// dust. Can also take credited-but-unclaimed team tax; the owner is trusted to
/// leave `claimableTeamTax` funded or make the recipient whole out of band.
function withdrawNative(address recipient, uint256 amount) external onlyOwner {
if (recipient == address(0)) revert ZeroAddress();
if (amount == 0 || amount > address(this).balance) revert AmountTooLarge();
(bool sent,) = payable(recipient).call{ value: amount }("");
if (!sent) revert NativeTransferFailed();
emit NativeWithdrawn(recipient, amount);
}
function claimTeamTax(address recipient) external returns (uint256 amount) {
if (recipient == address(0)) revert ZeroAddress();
amount = claimableTeamTax[msg.sender];
if (amount == 0) revert NothingToClaim();
claimableTeamTax[msg.sender] = 0;
(bool sent,) = payable(recipient).call{ value: amount }("");
if (!sent) revert NativeTransferFailed();
emit TeamTaxClaimed(msg.sender, recipient, amount);
}
function transferOwnership(address newOwner) external onlyOwner {
if (newOwner == address(0)) revert ZeroAddress();
address oldOwner = owner;
owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
function beforeInitialize(address sender, PoolKey calldata key, uint160)
external
view
override
onlyPoolManager
returns (bytes4)
{
if (sender != tradingController) revert OnlyTradingController();
_requireNativeHoodlPool(key);
return IHooks.beforeInitialize.selector;
}
function afterInitialize(address, PoolKey calldata, uint160, int24)
external
view
override
onlyPoolManager
returns (bytes4)
{
return IHooks.afterInitialize.selector;
}
function beforeAddLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
bytes calldata
) external view override onlyPoolManager returns (bytes4) {
return IHooks.beforeAddLiquidity.selector;
}
function afterAddLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
BalanceDelta,
BalanceDelta,
bytes calldata
) external view override onlyPoolManager returns (bytes4, BalanceDelta) {
return (IHooks.afterAddLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);
}
function beforeRemoveLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
bytes calldata
) external view override onlyPoolManager returns (bytes4) {
return IHooks.beforeRemoveLiquidity.selector;
}
function afterRemoveLiquidity(
address,
PoolKey calldata,
ModifyLiquidityParams calldata,
BalanceDelta,
BalanceDelta,
bytes calldata
) external view override onlyPoolManager returns (bytes4, BalanceDelta) {
return (IHooks.afterRemoveLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);
}
function beforeSwap(
address sender,
PoolKey calldata key,
SwapParams calldata params,
bytes calldata hookData
) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {
if (paused) {
revert HookPaused();
}
(bool isBuy, bool isSell) = _swapSide(key, params.zeroForOne);
if (!isBuy && !isSell) {
return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
}
bytes32 poolId = PoolId.unwrap(key.toId());
_ensureTradingEnabled(key, poolId);
(address trader,) = _resolveTrader(sender, hookData);
return _beforeNormalSwapTax(key, params, isBuy, trader);
}
function afterSwap(
address sender,
PoolKey calldata key,
SwapParams calldata params,
BalanceDelta delta,
bytes calldata hookData
) external override onlyPoolManager returns (bytes4, int128) {
if (paused) {
revert HookPaused();
}
hookData;
if (sender == address(0)) revert TraderZeroAddress();
(bool isBuy, bool isSell) = _swapSide(key, params.zeroForOne);
if (!isBuy && !isSell) revert InvalidPool();
bytes32 poolId = PoolId.unwrap(key.toId());
if (!tradingEnabled[poolId]) revert TradingNotEnabled(poolId);
(address trader,) = _resolveTrader(sender, hookData);
if (isBuy) {
_settleStoredBuyTax(key, params, delta, trader);
return (IHooks.afterSwap.selector, 0);
}
uint256 sellTax = _settleSellTax(key, params, delta, trader);
return (IHooks.afterSwap.selector, _toInt128(sellTax));
}
function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)
external
view
override
onlyPoolManager
returns (bytes4)
{
return IHooks.beforeDonate.selector;
}
function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)
external
view
override
onlyPoolManager
returns (bytes4)
{
return IHooks.afterDonate.selector;
}
function _onlyOwner() internal view {
if (msg.sender != owner) revert OnlyOwner();
}
function _onlyPoolManager() internal view {
if (msg.sender != poolManager) revert OnlyPoolManager();
}
function _ensureTradingEnabled(PoolKey calldata key, bytes32 poolId) internal {
if (tradingEnabled[poolId]) {
return;
}
address controller = tradingController;
if (controller != address(0)) {
IHOODLTradingController(controller).finalizeFairLaunchFromHook(key);
}
if (!tradingEnabled[poolId]) revert TradingNotEnabled(poolId);
}
function _hookGame() internal view returns (IHOODLHookGame game) {
address sheriff_ = sheriff;
if (sheriff_ == address(0)) revert GameNotSet();
game = IHOODLHookGame(sheriff_);
}
function _swapSide(PoolKey calldata key, bool zeroForOne)
internal
view
returns (bool isBuy, bool isSell)
{
bool hoodlIsCurrency0 = Currency.unwrap(key.currency0) == hoodl;
bool hoodlIsCurrency1 = Currency.unwrap(key.currency1) == hoodl;
if (!hoodlIsCurrency0 && !hoodlIsCurrency1) {
return (false, false);
}
isSell = (hoodlIsCurrency0 && zeroForOne) || (hoodlIsCurrency1 && !zeroForOne);
isBuy = !isSell;
}
function _resolveTrader(address sender, bytes calldata hookData)
internal
pure
returns (address trader, bytes memory launchHookData)
{
if (sender == address(0)) revert TraderZeroAddress();
return (sender, hookData);
}
function _beforeNormalSwapTax(
PoolKey calldata key,
SwapParams calldata params,
bool isBuy,
address trader
) internal returns (bytes4, BeforeSwapDelta, uint24) {
if (params.amountSpecified > 0) revert ExactOutputNotAllowed();
if (trader == address(0)) revert TraderZeroAddress();
IHOODLHookGame game = _hookGame();
if (!isBuy) {
return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
}
uint256 taxBaseAmount = uint256(-params.amountSpecified);
(uint256 totalTax, uint256 teamTax, uint256 sheriffTax) =
game.quoteBuyTax(trader, taxBaseAmount);
_validateTaxQuote(taxBaseAmount, totalTax, teamTax, sheriffTax);
if (totalTax == 0) {
return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);
}
_requireNative(_inputCurrency(key, params));
_storeBuyTax(totalTax, teamTax, sheriffTax);
return (IHooks.beforeSwap.selector, toBeforeSwapDelta(_toInt128(totalTax), 0), 0);
}
function _settleStoredBuyTax(
PoolKey calldata key,
SwapParams calldata params,
BalanceDelta delta,
address trader
) internal {
(uint256 maxTotalTax,,) = _loadAndClearBuyTax();
if (maxTotalTax == 0) {
return;
}
(Currency inputCurrency, uint256 taxBaseAmount) =
_inputCurrencyAndAmount(key, params, delta);
_requireNative(inputCurrency);
IPoolManager manager = IPoolManager(poolManager);
if (taxBaseAmount == 0) {
manager.take(inputCurrency, trader, maxTotalTax);
return;
}
(uint256 totalTax, uint256 teamTax, uint256 sheriffTax) =
_hookGame().quoteBuyTax(trader, taxBaseAmount);
_validateTaxQuote(taxBaseAmount, totalTax, teamTax, sheriffTax);
if (totalTax > maxTotalTax) revert InvalidTaxQuote();
if (totalTax != 0) {
manager.take(inputCurrency, address(this), totalTax);
_distributeNativeTax(trader, true, taxBaseAmount, totalTax, teamTax, sheriffTax);
}
uint256 refund = maxTotalTax - totalTax;
if (refund != 0) {
manager.take(inputCurrency, trader, refund);
}
}
function _settleSellTax(
PoolKey calldata key,
SwapParams calldata params,
BalanceDelta delta,
address trader
) internal returns (uint256 totalTax) {
(Currency outputCurrency, uint256 outputAmount) =
_outputCurrencyAndAmount(key, params, delta);
if (outputAmount == 0) {
return 0;
}
_requireNative(outputCurrency);
uint256 teamTax;
uint256 sheriffTax;
(, uint256 tokenAmountIn) = _inputCurrencyAndAmount(key, params, delta);
if (tokenAmountIn == 0) {
return 0;
}
(totalTax, teamTax, sheriffTax) = _maxSellTax(outputAmount);
_validateTaxQuote(outputAmount, totalTax, teamTax, sheriffTax);
if (totalTax == 0) {
return 0;
}
IHOODLHookGame game = _hookGame();
IPoolManager(poolManager).take(outputCurrency, address(this), totalTax);
game.openSellTaxEscrow{ value: totalTax }(
trader, tokenAmountIn, outputAmount, teamWallet, teamTax, sheriffTax
);
emit HookTaxSettled(trader, false, outputAmount, totalTax, teamTax, sheriffTax);
}
function _distributeNativeTax(
address trader,
bool isBuy,
uint256 taxBaseAmount,
uint256 totalTax,
uint256 teamTax,
uint256 sheriffTax
) internal {
if (totalTax == 0) {
return;
}
if (teamTax != 0) {
address teamWallet_ = teamWallet;
(bool sent,) = payable(teamWallet_).call{ value: teamTax }("");
if (!sent) {
claimableTeamTax[teamWallet_] += teamTax;
emit TeamTaxCredited(teamWallet_, teamTax);
}
}
if (sheriffTax != 0) {
address sheriff_ = sheriff;
if (sheriff_ == address(0)) revert GameNotSet();
IHOODLHookGame(sheriff_).fundSheriffPot{ value: sheriffTax }(trader, sheriffTax);
}
emit HookTaxSettled(trader, isBuy, taxBaseAmount, totalTax, teamTax, sheriffTax);
}
function _maxSellTax(uint256 outputAmount)
internal
pure
returns (uint256 totalTax, uint256 teamTax, uint256 sheriffTax)
{
teamTax = (outputAmount * SELL_TEAM_TAX_BPS) / BPS;
sheriffTax = (outputAmount * (SELL_START_TAX_BPS - SELL_TEAM_TAX_BPS)) / BPS;
totalTax = teamTax + sheriffTax;
}
function _validateTaxQuote(
uint256 taxBaseAmount,
uint256 totalTax,
uint256 teamTax,
uint256 sheriffTax
) internal pure {
if (teamTax > totalTax || sheriffTax != totalTax - teamTax || totalTax > taxBaseAmount) {
revert InvalidTaxQuote();
}
}
function _storeBuyTax(uint256 totalTax, uint256 teamTax, uint256 sheriffTax) internal {
assembly ("memory-safe") {
tstore(TRANSIENT_BUY_TOTAL_TAX_SLOT, totalTax)
tstore(TRANSIENT_BUY_TEAM_TAX_SLOT, teamTax)
tstore(TRANSIENT_BUY_SHERIFF_TAX_SLOT, sheriffTax)
}
}
function _loadAndClearBuyTax()
internal
returns (uint256 totalTax, uint256 teamTax, uint256 sheriffTax)
{
assembly ("memory-safe") {
totalTax := tload(TRANSIENT_BUY_TOTAL_TAX_SLOT)
teamTax := tload(TRANSIENT_BUY_TEAM_TAX_SLOT)
sheriffTax := tload(TRANSIENT_BUY_SHERIFF_TAX_SLOT)
tstore(TRANSIENT_BUY_TOTAL_TAX_SLOT, 0)
tstore(TRANSIENT_BUY_TEAM_TAX_SLOT, 0)
tstore(TRANSIENT_BUY_SHERIFF_TAX_SLOT, 0)
}
}
function _inputCurrency(PoolKey calldata key, SwapParams calldata params)
internal
pure
returns (Currency)
{
return params.zeroForOne ? key.currency0 : key.currency1;
}
function _inputCurrencyAndAmount(
PoolKey calldata key,
SwapParams calldata params,
BalanceDelta delta
) internal pure returns (Currency inputCurrency, uint256 inputAmount) {
inputCurrency = _inputCurrency(key, params);
int128 inputDelta = Currency.unwrap(inputCurrency) == Currency.unwrap(key.currency0)
? delta.amount0()
: delta.amount1();
if (inputDelta < 0) {
inputDelta = -inputDelta;
}
inputAmount = uint256(uint128(inputDelta));
}
function _outputCurrencyAndAmount(
PoolKey calldata key,
SwapParams calldata params,
BalanceDelta delta
) internal pure returns (Currency outputCurrency, uint256 outputAmount) {
bool specifiedCurrencyIs0 =
params.amountSpecified < 0 == params.zeroForOne;
int128 outputDelta;
if (specifiedCurrencyIs0) {
outputCurrency = key.currency1;
outputDelta = delta.amount1();
} else {
outputCurrency = key.currency0;
outputDelta = delta.amount0();
}
if (outputDelta < 0) {
outputDelta = -outputDelta;
}
outputAmount = uint256(uint128(outputDelta));
}
function _requireNative(Currency currency) internal pure {
if (Currency.unwrap(currency) != address(0)) revert OnlyNativeHoodlPool();
}
function _requireNativeHoodlPool(PoolKey calldata key) internal view {
bool hoodlIsCurrency0 = Currency.unwrap(key.currency0) == hoodl;
bool hoodlIsCurrency1 = Currency.unwrap(key.currency1) == hoodl;
bool nativeIsCurrency0 = Currency.unwrap(key.currency0) == address(0);
bool nativeIsCurrency1 = Currency.unwrap(key.currency1) == address(0);
if (!((hoodlIsCurrency0 && nativeIsCurrency1) || (hoodlIsCurrency1 && nativeIsCurrency0))) {
revert OnlyNativeHoodlPool();
}
}
function _toInt128(uint256 value) internal pure returns (int128) {
if (value >= 1 << 127) revert AmountTooLarge();
return int128(int256(value));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "address"
},
{
"name": "hoodl_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AmountTooLarge",
"type": "error",
"inputs": []
},
{
"name": "ExactOutputNotAllowed",
"type": "error",
"inputs": []
},
{
"name": "GameNotSet",
"type": "error",
"inputs": []
},
{
"name": "HookPaused",
"type": "error",
"inputs": []
},
{
"name": "InvalidPool",
"type": "error",
"inputs": []
},
{
"name": "InvalidTaxQuote",
"type": "error",
"inputs": []
},
{
"name": "NativeTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OnlyNativeHoodlPool",
"type": "error",
"inputs": []
},
{
"name": "OnlyOwner",
"type": "error",
"inputs": []
},
{
"name": "OnlyPoolManager",
"type": "error",
"inputs": []
},
{
"name": "OnlyTradingController",
"type": "error",
"inputs": []
},
{
"name": "TraderZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "TradingNotEnabled",
"type": "error",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "HookPausedSet",
"type": "event",
"inputs": [
{
"name": "paused",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "HookTaxSettled",
"type": "event",
"inputs": [
{
"name": "trader",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "isBuy",
"type": "bool",
"indexed": true,
"internalType": "bool"
},
{
"name": "taxBaseAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "totalTax",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "teamTax",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "sheriffTax",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "NativeWithdrawn",
"type": "event",
"inputs": [
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "oldOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SheriffSet",
"type": "event",
"inputs": [
{
"name": "oldSheriff",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newSheriff",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TeamTaxClaimed",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TeamTaxCredited",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TeamWalletSet",
"type": "event",
"inputs": [
{
"name": "oldTeamWallet",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newTeamWallet",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TradingControllerSet",
"type": "event",
"inputs": [
{
"name": "oldTradingController",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newTradingController",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TradingEnabled",
"type": "event",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "caller",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"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": "view"
},
{
"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": "view"
},
{
"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": "view"
},
{
"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": "view"
},
{
"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": "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": "view"
},
{
"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": "view"
},
{
"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": "view"
},
{
"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": "view"
},
{
"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": "claimTeamTax",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimableTeamTax",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "enableTrading",
"type": "function",
"inputs": [
{
"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"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"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": "hoodl",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "setPaused",
"type": "function",
"inputs": [
{
"name": "newPaused",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSheriff",
"type": "function",
"inputs": [
{
"name": "newSheriff",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTeamWallet",
"type": "function",
"inputs": [
{
"name": "newTeamWallet",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTradingController",
"type": "function",
"inputs": [
{
"name": "newTradingController",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sheriff",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "teamWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "tradingController",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "tradingEnabled",
"type": "function",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawNative",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6080806040526004908136101561001f575b5050361561001d575f80fd5b005b5f3560e01c908163071c65c814610cf35750806307b18bde14610c455780631525ff7d14610bd457806316c38b3c14610b695780631b7c8fe014610b4157806321d0ee7014610b14578063259982e514610ae757806347f0db6514610a1d578063575e24b41461099057806359927044146109685780635c975abb146109435780635d1210d21461091b5780636c2bbe7e146108e85780636f6b4c51146108775780636fe7e6eb1461082157806372a00c23146107b05780637a6142301461076c57806387455d411461073f5780638da5cb5b146107185780639f063efc146106e5578063b47b2fb11461065e578063b6a8b0fa14610630578063c4e833ce146104a2578063cf60cd4b1461034e578063dc4c90d31461030a578063dc98354e1461020e578063e1b4af69146101e05763f2fde38b1461015f5780610011565b346101dc5760203660031901126101dc57610178610d27565b610180611170565b6001600160a01b039081169182156101cd57505f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405163d92e233d60e01b8152fd5b5f80fd5b346101dc576101ee36610e4f565b5050505050506101fc611195565b60405163e1b4af6960e01b8152602090f35b50346101dc5760e03660031901126101dc57610228610d27565b60a03660231901126101dc5761023c610e39565b50610245611195565b6003546001600160a01b0391908216908216036102fa57602435908082168092036101dc57807f000000000000000000000000a3fdcadd1a10ef1a1731e08b87493420d7a610071691828114926044359283168093036101dc57821491836102f1575b5082156102d7575b5050156102c957604051636e4c1aa760e11b8152602090f35b604051623404f560e91b8152fd5b909150816102e8575b505f806102b0565b9050155f6102e0565b1592505f6102a8565b506040516365004fc160e11b8152fd5b346101dc575f3660031901126101dc576040517f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03168152602090f35b50346101dc5760a03660031901126101dc575f546001600160a01b0390811633141580610494575b6102fa5781358181168082036101dc57827f000000000000000000000000a3fdcadd1a10ef1a1731e08b87493420d7a61007168082149060243592858416918285036101dc578214918361048b575b508215610471575b50501561046157604051916103e183610ed8565b8252602082015260443562ffffff811681036101dc5760408201526064358060020b81036101dc57606082015260843591821682036101dc5760a09160808201522090815f5260205260405f20600160ff1982541617905533907f0c5ce71a90b13b9315b77b3684eb519df58269f00be74b18f6b77fb700f699c35f80a3005b604051623404f560e91b81528490fd5b90915081610482575b505f806103cd565b9050155f61047a565b1592505f6103c5565b508060035416331415610376565b346101dc575f3660031901126101dc575f6101a06040516104c281610ea7565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201526101c060405161052381610ea7565b600181525f60208201525f60408201525f60608201525f60808201525f60a0820152600160c0820152600160e08201525f6101008201525f610120820152600161014082015260016101608201525f6101808201525f6101a08201526101a0604051916001835260208101511515602084015260408101511515604084015260608101511515606084015260808101511515608084015260a0810151151560a084015260c0810151151560c084015260e0810151151560e084015261010081015115156101008401526101208101511515610120840152610140810151151561014084015261016081015115156101608401526101808101511515610180840152015115156101a0820152f35b346101dc5761063e36610e4f565b50505050505061064c611195565b604051635b54587d60e11b8152602090f35b50346101dc576101603660031901126101dc57610679610d27565b9060a03660231901126101dc5760603660c31901126101dc57610144359167ffffffffffffffff83116101dc576106b86106cb92604094369101610d3d565b916106c1611195565b6101243590611081565b82516001600160e01b03199092168252600f0b6020820152f35b346101dc576106f336610dcf565b50505050505050610702611195565b604080516327c18fbf60e21b81525f6020820152f35b346101dc575f3660031901126101dc575f546040516001600160a01b039091168152602090f35b50346101dc5760203660031901126101dc5780355f52602052602060ff60405f2054166040519015158152f35b346101dc575f3660031901126101dc576040517f000000000000000000000000a3fdcadd1a10ef1a1731e08b87493420d7a610076001600160a01b03168152602090f35b50346101dc5760203660031901126101dc576107ca610d27565b6107d2611170565b6001600160a01b039081169182156101cd5750600354826001600160601b0360a01b821617600355167fc5db063c8e630d52358a682b5158066196c5930efc8713e4ef487beec6a62c7d5f80a3005b346101dc576101003660031901126101dc5761083b610d27565b5060a03660231901126101dc57610850610e39565b5060e4358060020b036101dc57610865611195565b604051636fe7e6eb60e01b8152602090f35b50346101dc5760203660031901126101dc57610891610d27565b610899611170565b6001600160a01b039081169182156101cd5750600254826001600160601b0360a01b821617600255167f080a54badc5fb016ac037ded1a06568e8ffe0e1442386d3355720ccbbc8b007a5f80a3005b346101dc576108f636610dcf565b50505050505050610905611195565b60408051633615df3f60e11b81525f6020820152f35b346101dc575f3660031901126101dc576002546040516001600160a01b039091168152602090f35b346101dc575f3660031901126101dc57602060ff60035460a01c166040519015158152f35b346101dc575f3660031901126101dc576001546040516001600160a01b039091168152602090f35b50346101dc576101403660031901126101dc576109ab610d27565b9060a03660231901126101dc5760603660c31901126101dc57610124359067ffffffffffffffff82116101dc576060926109ef6109fd9262ffffff94369101610d3d565b916109f8611195565b610fee565b906040939293519363ffffffff60e01b1684526020840152166040820152f35b50346101dc5760203660031901126101dc576001600160a01b03610a3f610d27565b168015610ad757335f52600560205260405f2054908115610ac657335f5260056020525f60408120555f80808085855af1610a78610f46565b5015610ab557602092506040518281527fdfe3b18436769ccc95bf45cbc56957ff5c40d6ee5d7f28fd3ae312d64e23f17c843392a3604051908152f35b604051633d2cec6f60e21b81528390fd5b6040516312d37ee560e31b81528390fd5b5060405163d92e233d60e01b8152fd5b346101dc57610af536610d6b565b5050505050610b02611195565b60405163259982e560e01b8152602090f35b346101dc57610b2236610d6b565b5050505050610b2f611195565b60405163021d0ee760e41b8152602090f35b346101dc575f3660031901126101dc576003546040516001600160a01b039091168152602090f35b50346101dc5760203660031901126101dc57358015158091036101dc5760207fb1f6d239cf65498d8c25c2543856abad1c3d33cbc16955f6bb6743194480b89191610bb2611170565b6003805460ff60a01b191660a083901b60ff60a01b16179055604051908152a1005b50346101dc5760203660031901126101dc57610bee610d27565b610bf6611170565b6001600160a01b039081169182156101cd5750600154826001600160601b0360a01b821617600155167f70c939fccaa8bd2dac7cc045bbe602424b1cc1ffe5575389d2e38d517fdd6f345f80a3005b50346101dc5760403660031901126101dc57610c5f610d27565b60243590610c6b611170565b6001600160a01b03169182156101cd5781158015610cea575b610cdb575f80808085875af1610c98610f46565b5015610ccc575060207fc303ca808382409472acbbf899c316cf439f409f6584aae22df86dfa3c9ed50491604051908152a2005b604051633d2cec6f60e21b8152fd5b604051630625040160e01b8152fd5b50478211610c84565b346101dc5760203660031901126101dc576020906001600160a01b03610d17610d27565b165f526005825260405f20548152f35b600435906001600160a01b03821682036101dc57565b9181601f840112156101dc5782359167ffffffffffffffff83116101dc57602083818601950101116101dc57565b906101606003198301126101dc576004356001600160a01b03811681036101dc579160a06023198201126101dc57602491608060c3198301126101dc5760c491610144359067ffffffffffffffff82116101dc57610dcb91600401610d3d565b9091565b906101a06003198301126101dc576004356001600160a01b03811681036101dc579160a06023198201126101dc57602491608060c3198301126101dc5760c49161014435916101643591610184359067ffffffffffffffff82116101dc57610dcb91600401610d3d565b60c435906001600160a01b03821682036101dc57565b6101206003198201126101dc576004356001600160a01b03811681036101dc579160a06023198301126101dc5760249160c4359160e43591610104359067ffffffffffffffff82116101dc57610dcb91600401610d3d565b6101c0810190811067ffffffffffffffff821117610ec457604052565b634e487b7160e01b5f52604160045260245ffd5b60a0810190811067ffffffffffffffff821117610ec457604052565b67ffffffffffffffff8111610ec457604052565b90601f8019910116810190811067ffffffffffffffff821117610ec457604052565b67ffffffffffffffff8111610ec457601f01601f191660200190565b3d15610f70573d90610f5782610f2a565b91610f656040519384610f08565b82523d5f602084013e565b606090565b60a09060231901126101dc5760405190610f8e82610ed8565b6001600160a01b038260243582811681036101dc57815260443582811681036101dc57602082015260643562ffffff811681036101dc5760408201526084358060020b81036101dc57606082015260a43591821682036101dc5760800152565b91909160ff60035460a01c1661106f5760c43580151581036101dc57611013906111d9565b819391159081611066575b506110525761104b936110449261103f60a061103936610f75565b20611279565b61138e565b50906113f0565b9192909190565b506315d7892d60e21b935f93508392509050565b9050155f61101e565b604051633038453560e21b8152600490fd5b9192909260ff60035460a01c1661106f576001600160a01b0383161561115e5760c43580151581036101dc576110b6906111d9565b819491159081611155575b506111445760a06110d136610f75565b20805f52600460205260ff60405f2054161561112c5750906110f3929161138e565b5090611116576111069061110b926117e2565b611a41565b63b47b2fb160e01b91565b61111f91611551565b63b47b2fb160e01b905f90565b6024906040519063196282cd60e21b82526004820152fd5b60405162820f3560e61b8152600490fd5b9050155f6110c1565b6040516364d4ad1560e01b8152600490fd5b5f546001600160a01b0316330361118357565b604051635fc483c560e01b8152600490fd5b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031633036111c757565b60405163f655705d60e01b8152600490fd5b6001600160a01b0390602435828116908190036101dc57827f000000000000000000000000a3fdcadd1a10ef1a1731e08b87493420d7a6100716809114926044359081168091036101dc571490821580611271575b6112685782611260575b8215611246575b5050801591565b90915081611257575b505f8061123f565b9050155f61124f565b915081611238565b5050505f905f90565b50811561122e565b805f52600460205260ff60405f20541661138b576003546001600160a01b0390811690816112bc575b5050805f52600460205260ff60405f2054161561112c5750565b60405163e23c207160e01b815291602435828116908190036101dc5760048401526044358281168091036101dc57602484015260643562ffffff81168091036101dc5760448401526084358060020b8091036101dc57606484015260a4359182168092036101dc5760a4835f819360a09560848401525af1801561138057611345575b806112a2565b60a0813d60a011611378575b8161135e60a09383610f08565b810103126101dc5760800151801515036101dc575f61133f565b3d9150611351565b6040513d5f823e3d90fd5b50565b9192916001600160a01b0381161561115e57926113aa81610f2a565b916113b86040519384610f08565b81835236828201116101dc57815f92602092838601378301015290565b908160609103126101dc578051916040602083015192015190565b60e435915f8313611532576001600160a01b03928184161561115e57611414611a65565b921561105257600160ff1b811461151e576040516307dd7f6560e11b81526001600160a01b039290921660048301525f0360248201819052916060908290604490829087165afa908115611380575f925f915f936114e1575b5082828561147a93611a8c565b82156110525760c43580151581036101dc57156114c95760243593841684036101dc576114a96114b794611add565b825f5d60015d60025d611a41565b60801b906315d7892d60e21b91905f90565b60443593841684036101dc576114a96114b794611add565b90935061147a925061150b915060603d606011611517575b6115038183610f08565b8101906113d5565b9193919290919061146d565b503d6114f9565b634e487b7160e01b5f52601160045260245ffd5b60405163037eeb5760e51b8152600490fd5b9190820391821161151e57565b5f915f5c915f805d5f60015d5f60025d82156117dc5761157090611b1d565b909161157b83611add565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181169290811561177e576115b6611a65565b604080516307dd7f6560e11b81526001600160a01b038616600482015260248101859052909792909160609183916044918391165afa908115611774575f935f915f9361174f575b5061160b83838784611a8c565b83851161173e57846116b0575b5050509061162591611544565b9283611634575b505050505050565b823b156116ac578451630b0d9c0960e01b81526001600160a01b03918216600482015291166024820152604481019290925290919083908390606490829084905af19081156116a3575061168c575b8080808061162c565b6116968291610ef4565b6116a05780611683565b80fd5b513d84823e3d90fd5b8580fd5b863b156101dc578851630b0d9c0960e01b81526001600160a01b0389166004820152306024820152604481018690525f81606481838c5af180156117345761170f575b5091611706918561162596959488611bb9565b90915f80611618565b611625959493919a509161172561170693610ef4565b845f9b929495509550916116f3565b8a513d5f823e3d90fd5b885163900c0da160e01b8152600490fd5b9150935061176c915060603d606011611517576115038183610f08565b91935f6115fe565b87513d5f823e3d90fd5b50509350809291923b156101dc57604051630b0d9c0960e01b81526001600160a01b03938416600482015293909216602484015260448301525f908290606490829084905af18015611380576117d15750565b6117da90610ef4565b565b50505050565b91905f9060c4358015158091036101dc575f60e4351203611a1c576044356001600160a01b03811681036101dc57936001600160801b0381600f0b5b5f81600f0b12611a0e575b16908115611a05576118439061183e87611add565b611b1d565b8093915015611a05576064820282810460640361151e5761271080910490610384808502908582040361151e57049161187c8383611bac565b9761188984848b88611a8c565b88156119f957611897611a65565b6001600160a01b03917f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409518316803b156101dc57604051630b0d9c0960e01b81526001600160a01b03929092166004830152306024830152604482018c90525f908290606490829084905af18015611380576119e6575b50811691816001541692803b156119e2578892918b60c4926040519687958694635502ec2960e11b8652169b8c600486015260248501528a604485015260648401528760848401528860a48401525af180156119d7578893929187916119b8575b50506040805194855260208501939093529183019190915260608201527fe59743d5fcfa9592dfe2b1f5fa1ca399bcfccf2fc08ab9d52561d52a6d7d3c4f9080608081015b0390a3565b6119c59192939450610ef4565b6119d357908691855f61196e565b8480fd5b6040513d88823e3d90fd5b8880fd5b6119f1919850610ef4565b5f968161190d565b505f9750505050505050565b505f9450505050565b611a1790611afd565b611829565b6024356001600160a01b03811681036101dc57936001600160801b038160801d61181e565b6001607f1b811015611a5357600f0b90565b604051630625040160e01b8152600490fd5b6002546001600160a01b03168015611a7a5790565b60405163e7b4746960e01b8152600490fd5b9192818411938415611ac6575b50508215611abc575b5050611aaa57565b60405163900c0da160e01b8152600490fd5b1190505f80611aa2565b82611ad392939550611544565b1415915f80611a99565b6001600160a01b0316611aec57565b604051623404f560e91b8152600490fd5b600f0b6f7fffffffffffffffffffffffffffffff19811461151e575f0390565b9060c43580151581036101dc5715611b95576024356001600160a01b03811681036101dc575b9182906024356001600160a01b03818116918290036101dc576001600160801b03931603611b8d5760801d5b805f81600f0b12611b7f57501690565b611b899150611afd565b1690565b600f0b611b6f565b6044356001600160a01b0381168114611b43575f80fd5b9190820180921161151e57565b9092938215611d325784611cc0575b80611c22575b6040805194855260208501939093529183019390935260608201526001916001600160a01b0316907fe59743d5fcfa9592dfe2b1f5fa1ca399bcfccf2fc08ab9d52561d52a6d7d3c4f9080608081016119b3565b6002546001600160a01b03169291908315611a7a57833b156101dc576040516356f31e7b60e11b81526001600160a01b038316600482015260248101829052935f908590604490829085905af1908115611380576001967fe59743d5fcfa9592dfe2b1f5fa1ca399bcfccf2fc08ab9d52561d52a6d7d3c4f956119b393611cb1575b5096509192935050611bce565b611cba90610ef4565b5f611ca4565b6001546001600160a01b03165f80808089855af1611cdc610f46565b5015611ce9575b50611bc8565b805f52600560205260405f20611d00878254611bac565b90557f9d2ed43994796687935cabfe2857883ed40faacabc95abdb442e287ea51099976020604051888152a25f611ce3565b505050505056fea2646970667358221220b38acde885b618d837734f995d089edaa416767c86071c01fcffa0b210008f7264736f6c63430008180033
| 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 | 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 | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x14282d…b206cc | 5 mins agoTue, 18 Aug 2026 02:54:49 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…eb458828 |
| 0x100418…524cc0 | 1 hr agoTue, 18 Aug 2026 01:27:58 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…4f262911 |
| 0x397eb6…b56512 | 5 hrs agoMon, 17 Aug 2026 21:15:57 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…152db681 |
| 0xd616b7…8d2d7b | 18 hrs agoMon, 17 Aug 2026 08:41:26 UTC | 0xe59743…3c4f | [0] 0x000000000000…262c40dc [1] 0x000000000000…00000000 data: 0x000000000000000000…b44da859 |
| 0x6fdc79…6800cc | 22 hrs agoMon, 17 Aug 2026 04:36:34 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…30e95c23 |
| 0x4bc2b3…828f84 | 1 day agoSun, 16 Aug 2026 21:36:07 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…aceaa98c |
| 0xf77b68…16d67b | 1 day agoSun, 16 Aug 2026 21:05:28 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…068436d2 |
| 0xd3519d…a8cb15 | 1 day agoSun, 16 Aug 2026 18:47:10 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…5b2a28ea |
| 0x8f839b…b27f80 | 1 day agoSun, 16 Aug 2026 16:46:45 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…42fa2a4b |
| 0xf9e792…6e7832 | 1 day agoSun, 16 Aug 2026 15:50:09 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…3aaad2c3 |
| 0x3c2cd9…1de743 | 1 day agoSun, 16 Aug 2026 15:19:27 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…e6f1883b |
| 0x3b15d8…6d4a9b | 1 day agoSun, 16 Aug 2026 15:14:00 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…7faf3e38 |
| 0x3309a7…e36fd8 | 1 day agoSun, 16 Aug 2026 14:00:21 UTC | 0xe59743…3c4f | [0] 0x000000000000…1b5cdc03 [1] 0x000000000000…00000000 data: 0x000000000000000000…3d6a3323 |
| 0x8fbb21…7de4c4 | 1 day agoSun, 16 Aug 2026 08:30:40 UTC | 0xe59743…3c4f | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…00000000 data: 0x000000000000000000…fa7db4fb |
| 0x71e06d…9f1499 | 1 day agoSun, 16 Aug 2026 07:03:13 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…aefcc167 |
| 0xddc1c0…3b31aa | 1 day agoSun, 16 Aug 2026 07:00:32 UTC | 0xe59743…3c4f | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…00000000 data: 0x000000000000000000…dbe266b6 |
| 0x342a6d…ec6171 | 1 day agoSun, 16 Aug 2026 05:13:03 UTC | 0xe59743…3c4f | [0] 0x000000000000…d113f996 [1] 0x000000000000…00000000 data: 0x000000000000000000…d7518cde |
| 0x5626cb…03aef0 | 1 day agoSun, 16 Aug 2026 05:01:32 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…bc8dad7e |
| 0xf532a6…66a65f | 2 days agoSat, 15 Aug 2026 23:38:56 UTC | 0xe59743…3c4f | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…00000000 data: 0x000000000000000000…07b098b8 |
| 0x01732a…8ea624 | 2 days agoSat, 15 Aug 2026 23:27:26 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…190bd842 |
| 0xf12cd7…1fadc1 | 2 days agoSat, 15 Aug 2026 21:38:24 UTC | 0xe59743…3c4f | [0] 0x000000000000…1b5cdc03 [1] 0x000000000000…00000000 data: 0x000000000000000000…33d1e18d |
| 0x7a8c83…d04f6e | 2 days agoSat, 15 Aug 2026 16:58:28 UTC | 0xe59743…3c4f | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…00000000 data: 0x000000000000000000…b80b6b38 |
| 0x246ceb…8b0b33 | 2 days agoSat, 15 Aug 2026 09:53:24 UTC | 0xe59743…3c4f | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…00000000 data: 0x000000000000000000…2202c660 |
| 0xef4927…3b57f6 | 2 days agoSat, 15 Aug 2026 07:57:08 UTC | 0xe59743…3c4f | [0] 0x000000000000…db8c0904 [1] 0x000000000000…00000000 data: 0x000000000000000000…9a608875 |
| 0x1b2c24…3778f3 | 2 days agoSat, 15 Aug 2026 04:25:36 UTC | 0xe59743…3c4f | [0] 0x000000000000…1b5cdc03 [1] 0x000000000000…00000000 data: 0x000000000000000000…94b2fd8e |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 39,355,267 | 5 mins agoTue, 18 Aug 2026 02:54:49 UTC | 0x14282d…b206cc | CALL | transferAndMulticall | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00028 ETH |
| 39,355,267 | 5 mins agoTue, 18 Aug 2026 02:54:49 UTC | 0x14282d…b206cc | CALL | transferAndMulticall | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00028 ETH |
| 39,303,295 | 1 hr agoTue, 18 Aug 2026 01:27:58 UTC | 0x100418…524cc0 | CALL | exec | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00029 ETH |
| 39,303,295 | 1 hr agoTue, 18 Aug 2026 01:27:58 UTC | 0x100418…524cc0 | CALL | exec | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00029 ETH |
| 39,152,420 | 5 hrs agoMon, 17 Aug 2026 21:15:57 UTC | 0x397eb6…b56512 | CALL | swapWithBackendSignature | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00231 ETH |
| 39,152,420 | 5 hrs agoMon, 17 Aug 2026 21:15:57 UTC | 0x397eb6…b56512 | CALL | swapWithBackendSignature | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00231 ETH |
| 38,303,234 | 1 day agoSun, 16 Aug 2026 21:36:07 UTC | 0x4bc2b3…828f84 | CALL | Execute | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00273 ETH |
| 38,303,234 | 1 day agoSun, 16 Aug 2026 21:36:07 UTC | 0x4bc2b3…828f84 | CALL | Execute | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00273 ETH |
| 38,284,896 | 1 day agoSun, 16 Aug 2026 21:05:28 UTC | 0xf77b68…16d67b | CALL | exec | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00023 ETH |
| 38,284,896 | 1 day agoSun, 16 Aug 2026 21:05:28 UTC | 0xf77b68…16d67b | CALL | exec | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00023 ETH |
| 38,202,149 | 1 day agoSun, 16 Aug 2026 18:47:10 UTC | 0xd3519d…a8cb15 | CALL | swapWithBackendSignature | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00368 ETH |
| 38,202,149 | 1 day agoSun, 16 Aug 2026 18:47:10 UTC | 0xd3519d…a8cb15 | CALL | swapWithBackendSignature | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00368 ETH |
| 38,130,146 | 1 day agoSun, 16 Aug 2026 16:46:45 UTC | 0x8f839b…b27f80 | CALL | 0x39ecce49 | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00027 ETH |
| 38,130,146 | 1 day agoSun, 16 Aug 2026 16:46:45 UTC | 0x8f839b…b27f80 | CALL | 0x39ecce49 | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00027 ETH |
| 38,096,281 | 1 day agoSun, 16 Aug 2026 15:50:09 UTC | 0xf9e792…6e7832 | CALL | Execute | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00093 ETH |
| 38,096,281 | 1 day agoSun, 16 Aug 2026 15:50:09 UTC | 0xf9e792…6e7832 | CALL | Execute | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00093 ETH |
| 38,077,929 | 1 day agoSun, 16 Aug 2026 15:19:27 UTC | 0x3c2cd9…1de743 | CALL | exec | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00023 ETH |
| 38,077,929 | 1 day agoSun, 16 Aug 2026 15:19:27 UTC | 0x3c2cd9…1de743 | CALL | exec | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00023 ETH |
| 38,074,672 | 1 day agoSun, 16 Aug 2026 15:14:00 UTC | 0x3b15d8…6d4a9b | CALL | Execute | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00023 ETH |
| 38,074,672 | 1 day agoSun, 16 Aug 2026 15:14:00 UTC | 0x3b15d8…6d4a9b | CALL | Execute | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00023 ETH |
| 38,030,612 | 1 day agoSun, 16 Aug 2026 14:00:21 UTC | 0x3309a7…e36fd8 | CALL | sell | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00906 ETH |
| 38,030,612 | 1 day agoSun, 16 Aug 2026 14:00:21 UTC | 0x3309a7…e36fd8 | CALL | sell | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00906 ETH |
| 37,833,688 | 1 day agoSun, 16 Aug 2026 08:30:40 UTC | 0x8fbb21…7de4c4 | CALL | dagSwapTo | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00023 ETH |
| 37,833,688 | 1 day agoSun, 16 Aug 2026 08:30:40 UTC | 0x8fbb21…7de4c4 | CALL | dagSwapTo | 0x8366…0951 | IN | 0xbb8e…20cc | 0.00023 ETH |
| 37,781,490 | 1 day agoSun, 16 Aug 2026 07:03:13 UTC | 0x71e06d…9f1499 | CALL | exec | 0xbb8e…20cc | OUT | 0xe53b…a9fb | 0.00189 ETH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xcaaaad…2a060a | setTradingController | 9,529,584 | 34 days agoTue, 14 Jul 2026 12:29:14 UTC | 0x0dc1…4550 | IN | HoodlHook | $0.000 ETH | 0.00000212 |