| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Wrapped Small ETH (WETH) | WETH | 14 | $1,896.03 | $26,544.42 |
| Global Dollar (USDG) | USDG | 28 | $1 | $28 |
| United States Dollar Electronic (USDe) | USDe | 26 | $1 | $26 |
| global dollar (USDG) | USDG | 20 | $1 | $20 |
| UStates of Dollars Globals (USDG) | USDG | 17 | $1 | $17 |
| Global Dollar (USDG) | USDG | 8 | $1 | $8 |
| Global Dollar (USDG) | USDG | 5 | $1 | $5 |
| Global Dollar (USDG) | USDG | 3.362 | $1 | $3.36 |
| up Position NFT (UP-POS) | UP-POS | 125 | — | — |
| 牛来 (牛来) | 牛来 | 40 | — | — |
| Z (Z) | Z | 15 | — | — |
| ZygoSwap (ZSWAP) | ZSWAP | 15 | — | — |
| THE CHOSEN FROG (PEPE) | PEPE | 15 | — | — |
| Hoodcat (Hoodcat) | Hoodcat | 15 | — | — |
| Cash Cat (CASHCAT) | CASHCAT | 15 | — | — |
| Peeko The Meerkat (PEEKO) | PEEKO | 15 | — | — |
| Shibinhood (WOOF) | WOOF | 15 | — | — |
| Beat Coin (BTC) | BTC | 10 | — | — |
| Wolf Pack (PACK) | PACK | 10 | — | — |
| Wojak in Hood (HOJAK) | HOJAK | 7 | — | — |
| StonkBroker (STONKBROKER) | STONKBROKER | 7 | — | — |
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/SafeCast.sol";
import "../StonkLockerOwnershipNFT.sol";
import "./interfaces/IStonkUpLocker.sol";
import "./interfaces/IUpSlipstream.sol";
/// @title StonkUpLockerCL
/// @notice Safety Deposit Box locker for up33 (up.) Slipstream concentrated
/// liquidity position NFTs, with opt-in gauge staking while locked.
///
/// Lock windows and fee modes mirror `StonkLiquidityLocker` exactly, so the
/// three lock styles the box already sells are expressed the same way:
/// - permanent startUnlock = 2^64-2, finishUnlock = 2^64-1
/// - hard lock startUnlock = now + d, finishUnlock = start + 600
/// - linear vesting startUnlock = now, finishUnlock = start + d
///
/// STAKING. up33 gauges are custodial: `deposit` demands the caller be
/// `ownerOf` the NFT and `withdraw` returns it to the depositor only. This
/// locker therefore becomes the staker of record, which is precisely the
/// property that keeps a locked position locked — the gauge will hand the NFT
/// back to nobody but this contract, and this contract only releases it when
/// the lock window says so.
///
/// The economics are a genuine either/or imposed by up33, not by us: a STAKED
/// position earns UP emissions and zero swap fees (they are routed to the
/// pool's voters), while an UNSTAKED position earns swap fees less the pool's
/// `unstakedFee` levy. Callers choose per lock, at any time, as often as they
/// like.
contract StonkUpLockerCL is Ownable, IERC721Receiver, ReentrancyGuard, IStonkUpLocker {
using SafeERC20 for IERC20;
using SafeCast for uint256;
uint256 private constant BPS = 10_000;
uint256 private constant UPFRONT_BPS = 50; // 0.5%
uint256 private constant WITHDRAW_BPS = 100; // 1%
uint256 private constant COLLECT_BPS = 2_000; // 20%
IUpNonfungiblePositionManager public immutable positionManager;
IUpCLFactory public immutable clFactory;
IUpVoter public immutable voter;
StonkLockerOwnershipNFT public immutable lockNft;
address public protocolFeeRecipient;
mapping(address => bool) public feeExempt;
struct CLLock {
uint256 positionTokenId;
uint256 lockTokenId;
address token0;
address token1;
int24 tickSpacing;
uint128 initialLiquidity;
uint128 withdrawnLiquidity;
uint64 startUnlock;
uint64 finishUnlock;
FeeMode feeMode;
bool closed;
/// @dev Non-zero exactly while the position is escrowed in a gauge.
address gauge;
}
mapping(uint256 => CLLock) public lockPositions;
mapping(uint256 => uint256) public positionToLockTokenId;
/// @dev Set only for the duration of `gauge.withdraw()`, which returns the
/// position via `safeTransferFrom` and would otherwise look like a brand
/// new lock deposit to `onERC721Received`.
uint256 private _gaugeReturn;
error InvalidLockWindow();
error InvalidMode();
error NotLockOwner();
error UnknownLock();
error PositionAlreadyLocked();
error BadPositionSender();
error ProtocolRecipientZero();
error ZeroLiquidity();
error LiquidityExceedsUnlocked();
error NotClosed();
error UnknownPool();
error NoGauge();
error GaugeNotAlive();
error PositionStaked();
error PositionNotStaked();
error GaugeReturnFailed();
error GaugeDepositFailed();
event ProtocolFeeRecipientUpdated(address indexed oldRecipient, address indexed newRecipient);
event FeeExemptUpdated(address indexed wallet, bool exempt);
event PositionLocked(
uint256 indexed positionTokenId,
uint256 indexed lockTokenId,
address indexed owner,
uint64 startUnlock,
uint64 finishUnlock,
FeeMode feeMode,
uint128 initialLiquidity
);
event LockFeesCollected(
uint256 indexed lockTokenId,
uint256 userAmount0,
uint256 userAmount1,
uint256 protocolAmount0,
uint256 protocolAmount1
);
event LockLiquidityDecreased(
uint256 indexed lockTokenId,
uint128 liquidity,
uint256 userAmount0,
uint256 userAmount1,
uint256 protocolAmount0,
uint256 protocolAmount1
);
event PositionReleased(uint256 indexed lockTokenId, uint256 indexed positionTokenId, address indexed owner);
event PositionStakedInGauge(uint256 indexed lockTokenId, address indexed gauge, uint256 indexed positionTokenId);
event PositionUnstakedFromGauge(
uint256 indexed lockTokenId, address indexed gauge, uint256 indexed positionTokenId
);
/// @dev Emitted once per distinct token moved by a staking-path payout.
/// Staking paths can move token0, token1 and the gauge reward token at
/// once, and the reward token may alias one of the pair, so amounts are
/// reported per token rather than as a fixed pair.
event LockTokensPaid(
uint256 indexed lockTokenId, address indexed token, uint256 userAmount, uint256 protocolAmount
);
constructor(
address initialOwner,
address _positionManager,
address _voter,
address _lockNft,
address _protocolFeeRecipient
) Ownable(initialOwner) {
require(_positionManager != address(0), "pm=0");
require(_voter != address(0), "voter=0");
require(_lockNft != address(0), "nft=0");
if (_protocolFeeRecipient == address(0)) revert ProtocolRecipientZero();
positionManager = IUpNonfungiblePositionManager(_positionManager);
clFactory = IUpCLFactory(IUpNonfungiblePositionManager(_positionManager).factory());
voter = IUpVoter(_voter);
lockNft = StonkLockerOwnershipNFT(_lockNft);
protocolFeeRecipient = _protocolFeeRecipient;
}
// ---------------------------------------------------------------- admin
function setProtocolFeeRecipient(address newRecipient) external onlyOwner {
if (newRecipient == address(0)) revert ProtocolRecipientZero();
emit ProtocolFeeRecipientUpdated(protocolFeeRecipient, newRecipient);
protocolFeeRecipient = newRecipient;
}
function setFeeExempt(address wallet, bool exempt) external onlyOwner {
require(wallet != address(0), "wallet=0");
feeExempt[wallet] = exempt;
emit FeeExemptUpdated(wallet, exempt);
}
// ----------------------------------------------------------------- lock
/// @notice Optional convenience path for UIs that would rather approve than
/// encode `safeTransferFrom` data. Registration runs inside the receive
/// hook so a failed window/pool check rolls the NFT transfer back with it
/// (same atomic pattern as `StonkLiquidityLocker`).
function lockByTransfer(uint256 positionTokenId, uint64 startUnlock, uint64 finishUnlock, FeeMode feeMode)
external
returns (uint256 lockTokenId)
{
positionManager.safeTransferFrom(
msg.sender, address(this), positionTokenId, abi.encode(startUnlock, finishUnlock, feeMode)
);
lockTokenId = positionToLockTokenId[positionTokenId];
if (lockTokenId == 0) revert UnknownLock();
}
function onERC721Received(address, address from, uint256 tokenId, bytes calldata data)
external
override
returns (bytes4)
{
if (msg.sender != address(positionManager)) revert BadPositionSender();
// A gauge handing back a position we staked. Accept it without touching
// lock state; `unstake` owns the bookkeeping for this leg.
if (_gaugeReturn == tokenId) {
if (from != lockPositions[positionToLockTokenId[tokenId]].gauge) revert BadPositionSender();
return IERC721Receiver.onERC721Received.selector;
}
// Anything else must carry lock parameters, or the NFT would be
// stranded in a contract with no lock to release it.
if (data.length == 0) revert InvalidLockWindow();
(uint64 startUnlock, uint64 finishUnlock, FeeMode feeMode) = abi.decode(data, (uint64, uint64, FeeMode));
_registerLock(from, tokenId, startUnlock, finishUnlock, feeMode);
return IERC721Receiver.onERC721Received.selector;
}
function _registerLock(address owner_, uint256 tokenId, uint64 startUnlock, uint64 finishUnlock, FeeMode feeMode)
internal
nonReentrant
returns (uint256 lockTokenId)
{
if (positionToLockTokenId[tokenId] != 0) revert PositionAlreadyLocked();
if (finishUnlock <= startUnlock || startUnlock < block.timestamp) revert InvalidLockWindow();
if (uint8(feeMode) > uint8(FeeMode.CollectTwentyPercent)) revert InvalidMode();
if (positionManager.ownerOf(tokenId) != address(this)) revert BadPositionSender();
(,, address token0, address token1, int24 tickSpacing,,, uint128 liquidity,,,,) =
positionManager.positions(tokenId);
if (liquidity == 0) revert ZeroLiquidity();
// Resolve through the factory: Slipstream pools are EIP-1167 clones, so
// the Uniswap V3 init-code-hash derivation would compute garbage.
address pool = clFactory.getPool(token0, token1, tickSpacing);
if (pool == address(0) || !clFactory.isPool(pool)) revert UnknownPool();
lockTokenId = lockNft.mint(owner_);
positionToLockTokenId[tokenId] = lockTokenId;
lockPositions[lockTokenId] = CLLock({
positionTokenId: tokenId,
lockTokenId: lockTokenId,
token0: token0,
token1: token1,
tickSpacing: tickSpacing,
initialLiquidity: liquidity,
withdrawnLiquidity: 0,
startUnlock: startUnlock,
finishUnlock: finishUnlock,
feeMode: feeMode,
closed: false,
gauge: address(0)
});
if (feeMode == FeeMode.UpfrontHalfPercent && !feeExempt[owner_]) {
_chargeUpfront(lockTokenId, liquidity);
}
// Emit the post-fee principal so the event matches stored state (and V2).
emit PositionLocked(
tokenId, lockTokenId, owner_, startUnlock, finishUnlock, feeMode, lockPositions[lockTokenId].initialLiquidity
);
}
// ------------------------------------------------------------- yield
/// @notice Collect accrued swap fees. Only meaningful while unstaked — a
/// staked position's swap fees belong to the pool's voters, and the NFPM
/// would reject us anyway since the gauge is the owner.
function collectFees(uint256 lockTokenId, uint128 amount0Max, uint128 amount1Max)
external
nonReentrant
returns (uint256 userAmount0, uint256 userAmount1, uint256 protocolAmount0, uint256 protocolAmount1)
{
CLLock storage p = _ownedLock(lockTokenId);
if (p.gauge != address(0)) revert PositionStaked();
// Pay the realized balance delta, never the NFPM return values — a
// fee-on-transfer / deflationary pair token would otherwise make the
// subsequent transfers revert and brick the lock (see audit H-1).
uint256 before0 = IERC20(p.token0).balanceOf(address(this));
uint256 before1 = IERC20(p.token1).balanceOf(address(this));
positionManager.collect(
IUpNonfungiblePositionManager.CollectParams({
tokenId: p.positionTokenId,
recipient: address(this),
amount0Max: amount0Max == 0 ? type(uint128).max : amount0Max,
amount1Max: amount1Max == 0 ? type(uint128).max : amount1Max
})
);
uint256 gross0 = IERC20(p.token0).balanceOf(address(this)) - before0;
uint256 gross1 = IERC20(p.token1).balanceOf(address(this)) - before1;
(userAmount0, userAmount1, protocolAmount0, protocolAmount1) =
_payPair(p.token0, p.token1, gross0, gross1, _yieldCutBps(p.feeMode, msg.sender));
emit LockFeesCollected(lockTokenId, userAmount0, userAmount1, protocolAmount0, protocolAmount1);
}
// ------------------------------------------------------------- staking
/// @notice Stake the locked position into its pool's up33 gauge to earn UP
/// emissions. Any swap fees the position had accrued are swept out by the
/// gauge on deposit and paid to the caller here.
function stake(uint256 lockTokenId) external nonReentrant returns (address gauge) {
CLLock storage p = _ownedLock(lockTokenId);
if (p.gauge != address(0)) revert PositionStaked();
address pool = clFactory.getPool(p.token0, p.token1, p.tickSpacing);
if (pool == address(0)) revert UnknownPool();
gauge = voter.gauges(pool);
if (gauge == address(0) || !voter.isGauge(gauge)) revert NoGauge();
if (!voter.isAlive(gauge)) revert GaugeNotAlive();
address[] memory toks = _yieldTokens(p.token0, p.token1, IUpCLGauge(gauge).rewardToken());
uint256[] memory before = _balances(toks);
// The gauge calls `nft.collect` and `nft.safeTransferFrom` on our behalf.
positionManager.approve(gauge, p.positionTokenId);
IUpCLGauge(gauge).deposit(p.positionTokenId);
if (positionManager.ownerOf(p.positionTokenId) != gauge) revert GaugeDepositFailed();
// OZ `_transfer` clears the approval; belt-and-braces in case a future
// gauge generation takes custody another way.
if (positionManager.getApproved(p.positionTokenId) != address(0)) {
positionManager.approve(address(0), p.positionTokenId);
}
p.gauge = gauge;
_payoutDeltas(lockTokenId, p.feeMode, toks, before);
emit PositionStakedInGauge(lockTokenId, gauge, p.positionTokenId);
}
/// @notice Pull the position back out of its gauge. Sweeps both the accrued
/// UP emissions and any swap fees the gauge settles on withdrawal.
function unstake(uint256 lockTokenId) external nonReentrant {
CLLock storage p = _ownedLock(lockTokenId);
address gauge = p.gauge;
if (gauge == address(0)) revert PositionNotStaked();
address[] memory toks = _yieldTokens(p.token0, p.token1, IUpCLGauge(gauge).rewardToken());
uint256[] memory before = _balances(toks);
_gaugeReturn = p.positionTokenId;
IUpCLGauge(gauge).withdraw(p.positionTokenId);
_gaugeReturn = 0;
if (positionManager.ownerOf(p.positionTokenId) != address(this)) revert GaugeReturnFailed();
p.gauge = address(0);
_payoutDeltas(lockTokenId, p.feeMode, toks, before);
emit PositionUnstakedFromGauge(lockTokenId, gauge, p.positionTokenId);
}
/// @notice Claim UP emissions without unstaking.
function claimEmissions(uint256 lockTokenId) external nonReentrant {
CLLock storage p = _ownedLock(lockTokenId);
address gauge = p.gauge;
if (gauge == address(0)) revert PositionNotStaked();
address[] memory toks = _yieldTokens(p.token0, p.token1, IUpCLGauge(gauge).rewardToken());
uint256[] memory before = _balances(toks);
IUpCLGauge(gauge).getReward(p.positionTokenId);
_payoutDeltas(lockTokenId, p.feeMode, toks, before);
}
// ------------------------------------------------------------ withdraw
function decreaseLockedLiquidity(uint256 lockTokenId, uint128 liquidity, uint256 amount0Min, uint256 amount1Min)
external
nonReentrant
returns (uint256 userAmount0, uint256 userAmount1, uint256 protocolAmount0, uint256 protocolAmount1)
{
if (liquidity == 0) revert ZeroLiquidity();
CLLock storage p = _ownedLock(lockTokenId);
if (p.gauge != address(0)) revert PositionStaked();
uint128 maxLiquidity = withdrawableLiquidity(lockTokenId);
if (liquidity > maxLiquidity) revert LiquidityExceedsUnlocked();
uint256 before0 = IERC20(p.token0).balanceOf(address(this));
uint256 before1 = IERC20(p.token1).balanceOf(address(this));
(uint256 reported0, uint256 reported1) = positionManager.decreaseLiquidity(
IUpNonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: p.positionTokenId,
liquidity: liquidity,
amount0Min: amount0Min,
amount1Min: amount1Min,
deadline: block.timestamp + 30 minutes
})
);
// Record the burn before collect so a dust tail that yields (0, 0)
// amounts can still advance `withdrawnLiquidity` toward `canRelease`.
// The NFPM reverts a collect with both maxes at zero, so skip it then.
p.withdrawnLiquidity += liquidity;
if (reported0 > 0 || reported1 > 0) {
// Collect exactly the principal just released. Sweeping uint128.max
// here would drag accrued swap fees into this contract outside the
// fee-mode logic.
positionManager.collect(
IUpNonfungiblePositionManager.CollectParams({
tokenId: p.positionTokenId,
recipient: address(this),
amount0Max: reported0.toUint128(),
amount1Max: reported1.toUint128()
})
);
}
uint256 gross0 = IERC20(p.token0).balanceOf(address(this)) - before0;
uint256 gross1 = IERC20(p.token1).balanceOf(address(this)) - before1;
uint256 cutBps =
(p.feeMode == FeeMode.WithdrawOnePercent && !feeExempt[msg.sender]) ? WITHDRAW_BPS : 0;
(userAmount0, userAmount1, protocolAmount0, protocolAmount1) =
_payPair(p.token0, p.token1, gross0, gross1, cutBps);
emit LockLiquidityDecreased(lockTokenId, liquidity, userAmount0, userAmount1, protocolAmount0, protocolAmount1);
}
function releasePosition(uint256 lockTokenId) external nonReentrant {
CLLock storage p = _ownedLock(lockTokenId);
if (p.gauge != address(0)) revert PositionStaked();
if (!canRelease(lockTokenId)) revert NotClosed();
uint256 positionTokenId = p.positionTokenId;
delete positionToLockTokenId[positionTokenId];
p.closed = true;
lockNft.burn(lockTokenId);
positionManager.safeTransferFrom(address(this), msg.sender, positionTokenId);
emit PositionReleased(lockTokenId, positionTokenId, msg.sender);
}
// -------------------------------------------------------------- views
function withdrawableLiquidity(uint256 lockTokenId) public view returns (uint128) {
CLLock memory p = lockPositions[lockTokenId];
// The record is kept after release for history; it must not keep
// reporting a live vesting schedule once the position has gone home.
if (p.positionTokenId == 0 || p.closed) return 0;
uint128 unlocked = _unlockedLiquidity(p);
if (unlocked <= p.withdrawnLiquidity) return 0;
return unlocked - p.withdrawnLiquidity;
}
function canRelease(uint256 lockTokenId) public view returns (bool) {
CLLock memory p = lockPositions[lockTokenId];
if (p.positionTokenId == 0 || p.closed) return false;
return block.timestamp >= p.finishUnlock && p.withdrawnLiquidity >= p.initialLiquidity;
}
function isStaked(uint256 lockTokenId) external view returns (bool) {
return lockPositions[lockTokenId].gauge != address(0);
}
/// @notice Gauge for a lock's pool, or zero when the pool has none.
function gaugeFor(uint256 lockTokenId) external view returns (address) {
CLLock memory p = lockPositions[lockTokenId];
if (p.positionTokenId == 0) return address(0);
address pool = clFactory.getPool(p.token0, p.token1, p.tickSpacing);
if (pool == address(0)) return address(0);
return voter.gauges(pool);
}
/// @notice Emissions accrued to a staked lock, gross of the protocol cut.
function pendingEmissions(uint256 lockTokenId) external view returns (uint256) {
CLLock memory p = lockPositions[lockTokenId];
if (p.gauge == address(0)) return 0;
return IUpCLGauge(p.gauge).earned(address(this), p.positionTokenId);
}
// ----------------------------------------------------------- internals
function _ownedLock(uint256 lockTokenId) internal view returns (CLLock storage p) {
p = lockPositions[lockTokenId];
if (p.positionTokenId == 0 || p.closed) revert UnknownLock();
if (lockNft.ownerOf(lockTokenId) != msg.sender) revert NotLockOwner();
}
/// @dev Cut applied to yield (swap fees and gauge emissions alike). Because
/// the rate is identical for both, a reward token that aliases token0/token1
/// can be paid out from a single combined balance delta with no error.
function _yieldCutBps(FeeMode feeMode, address actor) internal view returns (uint256) {
if (feeExempt[actor]) return 0;
return feeMode == FeeMode.CollectTwentyPercent ? COLLECT_BPS : 0;
}
/// @dev token0/token1/rewardToken, deduplicated and zero-filtered.
function _yieldTokens(address token0, address token1, address reward)
internal
pure
returns (address[] memory toks)
{
bool addReward = reward != address(0) && reward != token0 && reward != token1;
toks = new address[](addReward ? 3 : 2);
toks[0] = token0;
toks[1] = token1;
if (addReward) toks[2] = reward;
}
function _balances(address[] memory toks) internal view returns (uint256[] memory out) {
out = new uint256[](toks.length);
for (uint256 i = 0; i < toks.length; i++) {
out[i] = IERC20(toks[i]).balanceOf(address(this));
}
}
/// @dev Pays every positive balance delta to the lock owner net of the
/// mode's yield cut. Deltas are used rather than call return values because
/// the gauge performs collects and reward transfers internally.
function _payoutDeltas(uint256 lockTokenId, FeeMode feeMode, address[] memory toks, uint256[] memory before)
internal
{
uint256 bps = _yieldCutBps(feeMode, msg.sender);
address recipient = protocolFeeRecipient;
for (uint256 i = 0; i < toks.length; i++) {
uint256 gross = IERC20(toks[i]).balanceOf(address(this)) - before[i];
if (gross == 0) continue;
uint256 protocolAmount = bps == 0 ? 0 : (gross * bps) / BPS;
uint256 userAmount = gross - protocolAmount;
if (protocolAmount > 0) IERC20(toks[i]).safeTransfer(recipient, protocolAmount);
if (userAmount > 0) IERC20(toks[i]).safeTransfer(msg.sender, userAmount);
emit LockTokensPaid(lockTokenId, toks[i], userAmount, protocolAmount);
}
}
function _unlockedLiquidity(CLLock memory p) internal view returns (uint128) {
if (block.timestamp <= p.startUnlock) return 0;
if (block.timestamp >= p.finishUnlock) return p.initialLiquidity;
uint256 duration = uint256(p.finishUnlock) - uint256(p.startUnlock);
uint256 elapsed = block.timestamp - uint256(p.startUnlock);
return uint128((uint256(p.initialLiquidity) * elapsed) / duration);
}
function _chargeUpfront(uint256 lockTokenId, uint128 liquidity) internal {
CLLock storage p = lockPositions[lockTokenId];
uint128 feeLiquidity = uint128((uint256(liquidity) * UPFRONT_BPS) / BPS);
if (feeLiquidity == 0) return;
uint256 before0 = IERC20(p.token0).balanceOf(address(this));
uint256 before1 = IERC20(p.token1).balanceOf(address(this));
(uint256 reported0, uint256 reported1) = positionManager.decreaseLiquidity(
IUpNonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: p.positionTokenId,
liquidity: feeLiquidity,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp + 30 minutes
})
);
// Always reduce principal by the liquidity burned. A zero-amount burn
// (tiny position, both legs round to 0) is "no fee tokens", not failure.
p.initialLiquidity -= feeLiquidity;
if (reported0 > 0 || reported1 > 0) {
positionManager.collect(
IUpNonfungiblePositionManager.CollectParams({
tokenId: p.positionTokenId,
recipient: address(this),
amount0Max: reported0.toUint128(),
amount1Max: reported1.toUint128()
})
);
}
uint256 got0 = IERC20(p.token0).balanceOf(address(this)) - before0;
uint256 got1 = IERC20(p.token1).balanceOf(address(this)) - before1;
if (got0 > 0) IERC20(p.token0).safeTransfer(protocolFeeRecipient, got0);
if (got1 > 0) IERC20(p.token1).safeTransfer(protocolFeeRecipient, got1);
}
/// @dev Split a realized (token0, token1) balance delta between the caller
/// and the protocol fee recipient. Amounts are what the locker actually
/// holds, so fee-on-transfer tokens cannot brick the payout.
function _payPair(address token0, address token1, uint256 gross0, uint256 gross1, uint256 bps)
internal
returns (uint256 user0, uint256 user1, uint256 protocol0, uint256 protocol1)
{
protocol0 = bps == 0 ? 0 : (gross0 * bps) / BPS;
protocol1 = bps == 0 ? 0 : (gross1 * bps) / BPS;
user0 = gross0 - protocol0;
user1 = gross1 - protocol1;
if (protocol0 > 0) IERC20(token0).safeTransfer(protocolFeeRecipient, protocol0);
if (protocol1 > 0) IERC20(token1).safeTransfer(protocolFeeRecipient, protocol1);
if (user0 > 0) IERC20(token0).safeTransfer(msg.sender, user0);
if (user1 > 0) IERC20(token1).safeTransfer(msg.sender, user1);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "initialOwner",
"type": "address",
"internalType": "address"
},
{
"name": "_positionManager",
"type": "address",
"internalType": "address"
},
{
"name": "_voter",
"type": "address",
"internalType": "address"
},
{
"name": "_lockNft",
"type": "address",
"internalType": "address"
},
{
"name": "_protocolFeeRecipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadPositionSender",
"type": "error",
"inputs": []
},
{
"name": "GaugeDepositFailed",
"type": "error",
"inputs": []
},
{
"name": "GaugeNotAlive",
"type": "error",
"inputs": []
},
{
"name": "GaugeReturnFailed",
"type": "error",
"inputs": []
},
{
"name": "InvalidLockWindow",
"type": "error",
"inputs": []
},
{
"name": "InvalidMode",
"type": "error",
"inputs": []
},
{
"name": "LiquidityExceedsUnlocked",
"type": "error",
"inputs": []
},
{
"name": "NoGauge",
"type": "error",
"inputs": []
},
{
"name": "NotClosed",
"type": "error",
"inputs": []
},
{
"name": "NotLockOwner",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PositionAlreadyLocked",
"type": "error",
"inputs": []
},
{
"name": "PositionNotStaked",
"type": "error",
"inputs": []
},
{
"name": "PositionStaked",
"type": "error",
"inputs": []
},
{
"name": "ProtocolRecipientZero",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeCastOverflowedUintDowncast",
"type": "error",
"inputs": [
{
"name": "bits",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "UnknownLock",
"type": "error",
"inputs": []
},
{
"name": "UnknownPool",
"type": "error",
"inputs": []
},
{
"name": "ZeroLiquidity",
"type": "error",
"inputs": []
},
{
"name": "FeeExemptUpdated",
"type": "event",
"inputs": [
{
"name": "wallet",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "exempt",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "LockFeesCollected",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "userAmount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "userAmount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolAmount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolAmount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LockLiquidityDecreased",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "userAmount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "userAmount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolAmount0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolAmount1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LockTokensPaid",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "userAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PositionLocked",
"type": "event",
"inputs": [
{
"name": "positionTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "startUnlock",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "finishUnlock",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "feeMode",
"type": "uint8",
"indexed": false,
"internalType": "enum IStonkUpLocker.FeeMode"
},
{
"name": "initialLiquidity",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "PositionReleased",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "positionTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PositionStakedInGauge",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "gauge",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "positionTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PositionUnstakedFromGauge",
"type": "event",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "gauge",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "positionTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ProtocolFeeRecipientUpdated",
"type": "event",
"inputs": [
{
"name": "oldRecipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newRecipient",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "canRelease",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "clFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUpCLFactory"
}
],
"stateMutability": "view"
},
{
"name": "claimEmissions",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "collectFees",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount0Max",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "amount1Max",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [
{
"name": "userAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "userAmount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "protocolAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "protocolAmount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "decreaseLockedLiquidity",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "amount0Min",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1Min",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "userAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "userAmount1",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "protocolAmount0",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "protocolAmount1",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "feeExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "gaugeFor",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isStaked",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "lockByTransfer",
"type": "function",
"inputs": [
{
"name": "positionTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "startUnlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "finishUnlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "feeMode",
"type": "uint8",
"internalType": "enum IStonkUpLocker.FeeMode"
}
],
"outputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "lockNft",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract StonkLockerOwnershipNFT"
}
],
"stateMutability": "view"
},
{
"name": "lockPositions",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "positionTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "token0",
"type": "address",
"internalType": "address"
},
{
"name": "token1",
"type": "address",
"internalType": "address"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "initialLiquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "withdrawnLiquidity",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "startUnlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "finishUnlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "feeMode",
"type": "uint8",
"internalType": "enum IStonkUpLocker.FeeMode"
},
{
"name": "closed",
"type": "bool",
"internalType": "bool"
},
{
"name": "gauge",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "onERC721Received",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingEmissions",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUpNonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "positionToLockTokenId",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolFeeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "releasePosition",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeExempt",
"type": "function",
"inputs": [
{
"name": "wallet",
"type": "address",
"internalType": "address"
},
{
"name": "exempt",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolFeeRecipient",
"type": "function",
"inputs": [
{
"name": "newRecipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stake",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "gauge",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unstake",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "voter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUpVoter"
}
],
"stateMutability": "view"
},
{
"name": "withdrawableLiquidity",
"type": "function",
"inputs": [
{
"name": "lockTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
}
]0x610100604090808252346200030a5760a08162003b9f80380380916200002682856200030f565b8339810103126200030a576200003c8162000349565b60206200004b81840162000349565b926200005985820162000349565b926200007660806200006e6060850162000349565b930162000349565b6001600160a01b03918216949093908515620002f257600080546001600160a01b0319808216891783558a51999098929392869283167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a36001805516978815620002ca575083169384156200029c578316948515620002705783169687156200025f579082826004936080528a519384809263c45a015560e01b82525afa928315620002535781936200020f575b5050501660a05260c05260e05260025416176002555161384090816200035f8239608051818181610482015281816109010152818161095f01528181610a0001528181610a6701528181610b3301528181610b8501528181610f500152818161104b015281816111be015281816114780152818161172501528181611afc01528181611e24015261343f015260a051818181610205015281816107c501528181611fa001528181612361015261274e015260c0518181816108250152818161187001526127a5015260e051818181610e2a01528181610ff3015281816120210152612d310152f35b9091809350813d83116200024b575b6200022a81836200030f565b810103126200024857506200023f9062000349565b38808062000127565b80fd5b503d6200021e565b508851903d90823e3d90fd5b88516318060c7960e01b8152600490fd5b885162461bcd60e51b815260048101849052600560248201526406e66743d360dc1b6044820152606490fd5b885162461bcd60e51b81526004810184905260076024820152660766f7465723d360cc1b6044820152606490fd5b62461bcd60e51b815260048082018590526024820152630706d3d360e41b6044820152606490fd5b8751631e4fbdf760e01b815260006004820152602490fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200033357604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200030a5756fe6080604052600436101561001257600080fd5b6000803560e01c8063150b7a0214611d335780631765509014611c6157806319338d3a14611c305780632e17de7814611a1e57806330acef73146118de578063398daa851461189f57806346c96aac1461185a5780634940566c1461132657806364df049e146112fd578063670a43ca146112d35780636a57a6151461116e578063715018a61461111457806374ee772414610f7f578063791b98bc14610f3a5780638da5cb5b14610f135780638ebfc79614610e595780639c5bfeae14610e14578063a694fc3a1461073c578063b14d3ec514610347578063b2f70e961461031e578063baa51f86146102e6578063c9341edb146102b6578063e521cb9214610234578063e74f6166146101ef578063f2fde38b146101645763fc2fff861461013b57600080fd5b34610161576020366003190112610161576020610159600435612b75565b604051908152f35b80fd5b50346101615760203660031901126101615761017e611dbd565b610186613281565b6001600160a01b039081169081156101d657600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b604051631e4fbdf760e01b815260048101849052602490fd5b50346101615780600319360112610161576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101615760203660031901126101615761024e611dbd565b610256613281565b6001600160a01b039081169081156102a457816002549182167fd3890fc76afcfc31cba1dcf2c27b50e2541e4d75039c981855b5b5e03682aea08580a36001600160a01b0319161760025580f35b6040516318060c7960e01b8152600490fd5b50346101615760203660031901126101615760206102d5600435612a69565b6001600160801b0360405191168152f35b5034610161576020366003190112610161576020906004358152600482526006604060018060a01b0392200154161515604051908152f35b503461016157602036600319011261016157602061033d600435612941565b6040519015158152f35b503461016157606036600319011261016157600435610364611df6565b6001600160801b0360443516806044350361061357610381612cca565b61038a83612ced565b60068101549091906001600160a01b031661072a576002820180546040516370a0823160e01b8152306004820152969190602090889060249082906001600160a01b03165afa94851561071f5782956106ea575b6003850180546040516370a0823160e01b815230600482015299509094906020908a9060249082906001600160a01b03165afa9889156106df5784996106a9575b50855461047d926040926001600160801b03918281166106a3575081905b610699578180915b855194610451866125d8565b8552306020860152168484015216606082015281518093819263fc6f786560e01b8352600483016128c7565b0381867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156106605761066b575b50546040516370a0823160e01b81523060048201526001600160a01b0390911694602082602481895afa801561066057839061062c575b6104f89250612906565b91546040516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa91821561062057916105db575b509061055a60ff600561054c6105d79a61056099989796612906565b95015460801c1633906132ad565b93613193565b919492937f53d5968f2c4070d6fd41f8ac74ba6abeb336da7c5730caa9383551abc20aa15e604051806105ad86868b8b859094939260609260808301968352602083015260408201520152565b0390a260018055604051948594859094939260609260808301968352602083015260408201520152565b0390f35b9493929190506020853d602011610618575b816105fa6020938361260f565b810103126106135793519293919290919061055a610530565b600080fd5b3d91506105ed565b604051903d90823e3d90fd5b506020823d602011610658575b816106466020938361260f565b81010312610613576104f891516104ee565b3d9150610639565b6040513d85823e3d90fd5b61068c9060403d604011610692575b610684818361260f565b810190612874565b506104b7565b503d61067a565b8160443591610445565b9061043d565b9098506020813d6020116106d7575b816106c56020938361260f565b8101031261061357519761047d61041f565b3d91506106b8565b6040513d86823e3d90fd5b94506020873d602011610717575b816107056020938361260f565b810103126106135760249651946103de565b3d91506106f8565b6040513d84823e3d90fd5b604051636b84bfe960e11b8152600490fd5b503461016157602036600319011261016157610756612cca565b610761600435612ced565b60068101549091906001600160a01b031661072a5760028281015460038401546040516328af8d0b60e01b81526001600160a01b03928316600482018190529282166024820181905260a09290921c90930b604484015291602081806064810103817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156106df578491610dda575b506001600160a01b0316918215610dc85760405163b9a09fd560e01b815260048101939093527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602084602481845afa938415610bd2578594610d8c575b506001600160a01b038416158015610d32575b610d2057604051631703e5f960e01b81526001600160a01b038516600482015290602090829060249082905afa908115610bd2578591610cf1575b5015610cdf5760405163f7c618c160e01b8152906020826004816001600160a01b0388165afa918215610bd2578592610c9e575b506108f092612e11565b926108fa84612ec3565b81549094907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610bdd5760405163095ea7b360e01b81526001600160a01b03851660048201526024810191909152848180604481010381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610bd257908591610c8a575b505081546001600160a01b0384163b15610bdd5760405163b6b55f2560e01b815260048101919091528481602481836001600160a01b0389165af18015610bd257908591610c76575b505081546040516331a9108f60e11b8152600481018290526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610c1f578691610c3c575b506001600160a01b03858116911603610c2a5760405163020604bf60e21b8152600481018290526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610c1f578691610be1575b506001600160a01b0316610b31575b506006820180546001600160a01b0319166001600160a01b0385161790556005820154602095610ae892909160801c60ff16600435612fae565b54604051926001600160a01b03831690600435907ff5da5629ad21daaef4620653ef5113bf813977683f94ffbf1fe16c3c4a814ff09080a4600180556001600160a01b03168152f35b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610bdd5760405163095ea7b360e01b81526000600482015260248101919091528481604481837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610bd25715610aae57610bc48591612594565b610bce5738610aae565b8380fd5b6040513d87823e3d90fd5b8480fd5b90506020813d602011610c17575b81610bfc6020938361260f565b81010312610c1357610c0d90612630565b38610a9f565b8580fd5b3d9150610bef565b6040513d88823e3d90fd5b60405163d5e3128d60e01b8152600490fd5b90506020813d602011610c6e575b81610c576020938361260f565b81010312610c1357610c6890612630565b38610a38565b3d9150610c4a565b610c7f90612594565b610bce5783386109e0565b610c9390612594565b610bce578338610997565b9091506020813d602011610cd7575b81610cba6020938361260f565b81010312610bdd5790610cd06108f09392612630565b91926108e6565b3d9150610cad565b604051635ceafc1360e11b8152600490fd5b610d13915060203d602011610d19575b610d0b818361260f565b810190612929565b386108b2565b503d610d01565b60405163e569becd60e01b8152600490fd5b5060405163aa79979b60e01b81526001600160a01b0385166004820152602081602481855afa908115610c1f578691610d6d575b5015610877565b610d86915060203d602011610d1957610d0b818361260f565b38610d66565b9093506020813d602011610dc0575b81610da86020938361260f565b81010312610bdd57610db990612630565b9238610864565b3d9150610d9b565b60405163f7139e3360e01b8152600490fd5b90506020813d602011610e0c575b81610df56020938361260f565b81010312610bce57610e0690612630565b386107fd565b3d9150610de8565b50346101615780600319360112610161576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461016157604036600319011261016157610e73611dbd565b60243590811515809203610f0f57610e89613281565b6001600160a01b0316908115610edf5760207f4d5771454588f51370a8a2e7e151354b6de0dc3159b14821b4ad76bc04c28bc791838552600382526040852060ff1981541660ff8316179055604051908152a280f35b60405162461bcd60e51b8152602060048201526008602482015267077616c6c65743d360c41b6044820152606490fd5b8280fd5b5034610161578060031936011261016157546040516001600160a01b039091168152602090f35b50346101615780600319360112610161576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461016157602036600319011261016157600435610f9c612cca565b610fa581612ced565b60068101546001600160a01b0390811661072a57610fc283612941565b15611102578154808552600560208190526040862086905592909201805460ff60881b1916600160881b17905583907f00000000000000000000000000000000000000000000000000000000000000008116803b15610f0f57828091602460405180948193630852cd8d60e31b83528a60048401525af19081156106605783916110ee575b50507f000000000000000000000000000000000000000000000000000000000000000016803b156110ea57818091606460405180948193632142170760e11b83523060048401523360248401528860448401525af1801561071f576110d6575b505033917f6c2b69108c6691683495bb3a230fb2ce5b892b27607e017d4ad023e083cd712c8480a46001805580f35b6110df90612594565b610f0f5782386110a7565b5080fd5b6110f790612594565b6110ea578138611047565b6040516345a5a96f60e11b8152600490fd5b503461016157806003193601126101615761112d613281565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610161576080366003190112610161576004356024356001600160401b038082168092036106135760443590811680910361061357606435906003821015610bdd576111fa60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169260405192602095602085015260408401526060830190611dd3565b60608152611207816125d8565b813b15610bdd57918491604051938492635c46a7ef60e11b845233600485015230602485015286604485015260806064850152815191826084860152855b8381106112b9575050508360a484838383839684010152601f801991011681010301925af18015610660576112a5575b50815260056020526040902054801561129357602090604051908152f35b60405163049c91db60e41b8152600490fd5b6112af8391612594565b6110ea5738611275565b81810183015188820160a401528996508795508201611245565b50346101615760203660031901126101615760406020916004358152600583522054604051908152f35b50346101615780600319360112610161576002546040516001600160a01b039091168152602090f35b503461016157608036600319011261016157611340611df6565b611348612cca565b6001600160801b0381161561184857611362600435612ced565b60068101546001600160a01b031661072a576001600160801b03611387600435612a69565b166001600160801b038316116118365760028101546040516370a0823160e01b81523060048201529190602090839060249082906001600160a01b03165afa9182156106df578492611802575b5060038101546040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa908115610bd25785916117d0575b508154610708420142116117bc576040805161147392611430826125bd565b81526001600160801b038716602082015260443582820152606435606082015261070842016080820152815180938192630624e65f60e11b83526004830161288a565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610c1f578691879161179b575b506001600160801b038616600485015460801c016001600160801b038111611787576114f59060048601906001600160801b0382549181199060801b169116179055565b811580159061177e575b6116ef575b505060028201546040516370a0823160e01b81523060048201526001600160a01b0390911693602082602481885afa80156116e45787906116b0575b61154a9250612906565b60038301546040516370a0823160e01b815230600482015291926001600160a01b039091169190602082602481865afa9182156116a557889261166f575b5061159760059160ff93612906565b94015460801c16600381101561165b57906105d79660016115ca969594931480611644575b1561055a5750606493613193565b919492936001600160801b03604051911681528460208201528560408201528160608201528260808201527fe31f5f739c604eb9546fa0056f5ec109369870aa4d680097d2c3efb76c8c9bc060a060043592a260018055604051948594859094939260609260808301968352602083015260408201520152565b50338152600360205260ff604082205416156115bc565b634e487b7160e01b87526021600452602487fd5b91506020823d60201161169d575b8161168a6020938361260f565b8101031261061357905190611597611588565b3d915061167d565b6040513d8a823e3d90fd5b506020823d6020116116dc575b816116ca6020938361260f565b810103126106135761154a9151611540565b3d91506116bd565b6040513d89823e3d90fd5b611720916001600160801b036040928161171361170d895495613160565b92613160565b91855194610451866125d8565b0381897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610c1f57611760575b80611504565b6117789060403d60401161069257610684818361260f565b5061175a565b508015156114ff565b634e487b7160e01b88526011600452602488fd5b90506117b6915060403d60401161069257610684818361260f565b386114b1565b634e487b7160e01b86526011600452602486fd5b90506020813d6020116117fa575b816117eb6020938361260f565b81010312610613575138611411565b3d91506117de565b9091506020813d60201161182e575b8161181e6020938361260f565b81010312610613575190386113d4565b3d9150611811565b6040516357577f5960e11b8152600490fd5b604051630200e8a960e31b8152600490fd5b50346101615780600319360112610161576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101615760203660031901126101615760209060ff906040906001600160a01b036118ca611dbd565b168152600384522054166040519015158152f35b5034610161576020366003190112610161576004356118fb612cca565b61190481612ced565b600681015490916001600160a01b03918216918215611a0c576002840154600385015460405163f7c618c160e01b8152929182169116602083600481885afa9182156116e45787926119cb575b61195b9350612e11565b908461196683612ec3565b938554813b15610f0f578291602483926040519485938492631c4b774b60e01b845260048401525af1801561071f576119b7575b505060ff60056119b095015460801c1690612fae565b6001805580f35b6119c090612594565b610bdd57843861199a565b91506020833d602011611a04575b816119e66020938361260f565b81010312611a00576119fa61195b93612630565b91611951565b8680fd5b3d91506119d9565b60405163082141ff60e41b8152600490fd5b5034610161576020806003193601126110ea5760043590611a3d612cca565b611a4682612ced565b6006810180546001600160a01b03908116938415611a0c576002840154600385015460405163f7c618c160e01b815291841690841683836004818b5afa918215611bd6578a92611bf8575b611a9b9350612e11565b90611aa582612ec3565b92855480600655873b15611bf45760405190632e1a7d4d60e01b825260048201528981602481838c5af18015611bd657611be1575b50886006558554604051906331a9108f60e11b825260048201528281602481857f0000000000000000000000000000000000000000000000000000000000000000165afa928315611bd6578a93611b9a575b505030911603611b8857611b5b926001600160601b0360a01b815416905560ff600585015460801c1686612fae565b54917f43548f7388e7a2634dd544c18c43592a54f07aefed9644f0e4abde8325038ce98480a46001805580f35b60405163f93df48760e01b8152600490fd5b9080929350813d8311611bcf575b611bb2818361260f565b81010312611bcb57611bc390612630565b903880611b2c565b8880fd5b503d611ba8565b6040513d8c823e3d90fd5b611bed90999199612594565b9738611ada565b8980fd5b91508383813d8311611c29575b611c0f818361260f565b81010312611bf457611c23611a9b93612630565b91611a91565b503d611c05565b5034610161576020366003190112610161576020611c4f600435612644565b6040516001600160a01b039091168152f35b503461016157602036600319011261016157604061018091600435815260046020522080549060ff60018201549160018060a01b0390816002820154169160038201546004830154916005840154948160066001600160401b039601541697604051998a5260208a015260408901528116606088015260a01c60020b60808701526001600160801b03811660a087015260801c60c086015280821660e08601528160401c16610100850152611d1f6101208501838360801c16611dd3565b60881c161515610140830152610160820152f35b503461016157608036600319011261016157611d4d611dbd565b506024356001600160a01b03811681036110ea576064356001600160401b03928382116101615736602383011215610161578160040135938411610161573660248584010111610161576020611daa856024850160443587611e20565b6040516001600160e01b03199091168152f35b600435906001600160a01b038216820361061357565b906003821015611de05752565b634e487b7160e01b600052602160045260246000fd5b602435906001600160801b038216820361061357565b35906001600160401b038216820361061357565b91927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690338290036124b557826006541461254857801561251357846060918101031261061357611e7984611e0c565b93611e8660208201611e0c565b9360036040830135101561061357611e9c612cca565b836000526005602052604060002054612536576001600160401b0386166001600160401b03861611801590612524575b61251357600260ff60408401351611612501576040516331a9108f60e11b815260048101859052602081602481875afa908115612336576000916124c7575b50306001600160a01b03909116036124b55760405194859363133f757160e31b85528560048601528460246101809687935afa8015612336576000946000976000916000936123fb575b50506001600160801b03821615611848576040516328af8d0b60e01b81526001600160a01b03808816600483015289166024820152600282900b6044820152602081806064810103817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612336576000916123c1575b506001600160a01b03168015908115612342575b50610dc8576040516335313c2160e11b81526001600160a01b0385811660048301529098906020908a9060249082906000907f0000000000000000000000000000000000000000000000000000000000000000165af198891561233657600099612302575b508760005260056020528860406000205560405196612070886125f3565b88885289602089015260018060a01b0316604088015260018060a01b0316606087015260020b60808601526001600160801b03811660a0860152600060c08601526001600160401b03881660e08601526001600160401b0382166101008601526120e260408501356101208701612588565b6000610140860181905261016086018190528781526004602081815260409283902088518155908801516001820155918701516002830180546001600160a01b0319166001600160a01b0392831617905560608801516003840180546080808c01516001600160b81b0319909216939094169290921762ffffff60a01b60a093841b1617905588015160c089015190911b6fffffffffffffffffffffffffffffffff19166001600160801b03919091161790820155936001600160401b0360e087015116916005860154966fffffffffffffffff000000000000000061010082015160401b1693610120820151976003891015611de0577f7a5a16b84333b2656a94dfb32929b9b2b41facdc932c3cf70567b803edc92b8f996080996122b09760069460ff60881b610140880151151560881b169371ffffffffffffffffffffffffffffffffffff191617179060ff8c1b908c1b1617176005820155019061016060018060a01b03910151166001600160601b0360a01b825416179055604082013515806122df575b6122cf575b508760005260046020526001600160401b036001600160801b036004604060002001541693816040519b168b521660208a01526040808a01910135611dd3565b60608701526001600160a01b031694a460018055630a85bd0160e11b90565b6122d99089613391565b38612270565b506001600160a01b03851660009081526003602052604090205460ff161561226b565b9098506020813d60201161232e575b8161231e6020938361260f565b8101031261061357519738612052565b3d9150612311565b6040513d6000823e3d90fd5b604051635b16ebb760e01b8152600481019190915290506020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115612336576000916123a2575b501538611fed565b6123bb915060203d602011610d1957610d0b818361260f565b3861239a565b90506020813d6020116123f3575b816123dc6020938361260f565b81010312610613576123ed90612630565b38611fd9565b3d91506123cf565b9398509550505083813d83116124ae575b612416818361260f565b810103126106135782516001600160601b038116036106135761243b60208401612630565b5061244860408401612630565b9461245560608501612630565b9361246260808201612ca8565b9661246f60a08301612ca8565b5061247c60c08301612ca8565b506124a461016061248f60e08501612cb6565b9361249d6101408201612cb6565b5001612cb6565b5094963880611f55565b503d61240c565b604051631b1c91dd60e01b8152600490fd5b90506020813d6020116124f9575b816124e26020938361260f565b81010312610613576124f390612630565b38611f0b565b3d91506124d5565b60405163a0042b1760e01b8152600490fd5b60405162880b1160e81b8152600490fd5b50426001600160401b03871610611ecc565b604051637f184cdb60e11b8152600490fd5b5050600090815260056020908152604080832054835260049091529020600601546001600160a01b0390811691160390506124b557630a85bd0160e11b90565b6003821015611de05752565b6001600160401b0381116125a757604052565b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b038211176125a757604052565b608081019081106001600160401b038211176125a757604052565b61018081019081106001600160401b038211176125a757604052565b90601f801991011681019081106001600160401b038211176125a757604052565b51906001600160a01b038216820361061357565b600090815260206004815260409182812091835192612662846125f3565b8054845260018101548285015260018060a01b03938460028301541686820190815260038301549186600660608301958286168752608084019560a01c60020b865260048101546001600160801b03811660a086015260801c60c085015260ff60058201548c816001600160401b039182821660e08a01521c166101008701526126f5828260801c166101208801612588565b60881c161515610140850152015416610160820152511561286a57519151905186516328af8d0b60e01b81529286166001600160a01b039081166004850152918616909116602483015260020b604482015281816064817f000000000000000000000000000000000000000000000000000000000000000088165afa908115612860579084918491612828575b50168015612820578190602486518096819363b9a09fd560e01b835260048301527f0000000000000000000000000000000000000000000000000000000000000000165afa938415612815575081936127dc575b50505090565b9091809350813d831161280e575b6127f4818361260f565b81010312610161575061280690612630565b3880806127d6565b503d6127ea565b51913d9150823e3d90fd5b505091505090565b809250838092503d8311612859575b612841818361260f565b81010312610f0f576128538491612630565b38612782565b503d612837565b85513d85823e3d90fd5b5050505091505090565b9190826040910312610613576020825192015190565b91909160808060a0830194805184526001600160801b03602082015116602085015260408101516040850152606081015160608501520151910152565b919091606060808201938051835260018060a01b036020820151166020840152816040820151916001600160801b038093166040860152015116910152565b9190820391821161291357565b634e487b7160e01b600052601160045260246000fd5b90816020910312610613575180151581036106135790565b600052600460205260406000206040519061295b826125f3565b805482526001810154602083015260018060a01b03918260028301541660408201526003820154838116606083015260a01c60020b60808201526004820154926001600160801b039160a0810193838616855260c082019560801c86526005810154916001600160401b039384841660e0830152600660ff610100840195878160401c1687526129f4828260801c166101208701612588565b60881c16151593846101408501520154166101608201525115908115612a48575b50612a3e5751164210159283612a2b5750505090565b81929350511691511611153880806127d6565b5050505050600090565b905038612a15565b6001600160801b03918216908216039190821161291357565b60005260046020526040600020604051612a82816125f3565b815481526001820154602082015260018060a01b03908160028401541660408201526003830154828116606083015260a01c60020b60808201526004830154926001600160801b039283851660a084015260c083019460801c8552600660ff60058401546001600160401b0380821660e08801528160401c16610100870152612b14828260801c166101208801612588565b60881c1615159283610140860152015416610160830152815115908115612b6d575b50612b6557612b4582916132fa565b925116809183161115612b5e57612b5b91612a50565b90565b5050600090565b505050600090565b905038612b36565b60009081526020906004825260409081812092825193612b94856125f3565b80548552600181015482860152600660018060a01b039182600282015416868801526003810154838116606089015260a01c60020b608088015260048101546001600160801b03811660a089015260801c60c088015260ff60058201546001600160401b0380821660e08b015281891c166101008a0152612c1e828260801c166101208b01612588565b60881c1615156101408801520154169384610160820152841561282057518351633e491d4760e01b8152306004820152602481019190915292938190849060449082905afa93841561281557508193612c775750505090565b9091809350813d8311612ca1575b612c8f818361260f565b810103126101615750513880806127d6565b503d612c85565b51908160020b820361061357565b51906001600160801b038216820361061357565b600260015414612cdb576002600155565b604051633ee5aeb560e01b8152600490fd5b906000828152600460205260408120928354158015612dbf575b611293576040516331a9108f60e11b815260048101919091526001600160a01b03906020816024817f000000000000000000000000000000000000000000000000000000000000000086165afa928315610620578093612d80575b505033911603612d6e57565b604051630472b49d60e51b8152600490fd5b909192506020823d602011612db7575b81612d9d6020938361260f565b810103126101615750612daf90612630565b903880612d62565b3d9150612d90565b5060ff600585015460881c16612d07565b6001600160401b0381116125a75760051b60200190565b8051821015612dfb5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b92916001600160a01b0390811691908215159081612eb6575b81612ea9575b8115612ea05760ff60035b1692612e5f612e4985612dd0565b94612e57604051968761260f565b808652612dd0565b6020850190601f19013682378497855115612dfb5783169052835160011015612dfb57166040830152612e90575050565b805160021015612dfb5760600152565b60ff6002612e3b565b8281168414159150612e30565b8581168414159150612e2a565b90815191612ed083612dd0565b90612eec604094612ee4604051948561260f565b808452612dd0565b60209190601f190136848401378260005b8251811015612f93576024846001600160a01b03612f1b8487612de7565b51168951928380926370a0823160e01b82523060048301525afa908115612f8857600091612f5a575b5090600191612f538288612de7565b5201612efd565b908582813d8311612f81575b612f70818361260f565b810103126101615750516001612f44565b503d612f66565b88513d6000823e3d90fd5b509450505050565b8181029291811591840414171561291357565b90612fbd9094939433906132ad565b6002546001600160a01b039382159185169060005b81518110156131555786612fe68284612de7565b51604080516370a0823160e01b81523060048201529392602092839186916024918391165afa93841561314a5789918b898f8c94600099613108575b5061303b6001996130348a8094612de7565b5190612906565b8b81156130fa577f68b5d24a91a0d62a756b77d3d3e1735f1b886324e0054d3d95b9ff80dfec3bdd9661307994156130e35750600093848093612906565b948c836130cb575b91509250848092506130ad575b61309a91508990612de7565b5116958351928352820152a35b01612fd2565b6130c3926130bc8b3393612de7565b5116613777565b8d828a61308e565b6130d8946130bc91612de7565b86818f8c908c613081565b6130f06127109184612f9b565b0493848093612906565b5050505050505050506130a7565b955050505092809495915082813d8311613143575b613127818361260f565b81010312610161575051929190889088908b898f61303b613022565b503d61311d565b50513d6000823e3d90fd5b505050505050509050565b6001600160801b0390818111613174571690565b604490604051906306dfcc6560e41b8252608060048301526024820152fd5b9294908415938460001461326d576000955b86951561325a575060005b6131c5816131bf898298612906565b99612906565b9680613239575b5080613218575b5086806131fd575b505084806131e7575050565b6131fb9133906001600160a01b0316613777565b565b6132119133906001600160a01b0316613777565b38866131db565b60025461323391906001600160a01b03908116908516613777565b386131d3565b60025461325491906001600160a01b03908116908516613777565b386131cc565b6132676127109189612f9b565b046131b0565b61271061327a8786612f9b565b04956131a5565b6000546001600160a01b0316330361329557565b60405163118cdaa760e01b8152336004820152602490fd5b60009160018060a01b03168252600360205260ff6040832054166132f65760038110156132e257600203612b5b57506107d090565b634e487b7160e01b82526021600452602482fd5b5090565b60e081016001600160401b03808251168042111561338857816101008501511680421015613374576133539261333660a0969361333f93612906565b94511642612906565b906001600160801b03948591015116612f9b565b811561335e57041690565b634e487b7160e01b600052601260045260246000fd5b5050505060a001516001600160801b031690565b50505050600090565b6000908152600490602090828252604091828220926001600160801b03809616603281029080820460321490151715613764576127108791041690811561375b57856024946002870160018060a01b039786898354168651998a80926370a0823160e01b9889835230908301525afa97881561286057839861372c575b50600381019a898c541696888c60248951809b81938b835230908301525afa9788156137225785986136f3575b508a7f00000000000000000000000000000000000000000000000000000000000000001692805461070842018042116136e0578392918f8b926134b49897968f855194613487866125bd565b85528401528a848401528a6060840152608083015282519788928392630624e65f60e11b8452830161288a565b03818a885af19182156136d657918d969593918f938b96948a968b946136b1575b50820190846134e8835492828416612a50565b16906001600160801b03191617905584158015906136a8575b61361e575b5050505050505416958351838152308a82015286816024818b5afa908115612860579087929184916135eb575b509061353e91612906565b986024898c54169486519586938492835230908301525afa9283156135e1575080926135ac575b50506135719250612906565b9280613596575b50508161358457505050565b806131fb935416906002541690613777565b6135a591836002541690613777565b3880613578565b9150919282813d83116135da575b6135c4818361260f565b8101031261016157509061357191513880613565565b503d6135ba565b51903d90823e3d90fd5b8381939492503d8311613617575b613603818361260f565b81010312610f0f575186919061353e613533565b503d6135f9565b61366e96975061363361170d84925496613160565b91865195613640876125d8565b86528d309087015216858501521660608301528c86845180968195829463fc6f786560e01b845283016128c7565b03925af18015612860579089929161368c575b808080808994613506565b6136a290863d881161069257610684818361260f565b50613681565b50811515613501565b9093506136cc919650873d891161069257610684818361260f565b95909592386134d5565b89513d89823e3d90fd5b634e487b7160e01b885260118f52602488fd5b9097508881813d831161371b575b61370b818361260f565b81010312610bdd5751963861343b565b503d613701565b87513d87823e3d90fd5b9097508681813d8311613754575b613744818361260f565b81010312610f0f5751963861340e565b503d61373a565b50505050505050565b634e487b7160e01b845260118652602484fd5b60405163a9059cbb60e01b60208083019182526001600160a01b0394909416602483015260448083019590955293815290926000916137b760648261260f565b519082855af115612336576000513d61380157506001600160a01b0381163b155b6137df5750565b604051635274afe760e01b81526001600160a01b039091166004820152602490fd5b600114156137d856fea2646970667358221220b433982a070d9176a5e46dd446baa6d43b100670af5fba6e07d0f095ee83218e64736f6c634300081800330000000000000000000000005209b3ab7cfdcc5d006f4441be9d94bce054185600000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef0000000000000000000000007f749fdd351c1ceed82d76d7699cb631eb8332a70000000000000000000000003e45e90d83d87f961561968709d5ab844eb7422f00000000000000000000000055642a3f10f1af5145d3d59021b1d6b03bb8692c
0x6080604052600436101561001257600080fd5b6000803560e01c8063150b7a0214611d335780631765509014611c6157806319338d3a14611c305780632e17de7814611a1e57806330acef73146118de578063398daa851461189f57806346c96aac1461185a5780634940566c1461132657806364df049e146112fd578063670a43ca146112d35780636a57a6151461116e578063715018a61461111457806374ee772414610f7f578063791b98bc14610f3a5780638da5cb5b14610f135780638ebfc79614610e595780639c5bfeae14610e14578063a694fc3a1461073c578063b14d3ec514610347578063b2f70e961461031e578063baa51f86146102e6578063c9341edb146102b6578063e521cb9214610234578063e74f6166146101ef578063f2fde38b146101645763fc2fff861461013b57600080fd5b34610161576020366003190112610161576020610159600435612b75565b604051908152f35b80fd5b50346101615760203660031901126101615761017e611dbd565b610186613281565b6001600160a01b039081169081156101d657600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b604051631e4fbdf760e01b815260048101849052602490fd5b50346101615780600319360112610161576040517f0000000000000000000000001ac9db4a2608ba45d6127b1737949b51bb54b7f36001600160a01b03168152602090f35b50346101615760203660031901126101615761024e611dbd565b610256613281565b6001600160a01b039081169081156102a457816002549182167fd3890fc76afcfc31cba1dcf2c27b50e2541e4d75039c981855b5b5e03682aea08580a36001600160a01b0319161760025580f35b6040516318060c7960e01b8152600490fd5b50346101615760203660031901126101615760206102d5600435612a69565b6001600160801b0360405191168152f35b5034610161576020366003190112610161576020906004358152600482526006604060018060a01b0392200154161515604051908152f35b503461016157602036600319011261016157602061033d600435612941565b6040519015158152f35b503461016157606036600319011261016157600435610364611df6565b6001600160801b0360443516806044350361061357610381612cca565b61038a83612ced565b60068101549091906001600160a01b031661072a576002820180546040516370a0823160e01b8152306004820152969190602090889060249082906001600160a01b03165afa94851561071f5782956106ea575b6003850180546040516370a0823160e01b815230600482015299509094906020908a9060249082906001600160a01b03165afa9889156106df5784996106a9575b50855461047d926040926001600160801b03918281166106a3575081905b610699578180915b855194610451866125d8565b8552306020860152168484015216606082015281518093819263fc6f786560e01b8352600483016128c7565b0381867f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165af180156106605761066b575b50546040516370a0823160e01b81523060048201526001600160a01b0390911694602082602481895afa801561066057839061062c575b6104f89250612906565b91546040516370a0823160e01b81523060048201526001600160a01b039091169190602081602481865afa91821561062057916105db575b509061055a60ff600561054c6105d79a61056099989796612906565b95015460801c1633906132ad565b93613193565b919492937f53d5968f2c4070d6fd41f8ac74ba6abeb336da7c5730caa9383551abc20aa15e604051806105ad86868b8b859094939260609260808301968352602083015260408201520152565b0390a260018055604051948594859094939260609260808301968352602083015260408201520152565b0390f35b9493929190506020853d602011610618575b816105fa6020938361260f565b810103126106135793519293919290919061055a610530565b600080fd5b3d91506105ed565b604051903d90823e3d90fd5b506020823d602011610658575b816106466020938361260f565b81010312610613576104f891516104ee565b3d9150610639565b6040513d85823e3d90fd5b61068c9060403d604011610692575b610684818361260f565b810190612874565b506104b7565b503d61067a565b8160443591610445565b9061043d565b9098506020813d6020116106d7575b816106c56020938361260f565b8101031261061357519761047d61041f565b3d91506106b8565b6040513d86823e3d90fd5b94506020873d602011610717575b816107056020938361260f565b810103126106135760249651946103de565b3d91506106f8565b6040513d84823e3d90fd5b604051636b84bfe960e11b8152600490fd5b503461016157602036600319011261016157610756612cca565b610761600435612ced565b60068101549091906001600160a01b031661072a5760028281015460038401546040516328af8d0b60e01b81526001600160a01b03928316600482018190529282166024820181905260a09290921c90930b604484015291602081806064810103817f0000000000000000000000001ac9db4a2608ba45d6127b1737949b51bb54b7f36001600160a01b03165afa9081156106df578491610dda575b506001600160a01b0316918215610dc85760405163b9a09fd560e01b815260048101939093527f0000000000000000000000007f749fdd351c1ceed82d76d7699cb631eb8332a76001600160a01b0316602084602481845afa938415610bd2578594610d8c575b506001600160a01b038416158015610d32575b610d2057604051631703e5f960e01b81526001600160a01b038516600482015290602090829060249082905afa908115610bd2578591610cf1575b5015610cdf5760405163f7c618c160e01b8152906020826004816001600160a01b0388165afa918215610bd2578592610c9e575b506108f092612e11565b926108fa84612ec3565b81549094907f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03163b15610bdd5760405163095ea7b360e01b81526001600160a01b03851660048201526024810191909152848180604481010381837f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165af18015610bd257908591610c8a575b505081546001600160a01b0384163b15610bdd5760405163b6b55f2560e01b815260048101919091528481602481836001600160a01b0389165af18015610bd257908591610c76575b505081546040516331a9108f60e11b8152600481018290526020816024817f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165afa908115610c1f578691610c3c575b506001600160a01b03858116911603610c2a5760405163020604bf60e21b8152600481018290526020816024817f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165afa908115610c1f578691610be1575b506001600160a01b0316610b31575b506006820180546001600160a01b0319166001600160a01b0385161790556005820154602095610ae892909160801c60ff16600435612fae565b54604051926001600160a01b03831690600435907ff5da5629ad21daaef4620653ef5113bf813977683f94ffbf1fe16c3c4a814ff09080a4600180556001600160a01b03168152f35b7f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03163b15610bdd5760405163095ea7b360e01b81526000600482015260248101919091528481604481837f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165af18015610bd25715610aae57610bc48591612594565b610bce5738610aae565b8380fd5b6040513d87823e3d90fd5b8480fd5b90506020813d602011610c17575b81610bfc6020938361260f565b81010312610c1357610c0d90612630565b38610a9f565b8580fd5b3d9150610bef565b6040513d88823e3d90fd5b60405163d5e3128d60e01b8152600490fd5b90506020813d602011610c6e575b81610c576020938361260f565b81010312610c1357610c6890612630565b38610a38565b3d9150610c4a565b610c7f90612594565b610bce5783386109e0565b610c9390612594565b610bce578338610997565b9091506020813d602011610cd7575b81610cba6020938361260f565b81010312610bdd5790610cd06108f09392612630565b91926108e6565b3d9150610cad565b604051635ceafc1360e11b8152600490fd5b610d13915060203d602011610d19575b610d0b818361260f565b810190612929565b386108b2565b503d610d01565b60405163e569becd60e01b8152600490fd5b5060405163aa79979b60e01b81526001600160a01b0385166004820152602081602481855afa908115610c1f578691610d6d575b5015610877565b610d86915060203d602011610d1957610d0b818361260f565b38610d66565b9093506020813d602011610dc0575b81610da86020938361260f565b81010312610bdd57610db990612630565b9238610864565b3d9150610d9b565b60405163f7139e3360e01b8152600490fd5b90506020813d602011610e0c575b81610df56020938361260f565b81010312610bce57610e0690612630565b386107fd565b3d9150610de8565b50346101615780600319360112610161576040517f0000000000000000000000003e45e90d83d87f961561968709d5ab844eb7422f6001600160a01b03168152602090f35b503461016157604036600319011261016157610e73611dbd565b60243590811515809203610f0f57610e89613281565b6001600160a01b0316908115610edf5760207f4d5771454588f51370a8a2e7e151354b6de0dc3159b14821b4ad76bc04c28bc791838552600382526040852060ff1981541660ff8316179055604051908152a280f35b60405162461bcd60e51b8152602060048201526008602482015267077616c6c65743d360c41b6044820152606490fd5b8280fd5b5034610161578060031936011261016157546040516001600160a01b039091168152602090f35b50346101615780600319360112610161576040517f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03168152602090f35b503461016157602036600319011261016157600435610f9c612cca565b610fa581612ced565b60068101546001600160a01b0390811661072a57610fc283612941565b15611102578154808552600560208190526040862086905592909201805460ff60881b1916600160881b17905583907f0000000000000000000000003e45e90d83d87f961561968709d5ab844eb7422f8116803b15610f0f57828091602460405180948193630852cd8d60e31b83528a60048401525af19081156106605783916110ee575b50507f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef16803b156110ea57818091606460405180948193632142170760e11b83523060048401523360248401528860448401525af1801561071f576110d6575b505033917f6c2b69108c6691683495bb3a230fb2ce5b892b27607e017d4ad023e083cd712c8480a46001805580f35b6110df90612594565b610f0f5782386110a7565b5080fd5b6110f790612594565b6110ea578138611047565b6040516345a5a96f60e11b8152600490fd5b503461016157806003193601126101615761112d613281565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610161576080366003190112610161576004356024356001600160401b038082168092036106135760443590811680910361061357606435906003821015610bdd576111fa60018060a01b037f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef169260405192602095602085015260408401526060830190611dd3565b60608152611207816125d8565b813b15610bdd57918491604051938492635c46a7ef60e11b845233600485015230602485015286604485015260806064850152815191826084860152855b8381106112b9575050508360a484838383839684010152601f801991011681010301925af18015610660576112a5575b50815260056020526040902054801561129357602090604051908152f35b60405163049c91db60e41b8152600490fd5b6112af8391612594565b6110ea5738611275565b81810183015188820160a401528996508795508201611245565b50346101615760203660031901126101615760406020916004358152600583522054604051908152f35b50346101615780600319360112610161576002546040516001600160a01b039091168152602090f35b503461016157608036600319011261016157611340611df6565b611348612cca565b6001600160801b0381161561184857611362600435612ced565b60068101546001600160a01b031661072a576001600160801b03611387600435612a69565b166001600160801b038316116118365760028101546040516370a0823160e01b81523060048201529190602090839060249082906001600160a01b03165afa9182156106df578492611802575b5060038101546040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa908115610bd25785916117d0575b508154610708420142116117bc576040805161147392611430826125bd565b81526001600160801b038716602082015260443582820152606435606082015261070842016080820152815180938192630624e65f60e11b83526004830161288a565b0381897f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165af18015610c1f578691879161179b575b506001600160801b038616600485015460801c016001600160801b038111611787576114f59060048601906001600160801b0382549181199060801b169116179055565b811580159061177e575b6116ef575b505060028201546040516370a0823160e01b81523060048201526001600160a01b0390911693602082602481885afa80156116e45787906116b0575b61154a9250612906565b60038301546040516370a0823160e01b815230600482015291926001600160a01b039091169190602082602481865afa9182156116a557889261166f575b5061159760059160ff93612906565b94015460801c16600381101561165b57906105d79660016115ca969594931480611644575b1561055a5750606493613193565b919492936001600160801b03604051911681528460208201528560408201528160608201528260808201527fe31f5f739c604eb9546fa0056f5ec109369870aa4d680097d2c3efb76c8c9bc060a060043592a260018055604051948594859094939260609260808301968352602083015260408201520152565b50338152600360205260ff604082205416156115bc565b634e487b7160e01b87526021600452602487fd5b91506020823d60201161169d575b8161168a6020938361260f565b8101031261061357905190611597611588565b3d915061167d565b6040513d8a823e3d90fd5b506020823d6020116116dc575b816116ca6020938361260f565b810103126106135761154a9151611540565b3d91506116bd565b6040513d89823e3d90fd5b611720916001600160801b036040928161171361170d895495613160565b92613160565b91855194610451866125d8565b0381897f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b03165af18015610c1f57611760575b80611504565b6117789060403d60401161069257610684818361260f565b5061175a565b508015156114ff565b634e487b7160e01b88526011600452602488fd5b90506117b6915060403d60401161069257610684818361260f565b386114b1565b634e487b7160e01b86526011600452602486fd5b90506020813d6020116117fa575b816117eb6020938361260f565b81010312610613575138611411565b3d91506117de565b9091506020813d60201161182e575b8161181e6020938361260f565b81010312610613575190386113d4565b3d9150611811565b6040516357577f5960e11b8152600490fd5b604051630200e8a960e31b8152600490fd5b50346101615780600319360112610161576040517f0000000000000000000000007f749fdd351c1ceed82d76d7699cb631eb8332a76001600160a01b03168152602090f35b50346101615760203660031901126101615760209060ff906040906001600160a01b036118ca611dbd565b168152600384522054166040519015158152f35b5034610161576020366003190112610161576004356118fb612cca565b61190481612ced565b600681015490916001600160a01b03918216918215611a0c576002840154600385015460405163f7c618c160e01b8152929182169116602083600481885afa9182156116e45787926119cb575b61195b9350612e11565b908461196683612ec3565b938554813b15610f0f578291602483926040519485938492631c4b774b60e01b845260048401525af1801561071f576119b7575b505060ff60056119b095015460801c1690612fae565b6001805580f35b6119c090612594565b610bdd57843861199a565b91506020833d602011611a04575b816119e66020938361260f565b81010312611a00576119fa61195b93612630565b91611951565b8680fd5b3d91506119d9565b60405163082141ff60e41b8152600490fd5b5034610161576020806003193601126110ea5760043590611a3d612cca565b611a4682612ced565b6006810180546001600160a01b03908116938415611a0c576002840154600385015460405163f7c618c160e01b815291841690841683836004818b5afa918215611bd6578a92611bf8575b611a9b9350612e11565b90611aa582612ec3565b92855480600655873b15611bf45760405190632e1a7d4d60e01b825260048201528981602481838c5af18015611bd657611be1575b50886006558554604051906331a9108f60e11b825260048201528281602481857f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef165afa928315611bd6578a93611b9a575b505030911603611b8857611b5b926001600160601b0360a01b815416905560ff600585015460801c1686612fae565b54917f43548f7388e7a2634dd544c18c43592a54f07aefed9644f0e4abde8325038ce98480a46001805580f35b60405163f93df48760e01b8152600490fd5b9080929350813d8311611bcf575b611bb2818361260f565b81010312611bcb57611bc390612630565b903880611b2c565b8880fd5b503d611ba8565b6040513d8c823e3d90fd5b611bed90999199612594565b9738611ada565b8980fd5b91508383813d8311611c29575b611c0f818361260f565b81010312611bf457611c23611a9b93612630565b91611a91565b503d611c05565b5034610161576020366003190112610161576020611c4f600435612644565b6040516001600160a01b039091168152f35b503461016157602036600319011261016157604061018091600435815260046020522080549060ff60018201549160018060a01b0390816002820154169160038201546004830154916005840154948160066001600160401b039601541697604051998a5260208a015260408901528116606088015260a01c60020b60808701526001600160801b03811660a087015260801c60c086015280821660e08601528160401c16610100850152611d1f6101208501838360801c16611dd3565b60881c161515610140830152610160820152f35b503461016157608036600319011261016157611d4d611dbd565b506024356001600160a01b03811681036110ea576064356001600160401b03928382116101615736602383011215610161578160040135938411610161573660248584010111610161576020611daa856024850160443587611e20565b6040516001600160e01b03199091168152f35b600435906001600160a01b038216820361061357565b906003821015611de05752565b634e487b7160e01b600052602160045260246000fd5b602435906001600160801b038216820361061357565b35906001600160401b038216820361061357565b91927f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef6001600160a01b031690338290036124b557826006541461254857801561251357846060918101031261061357611e7984611e0c565b93611e8660208201611e0c565b9360036040830135101561061357611e9c612cca565b836000526005602052604060002054612536576001600160401b0386166001600160401b03861611801590612524575b61251357600260ff60408401351611612501576040516331a9108f60e11b815260048101859052602081602481875afa908115612336576000916124c7575b50306001600160a01b03909116036124b55760405194859363133f757160e31b85528560048601528460246101809687935afa8015612336576000946000976000916000936123fb575b50506001600160801b03821615611848576040516328af8d0b60e01b81526001600160a01b03808816600483015289166024820152600282900b6044820152602081806064810103817f0000000000000000000000001ac9db4a2608ba45d6127b1737949b51bb54b7f36001600160a01b03165afa908115612336576000916123c1575b506001600160a01b03168015908115612342575b50610dc8576040516335313c2160e11b81526001600160a01b0385811660048301529098906020908a9060249082906000907f0000000000000000000000003e45e90d83d87f961561968709d5ab844eb7422f165af198891561233657600099612302575b508760005260056020528860406000205560405196612070886125f3565b88885289602089015260018060a01b0316604088015260018060a01b0316606087015260020b60808601526001600160801b03811660a0860152600060c08601526001600160401b03881660e08601526001600160401b0382166101008601526120e260408501356101208701612588565b6000610140860181905261016086018190528781526004602081815260409283902088518155908801516001820155918701516002830180546001600160a01b0319166001600160a01b0392831617905560608801516003840180546080808c01516001600160b81b0319909216939094169290921762ffffff60a01b60a093841b1617905588015160c089015190911b6fffffffffffffffffffffffffffffffff19166001600160801b03919091161790820155936001600160401b0360e087015116916005860154966fffffffffffffffff000000000000000061010082015160401b1693610120820151976003891015611de0577f7a5a16b84333b2656a94dfb32929b9b2b41facdc932c3cf70567b803edc92b8f996080996122b09760069460ff60881b610140880151151560881b169371ffffffffffffffffffffffffffffffffffff191617179060ff8c1b908c1b1617176005820155019061016060018060a01b03910151166001600160601b0360a01b825416179055604082013515806122df575b6122cf575b508760005260046020526001600160401b036001600160801b036004604060002001541693816040519b168b521660208a01526040808a01910135611dd3565b60608701526001600160a01b031694a460018055630a85bd0160e11b90565b6122d99089613391565b38612270565b506001600160a01b03851660009081526003602052604090205460ff161561226b565b9098506020813d60201161232e575b8161231e6020938361260f565b8101031261061357519738612052565b3d9150612311565b6040513d6000823e3d90fd5b604051635b16ebb760e01b8152600481019190915290506020816024817f0000000000000000000000001ac9db4a2608ba45d6127b1737949b51bb54b7f36001600160a01b03165afa908115612336576000916123a2575b501538611fed565b6123bb915060203d602011610d1957610d0b818361260f565b3861239a565b90506020813d6020116123f3575b816123dc6020938361260f565b81010312610613576123ed90612630565b38611fd9565b3d91506123cf565b9398509550505083813d83116124ae575b612416818361260f565b810103126106135782516001600160601b038116036106135761243b60208401612630565b5061244860408401612630565b9461245560608501612630565b9361246260808201612ca8565b9661246f60a08301612ca8565b5061247c60c08301612ca8565b506124a461016061248f60e08501612cb6565b9361249d6101408201612cb6565b5001612cb6565b5094963880611f55565b503d61240c565b604051631b1c91dd60e01b8152600490fd5b90506020813d6020116124f9575b816124e26020938361260f565b81010312610613576124f390612630565b38611f0b565b3d91506124d5565b60405163a0042b1760e01b8152600490fd5b60405162880b1160e81b8152600490fd5b50426001600160401b03871610611ecc565b604051637f184cdb60e11b8152600490fd5b5050600090815260056020908152604080832054835260049091529020600601546001600160a01b0390811691160390506124b557630a85bd0160e11b90565b6003821015611de05752565b6001600160401b0381116125a757604052565b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b038211176125a757604052565b608081019081106001600160401b038211176125a757604052565b61018081019081106001600160401b038211176125a757604052565b90601f801991011681019081106001600160401b038211176125a757604052565b51906001600160a01b038216820361061357565b600090815260206004815260409182812091835192612662846125f3565b8054845260018101548285015260018060a01b03938460028301541686820190815260038301549186600660608301958286168752608084019560a01c60020b865260048101546001600160801b03811660a086015260801c60c085015260ff60058201548c816001600160401b039182821660e08a01521c166101008701526126f5828260801c166101208801612588565b60881c161515610140850152015416610160820152511561286a57519151905186516328af8d0b60e01b81529286166001600160a01b039081166004850152918616909116602483015260020b604482015281816064817f0000000000000000000000001ac9db4a2608ba45d6127b1737949b51bb54b7f388165afa908115612860579084918491612828575b50168015612820578190602486518096819363b9a09fd560e01b835260048301527f0000000000000000000000007f749fdd351c1ceed82d76d7699cb631eb8332a7165afa938415612815575081936127dc575b50505090565b9091809350813d831161280e575b6127f4818361260f565b81010312610161575061280690612630565b3880806127d6565b503d6127ea565b51913d9150823e3d90fd5b505091505090565b809250838092503d8311612859575b612841818361260f565b81010312610f0f576128538491612630565b38612782565b503d612837565b85513d85823e3d90fd5b5050505091505090565b9190826040910312610613576020825192015190565b91909160808060a0830194805184526001600160801b03602082015116602085015260408101516040850152606081015160608501520151910152565b919091606060808201938051835260018060a01b036020820151166020840152816040820151916001600160801b038093166040860152015116910152565b9190820391821161291357565b634e487b7160e01b600052601160045260246000fd5b90816020910312610613575180151581036106135790565b600052600460205260406000206040519061295b826125f3565b805482526001810154602083015260018060a01b03918260028301541660408201526003820154838116606083015260a01c60020b60808201526004820154926001600160801b039160a0810193838616855260c082019560801c86526005810154916001600160401b039384841660e0830152600660ff610100840195878160401c1687526129f4828260801c166101208701612588565b60881c16151593846101408501520154166101608201525115908115612a48575b50612a3e5751164210159283612a2b5750505090565b81929350511691511611153880806127d6565b5050505050600090565b905038612a15565b6001600160801b03918216908216039190821161291357565b60005260046020526040600020604051612a82816125f3565b815481526001820154602082015260018060a01b03908160028401541660408201526003830154828116606083015260a01c60020b60808201526004830154926001600160801b039283851660a084015260c083019460801c8552600660ff60058401546001600160401b0380821660e08801528160401c16610100870152612b14828260801c166101208801612588565b60881c1615159283610140860152015416610160830152815115908115612b6d575b50612b6557612b4582916132fa565b925116809183161115612b5e57612b5b91612a50565b90565b5050600090565b505050600090565b905038612b36565b60009081526020906004825260409081812092825193612b94856125f3565b80548552600181015482860152600660018060a01b039182600282015416868801526003810154838116606089015260a01c60020b608088015260048101546001600160801b03811660a089015260801c60c088015260ff60058201546001600160401b0380821660e08b015281891c166101008a0152612c1e828260801c166101208b01612588565b60881c1615156101408801520154169384610160820152841561282057518351633e491d4760e01b8152306004820152602481019190915292938190849060449082905afa93841561281557508193612c775750505090565b9091809350813d8311612ca1575b612c8f818361260f565b810103126101615750513880806127d6565b503d612c85565b51908160020b820361061357565b51906001600160801b038216820361061357565b600260015414612cdb576002600155565b604051633ee5aeb560e01b8152600490fd5b906000828152600460205260408120928354158015612dbf575b611293576040516331a9108f60e11b815260048101919091526001600160a01b03906020816024817f0000000000000000000000003e45e90d83d87f961561968709d5ab844eb7422f86165afa928315610620578093612d80575b505033911603612d6e57565b604051630472b49d60e51b8152600490fd5b909192506020823d602011612db7575b81612d9d6020938361260f565b810103126101615750612daf90612630565b903880612d62565b3d9150612d90565b5060ff600585015460881c16612d07565b6001600160401b0381116125a75760051b60200190565b8051821015612dfb5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b92916001600160a01b0390811691908215159081612eb6575b81612ea9575b8115612ea05760ff60035b1692612e5f612e4985612dd0565b94612e57604051968761260f565b808652612dd0565b6020850190601f19013682378497855115612dfb5783169052835160011015612dfb57166040830152612e90575050565b805160021015612dfb5760600152565b60ff6002612e3b565b8281168414159150612e30565b8581168414159150612e2a565b90815191612ed083612dd0565b90612eec604094612ee4604051948561260f565b808452612dd0565b60209190601f190136848401378260005b8251811015612f93576024846001600160a01b03612f1b8487612de7565b51168951928380926370a0823160e01b82523060048301525afa908115612f8857600091612f5a575b5090600191612f538288612de7565b5201612efd565b908582813d8311612f81575b612f70818361260f565b810103126101615750516001612f44565b503d612f66565b88513d6000823e3d90fd5b509450505050565b8181029291811591840414171561291357565b90612fbd9094939433906132ad565b6002546001600160a01b039382159185169060005b81518110156131555786612fe68284612de7565b51604080516370a0823160e01b81523060048201529392602092839186916024918391165afa93841561314a5789918b898f8c94600099613108575b5061303b6001996130348a8094612de7565b5190612906565b8b81156130fa577f68b5d24a91a0d62a756b77d3d3e1735f1b886324e0054d3d95b9ff80dfec3bdd9661307994156130e35750600093848093612906565b948c836130cb575b91509250848092506130ad575b61309a91508990612de7565b5116958351928352820152a35b01612fd2565b6130c3926130bc8b3393612de7565b5116613777565b8d828a61308e565b6130d8946130bc91612de7565b86818f8c908c613081565b6130f06127109184612f9b565b0493848093612906565b5050505050505050506130a7565b955050505092809495915082813d8311613143575b613127818361260f565b81010312610161575051929190889088908b898f61303b613022565b503d61311d565b50513d6000823e3d90fd5b505050505050509050565b6001600160801b0390818111613174571690565b604490604051906306dfcc6560e41b8252608060048301526024820152fd5b9294908415938460001461326d576000955b86951561325a575060005b6131c5816131bf898298612906565b99612906565b9680613239575b5080613218575b5086806131fd575b505084806131e7575050565b6131fb9133906001600160a01b0316613777565b565b6132119133906001600160a01b0316613777565b38866131db565b60025461323391906001600160a01b03908116908516613777565b386131d3565b60025461325491906001600160a01b03908116908516613777565b386131cc565b6132676127109189612f9b565b046131b0565b61271061327a8786612f9b565b04956131a5565b6000546001600160a01b0316330361329557565b60405163118cdaa760e01b8152336004820152602490fd5b60009160018060a01b03168252600360205260ff6040832054166132f65760038110156132e257600203612b5b57506107d090565b634e487b7160e01b82526021600452602482fd5b5090565b60e081016001600160401b03808251168042111561338857816101008501511680421015613374576133539261333660a0969361333f93612906565b94511642612906565b906001600160801b03948591015116612f9b565b811561335e57041690565b634e487b7160e01b600052601260045260246000fd5b5050505060a001516001600160801b031690565b50505050600090565b6000908152600490602090828252604091828220926001600160801b03809616603281029080820460321490151715613764576127108791041690811561375b57856024946002870160018060a01b039786898354168651998a80926370a0823160e01b9889835230908301525afa97881561286057839861372c575b50600381019a898c541696888c60248951809b81938b835230908301525afa9788156137225785986136f3575b508a7f00000000000000000000000007f44c47743a2f36414a82b9f558ecfcf0eedcef1692805461070842018042116136e0578392918f8b926134b49897968f855194613487866125bd565b85528401528a848401528a6060840152608083015282519788928392630624e65f60e11b8452830161288a565b03818a885af19182156136d657918d969593918f938b96948a968b946136b1575b50820190846134e8835492828416612a50565b16906001600160801b03191617905584158015906136a8575b61361e575b5050505050505416958351838152308a82015286816024818b5afa908115612860579087929184916135eb575b509061353e91612906565b986024898c54169486519586938492835230908301525afa9283156135e1575080926135ac575b50506135719250612906565b9280613596575b50508161358457505050565b806131fb935416906002541690613777565b6135a591836002541690613777565b3880613578565b9150919282813d83116135da575b6135c4818361260f565b8101031261016157509061357191513880613565565b503d6135ba565b51903d90823e3d90fd5b8381939492503d8311613617575b613603818361260f565b81010312610f0f575186919061353e613533565b503d6135f9565b61366e96975061363361170d84925496613160565b91865195613640876125d8565b86528d309087015216858501521660608301528c86845180968195829463fc6f786560e01b845283016128c7565b03925af18015612860579089929161368c575b808080808994613506565b6136a290863d881161069257610684818361260f565b50613681565b50811515613501565b9093506136cc919650873d891161069257610684818361260f565b95909592386134d5565b89513d89823e3d90fd5b634e487b7160e01b885260118f52602488fd5b9097508881813d831161371b575b61370b818361260f565b81010312610bdd5751963861343b565b503d613701565b87513d87823e3d90fd5b9097508681813d8311613754575b613744818361260f565b81010312610f0f5751963861340e565b503d61373a565b50505050505050565b634e487b7160e01b845260118652602484fd5b60405163a9059cbb60e01b60208083019182526001600160a01b0394909416602483015260448083019590955293815290926000916137b760648261260f565b519082855af115612336576000513d61380157506001600160a01b0381163b155b6137df5750565b604051635274afe760e01b81526001600160a01b039091166004820152602490fd5b600114156137d856fea2646970667358221220b433982a070d9176a5e46dd446baa6d43b100670af5fba6e07d0f095ee83218e64736f6c63430008180033
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xd99e2f…4cc88c | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0x53d596…a15e | [0] 0x000000000000…00000091 data: 0x000000000000000000…83aecfab |
| 0x4bec93…3f9a9d | 6 mins agoTue, 18 Aug 2026 05:05:59 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f908 [1] 0x000000000000…00000091 [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…f0d86dc0 |
| 0xd2d96e…0acde9 | 22 mins agoTue, 18 Aug 2026 04:50:45 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f8f8 [1] 0x000000000000…00000090 [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…a695bebd |
| 0x85258e…11446b | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0x53d596…a15e | [0] 0x000000000000…0000008b data: 0x000000000000000000…0a3846bf |
| 0x1edb9a…fcadcd | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0x53d596…a15e | [0] 0x000000000000…0000008e data: 0x000000000000000000…ec6b30a9 |
| 0x01d2d7…760865 | 59 mins agoTue, 18 Aug 2026 04:13:27 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f88d [1] 0x000000000000…0000008f [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…27a097f3 |
| 0x4ccb2f…0cbb6c | 1 hr agoTue, 18 Aug 2026 04:10:19 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f882 [1] 0x000000000000…0000008e [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…b6ad1d44 |
| 0x5f966c…d51089 | 1 hr agoTue, 18 Aug 2026 04:05:10 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f874 [1] 0x000000000000…0000008d [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…24c29dbc |
| 0xc29146…e604c3 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0x53d596…a15e | [0] 0x000000000000…00000080 data: 0x000000000000000000…b1cacb08 |
| 0xcd1a4d…957d17 | 1 hr agoTue, 18 Aug 2026 03:40:57 UTC | 0x53d596…a15e | [0] 0x000000000000…0000007f data: 0x000000000000000000…e95dbe0a |
| 0x291b9c…48ff4d | 1 hr agoTue, 18 Aug 2026 03:40:05 UTC | 0x53d596…a15e | [0] 0x000000000000…00000086 data: 0x000000000000000000…01e01a9c |
| 0x536747…020b9d | 1 hr agoTue, 18 Aug 2026 03:39:58 UTC | 0x53d596…a15e | [0] 0x000000000000…00000085 data: 0x000000000000000000…1bde9013 |
| 0xcf82ff…93cb15 | 1 hr agoTue, 18 Aug 2026 03:36:15 UTC | 0x53d596…a15e | [0] 0x000000000000…00000061 data: 0x000000000000000000…8686acf8 |
| 0xaf9df0…b83b14 | 1 hr agoTue, 18 Aug 2026 03:36:10 UTC | 0x53d596…a15e | [0] 0x000000000000…00000060 data: 0x000000000000000000…4b7d0671 |
| 0xa3e3ce…2204b3 | 1 hr agoTue, 18 Aug 2026 03:33:29 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f81e [1] 0x000000000000…0000008c [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…ebc90075 |
| 0x192def…b1c221 | 1 hr agoTue, 18 Aug 2026 03:20:39 UTC | 0x53d596…a15e | [0] 0x000000000000…0000008b data: 0x000000000000000000…00000000 |
| 0x3cd0e3…b7d270 | 1 hr agoTue, 18 Aug 2026 03:20:22 UTC | 0x53d596…a15e | [0] 0x000000000000…0000008b data: 0x000000000000000000…00000000 |
| 0x0c8c34…8ec2b3 | 1 hr agoTue, 18 Aug 2026 03:18:18 UTC | 0x53d596…a15e | [0] 0x000000000000…0000008b data: 0x000000000000000000…76bbbb22 |
| 0x18e0f7…b079b8 | 2 hrs agoTue, 18 Aug 2026 03:03:39 UTC | 0x53d596…a15e | [0] 0x000000000000…00000087 data: 0x000000000000000000…9f00623a |
| 0x4d4534…c3a7c5 | 2 hrs agoTue, 18 Aug 2026 03:01:44 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f7ba [1] 0x000000000000…0000008b [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…2f7ad973 |
| 0xd42872…aa21c7 | 2 hrs agoTue, 18 Aug 2026 02:58:37 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f7b1 [1] 0x000000000000…0000008a [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…8ea4822d |
| 0x223545…cbbb43 | 2 hrs agoTue, 18 Aug 2026 02:53:21 UTC | 0x7a5a16…2b8f | [0] 0x000000000000…0000f7a8 [1] 0x000000000000…00000089 [2] 0x000000000000…a91d71f9 data: 0x000000000000000000…97f87022 |
| 0x53ed64…f4f0fc | 2 hrs agoTue, 18 Aug 2026 02:47:41 UTC | 0x53d596…a15e | [0] 0x000000000000…00000061 data: 0x000000000000000000…5e707171 |
| 0x8161cb…345ef3 | 2 hrs agoTue, 18 Aug 2026 02:47:36 UTC | 0x53d596…a15e | [0] 0x000000000000…00000060 data: 0x000000000000000000…0f07410a |
| 0xe86eba…1fa58d | 2 hrs agoTue, 18 Aug 2026 02:44:26 UTC | 0x53d596…a15e | [0] 0x000000000000…0000004f data: 0x000000000000000000…3da21dcc |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd99e2f…4cc88c | collectFees | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0x91bd…5cd9 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000689 | |
| !0x92f265…90b20e | collectFees | 39,425,794 | 20 mins agoTue, 18 Aug 2026 04:52:43 UTC | 0xca50…0bb5 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000074 | |
| !0xa0acbd…699069 | collectFees | 39,425,663 | 20 mins agoTue, 18 Aug 2026 04:52:29 UTC | 0xca50…0bb5 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000074 | |
| 0x85258e…11446b | collectFees | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0xd6a6…3a2e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000468 | |
| 0x1edb9a…fcadcd | collectFees | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0x4c30…9c59 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000688 | |
| 0xc29146…e604c3 | collectFees | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0xb9ba…611e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000449 | |
| 0xcd1a4d…957d17 | collectFees | 39,382,870 | 1 hr agoTue, 18 Aug 2026 03:40:57 UTC | 0xb9ba…611e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000468 | |
| 0x291b9c…48ff4d | collectFees | 39,382,352 | 1 hr agoTue, 18 Aug 2026 03:40:05 UTC | 0xc6db…a682 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000599 | |
| 0x536747…020b9d | collectFees | 39,382,290 | 1 hr agoTue, 18 Aug 2026 03:39:58 UTC | 0xc6db…a682 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000686 | |
| 0xcf82ff…93cb15 | collectFees | 39,380,073 | 1 hr agoTue, 18 Aug 2026 03:36:15 UTC | 0x483d…c482 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000452 | |
| 0xaf9df0…b83b14 | collectFees | 39,380,024 | 1 hr agoTue, 18 Aug 2026 03:36:10 UTC | 0x483d…c482 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000471 | |
| 0x192def…b1c221 | collectFees | 39,370,733 | 1 hr agoTue, 18 Aug 2026 03:20:39 UTC | 0xd6a6…3a2e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000301 | |
| 0x3cd0e3…b7d270 | collectFees | 39,370,569 | 1 hr agoTue, 18 Aug 2026 03:20:22 UTC | 0xd6a6…3a2e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000382 | |
| 0x0c8c34…8ec2b3 | collectFees | 39,369,334 | 1 hr agoTue, 18 Aug 2026 03:18:18 UTC | 0xd6a6…3a2e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000651 | |
| !0x8825a0…62331b | collectFees | 39,363,285 | 2 hrs agoTue, 18 Aug 2026 03:08:13 UTC | 0x2af5…2bb2 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000074 | |
| 0x18e0f7…b079b8 | collectFees | 39,360,564 | 2 hrs agoTue, 18 Aug 2026 03:03:39 UTC | 0x60bd…b3ec | IN | StonkUpLockerCL | $0.000 ETH | 0.00000495 | |
| !0xcc89e9…d65f93 | collectFees | 39,356,425 | 2 hrs agoTue, 18 Aug 2026 02:56:44 UTC | 0x94c5…c296 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000076 | |
| !0x631232…e0cab7 | collectFees | 39,351,559 | 2 hrs agoTue, 18 Aug 2026 02:48:38 UTC | 0xd074…752a | IN | StonkUpLockerCL | $0.000 ETH | 0.00000075 | |
| 0x53ed64…f4f0fc | collectFees | 39,351,001 | 2 hrs agoTue, 18 Aug 2026 02:47:41 UTC | 0x483d…c482 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000457 | |
| 0x8161cb…345ef3 | collectFees | 39,350,948 | 2 hrs agoTue, 18 Aug 2026 02:47:36 UTC | 0x483d…c482 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000468 | |
| 0xe86eba…1fa58d | collectFees | 39,349,056 | 2 hrs agoTue, 18 Aug 2026 02:44:26 UTC | 0x6011…6ac6 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000448 | |
| 0xf50401…ed9007 | collectFees | 39,348,997 | 2 hrs agoTue, 18 Aug 2026 02:44:20 UTC | 0x6011…6ac6 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000466 | |
| !0xea111e…9ec83c | collectFees | 39,347,724 | 2 hrs agoTue, 18 Aug 2026 02:42:13 UTC | 0x843b…e527 | IN | StonkUpLockerCL | $0.000 ETH | 0.00000074 | |
| 0x5eb238…f3c7bf | collectFees | 39,346,756 | 2 hrs agoTue, 18 Aug 2026 02:40:36 UTC | 0xb9ba…611e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000561 | |
| 0x8dd411…0c02fd | collectFees | 39,346,701 | 2 hrs agoTue, 18 Aug 2026 02:40:30 UTC | 0xb9ba…611e | IN | StonkUpLockerCL | $0.000 ETH | 0.00000653 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x4bec939b…3f9a9d | Transfer | 39,433,722 | 6 mins agoTue, 18 Aug 2026 05:05:59 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63752 | |
| 0xd2d96efb…0acde9 | Transfer | 39,424,615 | 22 mins agoTue, 18 Aug 2026 04:50:45 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63736 | |
| 0x01d2d7b8…760865 | Transfer | 39,402,308 | 59 mins agoTue, 18 Aug 2026 04:13:27 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63629 | |
| 0x4ccb2fc2…0cbb6c | Transfer | 39,400,442 | 1 hr agoTue, 18 Aug 2026 04:10:19 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63618 | |
| 0x5f966ca3…d51089 | Transfer | 39,397,362 | 1 hr agoTue, 18 Aug 2026 04:05:10 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63604 | |
| 0xa3e3ce71…2204b3 | Transfer | 39,378,410 | 1 hr agoTue, 18 Aug 2026 03:33:29 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63518 | |
| 0x4d4534d3…c3a7c5 | Transfer | 39,359,408 | 2 hrs agoTue, 18 Aug 2026 03:01:44 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63418 | |
| 0xd428728e…aa21c7 | Transfer | 39,357,543 | 2 hrs agoTue, 18 Aug 2026 02:58:37 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63409 | |
| 0x2235458a…cbbb43 | Transfer | 39,354,384 | 2 hrs agoTue, 18 Aug 2026 02:53:21 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63400 | |
| 0xfa75a139…78df0b | Transfer | 39,341,537 | 2 hrs agoTue, 18 Aug 2026 02:31:52 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63311 | |
| 0xc97c71c8…5f9b42 | Transfer | 39,331,476 | 2 hrs agoTue, 18 Aug 2026 02:15:04 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63251 | |
| 0x891f0369…a31029 | Transfer | 39,328,383 | 3 hrs agoTue, 18 Aug 2026 02:09:55 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63235 | |
| 0x891f0369…a31029 | Transfer | 39,328,383 | 3 hrs agoTue, 18 Aug 2026 02:09:55 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63234 | |
| 0x52dfd6e2…7f9f16 | Transfer | 39,328,348 | 3 hrs agoTue, 18 Aug 2026 02:09:51 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63232 | |
| 0x52dfd6e2…7f9f16 | Transfer | 39,328,348 | 3 hrs agoTue, 18 Aug 2026 02:09:51 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63231 | |
| 0x40b51145…b5f661 | Transfer | 39,315,808 | 3 hrs agoTue, 18 Aug 2026 01:48:53 UTC | 0xc1af…a076 | OUT | 0x5345…bd07 | Transfer | up Position NFT (UP-POS) #58146 | |
| 0x659f9f8f…f16818 | Transfer | 39,304,740 | 3 hrs agoTue, 18 Aug 2026 01:30:23 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63150 | |
| 0x659f9f8f…f16818 | Transfer | 39,304,740 | 3 hrs agoTue, 18 Aug 2026 01:30:23 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63149 | |
| 0xeead858f…8f1b33 | Transfer | 39,295,435 | 3 hrs agoTue, 18 Aug 2026 01:14:49 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63124 | |
| 0xeead858f…8f1b33 | Transfer | 39,295,435 | 3 hrs agoTue, 18 Aug 2026 01:14:49 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63123 | |
| 0xebb6186b…fc8873 | Transfer | 39,293,958 | 4 hrs agoTue, 18 Aug 2026 01:12:22 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63119 | |
| 0xebb6186b…fc8873 | Transfer | 39,293,958 | 4 hrs agoTue, 18 Aug 2026 01:12:22 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63118 | |
| 0x325bbcf5…98415a | Transfer | 39,293,948 | 4 hrs agoTue, 18 Aug 2026 01:12:21 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63117 | |
| 0x325bbcf5…98415a | Transfer | 39,293,948 | 4 hrs agoTue, 18 Aug 2026 01:12:21 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63116 | |
| 0xb36f2af1…c3cf1c | Transfer | 39,293,939 | 4 hrs agoTue, 18 Aug 2026 01:12:20 UTC | 0xeca5…71f9 | IN | 0xc1af…a076 | Transfer | up Position NFT (UP-POS) #63115 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0xc1af…a076 | OUT | 0x91bd…5cd9 | 6,299.418830 DOGGIES | DOGGIES (DOGGIES) | |
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0xc1af…a076 | OUT | 0x91bd…5cd9 | 0.000017 WETH | WETH (WETH) | |
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 1,574.854707 DOGGIES | DOGGIES (DOGGIES) | |
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 0.000004 WETH | WETH (WETH) | |
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0x700b…bddb | IN | 0xc1af…a076 | 7,874.273537 DOGGIES | DOGGIES (DOGGIES) | |
| 0xd99e2f5a…4cc88c | Transfer | 39,436,178 | 2 mins agoTue, 18 Aug 2026 05:10:05 UTC | 0x700b…bddb | IN | 0xc1af…a076 | 0.000021 WETH | WETH (WETH) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0xc1af…a076 | OUT | 0xd6a6…3a2e | 5,744.773727 BICHKA | BICHKA (BICHKA) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0xc1af…a076 | OUT | 0xd6a6…3a2e | 0.000493 WETH | WETH (WETH) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 1,436.193431 BICHKA | BICHKA (BICHKA) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 0.000123 WETH | WETH (WETH) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0x2345…e2fc | IN | 0xc1af…a076 | 7,180.967159 BICHKA | BICHKA (BICHKA) | |
| 0x85258e10…11446b | Transfer | 39,408,040 | 49 mins agoTue, 18 Aug 2026 04:23:01 UTC | 0x2345…e2fc | IN | 0xc1af…a076 | 0.000617 WETH | WETH (WETH) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0xc1af…a076 | OUT | 0x4c30…9c59 | 375,519.770829 STINK | Stinkbroker (STINK) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0xc1af…a076 | OUT | 0x4c30…9c59 | 0.001654 WETH | WETH (WETH) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 93,879.942707 STINK | Stinkbroker (STINK) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 0.000413 WETH | WETH (WETH) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0x6f94…267c | IN | 0xc1af…a076 | 469,399.713537 STINK | Stinkbroker (STINK) | |
| 0x1edb9a73…fcadcd | Transfer | 39,407,192 | 51 mins agoTue, 18 Aug 2026 04:21:36 UTC | 0x6f94…267c | IN | 0xc1af…a076 | 0.002068 WETH | WETH (WETH) | |
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0xc1af…a076 | OUT | 0xb9ba…611e | $21.25940.877007 STONKBROKER | ||
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0xc1af…a076 | OUT | 0xb9ba…611e | 53,659.460945 NIPS | SHIRTLESS (NIPS) | |
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0xc1af…a076 | OUT | 0x5564…692c | $5.31235.219251 STONKBROKER | ||
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0xc1af…a076 | OUT | 0x5564…692c | 13,414.865236 NIPS | SHIRTLESS (NIPS) | |
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0x4e9f…6a2b | IN | 0xc1af…a076 | $NaN1,176.096259 STONKBROKER | ||
| 0xc29146c0…e604c3 | Transfer | 39,382,925 | 1 hr agoTue, 18 Aug 2026 03:41:02 UTC | 0x4e9f…6a2b | IN | 0xc1af…a076 | 67,074.326182 NIPS | SHIRTLESS (NIPS) | |
| 0xcd1a4d94…957d17 | Transfer | 39,382,870 | 1 hr agoTue, 18 Aug 2026 03:40:57 UTC | 0xc1af…a076 | OUT | 0xb9ba…611e | 115,735.802482 NIPS | SHIRTLESS (NIPS) |