// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { IHooks } from "@uniswap/v4-core/interfaces/IHooks.sol";
import { IPoolManager } from "@uniswap/v4-core/interfaces/IPoolManager.sol";
import { IUnlockCallback } from "@uniswap/v4-core/interfaces/callback/IUnlockCallback.sol";
import { TransientStateLibrary } from "@uniswap/v4-core/libraries/TransientStateLibrary.sol";
import { Currency } from "@uniswap/v4-core/types/Currency.sol";
import { PoolKey } from "@uniswap/v4-core/types/PoolKey.sol";
import { ModifyLiquidityParams } from "@uniswap/v4-core/types/PoolOperation.sol";
/// @title Removable FUND canary liquidity position
/// @notice Owns one fixed direct PoolManager position; principal removal remains owner-controlled
/// unless the separate irreversible lock switch is deliberately invoked later.
contract FUNDCanaryLiquidity is Ownable2Step, ReentrancyGuard, IUnlockCallback {
using SafeERC20 for IERC20;
using TransientStateLibrary for IPoolManager;
IPoolManager public immutable poolManager;
address public immutable lpFeeRecipient;
int24 public immutable tickLower;
int24 public immutable tickUpper;
uint160 public immutable initialSqrtPriceX96;
PoolKey private _poolKey;
uint128 public positionLiquidity;
bool public liquidityLockedForever;
bool private _unlocking;
bytes32 private _callbackHash;
struct CallbackData {
address payer;
int256 liquidityDelta;
uint256 maxAmount0;
uint256 maxAmount1;
}
error ZeroAddress();
error InvalidConfiguration();
error InvalidAmount();
error InvalidDeadline();
error InvalidUnlockCallback();
error LiquidityAlreadyLocked();
error LimitExceeded(uint256 actual, uint256 maximum);
error SettlementMismatch(uint256 expected, uint256 actual);
event PoolInitialized(uint160 sqrtPriceX96);
event LiquidityChanged(
int256 liquidityDelta, uint256 amount0, uint256 amount1, uint128 positionLiquidity
);
event FeesCollected(uint256 amount0, uint256 amount1, address indexed recipient);
event LiquidityLockedForever(uint128 lockedLiquidity);
constructor(
IPoolManager poolManager_,
address fund,
address weth,
IHooks hook,
uint24 fee,
int24 tickSpacing,
int24 tickLower_,
int24 tickUpper_,
uint160 initialSqrtPriceX96_,
address initialOwner,
address lpFeeRecipient_
) Ownable(initialOwner) {
if (
address(poolManager_) == address(0) || fund == address(0) || weth == address(0)
|| address(hook) == address(0) || initialOwner == address(0)
|| lpFeeRecipient_ == address(0)
) revert ZeroAddress();
if (
tickSpacing <= 0 || tickLower_ >= tickUpper_ || tickLower_ % tickSpacing != 0
|| tickUpper_ % tickSpacing != 0 || initialSqrtPriceX96_ == 0
) revert InvalidConfiguration();
(Currency currency0, Currency currency1) = fund < weth
? (Currency.wrap(fund), Currency.wrap(weth))
: (Currency.wrap(weth), Currency.wrap(fund));
poolManager = poolManager_;
lpFeeRecipient = lpFeeRecipient_;
tickLower = tickLower_;
tickUpper = tickUpper_;
initialSqrtPriceX96 = initialSqrtPriceX96_;
_poolKey = PoolKey({
currency0: currency0,
currency1: currency1,
fee: fee,
tickSpacing: tickSpacing,
hooks: hook
});
}
function poolKey() external view returns (PoolKey memory) {
return _poolKey;
}
function initializePool() external onlyOwner {
poolManager.initialize(_poolKey, initialSqrtPriceX96);
emit PoolInitialized(initialSqrtPriceX96);
}
function addLiquidity(
uint128 liquidity,
uint256 maxAmount0,
uint256 maxAmount1,
uint48 deadline
) external onlyOwner nonReentrant returns (uint256 amount0, uint256 amount1) {
if (liquidity == 0 || liquidity > uint128(type(int128).max)) revert InvalidAmount();
if (block.timestamp > deadline) revert InvalidDeadline();
(amount0, amount1) = _modify(
CallbackData({
payer: msg.sender,
liquidityDelta: int256(uint256(liquidity)),
maxAmount0: maxAmount0,
maxAmount1: maxAmount1
})
);
positionLiquidity += liquidity;
emit LiquidityChanged(int256(uint256(liquidity)), amount0, amount1, positionLiquidity);
}
function removeLiquidity(
uint128 liquidity,
uint256 minimumAmount0,
uint256 minimumAmount1,
uint48 deadline
) external onlyOwner nonReentrant returns (uint256 amount0, uint256 amount1) {
if (liquidityLockedForever) revert LiquidityAlreadyLocked();
if (liquidity == 0 || liquidity > positionLiquidity) revert InvalidAmount();
if (block.timestamp > deadline) revert InvalidDeadline();
(amount0, amount1) = _modify(
CallbackData({
payer: msg.sender,
liquidityDelta: -int256(uint256(liquidity)),
maxAmount0: type(uint256).max,
maxAmount1: type(uint256).max
})
);
if (amount0 < minimumAmount0) revert LimitExceeded(amount0, minimumAmount0);
if (amount1 < minimumAmount1) revert LimitExceeded(amount1, minimumAmount1);
positionLiquidity -= liquidity;
emit LiquidityChanged(-int256(uint256(liquidity)), amount0, amount1, positionLiquidity);
}
function collectFees(uint48 deadline)
external
onlyOwner
nonReentrant
returns (uint256 amount0, uint256 amount1)
{
if (block.timestamp > deadline) revert InvalidDeadline();
(amount0, amount1) = _modify(
CallbackData({ payer: msg.sender, liquidityDelta: 0, maxAmount0: 0, maxAmount1: 0 })
);
emit FeesCollected(amount0, amount1, lpFeeRecipient);
}
/// @notice Optional production action. The canary runbook forbids invoking it.
function lockLiquidityForever() external onlyOwner {
if (liquidityLockedForever) revert LiquidityAlreadyLocked();
liquidityLockedForever = true;
emit LiquidityLockedForever(positionLiquidity);
}
function unlockCallback(bytes calldata rawData) external returns (bytes memory) {
if (
msg.sender != address(poolManager) || !_unlocking || keccak256(rawData) != _callbackHash
) revert InvalidUnlockCallback();
CallbackData memory data = abi.decode(rawData, (CallbackData));
poolManager.modifyLiquidity(
_poolKey,
ModifyLiquidityParams({
tickLower: tickLower,
tickUpper: tickUpper,
liquidityDelta: data.liquidityDelta,
salt: bytes32(0)
}),
bytes("")
);
int256 delta0 = poolManager.currencyDelta(address(this), _poolKey.currency0);
int256 delta1 = poolManager.currencyDelta(address(this), _poolKey.currency1);
uint256 amount0 = delta0 < 0 ? uint256(-delta0) : uint256(delta0);
uint256 amount1 = delta1 < 0 ? uint256(-delta1) : uint256(delta1);
if (data.liquidityDelta > 0) {
if (delta0 > 0 || delta1 > 0) revert InvalidConfiguration();
if (amount0 > data.maxAmount0) revert LimitExceeded(amount0, data.maxAmount0);
if (amount1 > data.maxAmount1) revert LimitExceeded(amount1, data.maxAmount1);
if (delta0 < 0) _settle(_poolKey.currency0, data.payer, amount0);
if (delta1 < 0) _settle(_poolKey.currency1, data.payer, amount1);
} else {
if (delta0 < 0 || delta1 < 0) revert InvalidConfiguration();
if (delta0 > 0) poolManager.take(_poolKey.currency0, lpFeeRecipient, amount0);
if (delta1 > 0) poolManager.take(_poolKey.currency1, lpFeeRecipient, amount1);
}
return abi.encode(amount0, amount1);
}
function _modify(CallbackData memory data) private returns (uint256 amount0, uint256 amount1) {
bytes memory encoded = abi.encode(data);
_unlocking = true;
_callbackHash = keccak256(encoded);
(amount0, amount1) = abi.decode(poolManager.unlock(encoded), (uint256, uint256));
_callbackHash = bytes32(0);
_unlocking = false;
}
function _settle(Currency currency, address payer, uint256 amount) private {
poolManager.sync(currency);
IERC20(Currency.unwrap(currency)).safeTransferFrom(payer, address(poolManager), amount);
uint256 settled = poolManager.settle();
if (settled != amount) revert SettlementMismatch(amount, settled);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "fund",
"type": "address",
"internalType": "address"
},
{
"name": "weth",
"type": "address",
"internalType": "address"
},
{
"name": "hook",
"type": "address",
"internalType": "contract IHooks"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickLower_",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper_",
"type": "int24",
"internalType": "int24"
},
{
"name": "initialSqrtPriceX96_",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "lpFeeRecipient_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "InvalidAmount",
"type": "error",
"inputs": []
},
{
"name": "InvalidConfiguration",
"type": "error",
"inputs": []
},
{
"name": "InvalidDeadline",
"type": "error",
"inputs": []
},
{
"name": "InvalidUnlockCallback",
"type": "error",
"inputs": []
},
{
"name": "LimitExceeded",
"type": "error",
"inputs": [
{
"name": "actual",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maximum",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "LiquidityAlreadyLocked",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SettlementMismatch",
"type": "error",
"inputs": [
{
"name": "expected",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "actual",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "FeesCollected",
"type": "event",
"inputs": [
{
"name": "amount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LiquidityChanged",
"type": "event",
"inputs": [
{
"name": "liquidityDelta",
"type": "int256",
"indexed": false,
"internalType": "int256"
},
{
"name": "amount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "positionLiquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "LiquidityLockedForever",
"type": "event",
"inputs": [
{
"name": "lockedLiquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PoolInitialized",
"type": "event",
"inputs": [
{
"name": "sqrtPriceX96",
"type": "uint160",
"indexed": false,
"internalType": "uint160"
}
],
"anonymous": false
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "addLiquidity",
"type": "function",
"inputs": [
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "maxAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxAmount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "collectFees",
"type": "function",
"inputs": [
{
"name": "deadline",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "initialSqrtPriceX96",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "initializePool",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "liquidityLockedForever",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "lockLiquidityForever",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "lpFeeRecipient",
"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": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolKey",
"type": "function",
"inputs": [],
"outputs": [
{
"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"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "positionLiquidity",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "removeLiquidity",
"type": "function",
"inputs": [
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "minimumAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minimumAmount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tickLower",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "tickUpper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "rawData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
}
]0x610120604052346103f657604051601f6118e638819003918201601f19168301916001600160401b0383118484101761032057808492610160946040528339810103126103f6578051906001600160a01b038216908183036103f657610067602082016103fa565b92610074604083016103fa565b60608301516001600160a01b03811695919291908690036103f65760808401519462ffffff8616938487036103f6576100af60a0870161040e565b956100bc60c0820161040e565b6100c860e0830161040e565b916101008101519360018060a01b038516958686036103f6576100fb6101406100f461012086016103fa565b94016103fa565b926001600160a01b031680156103e357600180546001600160a01b03199081169091555f8054918216831781556001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00551580156103d2575b80156103c1575b80156103b9575b80156103b2575b80156103a1575b610392578960020b955f871390811591610380575b8115610369575b8115610352575b8115610349575b5061033a576001600160a01b039081169616868110156103345795965b60805260a05260c05260e0526101005260405160a081019181831060018060401b0384111761032057889360809360405260018060a01b03169485835260018060a01b03169586602084015260408301526060820152015260018060a01b0319600254161760025560018060a01b031960035416176003556003549060b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b1916171760035560018060a01b031960045416176004556040516114a3908161044382396080518181816101a70152818161027201528181610e0d0152818161117601526112d4015260a0518181816105ab0152818161063d015281816108fa0152610c59015260c0518181816103160152610b72015260e0518181816103410152610baf0152610100518181816101ec0152610dd60152f35b634e487b7160e01b5f52604160045260245ffd5b966101e7565b63c52a9bd360e01b5f5260045ffd5b9050155f6101ca565b905061035e8b8661041c565b60020b1515906101c3565b90506103758b8561041c565b60020b1515906101bc565b90508460020b8460020b1215906101b5565b63d92e233d60e01b5f5260045ffd5b506001600160a01b038216156101a0565b505f610199565b508b15610192565b506001600160a01b0381161561018b565b506001600160a01b03871615610184565b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b51906001600160a01b03821682036103f657565b51908160020b82036103f657565b9060020b90811561042e5760020b0790565b634e487b7160e01b5f52601260045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c908163182148ef14610ea357508063250e6de014610d9c5780632aa6685c14610c885780633c14a7b914610c445780634e33d91014610bd557806355b812a814610b9857806359c4f90514610b5b578063644aeb7e1461099957806368b03489146109745780636e0c863e14610889578063715018a6146108265780637211dc361461080057806379ba50971461077b5780638da5cb5b1461075457806391dd73461461021b578063d404b263146101d6578063dc4c90d314610191578063e30c3978146101685763f2fde38b146100ef575f80fd5b34610165576020366003190112610165576004356001600160a01b038116908190036101615761011d6110a3565b600180546001600160a01b0319168217905581546001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5080fd5b80fd5b50346101655780600319360112610165576001546040516001600160a01b039091168152602090f35b50346101655780600319360112610165576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101655780600319360112610165576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346106a75760203660031901126106a75760043567ffffffffffffffff81116106a757366023820112156106a75780600401359067ffffffffffffffff82116106a757602481018282013660248201116106a7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381169490919033861480159190610743575b811561070b575b506106fc57608090849003126106a757604051916102cf83610ff7565b356001600160a01b03811681036106a7578252604483013594602083019386855260408401966064820135885260846060860192013582526040805161031481610ff7565b7f000000000000000000000000000000000000000000000000000000000000000060020b815260208101907f000000000000000000000000000000000000000000000000000000000000000060020b82528281019384526103d6606082015f8152845190610383602083611013565b5f82528551632d35e7ed60e11b815296879586956103a360048801611035565b5160020b60a48701525160020b60c48601525160e485015251610104840152610140610124840152610144830190610fa3565b03815f8b5af1801561069c576106d1575b506002546001600160a01b031696610417610403893087611255565b9460018060a01b0360035416903090611255565b5f85129485156106ca5761042a81611077565b985b5f83129a8b156106c2575f61044085611077565b9a5b5113156105445750508480911391821561053a575b505061052b57518087116105145750518085116104fc5750506104b49483916104da575b6104b8575b50505b6040519160208301526040820152604081526104a0606082611013565b604051918291602083526020830190610fa3565b0390f35b60035491516104d3926001600160a01b0391821691166112d1565b5f81610480565b60025483516104f79187916001600160a01b0390811691166112d1565b61047b565b634779077960e11b8252600485905260245260449150fd5b634779077960e11b83526004879052602452604482fd5b63c52a9bd360e01b8352600483fd5b139050835f610457565b94509650948092509890939891156106ba575b506106ab575f879313610614575b5013610577575b506104b49250610483565b60035484906001600160a01b0316823b1561016157604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000909116602482015260448101849052918290606490829084905af18015610609571561056c576105fb848092611013565b610605578261056c565b8280fd5b6040513d86823e3d90fd5b909150823b156106a757604051630b0d9c0960e01b81526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091166024820152604481018590525f8160648183875af1801561069c57610687575b908591610565565b6106949195505f90611013565b5f935f61067f565b6040513d5f823e3d90fd5b5f80fd5b63c52a9bd360e01b5f5260045ffd5b90505f610557565b5f849a610442565b809861042c565b604090813d83116106f5575b6106e78183611013565b810103126106a7575f6103e7565b503d6106dd565b639b00778960e01b5f5260045ffd5b905061071681611087565b6107236040519182611013565b8181525f602080830193808886378301015251902060065414155f6102b2565b60055460881c60ff161591506102ab565b346106a7575f3660031901126106a7575f546040516001600160a01b039091168152602090f35b346106a7575f3660031901126106a757600154336001600160a01b03909116036107ed57600180546001600160a01b03199081169091555f805433928116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b63118cdaa760e01b5f523360045260245ffd5b346106a7575f3660031901126106a75760206001600160801b0360055416604051908152f35b346106a7575f3660031901126106a75761083e6110a3565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346106a75760203660031901126106a75760043565ffffffffffff81168091036106a7576108b56110a3565b6108bd6110b6565b42116109655760406108ec81516108d381610ff7565b3381525f60208201525f838201525f60608201526110ee565b8251828152602081018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316907f1b4adb9070e1d08c74353b02e137a2c8fe592b8e2e17179a4e53fb5f8f19ce9f908590a260015f8051602061144e8339815191525582519182526020820152f35b631da7447960e21b5f5260045ffd5b346106a7575f3660031901126106a757602060ff60055460801c166040519015158152f35b346106a7576109a736610f66565b6109af6110a3565b6109b76110b6565b6005549360ff8560801c16610b4c576001600160801b0316938415908115610b39575b50610b2a5765ffffffffffff16421161096557610a216109f984611077565b60405190610a0682610ff7565b33825260208201525f196040820181905260608201526110ee565b919092808410610b145750808210610afe575060055492806001600160801b038516036001600160801b038111610aea57604094610aca610a9d7f527a331b4854dd054411a42612817ce9d1a56e269586e679cf477e660be8f6cd946001600160801b0388951680946001600160801b03191617600555611077565b87519081526020810193909352604083018590526001600160801b03909116606083015281906080820190565b0390a160015f8051602061144e8339815191525582519182526020820152f35b634e487b7160e01b5f52601160045260245ffd5b90634779077960e11b5f5260045260245260445ffd5b83634779077960e11b5f5260045260245260445ffd5b63162908e360e11b5f5260045ffd5b6001600160801b039150168411856109da565b635a3abd4b60e11b5f5260045ffd5b346106a7575f3660031901126106a75760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b346106a7575f3660031901126106a75760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b346106a7575f3660031901126106a757610bed6110a3565b60055460ff8160801c16610b4c5760ff60801b198116600160801b176005556040516001600160801b0390911681527fc36479ba4e055bb2e08d01e364f238c2cc4d831c51baa7e0cc78c915eb24add590602090a1005b346106a7575f3660031901126106a7576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346106a7576001600160801b03610c9e36610f66565b939092610ca96110a3565b610cb16110b6565b169283158015610d83575b610b2a5765ffffffffffff16421161096557610cf79160405191610cdf83610ff7565b338352846020840152604083015260608201526110ee565b600554836001600160801b03821601906001600160801b038211610aea576fffffffffffffffffffffffffffffffff19166001600160801b039190911690811760055560408051948552602085018490528481018390526060850191909152927f527a331b4854dd054411a42612817ce9d1a56e269586e679cf477e660be8f6cd908060808101610aca565b506f7fffffffffffffffffffffffffffffff8411610cbc565b346106a7575f3660031901126106a757610db46110a3565b60405163313b65df60e11b8152610dcd60048201611035565b60018060a01b037f000000000000000000000000000000000000000000000000000000000000000016908160a482015260208160c4815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1801561069c57610e67575b7fb1b3d56472cdd8e74e5d30fd9cff8561ff07d4dc2c3829bb97f669c9b983ebca602083604051908152a1005b6020813d602011610e9b575b81610e8060209383611013565b810103126106a757518060020b81036106a757506020610e3a565b3d9150610e73565b346106a7575f3660031901126106a757608081610ec05f93610fc7565b828152826020820152826040820152826060820152015260a0604051610ee581610fc7565b600180831b03600254169081815260035462ffffff60208301600180871b038316815260408401908284881c168252606085019360b81c60020b84526080600180891b03600454169501948552604051958652600180881b039051166020860152511660408401525160020b6060830152600180841b039051166080820152f35b60809060031901126106a7576004356001600160801b03811681036106a75790602435906044359060643565ffffffffffff811681036106a75790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff821117610fe357604052565b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff821117610fe357604052565b90601f8019910116810190811067ffffffffffffffff821117610fe357604052565b600280546001600160a01b039081168352600354808216602085015260a081901c62ffffff16604085015260b81c90910b606083015260045416608090910152565b600160ff1b8114610aea575f0390565b67ffffffffffffffff8111610fe357601f01601f191660200190565b5f546001600160a01b031633036107ed57565b60025f8051602061144e83398151915254146110df5760025f8051602061144e83398151915255565b633ee5aeb560e01b5f5260045ffd5b5f61117191604051906060602083019160018060a01b03815116835260208101516040850152604081015182850152015160808301526080825261113360a083611013565b6005805460ff60881b1916600160881b179055815190206006556040516348c8949160e01b8152602060048201529283918291906024830190610fa3565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561069c575f916111db575b506040818051810103126106a7576040602082015191015190915f60065560ff60881b1960055416600555565b90503d805f833e6111ec8183611013565b8101906020818303126106a75780519067ffffffffffffffff82116106a7570181601f820112156106a75780519061122382611087565b926112316040519485611013565b828452602083830101116106a757815f9260208093018386015e830101525f6111ae565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa90811561069c575f916112a2575090565b90506020813d6020116112c9575b816112bd60209383611013565b810103126106a7575190565b3d91506112b0565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156106a757604051632961046560e21b81526001600160a01b03909416600485018190525f94858160248183875af1801561069c57611438575b506040516323b872dd60e01b86526001600160a01b039094166004526024829052604483905260208560648180855af16001865114811615611419575b84604052856060521561140757508260048186602094630476982d60e21b83525af19182156113fc5783926113c8575b508082036113b257505050565b63adc66ead60e01b835260045260245260449150fd5b9091506020813d6020116113f4575b816113e460209383611013565b810103126106055751905f6113a5565b3d91506113d7565b6040513d85823e3d90fd5b635274afe760e01b8552600452602484fd5b600181151661142f57813b15153d151616611375565b843d87823e3d90fd5b6114459195505f90611013565b5f935f61133856fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212200a1e3fbc5fc239ea33d3609f803f36004733376e766c095275fe4d9886d050f664736f6c634300081a00330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000e9e67829d1d1db3820ccd598f909dd58d962b0c50000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7300000000000000000000000041cb290b04046a5834dfcf4fff71edf6971860cc0000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000003cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c000000000000000000000000000000000000000000000000000000000002cf8800000000000000000000000000000000000027087e8fb5ce7388fc260d3798220000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f0000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f
0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163182148ef14610ea357508063250e6de014610d9c5780632aa6685c14610c885780633c14a7b914610c445780634e33d91014610bd557806355b812a814610b9857806359c4f90514610b5b578063644aeb7e1461099957806368b03489146109745780636e0c863e14610889578063715018a6146108265780637211dc361461080057806379ba50971461077b5780638da5cb5b1461075457806391dd73461461021b578063d404b263146101d6578063dc4c90d314610191578063e30c3978146101685763f2fde38b146100ef575f80fd5b34610165576020366003190112610165576004356001600160a01b038116908190036101615761011d6110a3565b600180546001600160a01b0319168217905581546001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5080fd5b80fd5b50346101655780600319360112610165576001546040516001600160a01b039091168152602090f35b50346101655780600319360112610165576040517f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03168152602090f35b50346101655780600319360112610165576040517f00000000000000000000000000000000000027087e8fb5ce7388fc260d3798226001600160a01b03168152602090f35b50346106a75760203660031901126106a75760043567ffffffffffffffff81116106a757366023820112156106a75780600401359067ffffffffffffffff82116106a757602481018282013660248201116106a7577f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0381169490919033861480159190610743575b811561070b575b506106fc57608090849003126106a757604051916102cf83610ff7565b356001600160a01b03811681036106a7578252604483013594602083019386855260408401966064820135885260846060860192013582526040805161031481610ff7565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c60020b815260208101907f000000000000000000000000000000000000000000000000000000000002cf8860020b82528281019384526103d6606082015f8152845190610383602083611013565b5f82528551632d35e7ed60e11b815296879586956103a360048801611035565b5160020b60a48701525160020b60c48601525160e485015251610104840152610140610124840152610144830190610fa3565b03815f8b5af1801561069c576106d1575b506002546001600160a01b031696610417610403893087611255565b9460018060a01b0360035416903090611255565b5f85129485156106ca5761042a81611077565b985b5f83129a8b156106c2575f61044085611077565b9a5b5113156105445750508480911391821561053a575b505061052b57518087116105145750518085116104fc5750506104b49483916104da575b6104b8575b50505b6040519160208301526040820152604081526104a0606082611013565b604051918291602083526020830190610fa3565b0390f35b60035491516104d3926001600160a01b0391821691166112d1565b5f81610480565b60025483516104f79187916001600160a01b0390811691166112d1565b61047b565b634779077960e11b8252600485905260245260449150fd5b634779077960e11b83526004879052602452604482fd5b63c52a9bd360e01b8352600483fd5b139050835f610457565b94509650948092509890939891156106ba575b506106ab575f879313610614575b5013610577575b506104b49250610483565b60035484906001600160a01b0316823b1561016157604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f909116602482015260448101849052918290606490829084905af18015610609571561056c576105fb848092611013565b610605578261056c565b8280fd5b6040513d86823e3d90fd5b909150823b156106a757604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f9091166024820152604481018590525f8160648183875af1801561069c57610687575b908591610565565b6106949195505f90611013565b5f935f61067f565b6040513d5f823e3d90fd5b5f80fd5b63c52a9bd360e01b5f5260045ffd5b90505f610557565b5f849a610442565b809861042c565b604090813d83116106f5575b6106e78183611013565b810103126106a7575f6103e7565b503d6106dd565b639b00778960e01b5f5260045ffd5b905061071681611087565b6107236040519182611013565b8181525f602080830193808886378301015251902060065414155f6102b2565b60055460881c60ff161591506102ab565b346106a7575f3660031901126106a7575f546040516001600160a01b039091168152602090f35b346106a7575f3660031901126106a757600154336001600160a01b03909116036107ed57600180546001600160a01b03199081169091555f805433928116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b63118cdaa760e01b5f523360045260245ffd5b346106a7575f3660031901126106a75760206001600160801b0360055416604051908152f35b346106a7575f3660031901126106a75761083e6110a3565b600180546001600160a01b03199081169091555f80549182168155906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346106a75760203660031901126106a75760043565ffffffffffff81168091036106a7576108b56110a3565b6108bd6110b6565b42116109655760406108ec81516108d381610ff7565b3381525f60208201525f838201525f60608201526110ee565b8251828152602081018290527f0000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f6001600160a01b0316907f1b4adb9070e1d08c74353b02e137a2c8fe592b8e2e17179a4e53fb5f8f19ce9f908590a260015f8051602061144e8339815191525582519182526020820152f35b631da7447960e21b5f5260045ffd5b346106a7575f3660031901126106a757602060ff60055460801c166040519015158152f35b346106a7576109a736610f66565b6109af6110a3565b6109b76110b6565b6005549360ff8560801c16610b4c576001600160801b0316938415908115610b39575b50610b2a5765ffffffffffff16421161096557610a216109f984611077565b60405190610a0682610ff7565b33825260208201525f196040820181905260608201526110ee565b919092808410610b145750808210610afe575060055492806001600160801b038516036001600160801b038111610aea57604094610aca610a9d7f527a331b4854dd054411a42612817ce9d1a56e269586e679cf477e660be8f6cd946001600160801b0388951680946001600160801b03191617600555611077565b87519081526020810193909352604083018590526001600160801b03909116606083015281906080820190565b0390a160015f8051602061144e8339815191525582519182526020820152f35b634e487b7160e01b5f52601160045260245ffd5b90634779077960e11b5f5260045260245260445ffd5b83634779077960e11b5f5260045260245260445ffd5b63162908e360e11b5f5260045ffd5b6001600160801b039150168411856109da565b635a3abd4b60e11b5f5260045ffd5b346106a7575f3660031901126106a75760206040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2764c60020b8152f35b346106a7575f3660031901126106a75760206040517f000000000000000000000000000000000000000000000000000000000002cf8860020b8152f35b346106a7575f3660031901126106a757610bed6110a3565b60055460ff8160801c16610b4c5760ff60801b198116600160801b176005556040516001600160801b0390911681527fc36479ba4e055bb2e08d01e364f238c2cc4d831c51baa7e0cc78c915eb24add590602090a1005b346106a7575f3660031901126106a7576040517f0000000000000000000000000a72e396496349d90dfa92cf500c3f3d2eb9f83f6001600160a01b03168152602090f35b346106a7576001600160801b03610c9e36610f66565b939092610ca96110a3565b610cb16110b6565b169283158015610d83575b610b2a5765ffffffffffff16421161096557610cf79160405191610cdf83610ff7565b338352846020840152604083015260608201526110ee565b600554836001600160801b03821601906001600160801b038211610aea576fffffffffffffffffffffffffffffffff19166001600160801b039190911690811760055560408051948552602085018490528481018390526060850191909152927f527a331b4854dd054411a42612817ce9d1a56e269586e679cf477e660be8f6cd908060808101610aca565b506f7fffffffffffffffffffffffffffffff8411610cbc565b346106a7575f3660031901126106a757610db46110a3565b60405163313b65df60e11b8152610dcd60048201611035565b60018060a01b037f00000000000000000000000000000000000027087e8fb5ce7388fc260d37982216908160a482015260208160c4815f60018060a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af1801561069c57610e67575b7fb1b3d56472cdd8e74e5d30fd9cff8561ff07d4dc2c3829bb97f669c9b983ebca602083604051908152a1005b6020813d602011610e9b575b81610e8060209383611013565b810103126106a757518060020b81036106a757506020610e3a565b3d9150610e73565b346106a7575f3660031901126106a757608081610ec05f93610fc7565b828152826020820152826040820152826060820152015260a0604051610ee581610fc7565b600180831b03600254169081815260035462ffffff60208301600180871b038316815260408401908284881c168252606085019360b81c60020b84526080600180891b03600454169501948552604051958652600180881b039051166020860152511660408401525160020b6060830152600180841b039051166080820152f35b60809060031901126106a7576004356001600160801b03811681036106a75790602435906044359060643565ffffffffffff811681036106a75790565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff821117610fe357604052565b634e487b7160e01b5f52604160045260245ffd5b6080810190811067ffffffffffffffff821117610fe357604052565b90601f8019910116810190811067ffffffffffffffff821117610fe357604052565b600280546001600160a01b039081168352600354808216602085015260a081901c62ffffff16604085015260b81c90910b606083015260045416608090910152565b600160ff1b8114610aea575f0390565b67ffffffffffffffff8111610fe357601f01601f191660200190565b5f546001600160a01b031633036107ed57565b60025f8051602061144e83398151915254146110df5760025f8051602061144e83398151915255565b633ee5aeb560e01b5f5260045ffd5b5f61117191604051906060602083019160018060a01b03815116835260208101516040850152604081015182850152015160808301526080825261113360a083611013565b6005805460ff60881b1916600160881b179055815190206006556040516348c8949160e01b8152602060048201529283918291906024830190610fa3565b0381837f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03165af190811561069c575f916111db575b506040818051810103126106a7576040602082015191015190915f60065560ff60881b1960055416600555565b90503d805f833e6111ec8183611013565b8101906020818303126106a75780519067ffffffffffffffff82116106a7570181601f820112156106a75780519061122382611087565b926112316040519485611013565b828452602083830101116106a757815f9260208093018386015e830101525f6111ae565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa90811561069c575f916112a2575090565b90506020813d6020116112c9575b816112bd60209383611013565b810103126106a7575190565b3d91506112b0565b917f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316803b156106a757604051632961046560e21b81526001600160a01b03909416600485018190525f94858160248183875af1801561069c57611438575b506040516323b872dd60e01b86526001600160a01b039094166004526024829052604483905260208560648180855af16001865114811615611419575b84604052856060521561140757508260048186602094630476982d60e21b83525af19182156113fc5783926113c8575b508082036113b257505050565b63adc66ead60e01b835260045260245260449150fd5b9091506020813d6020116113f4575b816113e460209383611013565b810103126106055751905f6113a5565b3d91506113d7565b6040513d85823e3d90fd5b635274afe760e01b8552600452602484fd5b600181151661142f57813b15153d151616611375565b843d87823e3d90fd5b6114459195505f90611013565b5f935f61133856fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212200a1e3fbc5fc239ea33d3609f803f36004733376e766c095275fe4d9886d050f664736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x5056974e…6b7b7e | Transfer | 20,642,882 | 21 days agoMon, 27 Jul 2026 09:59:17 UTC | 0xcaf7…5d11 | IN | 0x3de5…c69b | $0.001 DIH |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xb92565…a37fcb | 26 days agoWed, 22 Jul 2026 11:17:27 UTC | 0x527a33…f6cd | data: 0xffffffffffffffffff…00000000 |
| 0xd99838…7bf545 | 26 days agoWed, 22 Jul 2026 11:17:21 UTC | 0x1b4adb…ce9f | [0] 0x000000000000…2eb9f83f data: 0x000000000000000000…852f4774 |
| 0xd07693…797dcb | 27 days agoTue, 21 Jul 2026 18:00:16 UTC | 0x1b4adb…ce9f | [0] 0x000000000000…2eb9f83f data: 0x000000000000000000…09245d84 |
| 0x20f789…e9398b | 27 days agoTue, 21 Jul 2026 16:21:48 UTC | 0x527a33…f6cd | data: 0x000000000000000000…7a64e405 |
| 0xa2b7e1…cbfc43 | 27 days agoTue, 21 Jul 2026 16:21:42 UTC | 0xb1b3d5…ebca | data: 0x000000000000000000…0d379822 |
| 0xcd26ae…7cc080 | 27 days agoTue, 21 Jul 2026 16:20:41 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…2eb9f83f |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xb92565…a37fcb | removeLiquidity | 16,382,825 | 26 days agoWed, 22 Jul 2026 11:17:27 UTC | 0x0a72…f83f | IN | FUNDCanaryLiquidity | $0.000 ETH | 0.00001208 | |
| 0xd99838…7bf545 | collectFees | 16,382,768 | 26 days agoWed, 22 Jul 2026 11:17:21 UTC | 0x0a72…f83f | IN | FUNDCanaryLiquidity | $0.000 ETH | 0.00001756 | |
| 0xd07693…797dcb | collectFees | 15,761,852 | 27 days agoTue, 21 Jul 2026 18:00:16 UTC | 0x0a72…f83f | IN | FUNDCanaryLiquidity | $0.000 ETH | 0.00001843 | |
| 0x20f789…e9398b | addLiquidity | 15,702,868 | 27 days agoTue, 21 Jul 2026 16:21:48 UTC | 0x0a72…f83f | IN | FUNDCanaryLiquidity | $0.000 ETH | 0.00002377 | |
| 0xa2b7e1…cbfc43 | initializePool | 15,702,804 | 27 days agoTue, 21 Jul 2026 16:21:42 UTC | 0x0a72…f83f | IN | FUNDCanaryLiquidity | $0.000 ETH | 0.00000433 |