// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.26;
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {NotAdmin, ZeroAddress, NothingToWithdraw, Reentrancy} from "./libs/Errors.sol";
/// @dev `recordPosition` called by anyone other than the bound factory.
error NotFactory();
/// @dev A tokenId already carries a creator binding. Bindings are write-once.
error PositionAlreadyRecorded();
/// @dev `collect` for a tokenId this vault never had recorded.
error UnknownPosition();
/// @dev `factory.feeRecipient()` read back as the zero address (a burn) or the
/// vault itself (a silent, unledgered park).
error BadPlatformRecipient();
/// @dev `factory.weth9()` read back as zero.
error BadWeth();
/// @dev An admin sweep / extraction was handed a zero recipient.
error BadRecipient();
/// @notice Role getters read off the `PopiFastFactory` proxy. All `view`, so
/// solc emits STATICCALL — a factory implementation could not re-enter here.
interface IPopiFastFactoryRoles {
function admin() external view returns (address);
function feeRecipient() external view returns (address);
function weth9() external view returns (address);
}
/// @notice The FULLER NPM surface this UPGRADEABLE vault is allowed to use.
/// UNLIKE the immutable V2 vault (which deliberately omits every liquidity-exit
/// selector), this vault CAN `decreaseLiquidity` — that is the whole point: an
/// admin-operated LP position that can be extracted / recovered. The extra power
/// is gated behind `onlyAdmin` + the UUPS upgrade authority, an explicit,
/// authorized design.
interface INpmFull {
struct CollectParams {
uint256 tokenId;
address recipient;
uint128 amount0Max;
uint128 amount1Max;
}
struct DecreaseLiquidityParams {
uint256 tokenId;
uint128 liquidity;
uint256 amount0Min;
uint256 amount1Min;
uint256 deadline;
}
function collect(CollectParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);
function decreaseLiquidity(DecreaseLiquidityParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
/// @notice Uniswap V3 SwapRouter02 (peripheral). Fee tier `10000` matches the
/// migration/seed pool.
interface ISwapRouter02 {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
}
/// @notice Minimal WETH9 surface: unwrap `wad` WETH held here into native ETH.
interface IWETH {
function withdraw(uint256 wad) external;
}
/// @title PopiFastLpFeeVaultUpgradeable
/// @notice UUPS-UPGRADEABLE successor to `PopiFastLpFeeVaultV2`. Owns FUTURE
/// FAST-V3-T0 seed positions (factory repointed via `setLpFeeVault`) and keeps
/// V2's exact permissionless `collect` money path (swap launch-token side to
/// WETH → unwrap → split native 50/50 creator/platform, with the pull-ledger
/// fallbacks), so it is a drop-in for the `robin-fast-fee` bot and the factory.
///
/// ## What changed vs V2 (INTENTIONAL, authorized)
/// V2 is immutable and structurally incapable of touching the NFT — its 58
/// positions are locked forever. The owner wants FUTURE launches governed by a
/// vault the admin CAN operate on and extract from (including pulling LP
/// liquidity) — an explicit admin-controlled ("rug-switch") design. This vault:
/// - is a UUPS proxy impl (arbitrary future logic is the upgrade authority);
/// - exposes `onlyAdmin` operate/extract powers: `adminDecreaseLiquidity`
/// (the LP-liquidity extraction / recovery path), `adminCollectTo`,
/// `adminSweepERC20`, `adminSweepETH`.
/// It DELIBERATELY has NO raw arbitrary-call/delegatecall primitive — the
/// upgrade path already covers future logic; the operator surface stays explicit.
///
/// ## Roles (parity with V2)
/// `admin` / `platformRecipient` / `weth9` are read THROUGH the factory, never
/// stored. `factory` / `positionManager` / `swapRouter` are IMPL-immutables set
/// in the constructor (read fine through the proxy delegatecall) — same pattern
/// `PopiFeeHook` uses. `factory()` is a public getter so the factory's
/// `setLpFeeVault` can assert `newVault.factory() == address(this)`.
contract PopiFastLpFeeVaultUpgradeable is Initializable, UUPSUpgradeable {
/// @dev bps denominator.
uint16 internal constant BPS_DENOM = 10_000;
/// @notice Creator share of the unwrapped native-ETH payout. Hardcoded —
/// no admin band, cannot drift (parity with V2).
uint16 public constant WETH_CREATOR_SHARE_BPS = 5000; // 50%
/// @notice Gas forwarded on the DIRECT native-ETH send in `collect`. Bounded
/// so a griefing recipient can't OOG-brick the collect for the other party.
uint256 private constant _ETH_SEND_GAS = 30_000;
/// @notice v3 pool fee tier the vault routes through when swapping the
/// launch-token side back to WETH. Matches the seed pool.
uint24 public constant SWAP_FEE_TIER = 10_000;
/// @notice The Uniswap-V3 NonfungiblePositionManager holding our positions.
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
INpmFull public immutable positionManager;
/// @notice The PopiFastFactory proxy — sole writer of creator bindings and
/// source of the admin / feeRecipient / weth9 role reads.
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
address public immutable factory;
/// @notice The peripheral SwapRouter02 used to convert launch-token fees to
/// WETH before the split.
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable
ISwapRouter02 public immutable swapRouter;
// ------------------------------------------------------------------ //
// Storage (proxy) — append-only across upgrades, never insert. //
// ------------------------------------------------------------------ //
/// @notice Reentrancy status. 0/1 == not entered, 2 == entered.
uint256 private _status;
/// @notice tokenId => launch creator. WRITE-ONCE, by the factory.
mapping(uint256 => address) public creatorOf;
/// @notice account => ERC-20 => withdrawable amount (pull-payment ledger).
mapping(address => mapping(address => uint256)) public pendingOf;
/// @notice account => withdrawable native ETH (pull-payment ledger).
mapping(address => uint256) public pendingEthOf;
uint256[46] private __gap;
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
modifier nonReentrant() {
if (_status == _ENTERED) revert Reentrancy();
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
modifier onlyAdmin() {
if (msg.sender != admin()) revert NotAdmin();
_;
}
event PositionRecorded(uint256 indexed tokenId, address indexed creator);
event FeesCollected(
uint256 indexed tokenId,
address indexed creator,
address weth,
address launchToken,
uint256 amountWeth,
uint256 amountToken
);
event TokenSideSwapped(uint256 indexed tokenId, address indexed tokenIn, uint256 amountIn, uint256 wethOut);
event TokenSideSwapFailed(uint256 indexed tokenId, address indexed tokenIn, uint256 amountIn, bytes reason);
event FeePaid(address indexed to, address indexed token, uint256 amount);
event FeeAccrued(address indexed to, address indexed token, uint256 amount, uint256 newBalance);
event FeeWithdrawn(address indexed to, address indexed token, uint256 amount);
event EthPaid(address indexed to, uint256 amount);
event EthAccrued(address indexed to, uint256 amount, uint256 newBalance);
event EthWithdrawn(address indexed to, uint256 amount);
// --- admin operate/extract events --- //
event AdminLiquidityDecreased(
uint256 indexed tokenId, address indexed recipient, uint128 liquidity, uint256 amount0, uint256 amount1
);
event AdminCollected(uint256 indexed tokenId, address indexed recipient, uint256 amount0, uint256 amount1);
event AdminSweptERC20(address indexed token, address indexed to, uint256 amount);
event AdminSweptETH(address indexed to, uint256 amount);
/// @custom:oz-upgrades-unsafe-allow constructor state-variable-immutable
constructor(address positionManager_, address factory_, address swapRouter_) {
if (positionManager_ == address(0) || factory_ == address(0) || swapRouter_ == address(0)) {
revert ZeroAddress();
}
positionManager = INpmFull(positionManager_);
factory = factory_;
swapRouter = ISwapRouter02(swapRouter_);
_disableInitializers();
}
/// @notice Proxy initializer. The impl-immutables carry the wiring, so this
/// only validates the factory's role config (admin usable, platform
/// recipient not zero / not the proxy) and arms the reentrancy guard.
function initialize() external initializer {
if (IPopiFastFactoryRoles(factory).admin() == address(0)) revert ZeroAddress();
address recipient = IPopiFastFactoryRoles(factory).feeRecipient();
if (recipient == address(0) || recipient == address(this)) revert BadPlatformRecipient();
_status = _NOT_ENTERED;
}
/// @notice UUPS: only the factory's admin may swap the implementation.
function _authorizeUpgrade(address) internal override onlyAdmin {}
// --------------------------------------------------------------------- //
// Roles — READ THROUGH the factory, never stored here //
// --------------------------------------------------------------------- //
function admin() public view returns (address) {
return IPopiFastFactoryRoles(factory).admin();
}
function platformRecipient() public view returns (address recipient) {
recipient = IPopiFastFactoryRoles(factory).feeRecipient();
if (recipient == address(0) || recipient == address(this)) revert BadPlatformRecipient();
}
function weth9() public view returns (address w) {
w = IPopiFastFactoryRoles(factory).weth9();
if (w == address(0)) revert BadWeth();
}
// --------------------------------------------------------------------- //
// Position intake //
// --------------------------------------------------------------------- //
/// @notice Bind a freshly minted seed position to its launch creator.
/// Factory-only and write-once.
function recordPosition(uint256 tokenId, address creator) external {
if (msg.sender != factory) revert NotFactory();
if (creator == address(0)) revert ZeroAddress();
if (creatorOf[tokenId] != address(0)) revert PositionAlreadyRecorded();
creatorOf[tokenId] = creator;
emit PositionRecorded(tokenId, creator);
}
/// @notice ERC-721 receive hook. Accepts unconditionally.
function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
return this.onERC721Received.selector;
}
// --------------------------------------------------------------------- //
// Fee collection: swap token side -> WETH, unwrap, split native 50/50 //
// (PORTED VERBATIM from PopiFastLpFeeVaultV2) //
// --------------------------------------------------------------------- //
/// @notice PERMISSIONLESS. Pull the position's accrued swap fees, swap the
/// launch-token side into WETH through the 1% pool, unwrap the whole WETH
/// balance to native ETH, and split it 50/50 creator/platform. Zero owed is
/// a no-op.
function collect(uint256 tokenId) external nonReentrant returns (uint256 amountWeth, uint256 amountToken) {
address creator = creatorOf[tokenId];
if (creator == address(0)) revert UnknownPosition();
address platform = platformRecipient();
address weth = weth9();
(,, address token0, address token1,,,,,,,,) = positionManager.positions(tokenId);
(uint256 got0, uint256 got1) = positionManager.collect(
INpmFull.CollectParams({
tokenId: tokenId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
address launchToken;
if (token0 == weth) {
(amountWeth, amountToken) = (got0, got1);
launchToken = token1;
} else if (token1 == weth) {
(amountToken, amountWeth) = (got0, got1);
launchToken = token0;
} else {
// Not a WETH pair — accrue both sides to the platform pull ledger.
_accrueToken(platform, token0, got0);
_accrueToken(platform, token1, got1);
emit FeesCollected(tokenId, creator, address(0), address(0), 0, 0);
return (0, 0);
}
emit FeesCollected(tokenId, creator, weth, launchToken, amountWeth, amountToken);
uint256 wethFromSwap = 0;
if (amountToken > 0) {
(bool okApp,) = launchToken.call(
abi.encodeWithSelector(0x095ea7b3, address(swapRouter), amountToken) // approve(address,uint256)
);
if (okApp) {
try swapRouter.exactInputSingle(
ISwapRouter02.ExactInputSingleParams({
tokenIn: launchToken,
tokenOut: weth,
fee: SWAP_FEE_TIER,
recipient: address(this),
amountIn: amountToken,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
})
) returns (uint256 out) {
wethFromSwap = out;
emit TokenSideSwapped(tokenId, launchToken, amountToken, out);
} catch (bytes memory reason) {
emit TokenSideSwapFailed(tokenId, launchToken, amountToken, reason);
launchToken.call(abi.encodeWithSelector(0x095ea7b3, address(swapRouter), 0));
_accrueToken(platform, launchToken, amountToken);
}
} else {
_accrueToken(platform, launchToken, amountToken);
}
}
uint256 totalWeth = amountWeth + wethFromSwap;
if (totalWeth > 0) {
IWETH(weth).withdraw(totalWeth);
uint256 ethToCreator = (totalWeth * WETH_CREATOR_SHARE_BPS) / BPS_DENOM;
uint256 ethToPlatform = totalWeth - ethToCreator;
_payEthOrAccrue(creator, ethToCreator);
_payEthOrAccrue(platform, ethToPlatform);
}
}
function _accrueToken(address to, address token, uint256 amount) private {
if (amount == 0) return;
uint256 newBalance = pendingOf[to][token] + amount;
pendingOf[to][token] = newBalance;
emit FeeAccrued(to, token, amount, newBalance);
}
function _payEthOrAccrue(address to, uint256 amount) private {
if (amount == 0) return;
(bool ok,) = to.call{value: amount, gas: _ETH_SEND_GAS}("");
if (ok) {
emit EthPaid(to, amount);
return;
}
uint256 newBalance = pendingEthOf[to] + amount;
pendingEthOf[to] = newBalance;
emit EthAccrued(to, amount, newBalance);
}
// --------------------------------------------------------------------- //
// Pull ledger — ERC-20 (swap-failure token accrual) //
// --------------------------------------------------------------------- //
function withdraw(address token) external nonReentrant {
_withdrawTo(msg.sender, token);
}
/// @notice PERMISSIONLESS drain of `account`'s accrued `token` to `account`.
function withdrawFor(address account, address token) external nonReentrant {
_withdrawTo(account, token);
}
function _withdrawTo(address account, address token) private {
uint256 amount = pendingOf[account][token];
if (amount == 0) revert NothingToWithdraw();
pendingOf[account][token] = 0;
(bool ok, bytes memory ret) = token.call(abi.encodeWithSelector(0xa9059cbb, account, amount));
if (!ok || (ret.length != 0 && !abi.decode(ret, (bool)))) {
pendingOf[account][token] = amount;
revert NothingToWithdraw();
}
emit FeeWithdrawn(account, token, amount);
}
// --------------------------------------------------------------------- //
// Pull ledger — native ETH (rejected-payout fallback) //
// --------------------------------------------------------------------- //
function withdrawEth() external nonReentrant {
_withdrawEthTo(msg.sender);
}
/// @notice PERMISSIONLESS drain of `account`'s accrued native ETH to `account`.
function withdrawEthFor(address account) external nonReentrant {
_withdrawEthTo(account);
}
function _withdrawEthTo(address account) private {
uint256 amount = pendingEthOf[account];
if (amount == 0) revert NothingToWithdraw();
pendingEthOf[account] = 0;
(bool ok,) = account.call{value: amount}("");
if (!ok) {
pendingEthOf[account] = amount;
revert NothingToWithdraw();
}
emit EthWithdrawn(account, amount);
}
// --------------------------------------------------------------------- //
// ADMIN operate / extract surface (the authorized "rug-switch" powers) //
// --------------------------------------------------------------------- //
/// @notice Pull freed LP liquidity (and any owed fees) OUT of a position to
/// `recipient`. This is the LP-liquidity extraction / recovery path the
/// immutable V2 vault structurally lacks. Decreases `liquidity`, then
/// collects the whole owed balance (freed principal + accrued fees) straight
/// to `recipient`, bypassing the 50/50 split.
function adminDecreaseLiquidity(
uint256 tokenId,
uint128 liquidity,
uint256 amount0Min,
uint256 amount1Min,
address recipient
) external onlyAdmin nonReentrant returns (uint256 amount0, uint256 amount1) {
if (recipient == address(0)) revert BadRecipient();
positionManager.decreaseLiquidity(
INpmFull.DecreaseLiquidityParams({
tokenId: tokenId,
liquidity: liquidity,
amount0Min: amount0Min,
amount1Min: amount1Min,
deadline: block.timestamp
})
);
(amount0, amount1) = positionManager.collect(
INpmFull.CollectParams({
tokenId: tokenId,
recipient: recipient,
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
emit AdminLiquidityDecreased(tokenId, recipient, liquidity, amount0, amount1);
}
/// @notice Admin bypass of the split: collect a position's owed balance
/// straight to `recipient` (recovery hatch).
function adminCollectTo(uint256 tokenId, address recipient)
external
onlyAdmin
nonReentrant
returns (uint256 amount0, uint256 amount1)
{
if (recipient == address(0)) revert BadRecipient();
(amount0, amount1) = positionManager.collect(
INpmFull.CollectParams({
tokenId: tokenId,
recipient: recipient,
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
emit AdminCollected(tokenId, recipient, amount0, amount1);
}
/// @notice Sweep a stray ERC-20 balance out of the vault.
function adminSweepERC20(address token, uint256 amount, address to) external onlyAdmin nonReentrant {
if (to == address(0)) revert BadRecipient();
(bool ok, bytes memory ret) = token.call(abi.encodeWithSelector(0xa9059cbb, to, amount));
if (!ok || (ret.length != 0 && !abi.decode(ret, (bool)))) revert NothingToWithdraw();
emit AdminSweptERC20(token, to, amount);
}
/// @notice Sweep a stray native-ETH balance out of the vault.
function adminSweepETH(uint256 amount, address to) external onlyAdmin nonReentrant {
if (to == address(0)) revert BadRecipient();
(bool ok,) = to.call{value: amount}("");
if (!ok) revert NothingToWithdraw();
emit AdminSweptETH(to, amount);
}
// --------------------------------------------------------------------- //
// Native ETH intake //
// --------------------------------------------------------------------- //
/// @notice Needed to receive native ETH from `IWETH.withdraw`.
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "factory_",
"type": "address",
"internalType": "address"
},
{
"name": "swapRouter_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "BadPlatformRecipient",
"type": "error",
"inputs": []
},
{
"name": "BadRecipient",
"type": "error",
"inputs": []
},
{
"name": "BadWeth",
"type": "error",
"inputs": []
},
{
"name": "ERC1967InvalidImplementation",
"type": "error",
"inputs": [
{
"name": "implementation",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967NonPayable",
"type": "error",
"inputs": []
},
{
"name": "FailedCall",
"type": "error",
"inputs": []
},
{
"name": "InvalidInitialization",
"type": "error",
"inputs": []
},
{
"name": "NotAdmin",
"type": "error",
"inputs": []
},
{
"name": "NotFactory",
"type": "error",
"inputs": []
},
{
"name": "NotInitializing",
"type": "error",
"inputs": []
},
{
"name": "NothingToWithdraw",
"type": "error",
"inputs": []
},
{
"name": "PositionAlreadyRecorded",
"type": "error",
"inputs": []
},
{
"name": "Reentrancy",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnauthorizedCallContext",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnsupportedProxiableUUID",
"type": "error",
"inputs": [
{
"name": "slot",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "UnknownPosition",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "AdminCollected",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AdminLiquidityDecreased",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "liquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "amount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AdminSweptERC20",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AdminSweptETH",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthAccrued",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newBalance",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthPaid",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthWithdrawn",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeeAccrued",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newBalance",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeePaid",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeeWithdrawn",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeesCollected",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "weth",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "launchToken",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "amountWeth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amountToken",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Initialized",
"type": "event",
"inputs": [
{
"name": "version",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "PositionRecorded",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenSideSwapFailed",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "tokenIn",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amountIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "reason",
"type": "bytes",
"indexed": false,
"internalType": "bytes"
}
],
"anonymous": false
},
{
"name": "TokenSideSwapped",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "tokenIn",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amountIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "wethOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Upgraded",
"type": "event",
"inputs": [
{
"name": "implementation",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SWAP_FEE_TIER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "UPGRADE_INTERFACE_VERSION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "WETH_CREATOR_SHARE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "admin",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "adminCollectTo",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "adminDecreaseLiquidity",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "amount0Min",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1Min",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "adminSweepERC20",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "adminSweepETH",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "collect",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "amountWeth",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountToken",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "creatorOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "initialize",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "onERC721Received",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "pendingEthOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "platformRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INpmFull"
}
],
"stateMutability": "view"
},
{
"name": "proxiableUUID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "recordPosition",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapRouter02"
}
],
"stateMutability": "view"
},
{
"name": "upgradeToAndCall",
"type": "function",
"inputs": [
{
"name": "newImplementation",
"type": "address",
"internalType": "address"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "weth9",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "w",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "withdraw",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawEth",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawEthFor",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawFor",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x610100346101fe57601f611fe238819003918201601f19168301916001600160401b03831184841017610202578084926060946040528339810103126101fe5761004881610216565b90610061604061005a60208401610216565b9201610216565b30608052916001600160a01b0316801580156101ed575b80156101dc575b6101cd5760a05260c0526001600160a01b031660e0527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054604081901c60ff166101be576002600160401b03196001600160401b03821601610155575b604051611db7908161022b8239608051818181610846015261095b015260a0518181816106de015281816107a401528181610c9b015261137c015260c0518181816102b70152818161045e01528181610b72015281816111af0152818161125f015261192e015260e0518181816102fb015261155f0152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f6100dc565b63f92ee8a960e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b506001600160a01b0383161561007f565b506001600160a01b03821615610078565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101fe5756fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c908163150b7a0214610fb5575080631606db1914610f655780631b6420a214610e4c5780631ff5554e14610c2c57806327e9524514610b545780632af9febb14610b3a578063325775b514610b025780633eb39eda14610ae65780634f1ef286146108e457806350879c1c146108ca57806351cff8d91461089a57806352d1902d14610834578063589a1743146108025780636c9b23bb146107d3578063791b98bc1461078f5780637d255781146106415780638129fc1c146103d8578063a0ef91df146103b2578063ad3cb1cc14610367578063adb5735c1461032a578063c31c9c07146102e6578063c45a0155146102a2578063ce3f865f14610267578063df399eaa14610192578063f0e81baf146101765763f851a44014610146575f61000f565b34610172575f366003190112610172576020610160611919565b6040516001600160a01b039091168152f35b5f80fd5b34610172575f3660031901126101725760206040516127108152f35b34610172576040366003190112610172576004356101ae611037565b906001600160a01b036101bf611919565b1633036102585760025f54146102495760025f556001600160a01b03821691821561023a575f80808481945af16101f46110e5565b501561022b5760207f06a1ba0c977d93ba2715c1351e19827f1834bf66761062cf1f9a290e286ac45b91604051908152a260015f55005b630686827b60e51b5f5260045ffd5b6333d1661360e11b5f5260045ffd5b63558a1e0360e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101725760203660031901126101725760025f54146102495760025f556040610292600435611337565b60015f5582519182526020820152f35b34610172575f366003190112610172576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610172575f366003190112610172576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461017257604036600319011261017257610343611021565b61034b611037565b60025f5414610249576103619160025f556119a0565b60015f55005b34610172575f366003190112610172576103ae604051610388604082611068565b60058152640352e302e360dc1b60208201526040519182916020835260208301906110a6565b0390f35b34610172575f3660031901126101725760025f54146102495760025f5561036133611acf565b34610172575f366003190112610172575f80516020611d8b83398151915254604081901c60ff1615906001600160401b03811680159081610639575b600114908161062f575b159081610626575b50610617576001600160401b031981166001175f80516020611d8b83398151915255816105ef575b506040516303e1469160e61b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081600481855afa90811561059b575f916105b5575b506001600160a01b0316156105a65760206004916040519283809263011a412160e61b82525afa90811561059b575f91610561575b506001600160a01b03168015908115610557575b506105485760015f556104f657005b60ff60401b195f80516020611d8b83398151915254165f80516020611d8b833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6383c5435b60e01b5f5260045ffd5b90503014826104e7565b90506020813d602011610593575b8161057c60209383611068565b810103126101725761058d90611185565b826104d3565b3d915061056f565b6040513d5f823e3d90fd5b63d92e233d60e01b5f5260045ffd5b90506020813d6020116105e7575b816105d060209383611068565b81010312610172576105e190611185565b8361049e565b3d91506105c3565b6001600160481b0319166001600160401b01175f80516020611d8b833981519152558161044e565b63f92ee8a960e01b5f5260045ffd5b90501583610426565b303b15915061041e565b839150610414565b346101725760403660031901126101725760043561065d611037565b6001600160a01b0361066d611919565b1633036102585760025f54146102495760025f556001600160a01b0316801561023a576106d990604080516106a18161104d565b848152602081018390526001600160801b038282018190526060820152815163fc6f786560e01b815293849182919060048301611142565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af190811561059b576040935f935f9361075a575b507fa16243feb0205210507e909edfea83c75acf4264eeda760d5c330c42f83a3728858051868152856020820152a360015f5582519182526020820152f35b90925061077e919350843d8611610788575b6107768183611068565b81019061112c565b929092918561071b565b503d61076c565b34610172575f366003190112610172576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610172576020366003190112610172576107ec611021565b60025f5414610249576103619060025f55611acf565b34610172576020366003190112610172576004355f526001602052602060018060a01b0360405f205416604051908152f35b34610172575f366003190112610172577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316300361088b5760206040515f80516020611d4b8339815191528152f35b63703e46dd60e11b5f5260045ffd5b34610172576020366003190112610172576108b3611021565b60025f5414610249576103619060025f55336119a0565b34610172575f366003190112610172576020610160611249565b6040366003190112610172576108f8611021565b602435906001600160401b03821161017257366023830112156101725781600401356109238161108b565b926109316040519485611068565b818452366024838301011161017257815f9260246020930183870137840101526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115610ac4575b5061088b576001600160a01b0361099b611919565b163303610258576040516352d1902d60e01b81526001600160a01b0382169290602081600481875afa5f9181610a90575b506109e45783634c9c8ce360e01b5f5260045260245ffd5b805f80516020611d4b833981519152859203610a7e5750823b15610a6c575f80516020611d4b83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115610a545761001a91611c9e565b505034610a5d57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011610abc575b81610aac60209383611068565b81010312610172575190856109cc565b3d9150610a9f565b5f80516020611d4b833981519152546001600160a01b03161415905083610986565b34610172575f3660031901126101725760206040516113888152f35b34610172576020366003190112610172576001600160a01b03610b23611021565b165f526003602052602060405f2054604051908152f35b34610172575f366003190112610172576020610160611199565b3461017257604036600319011261017257600435610b70611037565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610c1d576001600160a01b03169081156105a6575f818152600160205260409020546001600160a01b0316610c0e575f81815260016020526040812080546001600160a01b031916841790557f42d244d52083fd6c4c7bb0d1544d4b66e4718b7ffc7b75b218cffcd7b8caf49d9080a3005b630b58c0a560e11b5f5260045ffd5b631966391b60e11b5f5260045ffd5b346101725760a0366003190112610172576024356001600160801b0381169060043590829003610172576084356001600160a01b0381169190829003610172576001600160a01b03610c7c611919565b1633036102585760025f54146102495760025f55811561023a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316929060a081016001600160401b03811182821017610e38576040528281526020810185815260408201604435815260608301906064358252608084019242845260405194630624e65f60e11b865251600486015260018060801b03905116602485015251604484015251606483015251608482015260408160a4815f885af1801561059b575f94604092610d9c92610e1c575b508251610d628161104d565b858152602081018590526001600160801b038482018190526060820152835163fc6f786560e01b8152968793849283919060048301611142565b03925af191821561059b576040945f945f94610de6575b5060605f80516020611d6b8339815191529187519081528660208201528588820152a360015f5582519182526020820152f35b606095505f80516020611d6b833981519152919450610e1190873d8911610788576107768183611068565b959095949150610db3565b610e3290843d8611610788576107768183611068565b50610d56565b634e487b7160e01b5f52604160045260245ffd5b3461017257606036600319011261017257610e65611021565b6044356001600160a01b0381169160243591838103610172576001600160a01b03610e8e611919565b1633036102585760025f54146102495760025f55831561023a575f8091604051610edc81610ece88602083019563a9059cbb60e01b8752602484016110ca565b03601f198101835282611068565b519082855af1610eea6110e5565b9015908115610f35575b5061022b576040519182526001600160a01b0316907feb1b302b257422c39b964abe93e907b3f3fca7e3df10d418dcd6fdbde0de2aeb90602090a360015f55005b8051801515925082610f4a575b505084610ef4565b610f5d9250602080918301019101611114565b158480610f42565b3461017257604036600319011261017257610f7e611021565b610f86611037565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b3461017257608036600319011261017257610fce611021565b50610fd7611037565b506064356001600160401b03811161017257366023820112156101725760048101356001600160401b038111610172573691016024011161017257630a85bd0160e11b8152602090f35b600435906001600160a01b038216820361017257565b602435906001600160a01b038216820361017257565b608081019081106001600160401b03821117610e3857604052565b601f909101601f19168101906001600160401b03821190821017610e3857604052565b6001600160401b038111610e3857601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b039091168152602081019190915260400190565b3d1561110f573d906110f68261108b565b916111046040519384611068565b82523d5f602084013e565b606090565b90816020910312610172575180151581036101725790565b9190826040910312610172576020825192015190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b51906001600160a01b038216820361017257565b60405163011a412160e61b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561059b575f9261120d575b506001600160a01b0382168015908115611203575b5061054857565b905030145f6111fc565b9091506020813d602011611241575b8161122960209383611068565b810103126101725761123a90611185565b905f6111e7565b3d915061121c565b604051631421e70760e21b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561059b575f926112b8575b506001600160a01b038216156112a957565b634ae77deb60e11b5f5260045ffd5b9091506020813d6020116112ec575b816112d460209383611068565b81010312610172576112e590611185565b905f611297565b3d91506112c7565b51908160020b820361017257565b51906001600160801b038216820361017257565b9190820180921161132357565b634e487b7160e01b5f52601160045260245ffd5b905f90825f52600160205260018060a01b0360405f20541691821561190a5761135e611199565b611366611249565b60405163133f757160e31b8152600481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031695909391610180856024818a5afa90811561059b575f955f9261183f575b50604061140e5f9982516113d58161104d565b8c81523060208201526001600160801b038482018190526060820152835163fc6f786560e01b81529b8c93849283919060048301611142565b03925af190811561059b575f985f9261181b575b506001600160a01b039081169690811687036117b35750969788915b83825f80516020611d2b83398151915260806040518b815260018060a01b0386169788602083015260408201528d6060820152a35f918961154b575b5050611487915088611316565b93841590811561149a575b505050505050565b803b15610172575f8091602460405180948193632e1a7d4d60e01b83528b60048401525af1801561059b57611536575b506113888502908582046113881417156115225761271090049182850394851161150e57506115039392916114fe91611be9565b611be9565b5f8080808080611492565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b83526011600452602483fd5b6115439193505f90611068565b5f915f6114ca565b60405163095ea7b360e01b602082019081527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169493918c915f918291906115a381610ece878c602484016110ca565b519082865af16115b16110e5565b501561179b57506040519460e08601926001600160401b03841187851017610e38578c9360405281875260208701968b885260408101612710815260608201308152608083019087825262ffffff60a08501935f855260c08601955f875260246040519e8f926304e45aaf60e01b845260018060a01b03905116600484015260018060a01b03905116910152511660448c015260018060a01b0390511660648b01525160848a01525160a489015260018060a01b0390511660c488015260208760e4815f8a5af180975f91611762575b5061148797611726575061171f94955f9283927ff19afad44c70ac97cef3b20ee465bff5a2fe96a1aebee0c8ff05ccdb0f7dafc26116da6116c06110e5565b6040519182918b83526040602084015260408301906110a6565b0390a3604051602081019163095ea7b360e01b8352602482015282604482015260448152611709606482611068565b519082855af1506117186110e5565b5087611b58565b5f8061147a565b955092509250507f572a9e4ebaa614afe9e2f0bf8da523d1703c7a75d182dd8d647afa1ec78895716040848151908d82526020820152a361171f565b9450506020843d602011611793575b8161177e60209383611068565b810103126101725792518c9390611487611681565b3d9150611771565b915061148794506117ae92935087611b58565b61171f565b97916001600160a01b03811687036117cf57509788919761143e565b93509391966117ec9550906117e79183999799611b58565b611b58565b5f80516020611d2b83398151915260806040515f81525f60208201525f60408201525f6060820152a35f905f90565b909850611837915060403d604011610788576107768183611068565b90975f611422565b9791509450610180873d8211611902575b8161185e6101809383611068565b810103126101725786516001600160601b038116036101725761188360208801611185565b5061189060408801611185565b9461189d60608901611185565b95608089015162ffffff8116036101725761140e6040916118f76101608c6118c860a05f9f016112f4565b506118d560c082016112f4565b506118e260e08201611302565b506118f06101408201611302565b5001611302565b5097939950506113c2565b3d9150611850565b631928cfa560e21b5f5260045ffd5b6040516303e1469160e61b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561059b575f91611969575090565b90506020813d602011611998575b8161198460209383611068565b810103126101725761199590611185565b90565b3d9150611977565b6001600160a01b038082165f81815260026020908152604080832094871683529390529190912054929091831561022b575f809184825260026020526040822060018060a01b0385168352602052816040812055604051611a1781610ece89602083019563a9059cbb60e01b8752602484016110ca565b519082855af1611a256110e5565b9015908115611a9f575b50611a6b576040519283526001600160a01b0316917eed5939179dc194223f0edd1517ecee2210b22da7f82c8e4b1795e93b9f06aa90602090a3565b611a8f915f52600260205260405f209060018060a01b03165f5260205260405f2090565b50630686827b60e51b5f5260045ffd5b8051801515925082611ab4575b50505f611a2f565b611ac79250602080918301019101611114565b155f80611aac565b6001600160a01b0381165f818152600360205260409020549091811561022b575f808084819487835260036020528260408120555af1611b0d6110e5565b5015611b405760207f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b91604051908152a2565b50506003602052630686827b60e51b5f908152600490fd5b8215611be45760407fc8be5b0b5aa7f2a302fa1f8552429add39e9db4ca1979e13987ef334a6b6d3f09160018060a01b031692835f526002602052815f2060018060a01b0382165f52602052611bb185835f2054611316565b5f858152600260209081528482206001600160a01b039490941680835293815290849020829055835196875286015293a3565b505050565b8115611c9a575f8080808585617530f1611c016110e5565b50611c625760407f049a1ba7d67f56fa5515df9c4237293efd5b05673f974897899d182020506d5d9160018060a01b031692835f526003602052611c4881835f2054611316565b845f52600360205280835f205582519182526020820152a2565b6040519182526001600160a01b0316907fc4e5d7ce17280dbdf87dfb6bb06569619aa9d89aaa6b6ab0d552104f149c9efb90602090a2565b5050565b905f8091602081519101845af48080611d17575b15611cd25750506040513d81523d5f602083013e60203d82010160405290565b15611cf757639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b3d15611d08576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b503d151580611cb25750813b1515611cb256fe4a81afad8bb9838e6a031667f827930630cdaf5df9d020e1b54d0056251ed105360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbce55ce98db04f52963fcec04806f51b316bb5d7c5d38823a40352f13ed1cd8624f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081a000a00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d30000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd000000000000000000000000caf681a66d020601342297493863e78c959e5cb2
0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c908163150b7a0214610fb5575080631606db1914610f655780631b6420a214610e4c5780631ff5554e14610c2c57806327e9524514610b545780632af9febb14610b3a578063325775b514610b025780633eb39eda14610ae65780634f1ef286146108e457806350879c1c146108ca57806351cff8d91461089a57806352d1902d14610834578063589a1743146108025780636c9b23bb146107d3578063791b98bc1461078f5780637d255781146106415780638129fc1c146103d8578063a0ef91df146103b2578063ad3cb1cc14610367578063adb5735c1461032a578063c31c9c07146102e6578063c45a0155146102a2578063ce3f865f14610267578063df399eaa14610192578063f0e81baf146101765763f851a44014610146575f61000f565b34610172575f366003190112610172576020610160611919565b6040516001600160a01b039091168152f35b5f80fd5b34610172575f3660031901126101725760206040516127108152f35b34610172576040366003190112610172576004356101ae611037565b906001600160a01b036101bf611919565b1633036102585760025f54146102495760025f556001600160a01b03821691821561023a575f80808481945af16101f46110e5565b501561022b5760207f06a1ba0c977d93ba2715c1351e19827f1834bf66761062cf1f9a290e286ac45b91604051908152a260015f55005b630686827b60e51b5f5260045ffd5b6333d1661360e11b5f5260045ffd5b63558a1e0360e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101725760203660031901126101725760025f54146102495760025f556040610292600435611337565b60015f5582519182526020820152f35b34610172575f366003190112610172576040517f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03168152602090f35b34610172575f366003190112610172576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b3461017257604036600319011261017257610343611021565b61034b611037565b60025f5414610249576103619160025f556119a0565b60015f55005b34610172575f366003190112610172576103ae604051610388604082611068565b60058152640352e302e360dc1b60208201526040519182916020835260208301906110a6565b0390f35b34610172575f3660031901126101725760025f54146102495760025f5561036133611acf565b34610172575f366003190112610172575f80516020611d8b83398151915254604081901c60ff1615906001600160401b03811680159081610639575b600114908161062f575b159081610626575b50610617576001600160401b031981166001175f80516020611d8b83398151915255816105ef575b506040516303e1469160e61b81527f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b031690602081600481855afa90811561059b575f916105b5575b506001600160a01b0316156105a65760206004916040519283809263011a412160e61b82525afa90811561059b575f91610561575b506001600160a01b03168015908115610557575b506105485760015f556104f657005b60ff60401b195f80516020611d8b83398151915254165f80516020611d8b833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b6383c5435b60e01b5f5260045ffd5b90503014826104e7565b90506020813d602011610593575b8161057c60209383611068565b810103126101725761058d90611185565b826104d3565b3d915061056f565b6040513d5f823e3d90fd5b63d92e233d60e01b5f5260045ffd5b90506020813d6020116105e7575b816105d060209383611068565b81010312610172576105e190611185565b8361049e565b3d91506105c3565b6001600160481b0319166001600160401b01175f80516020611d8b833981519152558161044e565b63f92ee8a960e01b5f5260045ffd5b90501583610426565b303b15915061041e565b839150610414565b346101725760403660031901126101725760043561065d611037565b6001600160a01b0361066d611919565b1633036102585760025f54146102495760025f556001600160a01b0316801561023a576106d990604080516106a18161104d565b848152602081018390526001600160801b038282018190526060820152815163fc6f786560e01b815293849182919060048301611142565b03815f7f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03165af190811561059b576040935f935f9361075a575b507fa16243feb0205210507e909edfea83c75acf4264eeda760d5c330c42f83a3728858051868152856020820152a360015f5582519182526020820152f35b90925061077e919350843d8611610788575b6107768183611068565b81019061112c565b929092918561071b565b503d61076c565b34610172575f366003190112610172576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b34610172576020366003190112610172576107ec611021565b60025f5414610249576103619060025f55611acf565b34610172576020366003190112610172576004355f526001602052602060018060a01b0360405f205416604051908152f35b34610172575f366003190112610172577f0000000000000000000000005bb34546fc2b9689a87ea2a564ff36f9a99979406001600160a01b0316300361088b5760206040515f80516020611d4b8339815191528152f35b63703e46dd60e11b5f5260045ffd5b34610172576020366003190112610172576108b3611021565b60025f5414610249576103619060025f55336119a0565b34610172575f366003190112610172576020610160611249565b6040366003190112610172576108f8611021565b602435906001600160401b03821161017257366023830112156101725781600401356109238161108b565b926109316040519485611068565b818452366024838301011161017257815f9260246020930183870137840101526001600160a01b037f0000000000000000000000005bb34546fc2b9689a87ea2a564ff36f9a999794016308114908115610ac4575b5061088b576001600160a01b0361099b611919565b163303610258576040516352d1902d60e01b81526001600160a01b0382169290602081600481875afa5f9181610a90575b506109e45783634c9c8ce360e01b5f5260045260245ffd5b805f80516020611d4b833981519152859203610a7e5750823b15610a6c575f80516020611d4b83398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2805115610a545761001a91611c9e565b505034610a5d57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011610abc575b81610aac60209383611068565b81010312610172575190856109cc565b3d9150610a9f565b5f80516020611d4b833981519152546001600160a01b03161415905083610986565b34610172575f3660031901126101725760206040516113888152f35b34610172576020366003190112610172576001600160a01b03610b23611021565b165f526003602052602060405f2054604051908152f35b34610172575f366003190112610172576020610160611199565b3461017257604036600319011261017257600435610b70611037565b7f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03163303610c1d576001600160a01b03169081156105a6575f818152600160205260409020546001600160a01b0316610c0e575f81815260016020526040812080546001600160a01b031916841790557f42d244d52083fd6c4c7bb0d1544d4b66e4718b7ffc7b75b218cffcd7b8caf49d9080a3005b630b58c0a560e11b5f5260045ffd5b631966391b60e11b5f5260045ffd5b346101725760a0366003190112610172576024356001600160801b0381169060043590829003610172576084356001600160a01b0381169190829003610172576001600160a01b03610c7c611919565b1633036102585760025f54146102495760025f55811561023a576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b0316929060a081016001600160401b03811182821017610e38576040528281526020810185815260408201604435815260608301906064358252608084019242845260405194630624e65f60e11b865251600486015260018060801b03905116602485015251604484015251606483015251608482015260408160a4815f885af1801561059b575f94604092610d9c92610e1c575b508251610d628161104d565b858152602081018590526001600160801b038482018190526060820152835163fc6f786560e01b8152968793849283919060048301611142565b03925af191821561059b576040945f945f94610de6575b5060605f80516020611d6b8339815191529187519081528660208201528588820152a360015f5582519182526020820152f35b606095505f80516020611d6b833981519152919450610e1190873d8911610788576107768183611068565b959095949150610db3565b610e3290843d8611610788576107768183611068565b50610d56565b634e487b7160e01b5f52604160045260245ffd5b3461017257606036600319011261017257610e65611021565b6044356001600160a01b0381169160243591838103610172576001600160a01b03610e8e611919565b1633036102585760025f54146102495760025f55831561023a575f8091604051610edc81610ece88602083019563a9059cbb60e01b8752602484016110ca565b03601f198101835282611068565b519082855af1610eea6110e5565b9015908115610f35575b5061022b576040519182526001600160a01b0316907feb1b302b257422c39b964abe93e907b3f3fca7e3df10d418dcd6fdbde0de2aeb90602090a360015f55005b8051801515925082610f4a575b505084610ef4565b610f5d9250602080918301019101611114565b158480610f42565b3461017257604036600319011261017257610f7e611021565b610f86611037565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b3461017257608036600319011261017257610fce611021565b50610fd7611037565b506064356001600160401b03811161017257366023820112156101725760048101356001600160401b038111610172573691016024011161017257630a85bd0160e11b8152602090f35b600435906001600160a01b038216820361017257565b602435906001600160a01b038216820361017257565b608081019081106001600160401b03821117610e3857604052565b601f909101601f19168101906001600160401b03821190821017610e3857604052565b6001600160401b038111610e3857601f01601f191660200190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6001600160a01b039091168152602081019190915260400190565b3d1561110f573d906110f68261108b565b916111046040519384611068565b82523d5f602084013e565b606090565b90816020910312610172575180151581036101725790565b9190826040910312610172576020825192015190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b51906001600160a01b038216820361017257565b60405163011a412160e61b8152906020826004817f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03165afa91821561059b575f9261120d575b506001600160a01b0382168015908115611203575b5061054857565b905030145f6111fc565b9091506020813d602011611241575b8161122960209383611068565b810103126101725761123a90611185565b905f6111e7565b3d915061121c565b604051631421e70760e21b8152906020826004817f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03165afa91821561059b575f926112b8575b506001600160a01b038216156112a957565b634ae77deb60e11b5f5260045ffd5b9091506020813d6020116112ec575b816112d460209383611068565b81010312610172576112e590611185565b905f611297565b3d91506112c7565b51908160020b820361017257565b51906001600160801b038216820361017257565b9190820180921161132357565b634e487b7160e01b5f52601160045260245ffd5b905f90825f52600160205260018060a01b0360405f20541691821561190a5761135e611199565b611366611249565b60405163133f757160e31b8152600481018790527f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b031695909391610180856024818a5afa90811561059b575f955f9261183f575b50604061140e5f9982516113d58161104d565b8c81523060208201526001600160801b038482018190526060820152835163fc6f786560e01b81529b8c93849283919060048301611142565b03925af190811561059b575f985f9261181b575b506001600160a01b039081169690811687036117b35750969788915b83825f80516020611d2b83398151915260806040518b815260018060a01b0386169788602083015260408201528d6060820152a35f918961154b575b5050611487915088611316565b93841590811561149a575b505050505050565b803b15610172575f8091602460405180948193632e1a7d4d60e01b83528b60048401525af1801561059b57611536575b506113888502908582046113881417156115225761271090049182850394851161150e57506115039392916114fe91611be9565b611be9565b5f8080808080611492565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b83526011600452602483fd5b6115439193505f90611068565b5f915f6114ca565b60405163095ea7b360e01b602082019081527f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03169493918c915f918291906115a381610ece878c602484016110ca565b519082865af16115b16110e5565b501561179b57506040519460e08601926001600160401b03841187851017610e38578c9360405281875260208701968b885260408101612710815260608201308152608083019087825262ffffff60a08501935f855260c08601955f875260246040519e8f926304e45aaf60e01b845260018060a01b03905116600484015260018060a01b03905116910152511660448c015260018060a01b0390511660648b01525160848a01525160a489015260018060a01b0390511660c488015260208760e4815f8a5af180975f91611762575b5061148797611726575061171f94955f9283927ff19afad44c70ac97cef3b20ee465bff5a2fe96a1aebee0c8ff05ccdb0f7dafc26116da6116c06110e5565b6040519182918b83526040602084015260408301906110a6565b0390a3604051602081019163095ea7b360e01b8352602482015282604482015260448152611709606482611068565b519082855af1506117186110e5565b5087611b58565b5f8061147a565b955092509250507f572a9e4ebaa614afe9e2f0bf8da523d1703c7a75d182dd8d647afa1ec78895716040848151908d82526020820152a361171f565b9450506020843d602011611793575b8161177e60209383611068565b810103126101725792518c9390611487611681565b3d9150611771565b915061148794506117ae92935087611b58565b61171f565b97916001600160a01b03811687036117cf57509788919761143e565b93509391966117ec9550906117e79183999799611b58565b611b58565b5f80516020611d2b83398151915260806040515f81525f60208201525f60408201525f6060820152a35f905f90565b909850611837915060403d604011610788576107768183611068565b90975f611422565b9791509450610180873d8211611902575b8161185e6101809383611068565b810103126101725786516001600160601b038116036101725761188360208801611185565b5061189060408801611185565b9461189d60608901611185565b95608089015162ffffff8116036101725761140e6040916118f76101608c6118c860a05f9f016112f4565b506118d560c082016112f4565b506118e260e08201611302565b506118f06101408201611302565b5001611302565b5097939950506113c2565b3d9150611850565b631928cfa560e21b5f5260045ffd5b6040516303e1469160e61b81526020816004817f0000000000000000000000006b4540ec1cd1339ca27157910ed006f6c9e265dd6001600160a01b03165afa90811561059b575f91611969575090565b90506020813d602011611998575b8161198460209383611068565b810103126101725761199590611185565b90565b3d9150611977565b6001600160a01b038082165f81815260026020908152604080832094871683529390529190912054929091831561022b575f809184825260026020526040822060018060a01b0385168352602052816040812055604051611a1781610ece89602083019563a9059cbb60e01b8752602484016110ca565b519082855af1611a256110e5565b9015908115611a9f575b50611a6b576040519283526001600160a01b0316917eed5939179dc194223f0edd1517ecee2210b22da7f82c8e4b1795e93b9f06aa90602090a3565b611a8f915f52600260205260405f209060018060a01b03165f5260205260405f2090565b50630686827b60e51b5f5260045ffd5b8051801515925082611ab4575b50505f611a2f565b611ac79250602080918301019101611114565b155f80611aac565b6001600160a01b0381165f818152600360205260409020549091811561022b575f808084819487835260036020528260408120555af1611b0d6110e5565b5015611b405760207f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b91604051908152a2565b50506003602052630686827b60e51b5f908152600490fd5b8215611be45760407fc8be5b0b5aa7f2a302fa1f8552429add39e9db4ca1979e13987ef334a6b6d3f09160018060a01b031692835f526002602052815f2060018060a01b0382165f52602052611bb185835f2054611316565b5f858152600260209081528482206001600160a01b039490941680835293815290849020829055835196875286015293a3565b505050565b8115611c9a575f8080808585617530f1611c016110e5565b50611c625760407f049a1ba7d67f56fa5515df9c4237293efd5b05673f974897899d182020506d5d9160018060a01b031692835f526003602052611c4881835f2054611316565b845f52600360205280835f205582519182526020820152a2565b6040519182526001600160a01b0316907fc4e5d7ce17280dbdf87dfb6bb06569619aa9d89aaa6b6ab0d552104f149c9efb90602090a2565b5050565b905f8091602081519101845af48080611d17575b15611cd25750506040513d81523d5f602083013e60203d82010160405290565b15611cf757639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b3d15611d08576040513d5f823e3d90fd5b63d6bda27560e01b5f5260045ffd5b503d151580611cb25750813b1515611cb256fe4a81afad8bb9838e6a031667f827930630cdaf5df9d020e1b54d0056251ed105360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbce55ce98db04f52963fcec04806f51b316bb5d7c5d38823a40352f13ed1cd8624f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c634300081a000a
| 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 | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x8acb0c…8fea6e | 5 days agoWed, 12 Aug 2026 10:05:14 UTC | 0xc7f505…81d2 | data: 0x000000000000000000…ffffffff |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 35,411,164 | 4 days agoThu, 13 Aug 2026 13:03:04 UTC | 0x1bc852…b6afd3 | DELEGATECALL | collect | 0x7927…ed7f | IN | 0x5bb3…7940 | 0.01627 ETH |
| 34,622,975 | 5 days agoWed, 12 Aug 2026 15:06:07 UTC | 0xd4532c…6ca4df | DELEGATECALL | collect | 0x7927…ed7f | IN | 0x5bb3…7940 | 0.08465 ETH |