// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {ISushiV3PositionManager} from "./interfaces/ISushiV3PositionManager.sol";
import {ISushiV3Pool} from "./interfaces/ISushiV3Pool.sol";
import {IWETH9} from "./interfaces/IWETH9.sol";
import {IReferralRegistry} from "./interfaces/IReferralRegistry.sol";
import {SushiV3LiquidityLocker} from "./SushiV3LiquidityLocker.sol";
import {SushiV3LiquidityMath} from "./libraries/SushiV3LiquidityMath.sol";
/// @notice Owns the finite launch-range NFT and can only turn it into permanent
/// full-range liquidity in the same pool after the exact terminal price is reached.
contract SushiV3LaunchVault is ReentrancyGuard, IERC721Receiver {
using SafeERC20 for IERC20;
uint256 public constant BPS = 10_000;
uint256 public constant RESERVED_TOKENS = 200_000_000 ether;
uint256 public constant MIN_TERMINAL_WETH = 24_900_000_000_000_000_000;
uint256 public constant MAX_TERMINAL_TOKEN_DUST = 1_000_000;
uint256 public constant MINT_MIN_BPS = 9_900;
uint16 public constant REFERRAL_SHARE_BPS = 1_000;
uint8 public constant CREATOR_CLAIM = 1;
uint8 public constant TREASURY_CLAIM = 2;
int24 public constant FULL_RANGE_LOWER = -887_200;
int24 public constant FULL_RANGE_UPPER = 887_200;
address public immutable adapter;
ISushiV3PositionManager public immutable positionManager;
IWETH9 public immutable weth;
IERC20 public immutable token;
ISushiV3Pool public immutable pool;
SushiV3LiquidityLocker public immutable liquidityLocker;
address public immutable creator;
address public immutable treasury;
address public immutable settlementOperator;
IReferralRegistry public immutable referralRegistry;
uint16 public immutable creatorShareBps;
uint24 public immutable poolFee;
int24 public immutable launchTickLower;
int24 public immutable launchTickUpper;
uint160 public immutable startSqrtPriceX96;
uint160 public immutable terminalSqrtPriceX96;
uint256 public launchPositionId;
uint256 public finalPositionId;
bool public initialized;
bool public finalized;
bool private terminalRecoveryActive;
mapping(address asset => uint256 amount) public creatorAccrued;
mapping(address asset => uint256 amount) public treasuryAccrued;
mapping(address asset => uint256 amount) public referralReserve;
constructor(
address adapter_,
ISushiV3PositionManager positionManager_,
IWETH9 weth_,
IERC20 token_,
ISushiV3Pool pool_,
SushiV3LiquidityLocker liquidityLocker_,
address creator_,
address treasury_,
address settlementOperator_,
IReferralRegistry referralRegistry_,
uint16 creatorShareBps_,
uint24 poolFee_,
int24 launchTickLower_,
int24 launchTickUpper_,
uint160 startSqrtPriceX96_,
uint160 terminalSqrtPriceX96_
) {
if (
adapter_ == address(0) || address(positionManager_) == address(0) || address(weth_) == address(0) || address(token_) == address(0)
|| address(pool_) == address(0) || address(liquidityLocker_) == address(0) || creator_ == address(0)
|| treasury_ == address(0) || settlementOperator_ == address(0)
|| address(referralRegistry_) == address(0) || creatorShareBps_ + REFERRAL_SHARE_BPS > BPS
|| launchTickLower_ >= launchTickUpper_ || startSqrtPriceX96_ == terminalSqrtPriceX96_
) revert InvalidConfiguration();
adapter = adapter_;
positionManager = positionManager_;
weth = weth_;
token = token_;
pool = pool_;
liquidityLocker = liquidityLocker_;
creator = creator_;
treasury = treasury_;
settlementOperator = settlementOperator_;
referralRegistry = referralRegistry_;
creatorShareBps = creatorShareBps_;
poolFee = poolFee_;
launchTickLower = launchTickLower_;
launchTickUpper = launchTickUpper_;
startSqrtPriceX96 = startSqrtPriceX96_;
terminalSqrtPriceX96 = terminalSqrtPriceX96_;
}
function initialize(uint256 positionId) external {
if (msg.sender != adapter) revert OnlyAdapter();
if (initialized) revert AlreadyInitialized();
if (positionManager.ownerOf(positionId) != address(this)) revert PositionNotLocked();
(,, address token0, address token1, uint24 fee, int24 lower, int24 upper, uint128 liquidity,,,,) =
positionManager.positions(positionId);
if (
fee != poolFee || lower != launchTickLower || upper != launchTickUpper || liquidity == 0
|| !((token0 == address(weth) && token1 == address(token))
|| (token0 == address(token) && token1 == address(weth)))
) revert InvalidPosition();
if (token.balanceOf(address(this)) < RESERVED_TOKENS) revert MissingReserve();
launchPositionId = positionId;
initialized = true;
emit LaunchPositionLocked(positionId, address(pool), lower, upper);
}
function progressBps() external view returns (uint256) {
(uint160 current,,,,,,) = pool.slot0();
if (startSqrtPriceX96 < terminalSqrtPriceX96) {
if (current <= startSqrtPriceX96) return 0;
if (current >= terminalSqrtPriceX96) return BPS;
return uint256(current - startSqrtPriceX96) * BPS / (terminalSqrtPriceX96 - startSqrtPriceX96);
}
if (current >= startSqrtPriceX96) return 0;
if (current <= terminalSqrtPriceX96) return BPS;
return uint256(startSqrtPriceX96 - current) * BPS / (startSqrtPriceX96 - terminalSqrtPriceX96);
}
function transitionReady() public view returns (bool) {
(uint160 current,,,,,,) = pool.slot0();
if (!initialized || finalized) return false;
return startSqrtPriceX96 < terminalSqrtPriceX96
? current >= terminalSqrtPriceX96
: current <= terminalSqrtPriceX96;
}
/// @notice Deprecated compatibility alias. Use transitionReady for new integrations.
function graduationReady() external view returns (bool) {
return transitionReady();
}
function collectAndAccrue() public nonReentrant returns (uint256 amount0, uint256 amount1) {
if (!initialized || finalized) revert InvalidState();
(amount0, amount1) = _collectFees();
}
function finalize() external nonReentrant returns (uint256 resultingPositionId) {
if (!transitionReady()) revert TransitionNotReady();
_restoreTerminalPrice();
finalized = true;
// Native ETH can be forced into this contract despite receive() rejecting ordinary
// transfers. Treat it as WETH principal so it cannot make transition accounting drift.
uint256 forcedNative = address(this).balance;
if (forcedNative != 0) weth.deposit{value: forcedNative}();
_collectFees();
(,,,,,,, uint128 liquidity,,,,) = positionManager.positions(launchPositionId);
if (liquidity == 0) revert InvalidPosition();
(uint256 expected0, uint256 expected1) = positionManager.decreaseLiquidity(
ISushiV3PositionManager.DecreaseLiquidityParams({
tokenId: launchPositionId,
liquidity: liquidity,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
})
);
(uint256 principal0, uint256 principal1) = positionManager.collect(
ISushiV3PositionManager.CollectParams({
tokenId: launchPositionId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
if (principal0 != expected0 || principal1 != expected1) revert PrincipalMismatch();
positionManager.burn(launchPositionId);
bool tokenIsToken0 = address(token) < address(weth);
uint256 tokenPrincipal = tokenIsToken0 ? principal0 : principal1;
uint256 wethPrincipal = tokenIsToken0 ? principal1 : principal0;
if (tokenPrincipal > MAX_TERMINAL_TOKEN_DUST || wethPrincipal < MIN_TERMINAL_WETH) {
revert IncorrectTerminalPrincipal();
}
uint256 protectedWeth = creatorAccrued[address(0)] + treasuryAccrued[address(0)] + referralReserve[address(0)];
uint256 protectedToken = creatorAccrued[address(token)] + treasuryAccrued[address(token)] + referralReserve[address(token)];
uint256 wethBalance = weth.balanceOf(address(this));
uint256 tokenBalance = token.balanceOf(address(this));
if (wethBalance < protectedWeth || tokenBalance < protectedToken + RESERVED_TOKENS) revert InsolventAccounting();
uint256 freeWeth = wethBalance - protectedWeth;
uint256 freeToken = tokenBalance - protectedToken;
uint256 amount0Available = tokenIsToken0 ? freeToken : freeWeth;
uint256 amount1Available = tokenIsToken0 ? freeWeth : freeToken;
(uint160 currentSqrtPriceX96,,,,,,) = pool.slot0();
(uint128 expectedLiquidity, uint256 amount0Desired, uint256 amount1Desired) =
SushiV3LiquidityMath.balancedAmounts(
currentSqrtPriceX96,
FULL_RANGE_LOWER,
FULL_RANGE_UPPER,
amount0Available,
amount1Available
);
if (expectedLiquidity == 0 || amount0Desired == 0 || amount1Desired == 0) revert ZeroLiquidity();
IERC20(address(weth)).forceApprove(
address(positionManager), tokenIsToken0 ? amount1Desired : amount0Desired
);
token.forceApprove(address(positionManager), tokenIsToken0 ? amount0Desired : amount1Desired);
uint128 finalLiquidity;
uint256 amount0Used;
uint256 amount1Used;
(resultingPositionId, finalLiquidity, amount0Used, amount1Used) = positionManager.mint(
ISushiV3PositionManager.MintParams({
token0: tokenIsToken0 ? address(token) : address(weth),
token1: tokenIsToken0 ? address(weth) : address(token),
fee: poolFee,
tickLower: FULL_RANGE_LOWER,
tickUpper: FULL_RANGE_UPPER,
amount0Desired: amount0Desired,
amount1Desired: amount1Desired,
amount0Min: amount0Desired * MINT_MIN_BPS / BPS,
amount1Min: amount1Desired * MINT_MIN_BPS / BPS,
recipient: address(liquidityLocker),
deadline: block.timestamp
})
);
IERC20(address(weth)).forceApprove(address(positionManager), 0);
token.forceApprove(address(positionManager), 0);
if (
finalLiquidity == 0 || finalLiquidity > expectedLiquidity || amount0Used > amount0Desired
|| amount1Used > amount1Desired
) revert InvalidMintResult();
finalPositionId = resultingPositionId;
uint256[6] memory accruals = [
creatorAccrued[address(0)],
treasuryAccrued[address(0)],
referralReserve[address(0)],
creatorAccrued[address(token)],
treasuryAccrued[address(token)],
referralReserve[address(token)]
];
creatorAccrued[address(0)] = 0;
treasuryAccrued[address(0)] = 0;
referralReserve[address(0)] = 0;
creatorAccrued[address(token)] = 0;
treasuryAccrued[address(token)] = 0;
referralReserve[address(token)] = 0;
uint256 remainingWeth = weth.balanceOf(address(this));
if (remainingWeth != 0) IERC20(address(weth)).safeTransfer(address(liquidityLocker), remainingWeth);
uint256 remainingToken = token.balanceOf(address(this));
if (remainingToken != 0) token.safeTransfer(address(liquidityLocker), remainingToken);
liquidityLocker.initializeFromLaunch(
resultingPositionId, poolFee, FULL_RANGE_LOWER, FULL_RANGE_UPPER, accruals
);
emit Graduated(
bytes32(uint256(uint160(address(pool)))), launchPositionId, resultingPositionId, wethPrincipal, finalLiquidity
);
}
/// @dev A normal third-party V3 router can continue across an exhausted outer tick and
/// move through the zero-liquidity region. Traverse that empty region back to the exact
/// terminal boundary before consuming or reminting assets. Recovery is capped at one
/// token-wei and fails closed if external liquidity prevents reaching the boundary.
function _restoreTerminalPrice() private {
(uint160 current,,,,,,) = pool.slot0();
if (current == terminalSqrtPriceX96) return;
bool crossed = startSqrtPriceX96 < terminalSqrtPriceX96
? current > terminalSqrtPriceX96
: current < terminalSqrtPriceX96;
if (!crossed) revert TransitionNotReady();
terminalRecoveryActive = true;
(int256 amount0, int256 amount1) = pool.swap(
address(this), current > terminalSqrtPriceX96, 1, terminalSqrtPriceX96, bytes("")
);
terminalRecoveryActive = false;
(uint160 restored,,,,,,) = pool.slot0();
int256 tokenDelta = address(token) < address(weth) ? amount0 : amount1;
int256 wethDelta = address(token) < address(weth) ? amount1 : amount0;
if (tokenDelta < 0 || tokenDelta > 1 || wethDelta > 0 || restored != terminalSqrtPriceX96) {
revert TerminalPriceRecoveryFailed(tokenDelta, wethDelta, restored);
}
emit TerminalPriceRestored(current, restored);
}
/// @dev Authenticated callback used only by the one-wei terminal-price recovery swap.
function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata) external {
if (!terminalRecoveryActive || msg.sender != address(pool)) revert InvalidSwapCallback();
int256 tokenDelta = address(token) < address(weth) ? amount0Delta : amount1Delta;
int256 wethDelta = address(token) < address(weth) ? amount1Delta : amount0Delta;
if (tokenDelta == 0 && wethDelta == 0) return;
if (tokenDelta <= 0 || tokenDelta > 1 || wethDelta > 0) {
revert TerminalRecoveryCallbackFailed(tokenDelta, wethDelta);
}
token.safeTransfer(address(pool), uint256(tokenDelta));
}
function claimCreator(address asset) external nonReentrant returns (uint256 amount) {
if (finalized) revert InvalidState();
amount = creatorAccrued[asset];
if (amount == 0) return 0;
creatorAccrued[asset] = 0;
_pay(asset, creator, amount);
emit PositionFeesClaimed(creator, asset, amount, CREATOR_CLAIM);
}
function claimTreasury(address asset) external nonReentrant returns (uint256 amount) {
if (finalized) revert InvalidState();
amount = treasuryAccrued[asset];
if (amount == 0) return 0;
treasuryAccrued[asset] = 0;
_pay(asset, treasury, amount);
emit PositionFeesClaimed(treasury, asset, amount, TREASURY_CLAIM);
}
function settleReferrals(address asset, address[] calldata referrers, uint256[] calldata amounts)
external
nonReentrant
{
if (finalized || msg.sender != settlementOperator) revert Unauthorized();
if (referrers.length == 0 || referrers.length != amounts.length) revert InvalidSettlement();
address paymentToken = asset == address(0) ? address(weth) : asset;
uint256 total;
for (uint256 i; i < amounts.length; ++i) {
if (referrers[i] == address(0) || amounts[i] == 0) revert InvalidSettlement();
total += amounts[i];
}
if (referralReserve[asset] < total) revert InvalidSettlement();
referralReserve[asset] -= total;
IERC20(paymentToken).forceApprove(address(referralRegistry), total);
for (uint256 i; i < amounts.length; ++i) {
referralRegistry.accrueToken(referrers[i], paymentToken, amounts[i]);
emit ReferralFeesSettled(referrers[i], paymentToken, amounts[i]);
}
IERC20(paymentToken).forceApprove(address(referralRegistry), 0);
}
function releaseReferralReserve(address asset, uint256 amount) external {
if (finalized || msg.sender != settlementOperator) revert Unauthorized();
if (amount == 0 || referralReserve[asset] < amount) revert InvalidSettlement();
referralReserve[asset] -= amount;
treasuryAccrued[asset] += amount;
emit ReferralReserveReleased(asset, amount);
}
function _collectFees() private returns (uint256 amount0, uint256 amount1) {
(amount0, amount1) = positionManager.collect(
ISushiV3PositionManager.CollectParams({
tokenId: launchPositionId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
bool tokenIsToken0 = address(token) < address(weth);
_accrue(tokenIsToken0 ? address(token) : address(weth), amount0);
_accrue(tokenIsToken0 ? address(weth) : address(token), amount1);
}
function _accrue(address rawAsset, uint256 amount) private {
if (amount == 0) return;
address asset = rawAsset == address(weth) ? address(0) : rawAsset;
uint256 creatorAmount = amount * creatorShareBps / BPS;
uint256 referralAmount = amount * REFERRAL_SHARE_BPS / BPS;
uint256 treasuryAmount = amount - creatorAmount - referralAmount;
creatorAccrued[asset] += creatorAmount;
referralReserve[asset] += referralAmount;
treasuryAccrued[asset] += treasuryAmount;
emit PositionFeesAccrued(asset, creatorAmount, referralAmount, treasuryAmount);
}
function _pay(address asset, address recipient, uint256 amount) private {
if (asset == address(0)) {
weth.withdraw(amount);
(bool success,) = recipient.call{value: amount}("");
if (!success) {
weth.deposit{value: amount}();
IERC20(address(weth)).safeTransfer(recipient, amount);
}
} else {
IERC20(asset).safeTransfer(recipient, amount);
}
}
receive() external payable {
if (msg.sender != address(weth)) revert Unauthorized();
}
function onERC721Received(address operator, address from, uint256, bytes calldata) external view returns (bytes4) {
if (msg.sender != address(positionManager) || operator != adapter || from != address(0) || initialized) {
revert Unauthorized();
}
return IERC721Receiver.onERC721Received.selector;
}
event LaunchPositionLocked(uint256 indexed positionId, address indexed pool, int24 tickLower, int24 tickUpper);
event Graduated(bytes32 indexed poolId, uint256 indexed launchPositionId, uint256 indexed finalPositionId, uint256 wethPrincipal, uint128 liquidity);
event PositionFeesAccrued(address indexed asset, uint256 creatorAmount, uint256 referralAmount, uint256 treasuryAmount);
event PositionFeesClaimed(address indexed recipient, address indexed asset, uint256 amount, uint8 kind);
event ReferralFeesSettled(address indexed referrer, address indexed asset, uint256 amount);
event ReferralReserveReleased(address indexed asset, uint256 amount);
event TerminalPriceRestored(uint160 previousSqrtPriceX96, uint160 terminalSqrtPriceX96);
error InvalidConfiguration();
error OnlyAdapter();
error AlreadyInitialized();
error PositionNotLocked();
error InvalidPosition();
error MissingReserve();
error InvalidState();
error TransitionNotReady();
error TerminalPriceRecoveryFailed(int256 tokenDelta, int256 wethDelta, uint160 restoredSqrtPriceX96);
error InvalidSwapCallback();
error TerminalRecoveryCallbackFailed(int256 tokenDelta, int256 wethDelta);
error PrincipalMismatch();
error IncorrectTerminalPrincipal();
error InsolventAccounting();
error ZeroLiquidity();
error InvalidMintResult();
error Unauthorized();
error InvalidSettlement();
}[
{
"type": "constructor",
"inputs": [
{
"name": "adapter_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "contract ISushiV3PositionManager"
},
{
"name": "weth_",
"type": "address",
"internalType": "contract IWETH9"
},
{
"name": "token_",
"type": "address",
"internalType": "contract IERC20"
},
{
"name": "pool_",
"type": "address",
"internalType": "contract ISushiV3Pool"
},
{
"name": "liquidityLocker_",
"type": "address",
"internalType": "contract SushiV3LiquidityLocker"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address"
},
{
"name": "settlementOperator_",
"type": "address",
"internalType": "address"
},
{
"name": "referralRegistry_",
"type": "address",
"internalType": "contract IReferralRegistry"
},
{
"name": "creatorShareBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "poolFee_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "launchTickLower_",
"type": "int24",
"internalType": "int24"
},
{
"name": "launchTickUpper_",
"type": "int24",
"internalType": "int24"
},
{
"name": "startSqrtPriceX96_",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "terminalSqrtPriceX96_",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyInitialized",
"type": "error",
"inputs": []
},
{
"name": "IncorrectTerminalPrincipal",
"type": "error",
"inputs": []
},
{
"name": "InsolventAccounting",
"type": "error",
"inputs": []
},
{
"name": "InvalidConfiguration",
"type": "error",
"inputs": []
},
{
"name": "InvalidMintResult",
"type": "error",
"inputs": []
},
{
"name": "InvalidPosition",
"type": "error",
"inputs": []
},
{
"name": "InvalidSettlement",
"type": "error",
"inputs": []
},
{
"name": "InvalidState",
"type": "error",
"inputs": []
},
{
"name": "InvalidSwapCallback",
"type": "error",
"inputs": []
},
{
"name": "MissingReserve",
"type": "error",
"inputs": []
},
{
"name": "OnlyAdapter",
"type": "error",
"inputs": []
},
{
"name": "PositionNotLocked",
"type": "error",
"inputs": []
},
{
"name": "PrincipalMismatch",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "TerminalPriceRecoveryFailed",
"type": "error",
"inputs": [
{
"name": "tokenDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "wethDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "restoredSqrtPriceX96",
"type": "uint160",
"internalType": "uint160"
}
]
},
{
"name": "TerminalRecoveryCallbackFailed",
"type": "error",
"inputs": [
{
"name": "tokenDelta",
"type": "int256",
"internalType": "int256"
},
{
"name": "wethDelta",
"type": "int256",
"internalType": "int256"
}
]
},
{
"name": "TransitionNotReady",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "ZeroLiquidity",
"type": "error",
"inputs": []
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "launchPositionId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "finalPositionId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "wethPrincipal",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "LaunchPositionLocked",
"type": "event",
"inputs": [
{
"name": "positionId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "pool",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tickLower",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"indexed": false,
"internalType": "int24"
}
],
"anonymous": false
},
{
"name": "PositionFeesAccrued",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creatorAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "referralAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "treasuryAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PositionFeesClaimed",
"type": "event",
"inputs": [
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "kind",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "ReferralFeesSettled",
"type": "event",
"inputs": [
{
"name": "referrer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ReferralReserveReleased",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TerminalPriceRestored",
"type": "event",
"inputs": [
{
"name": "previousSqrtPriceX96",
"type": "uint160",
"indexed": false,
"internalType": "uint160"
},
{
"name": "terminalSqrtPriceX96",
"type": "uint160",
"indexed": false,
"internalType": "uint160"
}
],
"anonymous": false
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "CREATOR_CLAIM",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "FULL_RANGE_LOWER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "FULL_RANGE_UPPER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "MAX_TERMINAL_TOKEN_DUST",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MINT_MIN_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_TERMINAL_WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "REFERRAL_SHARE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "RESERVED_TOKENS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TREASURY_CLAIM",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "adapter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "claimCreator",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimTreasury",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "collectAndAccrue",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "amount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "creatorAccrued",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorShareBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "finalPositionId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "finalize",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "resultingPositionId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "finalized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "graduationReady",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "initialize",
"type": "function",
"inputs": [
{
"name": "positionId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "initialized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launchPositionId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launchTickLower",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "launchTickUpper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "liquidityLocker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract SushiV3LiquidityLocker"
}
],
"stateMutability": "view"
},
{
"name": "onERC721Received",
"type": "function",
"inputs": [
{
"name": "operator",
"type": "address",
"internalType": "address"
},
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "view"
},
{
"name": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISushiV3Pool"
}
],
"stateMutability": "view"
},
{
"name": "poolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISushiV3PositionManager"
}
],
"stateMutability": "view"
},
{
"name": "progressBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "referralRegistry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IReferralRegistry"
}
],
"stateMutability": "view"
},
{
"name": "referralReserve",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "releaseReferralReserve",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "settleReferrals",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "referrers",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "amounts",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "settlementOperator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "startSqrtPriceX96",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "terminalSqrtPriceX96",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint160",
"internalType": "uint160"
}
],
"stateMutability": "view"
},
{
"name": "token",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "transitionReady",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "treasuryAccrued",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IWETH9"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6080806040526004361015610074575b50361561001a575f80fd5b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316330361004c57005b7f82b42900000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f905f3560e01c90816302d05d3f1461330b5750806303eadcfc146132c8578063089fe6aa14613289578063127861f614613266578063150b7a0214613155578063158ef93e1461313357806316f0115b146130f05780631b6984e8146130ad57806320b285ce14613010578063249d39e914612ff45780632c4d826114612fd75780633241458c14612eb957806336ee94c014612e9c5780633fc8cef314612e595780634360766814612e1657806346f61ca814612deb5780634bb278f3146110785780634e627e62146110345780635ed536c214610ffc57806361d027b314610fb857806368fc68c714610f925780636bbd990f14610be75780636c1eba1514610bc457806371d933a014610b8c57806375a946c814610b4e578063791b98bc14610b0a5780637ede533614610aec578063931f6a6214610ad05780639759164a14610a8c578063afc44eea14610a70578063b1a25c9414610a31578063b38beaab146108fe578063b3f05b9714610a0b578063bc412da8146109cd578063c942636e14610995578063d65c7f301461093d578063d86bcd7d14610920578063d9a36a6814610903578063dad9b630146108fe578063df3225ac146108e1578063fa461e3314610898578063fc0c546a14610854578063fe40e14a14610810578063fe4b84df1461028c5763fef2b8f80361000f57346102895780600319360112610289576020604051620d899f198152f35b80fd5b5034610289576020600319360112610289576004356001600160a01b037f0000000000000000000000008c8795afe3d13e773a8a8942ac9bd52ac0d29ca91633036107e8576002549060ff82166107c0576001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107166040517f6352211e000000000000000000000000000000000000000000000000000000008152826004820152602081602481855afa9081156107b5578591610777575b506001600160a01b033091160361074f57610180602491604051928380927f99fbab880000000000000000000000000000000000000000000000000000000082528660048301525afa928315610744578493859486958796889589946106fe575b5062ffffff807f000000000000000000000000000000000000000000000000000000000000271016911614928315936106cc575b831561069a575b831561067f575b5082156105a4575b505061057c576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024816001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f165afa8015610571578690610530575b6aa56fa5b99019a5c8000000915010610508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060019184875516176002556040519260020b835260020b60208301527f3134ed07631f711a6ba6ef3e058b716512890e77a91d4c65d5b356a9507667e460406001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a6131693a380f35b6004857f1f366031000000000000000000000000000000000000000000000000000000008152fd5b506020813d602011610569575b8161054a6020938361351f565b81010312610565576aa56fa5b99019a5c80000009051610466565b5f80fd5b3d915061053d565b6040513d88823e3d90fd5b6004857fce7e065e000000000000000000000000000000000000000000000000000000008152fd5b9091506001600160a01b03807f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73169216918083149283610642575b83156105f1575b505050155f806103f5565b7f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f6001600160a01b0316149250908261062f575b50505f80806105e6565b6001600160a01b03161490505f80610625565b92506001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f166001600160a01b03831614926105df565b6fffffffffffffffffffffffffffffffff161592505f6103ed565b92507f000000000000000000000000000000000000000000000000000000000002d8e860020b8560020b1415926103e6565b92507f0000000000000000000000000000000000000000000000000000000000026d1860020b8760020b1415926103df565b9497505050505061072791506101803d811161073d575b61071f818361351f565b81019061359f565b505050509650979450929190929694925f6103ab565b503d610715565b6040513d86823e3d90fd5b6004847fd58f9686000000000000000000000000000000000000000000000000000000008152fd5b90506020813d6020116107ad575b816107926020938361351f565b810103126107a9576107a390613560565b5f61034a565b8480fd5b3d9150610785565b6040513d87823e3d90fd5b6004837f0dc149f0000000000000000000000000000000000000000000000000000000008152fd5b6004827f467122e8000000000000000000000000000000000000000000000000000000008152fd5b503461028957806003193601126102895760206040516001600160a01b037f0000000000000000000000000000000000000b1272b73d93234c72c07ade2b70168152f35b503461028957806003193601126102895760206040516001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f168152f35b50346102895760606003193601126102895760443567ffffffffffffffff81116108dd576108ca903690600401613362565b50506108da602435600435613ad3565b80f35b5080fd5b503461028957806003193601126102895760206040516103e88152f35b6133c1565b503461028957806003193601126102895760209054604051908152f35b503461028957806003193601126102895760206040516126ac8152f35b503461028957602060031936011261028957602061096961095c61334c565b610964613c64565b613919565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b50346102895760206003193601126102895760406020916001600160a01b036109bc61334c565b168152600583522054604051908152f35b503461028957806003193601126102895760206040517f0000000000000000000000000000000000000000000000000000000000026d1860020b8152f35b5034610289578060031936011261028957602060ff60025460081c166040519015158152f35b5034610289578060031936011261028957602060405161ffff7f0000000000000000000000000000000000000000000000000000000000001d4c168152f35b5034610289578060031936011261028957602060405160028152f35b503461028957806003193601126102895760206040516001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f168152f35b5034610289578060031936011261028957602060405160018152f35b50346102895780600319360112610289576020604051620f42408152f35b503461028957806003193601126102895760206040516001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107168152f35b503461028957806003193601126102895760206040517f000000000000000000000000000000000000000000000000000000000002d8e860020b8152f35b50346102895760206003193601126102895760406020916001600160a01b03610bb361334c565b168152600483522054604051908152f35b50346102895780600319360112610289576020610bdf613792565b604051908152f35b503461028957606060031936011261028957610c0161334c565b60243567ffffffffffffffff8111610e5657610c21903690600401613390565b9060443567ffffffffffffffff81116107a957610c42903690600401613390565b9190610c4c613c64565b60ff60025460081c168015610f5f575b610f375783158015610f2d575b610f05576001600160a01b0385169485610f0057506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165b8695875b858110610e825750808852600560205286604089205410610e5a57906001600160a01b03918852600560205260408820610ce88882546133e5565b90551693610d216001600160a01b037f0000000000000000000000004ad40394fb3d669975dd83635308106a356cd84b169687876144b1565b865b848110610d5c5787610d358888614410565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b87610d70610d6b838588613721565b61375e565b610d7b838887613721565b35893b15610e56576001600160a01b03604051927f9d1a4e5800000000000000000000000000000000000000000000000000000000845216600483015288602483015260448201528181606481838d5af18015610e4b57610e32575b50508086610deb610d6b6001948689613721565b7fb30dd603307751e9572dd954b8231ed2346f803726951a48903c77e6fe7e0f5960206001600160a01b03610e21868c8b613721565b35936040519485521692a301610d23565b81610e3c9161351f565b610e4757875f610dd7565b8780fd5b6040513d84823e3d90fd5b8280fd5b6004887f115931c4000000000000000000000000000000000000000000000000000000008152fd5b966001600160a01b03610e99610d6b8a8a89613721565b16158015610eed575b610ec557610ebe600191610eb78a8988613721565b359061341f565b9701610cad565b6004897f115931c4000000000000000000000000000000000000000000000000000000008152fd5b50610ef9888786613721565b3515610ea2565b610ca9565b6004867f115931c4000000000000000000000000000000000000000000000000000000008152fd5b5082841415610c69565b6004867f82b42900000000000000000000000000000000000000000000000000000000008152fd5b506001600160a01b037f0000000000000000000000007f5f9713b27a1c2d5c36b679399dd7039a7dcac616331415610c5c565b503461028957806003193601126102895760206040516aa56fa5b99019a5c80000008152f35b503461028957806003193601126102895760206040516001600160a01b037f00000000000000000000000023a08dbf1f0256890d679c0c2fb3ff828bfc3a74168152f35b50346102895760206003193601126102895760406020916001600160a01b0361102361334c565b168152600383522054604051908152f35b503461028957806003193601126102895760206040516001600160a01b037f0000000000000000000000004ad40394fb3d669975dd83635308106a356cd84b168152f35b5034610565575f60031936011261056557611091613c64565b6110996139bc565b15612dc3576110a6614025565b6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff60025416176002554780612d39575b506110e2613cdb565b505080546040517f99fbab88000000000000000000000000000000000000000000000000000000008152816004820152610180816024816001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165afa8015612d2e576fffffffffffffffffffffffffffffffff918491612d03575b50168015612cdb576040519160a0830183811067ffffffffffffffff821117612cae576040528252602082019081526040820183815260608301908482526fffffffffffffffffffffffffffffffff6080850193428552604051957f0c49ccbe0000000000000000000000000000000000000000000000000000000087525160048701525116602485015251604484015251606483015251608482015260408160a481856001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165af1908115610e4b576113009183918491612c8d575b5060408454815190611259826134d6565b81523060208201526fffffffffffffffffffffffffffffffff828201526fffffffffffffffffffffffffffffffff60608201528151809581927ffc6f78650000000000000000000000000000000000000000000000000000000083526004830191909160606fffffffffffffffffffffffffffffffff816080840195805185526001600160a01b036020820151166020860152826040820151166040860152015116910152565b0381876001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165af19182156107445784938593612c56575b50831490811591612c4b575b50612c23578280546001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107163b156108dd57604051907f42966c6800000000000000000000000000000000000000000000000000000000825260048201528181602481836001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165af18015610e4b57612c0e575b5050620f42406001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f161091825f14612c0757835b8315612bff5750925b118015612bed575b612bc557828052600360205261149f61148c6040852054858052600460205260408620549061341f565b848052600560205260408520549061341f565b916001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f168452600360205261155461151860408620546001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f168752600460205260408720549061341f565b6001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f168652600560205260408620549061341f565b604051937f70a082310000000000000000000000000000000000000000000000000000000085523060048601526020856024816001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165afa948515610571578695612b91575b50604051947f70a082310000000000000000000000000000000000000000000000000000000086523060048701526020866024816001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f165afa958615612b86578796612b52575b508181108015612b08575b612ae057611652929161164c916133e5565b946133e5565b928215612ad957835b8315612ad15750925b604051907f3850c7bd00000000000000000000000000000000000000000000000000000000825260e0826004816001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a613165afa918215610571578692612a9a575b50620d899f1960ff1d620d899f19810118620d89e88111612a6a5763ffffffff90600181167001fffcb933bd6fad37aa2d162d1a59400102700100000000000000000000000000000000189060028116612a4e575b60048116612a32575b60088116612a16575b601081166129fa575b602081166129de575b604081166129c2575b608081166129a6575b610100811661298a575b610200811661296e575b6104008116612952575b6108008116612936575b611000811661291a575b61200081166128fe575b61400081166128e2575b61800081166128c6575b6201000081166128aa575b62020000811661288f575b620400008116612874575b620800001661285e575b0160201c620d89a060ff1d620d89a0810118620d89e8811161282f5763ffffffff90600181167001fffcb933bd6fad37aa2d162d1a59400102700100000000000000000000000000000000189060028116612813575b600481166127f7575b600881166127db575b601081166127bf575b602081166127a3575b60408116612787575b6080811661276b575b610100811661274f575b6102008116612733575b6104008116612717575b61080081166126fb575b61100081166126df575b61200081166126c3575b61400081166126a7575b618000811661268b575b62010000811661266f575b620200008116612654575b620400008116612639575b6208000016612623575b5f19040160201c9182826001600160a01b038516926001600160a01b03851692848411612619575b6001600160a01b038881169b90899085168d116125a657505061192292614831565b945b8998898382116125105750505061196a939261194b6001600160a01b03936119519361487a565b93613772565b166fffffffffffffffffffffffffffffffff841661496f565b935b6fffffffffffffffffffffffffffffffff8216158015612508575b8015612500575b6124d85783156124cf576119f6815b6001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107166001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166144b1565b83156124c657611a51855b6001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107167f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f6144b1565b8315612496576001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16935b15612467576001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165b856126ac8102046126ac148615171561243a57816126ac8102046126ac148215171561243a57604051948561016081011067ffffffffffffffff6101608801111761240d57906001600160a01b038092610160880160405216865216602085015262ffffff7f0000000000000000000000000000000000000000000000000000000000002710166040850152620d899f196060850152620d89a060808501528460a08501528060c08501526127106126ac86020460e08501526127106126ac8202046101008501526001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f1661012085015242610140850152610140604051947f883164560000000000000000000000000000000000000000000000000000000086526001600160a01b0381511660048701526001600160a01b03602082015116602487015262ffffff6040820151166044870152606081015160020b6064870152608081015160020b608487015260a081015160a487015260c081015160c487015260e081015160e48701526101008101516101048701526001600160a01b0361012082015116610124870152015161014485015260808461016481896001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165af1801561057157869587889689936123a4575b506fffffffffffffffffffffffffffffffff90611d246001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107166001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316614410565b611d776001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107167f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f614410565b16958615948515612388575b50841561237e575b50508215612374575b505061234c578260015560405160c0810181811067ffffffffffffffff82111761231f576040528480526003602052604085205481528480526004602052604085205460208201528480526005602052604085205460408201526001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f1685526003602052604085205460608201526001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f1685526004602052604085205460808201526001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f1685526005602052604085205460a08201528480526003602052846040812055848052600460205284604081205584805260056020528460408120556001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16855260036020528460408120556001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16855260046020528460408120556001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16855260056020528460408120556040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024816001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165afa9081156105715786916122ed575b508061228a575b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024816001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f165afa908115610571578691612258575b50806121fe575b506001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f163b156107a957604051907fbc55df9c00000000000000000000000000000000000000000000000000000000825284600483015262ffffff7f0000000000000000000000000000000000000000000000000000000000002710166024830152620d899f196044830152620d89a060648301526084820186905b600682106121e857505050848161014481836001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f165af180156107b5576121cf575b509082916020945491604051918252858201527ff68a7d065acc005f56715487ce7407985ab1ad2a635c2e589e108eaf5b90034660406001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a6131692a460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6121da85809261351f565b6121e4575f612141565b8380fd5b60208060019285518152019301910190916120f8565b612252906001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f167f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f614517565b5f612055565b90506020813d602011612282575b816122736020938361351f565b8101031261056557515f61204e565b3d9150612266565b6122e7906001600160a01b037f000000000000000000000000792ae3c26b0f6d72aef3f3a4df04121b27df8e7f166001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316614517565b5f611fe1565b90506020813d602011612317575b816123086020938361351f565b8101031261056557515f611fda565b3d91506122fb565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6004847fb71cb524000000000000000000000000000000000000000000000000000000008152fd5b1190505f80611d94565b1192505f80611d8b565b6fffffffffffffffffffffffffffffffff16871194505f611d83565b9650509550506080843d608011612405575b816123c36080938361351f565b81010312612401578351936123da60208201613582565b956fffffffffffffffffffffffffffffffff60606040840151930151969792969290611cb5565b8580fd5b3d91506123b6565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16611ab3565b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731693611a83565b611a5181611a01565b6119f68561199d565b6004867f10074548000000000000000000000000000000000000000000000000000000008152fd5b50801561198e565b508415611987565b919950915082821015612574575061256f93926125626125458a61253f6001600160a01b03966125689661487a565b96613772565b94846fffffffffffffffffffffffffffffffff891696168661496f565b98613772565b169061487a565b61196c565b9750505061258d6001600160a01b039161256f93613772565b166fffffffffffffffffffffffffffffffff831661487a565b909290916001600160a01b0381168d101561260d5782916125cb916125d19594614831565b93614801565b6fffffffffffffffffffffffffffffffff81166fffffffffffffffffffffffffffffffff8316105f1461260657505b94611924565b9050612600565b91505061260092614801565b5085915084611900565b6b048a170391f7dc42444e8fa20260801c6118d8565b6d2216e584f5fa1ea926041bedfe9890910260801c906118ce565b906e5d6af8dedb81196699c329225ee6040260801c906118c3565b906f09aa508b5b7a84e1c677de54f3e99bc90260801c906118b8565b906f31be135f97d08fd981231505542fcfa60260801c906118ad565b906f70d869a156d2a1b890bb3df62baf32f70260801c906118a3565b906fa9f746462d870fdf8a65dc1f90e061e50260801c90611899565b906fd097f3bdfd2022b8845ad8f792aa58250260801c9061188f565b906fe7159475a2c29b7443b29c7fa6e889d90260801c90611885565b906ff3392b0822b70005940c7a398e4b70f30260801c9061187b565b906ff987a7253ac413176f2b074cf7815e540260801c90611871565b906ffcbe86c7900a88aedcffc83b479aa3a40260801c90611867565b906ffe5dee046a99a2a811c461f1969c30530260801c9061185d565b906fff2ea16466c96a3843ec78b326b528610260801c90611854565b906fff973b41fa98c081472e6896dfb254c00260801c9061184b565b906fffcb9843d60f6159c9db58835c9266440260801c90611842565b906fffe5caca7e10e4e61c3624eaa0941cd00260801c90611839565b906ffff2e50f5f656932ef12357cf3c7fdcc0260801c90611830565b906ffff97272373d413259a46990580e213a0260801c90611827565b6024887f8b86327a000000000000000000000000000000000000000000000000000000008152620d89a0600452fd5b6b048a170391f7dc42444e8fa20260801c6117d1565b6d2216e584f5fa1ea926041bedfe9890910260801c906117c7565b906e5d6af8dedb81196699c329225ee6040260801c906117bc565b906f09aa508b5b7a84e1c677de54f3e99bc90260801c906117b1565b906f31be135f97d08fd981231505542fcfa60260801c906117a6565b906f70d869a156d2a1b890bb3df62baf32f70260801c9061179c565b906fa9f746462d870fdf8a65dc1f90e061e50260801c90611792565b906fd097f3bdfd2022b8845ad8f792aa58250260801c90611788565b906fe7159475a2c29b7443b29c7fa6e889d90260801c9061177e565b906ff3392b0822b70005940c7a398e4b70f30260801c90611774565b906ff987a7253ac413176f2b074cf7815e540260801c9061176a565b906ffcbe86c7900a88aedcffc83b479aa3a40260801c90611760565b906ffe5dee046a99a2a811c461f1969c30530260801c90611756565b906fff2ea16466c96a3843ec78b326b528610260801c9061174d565b906fff973b41fa98c081472e6896dfb254c00260801c90611744565b906fffcb9843d60f6159c9db58835c9266440260801c9061173b565b906fffe5caca7e10e4e61c3624eaa0941cd00260801c90611732565b906ffff2e50f5f656932ef12357cf3c7fdcc0260801c90611729565b906ffff97272373d413259a46990580e213a0260801c90611720565b6024877f8b86327a000000000000000000000000000000000000000000000000000000008152620d899f19600452fd5b612abd91925060e03d60e011612aca575b612ab5818361351f565b810190613674565b505050505050905f6116cb565b503d612aab565b905092611664565b809361165b565b6004877f242cee99000000000000000000000000000000000000000000000000000000008152fd5b506aa56fa5b99019a5c80000008301808411612b2557861061163a565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b9095506020813d602011612b7e575b81612b6e6020938361351f565b810103126105655751945f61162f565b3d9150612b61565b6040513d89823e3d90fd5b9094506020813d602011612bbd575b81612bad6020938361351f565b810103126105655751935f6115c1565b3d9150612ba0565b6004837f4a19b22f000000000000000000000000000000000000000000000000000000008152fd5b506801598e9212fb3a00008210611462565b90509261145a565b8093611451565b81612c189161351f565b610e5657825f6113ec565b6004837f8eaf6c85000000000000000000000000000000000000000000000000000000008152fd5b90508114155f61134b565b909250612c7c91935060403d604011612c86575b612c74818361351f565b81019061364f565b929092915f61133f565b503d612c6a565b9050612ca8915060403d604011612c8657612c74818361351f565b5f611248565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6004837fce7e065e000000000000000000000000000000000000000000000000000000008152fd5b612d1c91506101803d811161073d5761071f818361351f565b5050505096505050505050505f611164565b6040513d85823e3d90fd5b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316803b15610565575f906004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af18015612db857156110d957612db191505f9061351f565b5f5f6110d9565b6040513d5f823e3d90fd5b7fcfcc9235000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610565576020600319360112610565576020610969612e0961334c565b612e11613c64565b61342c565b34610565575f6003193601126105655760206040516001600160a01b037f0000000000000000000000000000000000002c01e00531cec6ddd87978a6d308168152f35b34610565575f6003193601126105655760206040516001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b34610565575f600319360112610565576020604051620d89a08152f35b3461056557604060031936011261056557612ed261334c565b6024359060ff60025460081c168015612fa4575b61004c5781158015612f86575b612f5e5760206001600160a01b037f112d0b38c21bf5e3c04ce83e188ecf8bb04981465e4041b5bff338ee65b2364b921692835f526005825260405f20612f3b8282546133e5565b9055835f526004825260405f20612f5382825461341f565b9055604051908152a2005b7f115931c4000000000000000000000000000000000000000000000000000000005f5260045ffd5b506001600160a01b0381165f5260056020528160405f205410612ef3565b506001600160a01b037f0000000000000000000000007f5f9713b27a1c2d5c36b679399dd7039a7dcac616331415612ee6565b34610565575f600319360112610565576020600154604051908152f35b34610565575f6003193601126105655760206040516127108152f35b34610565575f60031936011261056557613028613c64565b60025460ff81161590811561309f575b50613077576040613047613cdb565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b7fbaf3f0f7000000000000000000000000000000000000000000000000000000005f5260045ffd5b60ff915060081c1681613038565b34610565575f6003193601126105655760206040516001600160a01b037f0000000000000000000000007f5f9713b27a1c2d5c36b679399dd7039a7dcac6168152f35b34610565575f6003193601126105655760206040516001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a613168152f35b34610565575f60031936011261056557602060ff600254166040519015158152f35b346105655760806003193601126105655761316e61334c565b6024356001600160a01b0381168091036105655760643567ffffffffffffffff8111610565576131a2903690600401613362565b50506001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e78161071633149182159261322d575b508115613223575b508015613217575b61004c5760206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b5060ff600254166131e9565b90501515816131e1565b9091506001600160a01b03807f0000000000000000000000008c8795afe3d13e773a8a8942ac9bd52ac0d29ca9169116141590826131d9565b34610565575f6003193601126105655760206040516801598e9212fb3a00008152f35b34610565575f60031936011261056557602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000002710168152f35b34610565575f6003193601126105655760206040516001600160a01b037f0000000000000000000000008c8795afe3d13e773a8a8942ac9bd52ac0d29ca9168152f35b34610565575f600319360112610565576020906001600160a01b037f00000000000000000000000098dc82470cd96449eff7a21837644e8a0b83f40e168152f35b600435906001600160a01b038216820361056557565b9181601f840112156105655782359167ffffffffffffffff8311610565576020838186019501011161056557565b9181601f840112156105655782359167ffffffffffffffff8311610565576020808501948460051b01011161056557565b34610565575f6003193601126105655760206133db6139bc565b6040519015158152f35b919082039182116133f257565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b919082018092116133f257565b9060ff60025460081c16613077576001600160a01b038216805f52600460205260405f20549283156134cf57815f5260046020525f6040812055613492847f00000000000000000000000023a08dbf1f0256890d679c0c2fb3ff828bfc3a748093613e77565b7fbc549b9dbd305b4b63cc912157355acab6a793bd841a074e55be017489c2be1260406001600160a01b03815193878552600260208601521692a3565b505f925050565b6080810190811067ffffffffffffffff8211176134f257604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176134f257604052565b51906001600160a01b038216820361056557565b51908160020b820361056557565b51906fffffffffffffffffffffffffffffffff8216820361056557565b9190826101809103126105655781516bffffffffffffffffffffffff8116810361056557916135d060208201613560565b916135dd60408301613560565b916135ea60608201613560565b91608082015162ffffff81168103610565579161360960a08201613574565b9161361660c08301613574565b9161362360e08201613582565b91610100820151916101208101519161364c6101606136456101408501613582565b9301613582565b90565b9190826040910312610565576020825192015190565b519061ffff8216820361056557565b908160e09103126105655780516001600160a01b0381168103610565579161369e60208301613574565b916136ab60408201613665565b916136b860608301613665565b916136c560808201613665565b9160a082015163ffffffff811681036105655760c09092015180151581036105655790565b81156136f4570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b91908110156137315760051b0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b356001600160a01b03811681036105655790565b906001600160a01b03809116911603906001600160a01b0382116133f257565b6040517f3850c7bd00000000000000000000000000000000000000000000000000000000815260e0816004816001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a613165afa908115612db8575f916138f4575b507f0000000000000000000000000000000000002c01e00531cec6ddd87978a6d308907f0000000000000000000000000000000000000b1272b73d93234c72c07ade2b70906001600160a01b0382166001600160a01b0384168181106138c7576001600160a01b038316908110156138be5711156138b5576138826001600160a01b039184613772565b169061271082029180830461271014901517156133f2576138ae6001600160a01b039161364c94613772565b16906136ea565b50505061271090565b50505050505f90565b6001600160a01b038395949516908111156138be5710156138b557613882826001600160a01b0392613772565b61390d915060e03d60e011612aca57612ab5818361351f565b5050505050505f6137f8565b9060ff60025460081c16613077576001600160a01b038216805f52600360205260405f20549283156134cf57815f5260036020525f604081205561397f847f00000000000000000000000098dc82470cd96449eff7a21837644e8a0b83f40e8093613e77565b7fbc549b9dbd305b4b63cc912157355acab6a793bd841a074e55be017489c2be1260406001600160a01b03815193878552600160208601521692a3565b6040517f3850c7bd00000000000000000000000000000000000000000000000000000000815260e0816004816001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a613165afa908115612db8575f91613aae575b5060025460ff811615908115613aa0575b50613a9b576001600160a01b03807f0000000000000000000000000000000000000b1272b73d93234c72c07ade2b70169182827f0000000000000000000000000000000000002c01e00531cec6ddd87978a6d30816105f14613a955716101590565b16111590565b505f90565b60ff915060081c165f613a33565b613ac7915060e03d60e011612aca57612ab5818361351f565b5050505050505f613a22565b9060ff60025460101c16158015613c31575b613c09577f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f906001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166001600160a01b0383161092835f14613c025780935b15613bfb57505b821580613bf3575b613bee575f8313801590613be4575b8015613bdb575b613bac575090613baa916001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a6131690614517565b565b827f0cbaab2d000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b505f8113613b70565b5060018313613b69565b505050565b508015613b5a565b9050613b52565b8193613b4b565b7f4400be28000000000000000000000000000000000000000000000000000000005f5260045ffd5b506001600160a01b037f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a61316331415613ae5565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005414613cb35760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b613d969060405f54815190613cef826134d6565b81523060208201526fffffffffffffffffffffffffffffffff828201526fffffffffffffffffffffffffffffffff60608201528151809481927ffc6f78650000000000000000000000000000000000000000000000000000000083526004830191909160606fffffffffffffffffffffffffffffffff816080840195805185526001600160a01b036020820151166020860152826040820151166040860152015116910152565b03815f6001600160a01b037f00000000000000000000000051d0e5188afe12d502e29d982d20c190e7816107165af1908115612db8575f925f92613e53575b50613baa826001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad738116907f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f16818110613e3b888215613e4d5783614592565b15613e465750614592565b9050614592565b84614592565b909250613e6f915060403d604011612c8657612c74818361351f565b90915f613dd5565b5f939291906001600160a01b03168061401a57506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316803b15610565576040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081528360048201525f8160248183865af18015612db857614005575b508480808086865af13d15614000573d67ffffffffffffffff8111613fd35760405190613f51601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018361351f565b81528660203d92013e5b15613f68575b5050509050565b803b156107a9576040517fd0e30db0000000000000000000000000000000000000000000000000000000008152858160048187865af1801561057157613fbe575b50613fb5939450614517565b805f8080613f61565b613fc986809261351f565b6107a95784613fa9565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b613f5b565b6140129195505f9061351f565b5f935f613efc565b613baa939450614517565b6040517f3850c7bd0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000003109bb347cad3735c1e8d017993d9729c3c3a6136001600160a01b031660e082600481845afa918215612db8575f926143e9575b506001600160a01b03807f0000000000000000000000000000000000000b1272b73d93234c72c07ade2b7016921691808314613bee57806001600160a01b037f0000000000000000000000000000000000002c01e00531cec6ddd87978a6d30816105f146143e1578083115b15612dc357620100007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff6002541617600255601f6040602060c4825161413e838261351f565b5f81527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0845195869485937f128acb08000000000000000000000000000000000000000000000000000000008552306004860152898c1160248601526001604486015289606486015260a0608486015280519182918260a4880152018686015e5f858286010152011681010301815f875af18015612db8575f915f916143a6575b5060e06004947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff60025416600255604051958680927f3850c7bd0000000000000000000000000000000000000000000000000000000082525afa938415612db8575f9461437f575b506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166001600160a01b037f0000000000000000000000004ea9f33d29241be48113e0a36994048fe13b8b7f161091825f146143785780925b156143705750915b5f8212908115614365575b811561435b575b8115614347575b5061430b5750507faf91acae8cebde19f9f263139bf036da9ab839c69b84926c9973a356642aac3a916001600160a01b036040928351928352166020820152a1565b6001600160a01b0393507ffbe31726000000000000000000000000000000000000000000000000000000005f526004526024521660445260645ffd5b90506001600160a01b03841614155f6142c9565b5f841391506142c2565b6001831391506142bb565b9050916142b0565b81926142a8565b61439991945060e03d60e011612aca57612ab5818361351f565b505050505050925f614247565b9150506040813d6040116143d9575b816143c26040938361351f565b8101031261056557805160209091015160e06141df565b3d91506143b5565b8083106140f8565b61440391925060e03d60e011612aca57612ab5818361351f565b505050505050905f61408c565b9061441c5f82846146cd565b15614425575050565b61442f8183614734565b1561447c575f61443f91836147ac565b156144475750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b6001600160a01b03827f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b91906144be8282856146cd565b156144c857505050565b6144d28184614734565b156144e2579061443f91836147ac565b6001600160a01b03837f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b916001600160a01b03604051927fa9059cbb000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180865af19060015f5114821615614571575b604052156144475750565b90600181151661458957823b15153d15161690614566565b503d5f823e3d90fd5b81156146c9576001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166001600160a01b038216145f146146c457505f5b61ffff7f0000000000000000000000000000000000000000000000000000000000001d4c1680830290838204036133f2576127109004916103e881028181046103e8036133f2577f5939c36cb55f8b94a7113ab500fb68d63b0fbda91f27335c607b2ff520a87282926001600160a01b0361466360609461465e6127108996049889926133e5565b6133e5565b911694855f52600360205260405f2061467d84825461341f565b9055855f52600560205260405f2061469682825461341f565b9055855f52600460205260405f206146af83825461341f565b905560405192835260208301526040820152a2565b6145d6565b5050565b92916001600160a01b03604051927f095ea7b3000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180875af19260015f5114841615614723575b50604052565b3d15903b151516909216915f61471d565b91906001600160a01b03604051917f095ea7b3000000000000000000000000000000000000000000000000000000005f52166004525f60245260205f60448180875af19260015f511484161561478a5750604052565b600184929415166147a3573b15153d151616915f61471d565b833d5f823e3d90fd5b92916001600160a01b03604051927f095ea7b3000000000000000000000000000000000000000000000000000000005f521660045260245260205f60448180875af19260015f511484161561478a5750604052565b916001600160a01b0361364c93614826938281168383161161482b575b0316906148d5565b6149ef565b9061481e565b916148269161364c936001600160a01b0382166001600160a01b03821611614874575b6001600160a01b039061486b82841683831661487a565b9203169161496f565b90614854565b90808202915f19828209918380841093039280840393846c01000000000000000000000000111561056557146148cc576c01000000000000000000000000910990828211900360a01b910360601c1790565b50505060601c90565b908160601b905f196c010000000000000000000000008409928280851094039380850394858411156105655714614968576c0100000000000000000000000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b91818302915f198185099383808610950394808603958685111561056557146149e7579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b906fffffffffffffffffffffffffffffffff8216809203614a0c57565b7f93dafdf1000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212207140fe81834c0d3b5bbb46af0e2907922f578bebc516cbfcc37177285a8477c564736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
WETH (WETH) | WETH | 0.002750 | $1,900.09 | $5.23 |
| UntilDeathDefeatIsPsychological (MENTAL) | MENTAL | 200,238,157.945360 | — | — |
| SushiSwap V3 Positions NFT-V1 (SUSHI-V3-POS) | SUSHI-V3-POS | 1 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xf6035c…3802da | 26 days agoWed, 22 Jul 2026 17:15:40 UTC | 0xbc549b…be12 | [0] 0x000000000000…8bfc3a74 [1] 0x000000000000…00000000 data: 0x000000000000000000…00000002 |
| 0x6d4431…7bc34d | 26 days agoWed, 22 Jul 2026 17:15:35 UTC | 0x5939c3…7282 | [0] 0x000000000000…00000000 data: 0x000000000000000000…61c76681 |
| 0x77cec4…cffc69 | 27 days agoTue, 21 Jul 2026 16:24:48 UTC | 0xbc549b…be12 | [0] 0x000000000000…8bfc3a74 [1] 0x000000000000…e13b8b7f data: 0x000000000000000000…00000002 |
| 0xe98565…f3898f | 27 days agoTue, 21 Jul 2026 16:24:43 UTC | 0x112d0b…364b | [0] 0x000000000000…e13b8b7f data: 0x000000000000000000…ca8474b8 |
| 0x39e296…ecbeaa | 27 days agoTue, 21 Jul 2026 16:24:35 UTC | 0xbc549b…be12 | [0] 0x000000000000…8bfc3a74 [1] 0x000000000000…00000000 data: 0x000000000000000000…00000002 |
| 0xa56eef…5ff2ae | 27 days agoTue, 21 Jul 2026 16:24:26 UTC | 0x112d0b…364b | [0] 0x000000000000…00000000 data: 0x000000000000000000…c360c9bf |
| 0x1e6652…d9f698 | 27 days agoTue, 21 Jul 2026 16:24:17 UTC | 0x5939c3…7282 | [0] 0x000000000000…e13b8b7f data: 0x000000000000000000…afc6af16 |
| 0x1e6652…d9f698 | 27 days agoTue, 21 Jul 2026 16:24:17 UTC | 0x5939c3…7282 | [0] 0x000000000000…00000000 data: 0x000000000000000000…a5112ea1 |
| 0x93a7f8…aedbac | 28 days agoTue, 21 Jul 2026 01:30:08 UTC | 0x3134ed…67e4 | [0] 0x000000000000…00000382 [1] 0x000000000000…c3c3a613 data: 0x000000000000000000…0002d8e8 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf6035c…3802da | claimTreasury | 16,597,481 | 26 days agoWed, 22 Jul 2026 17:15:40 UTC | 0x4cb8…6076 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00000558 | |
| 0x6d4431…7bc34d | collectAndAccrue | 16,597,437 | 26 days agoWed, 22 Jul 2026 17:15:35 UTC | 0x4cb8…6076 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00001500 | |
| 0x77cec4…cffc69 | claimTreasury | 15,704,673 | 27 days agoTue, 21 Jul 2026 16:24:48 UTC | 0x7f5f…cac6 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00000393 | |
| 0xe98565…f3898f | releaseReferralReserve | 15,704,618 | 27 days agoTue, 21 Jul 2026 16:24:43 UTC | 0x7f5f…cac6 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00000199 | |
| 0x39e296…ecbeaa | claimTreasury | 15,704,537 | 27 days agoTue, 21 Jul 2026 16:24:35 UTC | 0x7f5f…cac6 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00000441 | |
| 0xa56eef…5ff2ae | releaseReferralReserve | 15,704,454 | 27 days agoTue, 21 Jul 2026 16:24:26 UTC | 0x7f5f…cac6 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00000199 | |
| 0x1e6652…d9f698 | collectAndAccrue | 15,704,367 | 27 days agoTue, 21 Jul 2026 16:24:17 UTC | 0x7f5f…cac6 | IN | SushiV3LaunchVault | $0.000 ETH | 0.00002407 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf6035ce0…3802da | Transfer | 16,597,481 | 26 days agoWed, 22 Jul 2026 17:15:40 UTC | 0x54dd…ff64 | OUT | 0x0000…0000 | 0.000000 WETH | WETH (WETH) | |
| 0x6d44319b…7bc34d | Transfer | 16,597,437 | 26 days agoWed, 22 Jul 2026 17:15:35 UTC | 0x3109…a613 | IN | 0x54dd…ff64 | 0.000000 WETH | WETH (WETH) | |
| 0x77cec423…cffc69 | Transfer | 15,704,673 | 27 days agoTue, 21 Jul 2026 16:24:48 UTC | 0x54dd…ff64 | OUT | 0x23a0…3a74 | 79,385.981786 MENTAL | UntilDeathDefeatIsPsychological (MENTAL) | |
| 0x39e296e5…ecbeaa | Transfer | 15,704,537 | 27 days agoTue, 21 Jul 2026 16:24:35 UTC | 0x54dd…ff64 | OUT | 0x0000…0000 | 0.000916 WETH | WETH (WETH) | |
| 0x1e665201…d9f698 | Transfer | 15,704,367 | 27 days agoTue, 21 Jul 2026 16:24:17 UTC | 0x3109…a613 | IN | 0x54dd…ff64 | 317,543.927147 MENTAL | UntilDeathDefeatIsPsychological (MENTAL) | |
| 0x1e665201…d9f698 | Transfer | 15,704,367 | 27 days agoTue, 21 Jul 2026 16:24:17 UTC | 0x3109…a613 | IN | 0x54dd…ff64 | 0.003667 WETH | WETH (WETH) | |
| 0x93a7f85b…aedbac | Transfer | 15,169,211 | 28 days agoTue, 21 Jul 2026 01:30:08 UTC | 0x8c87…9ca9 | IN | 0x54dd…ff64 | 0.000000 MENTAL | UntilDeathDefeatIsPsychological (MENTAL) | |
| 0x93a7f85b…aedbac | Transfer | 15,169,211 | 28 days agoTue, 21 Jul 2026 01:30:08 UTC | 0x8c87…9ca9 | IN | 0x54dd…ff64 | 200,000,000.000000 MENTAL | UntilDeathDefeatIsPsychological (MENTAL) |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x93a7f85b…aedbac | Transfer | 15,169,211 | 28 days agoTue, 21 Jul 2026 01:30:08 UTC | 0x0000…0000 | IN | 0x54dd…ff64 | Mint | SushiSwap V3 Positions NFT-V1 (SUSHI-V3-POS) #898 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 16,597,481 | 26 days agoWed, 22 Jul 2026 17:15:40 UTC | 0xf6035c…3802da | CALL | claimTreasury | 0x54dd…ff64 | OUT | 0x23a0…3a74 | 0.00000 ETH |
| 16,597,481 | 26 days agoWed, 22 Jul 2026 17:15:40 UTC | 0xf6035c…3802da | CALL | claimTreasury | 0x0bd7…ad73 | IN | 0x54dd…ff64 | 0.00000 ETH |
| 15,704,537 | 27 days agoTue, 21 Jul 2026 16:24:35 UTC | 0x39e296…ecbeaa | CALL | claimTreasury | 0x54dd…ff64 | OUT | 0x23a0…3a74 | 0.00091 ETH |
| 15,704,537 | 27 days agoTue, 21 Jul 2026 16:24:35 UTC | 0x39e296…ecbeaa | CALL | claimTreasury | 0x0bd7…ad73 | IN | 0x54dd…ff64 | 0.00091 ETH |
| 15,169,211 | 28 days agoTue, 21 Jul 2026 01:30:08 UTC | 0x93a7f8…aedbac | CREATE | launch | 0x6af9…8e3a | IN | 0x54dd…ff64 | 0 ETH |