// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {IUnlockCallback} from "v4-core/src/interfaces/callback/IUnlockCallback.sol";
import {IPoolManager} from "v4-core/src/interfaces/IPoolManager.sol";
import {PoolKey} from "v4-core/src/types/PoolKey.sol";
import {Currency} from "v4-core/src/types/Currency.sol";
import {BalanceDelta} from "v4-core/src/types/BalanceDelta.sol";
import {TickMath} from "v4-core/src/libraries/TickMath.sol";
import {FullMath} from "v4-core/src/libraries/FullMath.sol";
import {StateLibrary} from "v4-core/src/libraries/StateLibrary.sol";
import {PoolIdLibrary} from "v4-core/src/types/PoolId.sol";
import {IERC20Minimal} from "v4-core/src/interfaces/external/IERC20Minimal.sol";
import {ModifyLiquidityParams} from "v4-core/src/types/PoolOperation.sol";
/// @title UkiyoLpManager — single-owner v4 LP position manager (HOOKLESS).
/// @notice Manages the ETH/NOTA pool position. Supports SINGLE-SIDED
/// liquidity (branches on `sqrtPriceX96` vs the range so token-only LP
/// works). The pool is hookless — `hooks = address(0)` in the PoolKey —
/// so this contract carries no hook dependency; the key it is given
/// already encodes the (empty) hook. Owns the position; exposes
/// add / remove / claim to the deployer. Proven BaseStation pattern.
contract UkiyoLpManager is IUnlockCallback {
using StateLibrary for IPoolManager;
using PoolIdLibrary for PoolKey;
IPoolManager public immutable pm;
address public immutable owner;
uint256 private constant Q96 = 0x1000000000000000000000000;
enum Action { ADD, REMOVE, CLAIM }
struct CallbackData {
Action action;
PoolKey key;
int24 tickLower;
int24 tickUpper;
uint256 amount0;
uint256 amount1;
uint128 liquidity;
address token1;
}
constructor(address _pm, address _owner) {
pm = IPoolManager(_pm);
owner = _owner;
}
modifier onlyOwner() { require(msg.sender == owner, "only owner"); _; }
receive() external payable {}
function positionLiquidity(PoolKey calldata key, int24 tickLower, int24 tickUpper)
external view returns (uint128 liquidity)
{
(liquidity,,) = pm.getPositionInfo(key.toId(), address(this), tickLower, tickUpper, bytes32(0));
}
/// @notice Add liquidity. For single-side token-only: send amount1 (tokens),
/// msg.value = 0, and a range entirely above the current tick.
function addLiquidity(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint256 amount1)
external payable onlyOwner
{
address token1 = Currency.unwrap(key.currency1);
if (amount1 > 0) IERC20Minimal(token1).transferFrom(msg.sender, address(this), amount1);
pm.unlock(abi.encode(CallbackData({
action: Action.ADD, key: key, tickLower: tickLower, tickUpper: tickUpper,
amount0: msg.value, amount1: amount1, liquidity: 0, token1: token1
})));
_refund(token1);
}
function removeLiquidity(PoolKey calldata key, int24 tickLower, int24 tickUpper, uint128 liquidity)
external onlyOwner
{
if (liquidity == 0) {
(liquidity,,) = pm.getPositionInfo(key.toId(), address(this), tickLower, tickUpper, bytes32(0));
require(liquidity > 0, "no liquidity");
}
address token1 = Currency.unwrap(key.currency1);
pm.unlock(abi.encode(CallbackData({
action: Action.REMOVE, key: key, tickLower: tickLower, tickUpper: tickUpper,
amount0: 0, amount1: 0, liquidity: liquidity, token1: token1
})));
}
function claimFees(PoolKey calldata key, int24 tickLower, int24 tickUpper) external onlyOwner {
address token1 = Currency.unwrap(key.currency1);
pm.unlock(abi.encode(CallbackData({
action: Action.CLAIM, key: key, tickLower: tickLower, tickUpper: tickUpper,
amount0: 0, amount1: 0, liquidity: 0, token1: token1
})));
}
function unlockCallback(bytes calldata data) external returns (bytes memory) {
require(msg.sender == address(pm), "not pm");
CallbackData memory d = abi.decode(data, (CallbackData));
if (d.action == Action.ADD) _handleAdd(d);
else if (d.action == Action.REMOVE) _handleRemove(d);
else _handleClaim(d);
return "";
}
function _handleAdd(CallbackData memory d) internal {
(uint160 sqrtPriceX96,,,) = pm.getSlot0(d.key.toId());
require(sqrtPriceX96 > 0, "pool not initialized");
uint160 sqrtLower = TickMath.getSqrtPriceAtTick(d.tickLower);
uint160 sqrtUpper = TickMath.getSqrtPriceAtTick(d.tickUpper);
uint128 liquidity;
if (sqrtPriceX96 <= sqrtLower) {
require(d.amount0 > 0, "need amount0");
liquidity = _liquidityForAmount0(sqrtLower, sqrtUpper, d.amount0);
} else if (sqrtPriceX96 >= sqrtUpper) {
require(d.amount1 > 0, "need amount1");
liquidity = _liquidityForAmount1(sqrtLower, sqrtUpper, d.amount1);
} else {
uint128 liq0 = _liquidityForAmount0(sqrtPriceX96, sqrtUpper, d.amount0);
uint128 liq1 = _liquidityForAmount1(sqrtLower, sqrtPriceX96, d.amount1);
liquidity = liq0 < liq1 ? liq0 : liq1;
}
require(liquidity > 0, "zero liquidity");
(BalanceDelta cd,) = pm.modifyLiquidity(
d.key,
ModifyLiquidityParams(d.tickLower, d.tickUpper, int256(uint256(liquidity)), bytes32(0)),
""
);
int128 d0 = cd.amount0();
if (d0 < 0) pm.settle{value: uint128(-d0)}();
else if (d0 > 0) pm.take(d.key.currency0, owner, uint128(d0));
int128 d1 = cd.amount1();
if (d1 < 0) {
uint128 owed = uint128(-d1);
pm.sync(d.key.currency1);
IERC20Minimal(d.token1).transfer(address(pm), owed);
pm.settle();
} else if (d1 > 0) {
pm.take(d.key.currency1, owner, uint128(d1));
}
}
function _handleRemove(CallbackData memory d) internal {
(BalanceDelta cd,) = pm.modifyLiquidity(
d.key,
ModifyLiquidityParams(d.tickLower, d.tickUpper, -int256(uint256(d.liquidity)), bytes32(0)),
""
);
int128 d0 = cd.amount0();
if (d0 > 0) pm.take(d.key.currency0, owner, uint128(d0));
int128 d1 = cd.amount1();
if (d1 > 0) pm.take(d.key.currency1, owner, uint128(d1));
}
function _handleClaim(CallbackData memory d) internal {
(BalanceDelta cd,) = pm.modifyLiquidity(
d.key,
ModifyLiquidityParams(d.tickLower, d.tickUpper, 0, bytes32(0)),
""
);
int128 d0 = cd.amount0();
if (d0 > 0) pm.take(d.key.currency0, owner, uint128(d0));
int128 d1 = cd.amount1();
if (d1 > 0) pm.take(d.key.currency1, owner, uint128(d1));
}
function _refund(address token1) internal {
uint256 ethLeft = address(this).balance;
if (ethLeft > 0) payable(owner).transfer(ethLeft);
uint256 tokLeft = IERC20Minimal(token1).balanceOf(address(this));
if (tokLeft > 0) IERC20Minimal(token1).transfer(owner, tokLeft);
}
function _liquidityForAmount0(uint160 sqrtA, uint160 sqrtB, uint256 amount0)
private pure returns (uint128)
{
if (sqrtA > sqrtB) (sqrtA, sqrtB) = (sqrtB, sqrtA);
uint256 inter = FullMath.mulDiv(sqrtA, sqrtB, Q96);
return uint128(FullMath.mulDiv(amount0, inter, uint256(sqrtB) - uint256(sqrtA)));
}
function _liquidityForAmount1(uint160 sqrtA, uint160 sqrtB, uint256 amount1)
private pure returns (uint128)
{
if (sqrtA > sqrtB) (sqrtA, sqrtB) = (sqrtB, sqrtA);
return uint128(FullMath.mulDiv(amount1, Q96, uint256(sqrtB) - uint256(sqrtA)));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_pm",
"type": "address",
"internalType": "address"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "addLiquidity",
"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"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "claimFees",
"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"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pm",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "positionLiquidity",
"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"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
}
],
"outputs": [
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "removeLiquidity",
"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"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60c0604052348015600e575f80fd5b5060405161241e38038061241e833981016040819052602b91605b565b6001600160a01b039182166080521660a0526087565b80516001600160a01b03811681146056575f80fd5b919050565b5f8060408385031215606b575f80fd5b6072836041565b9150607e602084016041565b90509250929050565b60805160a0516122c261015c5f395f818160f2015281816101c0015281816104da01528181610754015281816108f2015281816109c101528181610e51015281816110de015281816112ac015261137c01525f818160a2015281816102b0015281816103e90152818161056a01528181610604015281816107c301528181610a5e01528181610ca401528181610d9101528181610e8801528181610f2e01528181610fa101528181611026015281816111150152818161117c015281816112e3015281816113b3015261140b01526122c25ff3fe608060405260043610610071575f3560e01c806391dd73461161004c57806391dd734614610114578063b244b22114610140578063d8d595691461015f578063f70a2a6a14610196575f80fd5b80633732e7b11461007c5780638970cdff146100915780638da5cb5b146100e1575f80fd5b3661007857005b5f80fd5b61008f61008a366004611b25565b6101b5565b005b34801561009c575f80fd5b506100c47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ec575f80fd5b506100c47f000000000000000000000000000000000000000000000000000000000000000081565b34801561011f575f80fd5b5061013361012e366004611b6f565b6103dc565b6040516100d89190611bdd565b34801561014b575f80fd5b5061008f61015a366004611c28565b6104cf565b34801561016a575f80fd5b5061017e610179366004611c7b565b610728565b6040516001600160801b0390911681526020016100d8565b3480156101a1575f80fd5b5061008f6101b0366004611c7b565b610749565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461021f5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b5f6102306040860160208701611cde565b905081156102ae576040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd906064016020604051808303815f875af1158015610288573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ac9190611cf9565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916040518061010001604052805f60028111156102fb576102fb611d18565b815260200161030f368a90038a018a611e3a565b81526020018760020b81526020018660020b81526020013481526020018581526020015f6001600160801b03168152602001846001600160a01b031681525060405160200161035e9190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016103899190611bdd565b5f604051808303815f875af11580156103a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103cb9190810190611f4a565b506103d5816108de565b5050505050565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104565760405162461bcd60e51b815260206004820152600660248201527f6e6f7420706d00000000000000000000000000000000000000000000000000006044820152606401610216565b5f61046383850185611fec565b90505f8151600281111561047957610479611d18565b0361048c5761048781610a41565b6104b8565b6001815160028111156104a1576104a1611d18565b036104af5761048781611179565b6104b881611408565b505060408051602081019091525f81525b92915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105345760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610216565b806001600160801b03165f036105ef5761059461056061055936879003870187611e3a565b60a0902090565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016903086865f61148b565b50909150506001600160801b0381166105ef5760405162461bcd60e51b815260206004820152600c60248201527f6e6f206c697175696469747900000000000000000000000000000000000000006044820152606401610216565b5f6106006040860160208701611cde565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916040518061010001604052806001600281111561065057610650611d18565b8152602001610664368a90038a018a611e3a565b81526020018760020b81526020018660020b81526020015f81526020015f8152602001856001600160801b03168152602001846001600160a01b03168152506040516020016106b39190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016106de9190611bdd565b5f604051808303815f875af11580156106f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107209190810190611f4a565b505050505050565b5f61073e61056061055936879003870187611e3a565b509095945050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107ae5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610216565b5f6107bf6040850160208601611cde565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c8949160405180610100016040528060028081111561080e5761080e611d18565b815260200161082236899003890189611e3a565b81526020018660020b81526020018560020b81526020015f81526020015f81526020015f6001600160801b03168152602001846001600160a01b03168152506040516020016108719190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161089c9190611bdd565b5f604051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103d59190810190611f4a565b47801561093a576040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083905f818181858888f19350505050158015610938573d5f803e3d5ffd5b505b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a29190612087565b90508015610a3c5760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610a16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3a9190611cf9565b505b505050565b5f610a84610a54836020015160a0902090565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906114e2565b50505090505f816001600160a01b031611610ae15760405162461bcd60e51b815260206004820152601460248201527f706f6f6c206e6f7420696e697469616c697a65640000000000000000000000006044820152606401610216565b5f610aef8360400151611594565b90505f610aff8460600151611594565b90505f826001600160a01b0316846001600160a01b031611610b84575f856080015111610b6e5760405162461bcd60e51b815260206004820152600c60248201527f6e65656420616d6f756e743000000000000000000000000000000000000000006044820152606401610216565b610b7d83838760800151611859565b9050610c49565b816001600160a01b0316846001600160a01b031610610bff575f8560a0015111610bf05760405162461bcd60e51b815260206004820152600c60248201527f6e65656420616d6f756e743100000000000000000000000000000000000000006044820152606401610216565b610b7d83838760a001516118d0565b5f610c0f85848860800151611859565b90505f610c2185878960a001516118d0565b9050806001600160801b0316826001600160801b031610610c425780610c44565b815b925050505b5f816001600160801b031611610ca15760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206c69717569646974790000000000000000000000000000000000006044820152606401610216565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a6bcfda876020015160405180608001604052808a6040015160020b81526020018a6060015160020b8152602001866001600160801b031681526020015f801b8152506040518363ffffffff1660e01b8152600401610d2d92919061209e565b60408051808303815f875af1158015610d48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6c919061213d565b5090505f610d7a8260801d90565b90505f81600f0b1215610e21576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166311da60b4610dbf83612173565b6001600160801b03166040518263ffffffff1660e01b815260040160206040518083038185885af1158015610df6573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610e1b9190612087565b50610ee2565b5f81600f0b1315610ee257602087015151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000821660248201526001600160801b03831660448201527f000000000000000000000000000000000000000000000000000000000000000090911690630b0d9c09906064015f604051808303815f87803b158015610ecb575f80fd5b505af1158015610edd573d5f803e3d5ffd5b505050505b5f610eed83600f0b90565b90505f81600f0b12156110ac575f610f0482612173565b60208a8101510151604051632961046560e21b81526001600160a01b0391821660048201529192507f0000000000000000000000000000000000000000000000000000000000000000169063a5841194906024015f604051808303815f87803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b5050505060e089015160405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526001600160801b03841660248301529091169063a9059cbb906044016020604051808303815f875af1158015610fff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110239190611cf9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a59190612087565b505061116f565b5f81600f0b131561116f576020888101510151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000821660248201526001600160801b03831660448201527f000000000000000000000000000000000000000000000000000000000000000090911690630b0d9c09906064015f604051808303815f87803b158015611158575f80fd5b505af115801561116a573d5f803e3d5ffd5b505050505b5050505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a6bcfda83602001516040518060800160405280866040015160020b8152602001866060015160020b81526020018660c001516001600160801b03166111ea906121a0565b81525f6020909101526040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261122d92919060040161209e565b60408051808303815f875af1158015611248573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126c919061213d565b5090505f61127a8260801d90565b90505f81600f0b131561133d57602083015151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000821660248201526001600160801b03831660448201527f000000000000000000000000000000000000000000000000000000000000000090911690630b0d9c09906064015f604051808303815f87803b158015611326575f80fd5b505af1158015611338573d5f803e3d5ffd5b505050505b5f61134883600f0b90565b90505f81600f0b1315610a3a576020848101510151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000000000000000000000000000000000000000000000821660248201526001600160801b03831660448201527f000000000000000000000000000000000000000000000000000000000000000090911690630b0d9c09906064015f604051808303815f87803b1580156113f6575f80fd5b505af115801561116f573d5f803e3d5ffd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635a6bcfda83602001516040518060800160405280866040015160020b8152602001866060015160020b81526020015f81526020015f801b8152506040518363ffffffff1660e01b815260040161122d92919061209e565b60408051602681018390526006810184905260038101859052858152603a600c8201205f9282018390526020820183905290829052819081906114cf8a8a8361191f565b919c909b50909950975050505050505050565b5f805f805f6114f0866119c2565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015611538573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155c9190612087565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e88111156115bd576115bd6345c3193d60e11b846119fe565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615611606576ffff97272373d413259a46990580e213a0260801c5b6004821615611625576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611644576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611663576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611682576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156116a1576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156116c0576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156116e0576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611700576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611720576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611740576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611760576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611780576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156117a0576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156117c0576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156117e1576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611801576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611820576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561183d576b048a170391f7dc42444e8fa20260801c5b5f841315611849575f19045b63ffffffff0160201c9392505050565b5f826001600160a01b0316846001600160a01b03161115611878579192915b5f6118a3856001600160a01b0316856001600160a01b03166c01000000000000000000000000611a0d565b90506118c583826118c06001600160a01b03808a169089166121ba565b611a0d565b9150505b9392505050565b5f826001600160a01b0316846001600160a01b031611156118ef579192915b611917826c010000000000000000000000006118c06001600160a01b038089169088166121ba565b949350505050565b5f805f8061192d8686611aa9565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa15801561197b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119a291908101906121cd565b60208101516040820151606090920151909a919950975095505050505050565b6040515f906119e1908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302815f1985870982811083820303915050808411611a2c575f80fd5b805f03611a3e575082900490506118c9565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f80611ab4846119c2565b90505f611ac2600683612279565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b5f60a08284031215611b09575f80fd5b50919050565b8035600281900b8114611b20575f80fd5b919050565b5f805f806101008587031215611b39575f80fd5b611b438686611af9565b9350611b5160a08601611b0f565b9250611b5f60c08601611b0f565b9396929550929360e00135925050565b5f8060208385031215611b80575f80fd5b823567ffffffffffffffff811115611b96575f80fd5b8301601f81018513611ba6575f80fd5b803567ffffffffffffffff811115611bbc575f80fd5b856020828401011115611bcd575f80fd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160801b0381168114611b20575f80fd5b5f805f806101008587031215611c3c575f80fd5b611c468686611af9565b9350611c5460a08601611b0f565b9250611c6260c08601611b0f565b9150611c7060e08601611c12565b905092959194509250565b5f805f60e08486031215611c8d575f80fd5b611c978585611af9565b9250611ca560a08501611b0f565b9150611cb360c08501611b0f565b90509250925092565b6001600160a01b0381168114611cd0575f80fd5b50565b8035611b2081611cbc565b5f60208284031215611cee575f80fd5b81356118c981611cbc565b5f60208284031215611d09575f80fd5b815180151581146118c9575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715611d6457611d64611d2c565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d9357611d93611d2c565b604052919050565b5f60a08284031215611dab575f80fd5b60405160a0810167ffffffffffffffff81118282101715611dce57611dce611d2c565b6040529050808235611ddf81611cbc565b81526020830135611def81611cbc565b6020820152604083013562ffffff81168114611e09575f80fd5b6040820152611e1a60608401611b0f565b60608201526080830135611e2d81611cbc565b6080919091015292915050565b5f60a08284031215611e4a575f80fd5b6118c98383611d9b565b815161018082019060038110611e7857634e487b7160e01b5f52602160045260245ffd5b808352506020830151611edc60208401826001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b506040830151611ef160c084018260020b9052565b506060830151611f0660e084018260020b9052565b50608083015161010083015260a083015161012083015260c08301516001600160801b031661014083015260e0909201516001600160a01b03166101609091015290565b5f60208284031215611f5a575f80fd5b815167ffffffffffffffff811115611f70575f80fd5b8201601f81018413611f80575f80fd5b805167ffffffffffffffff811115611f9a57611f9a611d2c565b611fad601f8201601f1916602001611d6a565b818152856020838501011115611fc1575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b803560038110611b20575f80fd5b5f610180828403128015611ffe575f80fd5b50612007611d40565b61201083611fde565b815261201f8460208501611d9b565b602082015261203060c08401611b0f565b604082015261204160e08401611b0f565b6060820152610100830135608082015261012083013560a08201526120696101408401611c12565b60c082015261207b6101608401611cd3565b60e08201529392505050565b5f60208284031215612097575f80fd5b5051919050565b6120f681846001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f806040838503121561214e575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601160045260245ffd5b5f81600f0b6f7fffffffffffffffffffffffffffffff1981036121985761219861215f565b5f0392915050565b5f600160ff1b82016121b4576121b461215f565b505f0390565b818103818111156104c9576104c961215f565b5f602082840312156121dd575f80fd5b815167ffffffffffffffff8111156121f3575f80fd5b8201601f81018413612203575f80fd5b805167ffffffffffffffff81111561221d5761221d611d2c565b8060051b61222d60208201611d6a565b91825260208184018101929081019087841115612248575f80fd5b6020850194505b8385101561226e5784518083526020958601959093509091019061224f565b979650505050505050565b808201808211156104c9576104c961215f56fea2646970667358221220f9ffa780cc7e6807de67406036818a2d0960c3cfb168668549096b3f9c6a8a4b64736f6c634300081a00330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409510000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39
0x608060405260043610610071575f3560e01c806391dd73461161004c57806391dd734614610114578063b244b22114610140578063d8d595691461015f578063f70a2a6a14610196575f80fd5b80633732e7b11461007c5780638970cdff146100915780638da5cb5b146100e1575f80fd5b3661007857005b5f80fd5b61008f61008a366004611b25565b6101b5565b005b34801561009c575f80fd5b506100c47f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100ec575f80fd5b506100c47f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e3981565b34801561011f575f80fd5b5061013361012e366004611b6f565b6103dc565b6040516100d89190611bdd565b34801561014b575f80fd5b5061008f61015a366004611c28565b6104cf565b34801561016a575f80fd5b5061017e610179366004611c7b565b610728565b6040516001600160801b0390911681526020016100d8565b3480156101a1575f80fd5b5061008f6101b0366004611c7b565b610749565b336001600160a01b037f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39161461021f5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b5f6102306040860160208701611cde565b905081156102ae576040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038216906323b872dd906064016020604051808303815f875af1158015610288573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ac9190611cf9565b505b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894916040518061010001604052805f60028111156102fb576102fb611d18565b815260200161030f368a90038a018a611e3a565b81526020018760020b81526020018660020b81526020013481526020018581526020015f6001600160801b03168152602001846001600160a01b031681525060405160200161035e9190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016103899190611bdd565b5f604051808303815f875af11580156103a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103cb9190810190611f4a565b506103d5816108de565b5050505050565b6060336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146104565760405162461bcd60e51b815260206004820152600660248201527f6e6f7420706d00000000000000000000000000000000000000000000000000006044820152606401610216565b5f61046383850185611fec565b90505f8151600281111561047957610479611d18565b0361048c5761048781610a41565b6104b8565b6001815160028111156104a1576104a1611d18565b036104af5761048781611179565b6104b881611408565b505060408051602081019091525f81525b92915050565b336001600160a01b037f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e3916146105345760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610216565b806001600160801b03165f036105ef5761059461056061055936879003870187611e3a565b60a0902090565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116903086865f61148b565b50909150506001600160801b0381166105ef5760405162461bcd60e51b815260206004820152600c60248201527f6e6f206c697175696469747900000000000000000000000000000000000000006044820152606401610216565b5f6106006040860160208701611cde565b90507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894916040518061010001604052806001600281111561065057610650611d18565b8152602001610664368a90038a018a611e3a565b81526020018760020b81526020018660020b81526020015f81526020015f8152602001856001600160801b03168152602001846001600160a01b03168152506040516020016106b39190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016106de9190611bdd565b5f604051808303815f875af11580156106f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107209190810190611f4a565b505050505050565b5f61073e61056061055936879003870187611e3a565b509095945050505050565b336001600160a01b037f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e3916146107ae5760405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606401610216565b5f6107bf6040850160208601611cde565b90507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c8949160405180610100016040528060028081111561080e5761080e611d18565b815260200161082236899003890189611e3a565b81526020018660020b81526020018560020b81526020015f81526020015f81526020015f6001600160801b03168152602001846001600160a01b03168152506040516020016108719190611e54565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161089c9190611bdd565b5f604051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526103d59190810190611f4a565b47801561093a576040516001600160a01b037f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39169082156108fc029083905f818181858888f19350505050158015610938573d5f803e3d5ffd5b505b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a29190612087565b90508015610a3c5760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610a16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3a9190611cf9565b505b505050565b5f610a84610a54836020015160a0902090565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116906114e2565b50505090505f816001600160a01b031611610ae15760405162461bcd60e51b815260206004820152601460248201527f706f6f6c206e6f7420696e697469616c697a65640000000000000000000000006044820152606401610216565b5f610aef8360400151611594565b90505f610aff8460600151611594565b90505f826001600160a01b0316846001600160a01b031611610b84575f856080015111610b6e5760405162461bcd60e51b815260206004820152600c60248201527f6e65656420616d6f756e743000000000000000000000000000000000000000006044820152606401610216565b610b7d83838760800151611859565b9050610c49565b816001600160a01b0316846001600160a01b031610610bff575f8560a0015111610bf05760405162461bcd60e51b815260206004820152600c60248201527f6e65656420616d6f756e743100000000000000000000000000000000000000006044820152606401610216565b610b7d83838760a001516118d0565b5f610c0f85848860800151611859565b90505f610c2185878960a001516118d0565b9050806001600160801b0316826001600160801b031610610c425780610c44565b815b925050505b5f816001600160801b031611610ca15760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206c69717569646974790000000000000000000000000000000000006044820152606401610216565b5f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316635a6bcfda876020015160405180608001604052808a6040015160020b81526020018a6060015160020b8152602001866001600160801b031681526020015f801b8152506040518363ffffffff1660e01b8152600401610d2d92919061209e565b60408051808303815f875af1158015610d48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6c919061213d565b5090505f610d7a8260801d90565b90505f81600f0b1215610e21576001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951166311da60b4610dbf83612173565b6001600160801b03166040518263ffffffff1660e01b815260040160206040518083038185885af1158015610df6573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610e1b9190612087565b50610ee2565b5f81600f0b1315610ee257602087015151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39821660248201526001600160801b03831660448201527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190911690630b0d9c09906064015f604051808303815f87803b158015610ecb575f80fd5b505af1158015610edd573d5f803e3d5ffd5b505050505b5f610eed83600f0b90565b90505f81600f0b12156110ac575f610f0482612173565b60208a8101510151604051632961046560e21b81526001600160a01b0391821660048201529192507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169063a5841194906024015f604051808303815f87803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b5050505060e089015160405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951811660048301526001600160801b03841660248301529091169063a9059cbb906044016020604051808303815f875af1158015610fff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110239190611cf9565b507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a59190612087565b505061116f565b5f81600f0b131561116f576020888101510151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39821660248201526001600160801b03831660448201527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190911690630b0d9c09906064015f604051808303815f87803b158015611158575f80fd5b505af115801561116a573d5f803e3d5ffd5b505050505b5050505050505050565b5f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316635a6bcfda83602001516040518060800160405280866040015160020b8152602001866060015160020b81526020018660c001516001600160801b03166111ea906121a0565b81525f6020909101526040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261122d92919060040161209e565b60408051808303815f875af1158015611248573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126c919061213d565b5090505f61127a8260801d90565b90505f81600f0b131561133d57602083015151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39821660248201526001600160801b03831660448201527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190911690630b0d9c09906064015f604051808303815f87803b158015611326575f80fd5b505af1158015611338573d5f803e3d5ffd5b505050505b5f61134883600f0b90565b90505f81600f0b1315610a3a576020848101510151604051630b0d9c0960e01b81526001600160a01b0391821660048201527f0000000000000000000000004d265df4d8884ad037de287f8a83daff14481e39821660248201526001600160801b03831660448201527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190911690630b0d9c09906064015f604051808303815f87803b1580156113f6575f80fd5b505af115801561116f573d5f803e3d5ffd5b5f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316635a6bcfda83602001516040518060800160405280866040015160020b8152602001866060015160020b81526020015f81526020015f801b8152506040518363ffffffff1660e01b815260040161122d92919061209e565b60408051602681018390526006810184905260038101859052858152603a600c8201205f9282018390526020820183905290829052819081906114cf8a8a8361191f565b919c909b50909950975050505050505050565b5f805f805f6114f0866119c2565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015611538573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155c9190612087565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e88111156115bd576115bd6345c3193d60e11b846119fe565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615611606576ffff97272373d413259a46990580e213a0260801c5b6004821615611625576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611644576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611663576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611682576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156116a1576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156116c0576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156116e0576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611700576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611720576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611740576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611760576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611780576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156117a0576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156117c0576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156117e1576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611801576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611820576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561183d576b048a170391f7dc42444e8fa20260801c5b5f841315611849575f19045b63ffffffff0160201c9392505050565b5f826001600160a01b0316846001600160a01b03161115611878579192915b5f6118a3856001600160a01b0316856001600160a01b03166c01000000000000000000000000611a0d565b90506118c583826118c06001600160a01b03808a169089166121ba565b611a0d565b9150505b9392505050565b5f826001600160a01b0316846001600160a01b031611156118ef579192915b611917826c010000000000000000000000006118c06001600160a01b038089169088166121ba565b949350505050565b5f805f8061192d8686611aa9565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa15801561197b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119a291908101906121cd565b60208101516040820151606090920151909a919950975095505050505050565b6040515f906119e1908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302815f1985870982811083820303915050808411611a2c575f80fd5b805f03611a3e575082900490506118c9565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f80611ab4846119c2565b90505f611ac2600683612279565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b5f60a08284031215611b09575f80fd5b50919050565b8035600281900b8114611b20575f80fd5b919050565b5f805f806101008587031215611b39575f80fd5b611b438686611af9565b9350611b5160a08601611b0f565b9250611b5f60c08601611b0f565b9396929550929360e00135925050565b5f8060208385031215611b80575f80fd5b823567ffffffffffffffff811115611b96575f80fd5b8301601f81018513611ba6575f80fd5b803567ffffffffffffffff811115611bbc575f80fd5b856020828401011115611bcd575f80fd5b6020919091019590945092505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160801b0381168114611b20575f80fd5b5f805f806101008587031215611c3c575f80fd5b611c468686611af9565b9350611c5460a08601611b0f565b9250611c6260c08601611b0f565b9150611c7060e08601611c12565b905092959194509250565b5f805f60e08486031215611c8d575f80fd5b611c978585611af9565b9250611ca560a08501611b0f565b9150611cb360c08501611b0f565b90509250925092565b6001600160a01b0381168114611cd0575f80fd5b50565b8035611b2081611cbc565b5f60208284031215611cee575f80fd5b81356118c981611cbc565b5f60208284031215611d09575f80fd5b815180151581146118c9575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b604051610100810167ffffffffffffffff81118282101715611d6457611d64611d2c565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d9357611d93611d2c565b604052919050565b5f60a08284031215611dab575f80fd5b60405160a0810167ffffffffffffffff81118282101715611dce57611dce611d2c565b6040529050808235611ddf81611cbc565b81526020830135611def81611cbc565b6020820152604083013562ffffff81168114611e09575f80fd5b6040820152611e1a60608401611b0f565b60608201526080830135611e2d81611cbc565b6080919091015292915050565b5f60a08284031215611e4a575f80fd5b6118c98383611d9b565b815161018082019060038110611e7857634e487b7160e01b5f52602160045260245ffd5b808352506020830151611edc60208401826001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b506040830151611ef160c084018260020b9052565b506060830151611f0660e084018260020b9052565b50608083015161010083015260a083015161012083015260c08301516001600160801b031661014083015260e0909201516001600160a01b03166101609091015290565b5f60208284031215611f5a575f80fd5b815167ffffffffffffffff811115611f70575f80fd5b8201601f81018413611f80575f80fd5b805167ffffffffffffffff811115611f9a57611f9a611d2c565b611fad601f8201601f1916602001611d6a565b818152856020838501011115611fc1575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b803560038110611b20575f80fd5b5f610180828403128015611ffe575f80fd5b50612007611d40565b61201083611fde565b815261201f8460208501611d9b565b602082015261203060c08401611b0f565b604082015261204160e08401611b0f565b6060820152610100830135608082015261012083013560a08201526120696101408401611c12565b60c082015261207b6101608401611cd3565b60e08201529392505050565b5f60208284031215612097575f80fd5b5051919050565b6120f681846001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b8151600290810b60a08301526020830151900b60c0820152604082015160e082015260609091015161010082015261014061012082018190525f9082015261016001919050565b5f806040838503121561214e575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601160045260245ffd5b5f81600f0b6f7fffffffffffffffffffffffffffffff1981036121985761219861215f565b5f0392915050565b5f600160ff1b82016121b4576121b461215f565b505f0390565b818103818111156104c9576104c961215f565b5f602082840312156121dd575f80fd5b815167ffffffffffffffff8111156121f3575f80fd5b8201601f81018413612203575f80fd5b805167ffffffffffffffff81111561221d5761221d611d2c565b8060051b61222d60208201611d6a565b91825260208184018101929081019087841115612248575f80fd5b6020850194505b8385101561226e5784518083526020958601959093509091019061224f565b979650505050505050565b808201808211156104c9576104c961215f56fea2646970667358221220f9ffa780cc7e6807de67406036818a2d0960c3cfb168668549096b3f9c6a8a4b64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| no event logs emitted by this address | |||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x672075ac…cdfdaa | Transfer | 27,922,450 | 11 days agoTue, 04 Aug 2026 20:46:54 UTC | 0xb3cf…7e6e | OUT | 0x4d26…1e39 | 0.000000 UKIYO | uKIYO (UKIYO) | |
| 0x672075ac…cdfdaa | Transfer | 27,922,450 | 11 days agoTue, 04 Aug 2026 20:46:54 UTC | 0xb3cf…7e6e | OUT | 0x8366…0951 | 1,000,000,000.000000 UKIYO | uKIYO (UKIYO) | |
| 0x672075ac…cdfdaa | Transfer | 27,922,450 | 11 days agoTue, 04 Aug 2026 20:46:54 UTC | 0x4d26…1e39 | IN | 0xb3cf…7e6e | 1,000,000,000.000000 UKIYO | uKIYO (UKIYO) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x9952f6…9cf45f | removeLiquidity | 27,923,810 | 11 days agoTue, 04 Aug 2026 20:49:12 UTC | 0x4d26…1e39 | IN | UkiyoLpManager | $0.000 ETH | 0.00000296 | |
| 0x672075…cdfdaa | addLiquidity | 27,922,450 | 11 days agoTue, 04 Aug 2026 20:46:54 UTC | 0x4d26…1e39 | IN | UkiyoLpManager | $0.000 ETH | 0.00000452 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||