// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {QuiverDeployer} from "../utils/QuiverDeployer.sol";
import {OwnerAdmins} from "../utils/OwnerAdmins.sol";
import {IQuiver} from "../interfaces/IQuiver.sol";
import {QuiverLpLockerV3} from "./QuiverLpLockerV3.sol";
import {ISwapRouter02, IUniswapV3Factory, IUniswapV3Pool, IWETH9} from "./interfaces/IUniswapV3.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {TickMath} from "@uniswap/v4-core/src/libraries/TickMath.sol";
/// @title QuiverV3 — token launcher on plain Uniswap v3
/// @notice Launches a fixed-supply token straight into a hookless Uniswap v3
/// pool (1% fee tier) seeded with single-sided token liquidity laddered
/// above the starting tick. No bonding curve, no graduation, no hooks —
/// tradeable through the standard SwapRouter02 from the first block,
/// and simulatable by every terminal/scanner. All LP NFTs are locked
/// forever in QuiverLpLockerV3; swap fees split creator/protocol.
contract QuiverV3 is OwnerAdmins, ReentrancyGuard {
error Deprecated();
error OnlyOriginatingChain();
error InvalidPositions();
error TeamFeeRecipientNotSet();
error InvalidProtocolBps();
/// @dev Identical signature to the v4 factory's event so the indexer needs
/// no new ABI: poolHook = address(0) marks a v3 launch, and poolId is
/// the v3 pool address left-padded to bytes32.
event TokenCreated(
address msgSender,
address indexed tokenAddress,
address indexed tokenAdmin,
string tokenImage,
string tokenName,
string tokenSymbol,
string tokenMetadata,
string tokenContext,
int24 startingTick,
address poolHook,
bytes32 poolId,
address pairedToken,
address locker,
address mevModule,
uint256 extensionsSupply,
address[] extensions
);
event SetDeprecated(bool deprecated);
event SetTeamFeeRecipient(address oldRecipient, address newRecipient);
event SetProtocolBps(uint16 oldBps, uint16 newBps);
string public constant version = "v3-1";
uint256 public constant TOKEN_SUPPLY = 1_000_000_000e18; // 1b with 18 decimals
uint256 public constant BPS = 10_000;
uint24 public constant POOL_FEE = 10_000; // 1% fee tier
int24 public constant TICK_SPACING = 200; // tick spacing of the 1% tier
uint256 public constant MAX_POSITIONS = 10;
IUniswapV3Factory public immutable uniswapV3Factory;
ISwapRouter02 public immutable swapRouter;
address public immutable weth;
QuiverLpLockerV3 public immutable locker;
// if true, the factory will not allow token deployments
bool public deprecated;
// protocol's share of LP fees, in bps; the creator receives the remainder
uint16 public protocolBps;
address public teamFeeRecipient;
/// @dev Single-sided liquidity range, expressed as if the new token were
/// token0 (same convention as the v4 stack's tickIfToken0IsQuiver);
/// ticks are flipped internally when the token sorts as token1.
struct PoolPosition {
int24 tickLower;
int24 tickUpper;
uint16 bps; // share of pool supply in this range; all bps sum to 10_000
}
struct V3DeploymentInfo {
address pool;
int24 startingTick;
address creatorRecipient;
}
mapping(address token => V3DeploymentInfo info) public deploymentInfoForToken;
constructor(
address owner_,
address uniswapV3Factory_,
address swapRouter_,
address weth_,
address locker_,
uint16 protocolBps_
) OwnerAdmins(owner_) {
uniswapV3Factory = IUniswapV3Factory(uniswapV3Factory_);
swapRouter = ISwapRouter02(swapRouter_);
weth = weth_;
locker = QuiverLpLockerV3(locker_);
if (protocolBps_ > BPS) revert InvalidProtocolBps();
protocolBps = protocolBps_;
// launches stay disabled until explicitly activated post-deploy
deprecated = true;
}
function setDeprecated(bool deprecated_) external onlyOwner {
deprecated = deprecated_;
emit SetDeprecated(deprecated_);
}
function setTeamFeeRecipient(address teamFeeRecipient_) external onlyOwner {
emit SetTeamFeeRecipient(teamFeeRecipient, teamFeeRecipient_);
teamFeeRecipient = teamFeeRecipient_;
}
function setProtocolBps(uint16 protocolBps_) external onlyOwner {
if (protocolBps_ > BPS) revert InvalidProtocolBps();
emit SetProtocolBps(protocolBps, protocolBps_);
protocolBps = protocolBps_;
}
/// @notice Deploy a token and seed its v3 pool. Any msg.value is used as a
/// same-tx initial buy ("dev buy") for the token admin.
function deployToken(
IQuiver.TokenConfig memory tokenConfig,
int24 tickIfToken0IsQuiver,
PoolPosition[] memory positions,
address creatorRecipient
) external payable nonReentrant returns (address tokenAddress) {
if (deprecated) revert Deprecated();
if (block.chainid != tokenConfig.originatingChainId) revert OnlyOriginatingChain();
if (teamFeeRecipient == address(0)) revert TeamFeeRecipientNotSet();
if (positions.length == 0 || positions.length > MAX_POSITIONS) revert InvalidPositions();
tokenAddress = QuiverDeployer.deployToken(tokenConfig, TOKEN_SUPPLY);
address pool = _initializePool(tokenAddress, tickIfToken0IsQuiver);
_placeLadder(tokenAddress, pool, positions, creatorRecipient);
deploymentInfoForToken[tokenAddress] = V3DeploymentInfo({
pool: pool,
startingTick: tickIfToken0IsQuiver,
creatorRecipient: creatorRecipient
});
// optional dev buy — the launch tx's ETH buys through the standard router
if (msg.value > 0) {
IWETH9(weth).deposit{value: msg.value}();
IWETH9(weth).approve(address(swapRouter), msg.value);
swapRouter.exactInputSingle(
ISwapRouter02.ExactInputSingleParams({
tokenIn: weth,
tokenOut: tokenAddress,
fee: POOL_FEE,
recipient: tokenConfig.tokenAdmin,
amountIn: msg.value,
amountOutMinimum: 1,
sqrtPriceLimitX96: 0
})
);
}
emit TokenCreated({
msgSender: msg.sender,
tokenAddress: tokenAddress,
tokenAdmin: tokenConfig.tokenAdmin,
tokenImage: tokenConfig.image,
tokenName: tokenConfig.name,
tokenSymbol: tokenConfig.symbol,
tokenMetadata: tokenConfig.metadata,
tokenContext: tokenConfig.context,
startingTick: tickIfToken0IsQuiver,
poolHook: address(0),
poolId: bytes32(uint256(uint160(pool))),
pairedToken: weth,
locker: address(locker),
mevModule: address(0),
extensionsSupply: 0,
extensions: new address[](0)
});
}
function _initializePool(address token, int24 tickIfToken0IsQuiver)
internal
returns (address pool)
{
bool token0IsQuiver = token < weth;
int24 startingTick = token0IsQuiver ? tickIfToken0IsQuiver : -tickIfToken0IsQuiver;
pool = uniswapV3Factory.createPool(token, weth, POOL_FEE);
IUniswapV3Pool(pool).initialize(TickMath.getSqrtPriceAtTick(startingTick));
}
/// @dev Validates and flips the ladder ranges, hands the pool supply to the
/// locker, and has the locker mint the positions directly on the pool
/// (raw positions owned by the locker — no NFT to misjudge).
function _placeLadder(
address token,
address pool,
PoolPosition[] memory positions,
address creatorRecipient
) internal {
bool token0IsQuiver = token < weth;
QuiverLpLockerV3.PositionRange[] memory ranges =
new QuiverLpLockerV3.PositionRange[](positions.length);
uint256[] memory amounts = new uint256[](positions.length);
uint256 totalBps;
for (uint256 i = 0; i < positions.length; i++) {
PoolPosition memory p = positions[i];
totalBps += p.bps;
// ranges are given in token0-is-quiver space; flip when token is token1
(int24 lower, int24 upper) =
token0IsQuiver ? (p.tickLower, p.tickUpper) : (-p.tickUpper, -p.tickLower);
if (
lower >= upper || lower % TICK_SPACING != 0 || upper % TICK_SPACING != 0
|| p.bps == 0
) revert InvalidPositions();
ranges[i] = QuiverLpLockerV3.PositionRange({tickLower: lower, tickUpper: upper});
amounts[i] = TOKEN_SUPPLY * p.bps / BPS;
}
if (totalBps != BPS) revert InvalidPositions();
address[] memory recipients = new address[](2);
uint16[] memory rewardBps = new uint16[](2);
recipients[0] = creatorRecipient;
rewardBps[0] = uint16(BPS) - protocolBps;
recipients[1] = teamFeeRecipient;
rewardBps[1] = protocolBps;
SafeERC20.safeTransfer(IERC20(token), address(locker), TOKEN_SUPPLY);
locker.placeLiquidity(token, pool, ranges, amounts, recipients, rewardBps);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3Factory_",
"type": "address",
"internalType": "address"
},
{
"name": "swapRouter_",
"type": "address",
"internalType": "address"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
},
{
"name": "locker_",
"type": "address",
"internalType": "address"
},
{
"name": "protocolBps_",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "nonpayable"
},
{
"name": "Deprecated",
"type": "error",
"inputs": []
},
{
"name": "InvalidPositions",
"type": "error",
"inputs": []
},
{
"name": "InvalidProtocolBps",
"type": "error",
"inputs": []
},
{
"name": "OnlyOriginatingChain",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "TeamFeeRecipientNotSet",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SetAdmin",
"type": "event",
"inputs": [
{
"name": "admin",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "enabled",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "SetDeprecated",
"type": "event",
"inputs": [
{
"name": "deprecated",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "SetProtocolBps",
"type": "event",
"inputs": [
{
"name": "oldBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "newBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "SetTeamFeeRecipient",
"type": "event",
"inputs": [
{
"name": "oldRecipient",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "newRecipient",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenCreated",
"type": "event",
"inputs": [
{
"name": "msgSender",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "tokenAddress",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenAdmin",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenImage",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenName",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenSymbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenMetadata",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenContext",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "startingTick",
"type": "int24",
"indexed": false,
"internalType": "int24"
},
{
"name": "poolHook",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "pairedToken",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "locker",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "mevModule",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "extensionsSupply",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "extensions",
"type": "address[]",
"indexed": false,
"internalType": "address[]"
}
],
"anonymous": false
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_POSITIONS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_SPACING",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TOKEN_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "admins",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "deployToken",
"type": "function",
"inputs": [
{
"name": "tokenConfig",
"type": "tuple",
"components": [
{
"name": "tokenAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "image",
"type": "string",
"internalType": "string"
},
{
"name": "metadata",
"type": "string",
"internalType": "string"
},
{
"name": "context",
"type": "string",
"internalType": "string"
},
{
"name": "originatingChainId",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct IQuiver.TokenConfig"
},
{
"name": "tickIfToken0IsQuiver",
"type": "int24",
"internalType": "int24"
},
{
"name": "positions",
"type": "tuple[]",
"components": [
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"internalType": "struct QuiverV3.PoolPosition[]"
},
{
"name": "creatorRecipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "tokenAddress",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "deploymentInfoForToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "pool",
"type": "address",
"internalType": "address"
},
{
"name": "startingTick",
"type": "int24",
"internalType": "int24"
},
{
"name": "creatorRecipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "deprecated",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "locker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract QuiverLpLockerV3"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "protocolBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setAdmin",
"type": "function",
"inputs": [
{
"name": "admin",
"type": "address",
"internalType": "address"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setDeprecated",
"type": "function",
"inputs": [
{
"name": "deprecated_",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolBps",
"type": "function",
"inputs": [
{
"name": "protocolBps_",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTeamFeeRecipient",
"type": "function",
"inputs": [
{
"name": "teamFeeRecipient_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapRouter02"
}
],
"stateMutability": "view"
},
{
"name": "teamFeeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV3Factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV3Factory"
}
],
"stateMutability": "view"
},
{
"name": "version",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x610100346101e057601f61261338819003918201601f19168301916001600160401b038311848410176101e45780849260c0946040528339810103126101e057610048816101f8565b90610055602082016101f8565b610061604083016101f8565b9261006e606084016101f8565b9260a061007d608083016101f8565b9101519361ffff8516928386036101e0576001600160a01b03169586156101cd575f80546001600160a01b031981168917825560405198612710979290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360016002556001600160a01b0390811660805290811660a05260c0919091521660e052116101be5760019062ffff006003549160081b169062ffffff19161717600355612406908161020d82396080518181816105420152610a8e015260a05181818161032a0152611576015260c0518181816109a801528181610a4301528181610d36015281816113b4015281816114c40152818161152d015281816115e6015281816116510152611f2c015260e0518181816102d901528181610ff901528181611086015281816111b401526113f10152f35b6342df8b5d60e01b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101e05756fe6080806040526004361015610012575f80fd5b5f905f3560e01c908163065629801461208c575080630e136b191461206a5780631564ea4b14611fa2578063228871c514611f6c578063249d39e914611f505780633fc8cef314611f00578063429b62e514611eb657806346ca626b14611e9b5780634b0bddd214611df2578063506eecaf146105cb57806354fd4d50146105665780635b54918214610515578063715018a6146104975780638da5cb5b14610464578063926ff2551461039a5780639496700514610375578063b152f6cf1461034e578063c31c9c07146102fd578063d7b96d4e146102ac578063d848dee714610226578063dd1b9c4a14610209578063f2fde38b146101395763f7b24e081461011b575f80fd5b346101365780600319360112610136576020604051600a8152f35b80fd5b50346101365760206003193601126101365773ffffffffffffffffffffffffffffffffffffffff610168612112565b610170612300565b1680156101dd5773ffffffffffffffffffffffffffffffffffffffff8254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b503461013657806003193601126101365760206040516127108152f35b5034610136576020600319360112610136576004358015158091036102a85760207f20db9067ad1976f7d6ee4ee07eea48c1139e0716fd856ec6edf203236c37db8291610271612300565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006003541660ff821617600355604051908152a180f35b5080fd5b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461013657806003193601126101365760206040516b033b2e3c9fd0803ce80000008152f35b5034610136578060031936011261013657602061ffff60035460081c16604051908152f35b5034610136576020600319360112610136576103b4612112565b6103bc612300565b7fffffffffffffffffff0000000000000000000000000000000000000000ffffff76ffffffffffffffffffffffffffffffffffffffff000000600354927fb4a70636e7a4c9d224bbe13304010ccb0ac964b3cc46c612d9abaeacfa204bd96040805173ffffffffffffffffffffffffffffffffffffffff8760181c16815273ffffffffffffffffffffffffffffffffffffffff84166020820152a160181b1691161760035580f35b503461013657806003193601126101365773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101365780600319360112610136576104b0612300565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610136578060031936011261013657506105c760405161058960408261216d565b600481527f76332d31000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190612248565b0390f35b5060806003193601126119d45760043567ffffffffffffffff81116119d45761010060031982360301126119d457604051610100810181811067ffffffffffffffff821117611dc557604052816004013573ffffffffffffffffffffffffffffffffffffffff811681036119d4578152602482013567ffffffffffffffff81116119d45761065f90600436918501016121ae565b6020820152604482013567ffffffffffffffff81116119d45761068890600436918501016121ae565b6040820152606081019160648101358352608481013567ffffffffffffffff81116119d4576106bd90600436918401016121ae565b608083015260a481013567ffffffffffffffff81116119d4576106e690600436918401016121ae565b60a083015260c481013567ffffffffffffffff81116119d45761070f90600436918401016121ae565b60c083015260e460e0830191013581526024358060020b81036119d4576044359167ffffffffffffffff83116119d457366023840112156119d457826004013561075881612230565b93610766604051958661216d565b81855260246060602087019302820101903682116119d457602401915b818310611d6b575050506064359473ffffffffffffffffffffffffffffffffffffffff861686036119d4576002805414611d43576002805560035460ff8116611d1b5782514603611cf35760181c73ffffffffffffffffffffffffffffffffffffffff1615611ccb5783518015908115611cc0575b50611c98576108e660209161091a9361094f60405195869485947fdf4471e80000000000000000000000000000000000000000000000000000000086526040600487015273ffffffffffffffffffffffffffffffffffffffff8c511660448701526108ab8c60406108798b83015161010060648c01526101448b0190612248565b9101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8983030160848a0152612248565b905160a487015260808c01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8783030160c4880152612248565b60a08b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8683030160e4870152612248565b60c08a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc85830301610104860152612248565b90516101248301526b033b2e3c9fd0803ce80000006024830152038173b78030203d2b6c16f485ded74bbc8770d99fa7fd5af49081156119c9575f91611c79575b5073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8216105f14611c6a5781925b604051937fa167129500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff8316600486015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602486015261271060448601526020856064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af19485156119c9575f95611c39575b5060020b8060ff1d8181011890620d89e88211611c0e57600182167001fffcb933bd6fad37aa2d162d1a59400102700100000000000000000000000000000000189160028116611bf2575b60048116611bd6575b60088116611bba575b60108116611b9e575b60208116611b82575b60408116611b66575b60808116611b4a575b6101008116611b2e575b6102008116611b12575b6104008116611af6575b6108008116611ada575b6110008116611abe575b6120008116611aa2575b6140008116611a86575b6180008116611a6a575b620100008116611a4e575b620200008116611a33575b620400008116611a18575b62080000166119ff575b5f126119d8575b73ffffffffffffffffffffffffffffffffffffffff85163b156119d45773ffffffffffffffffffffffffffffffffffffffff63ffffffff604051927ff637731d0000000000000000000000000000000000000000000000000000000084520160201c1660048201525f816024818373ffffffffffffffffffffffffffffffffffffffff8a165af180156119c9576119b4575b508051927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610c9a610c8486612230565b95610c92604051978861216d565b808752612230565b01885b8181106119915750508151957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610cec610cd689612230565b98610ce46040519a8b61216d565b808a52612230565b013660208901378895895b8451811015610ec857610d0a81866123f2565b519761ffff60408a0151168101809111610e1d579773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816105f14610ea657805160020b602082015160020b5b8060020b8260020b12801590610e94575b8015610e82575b8015610e72575b610e4a579160409161ffff93835191610db983612151565b60020b825260020b6020820152610dd0858c6123f2565b52610ddb848b6123f2565b500151166b033b2e3c9fd0803ce8000000818102048103610e1d57906127106001926b033b2e3c9fd0803ce80000000204610e16828c6123f2565b5201610cf7565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60048e7f4f5db42b000000000000000000000000000000000000000000000000000000008152fd5b5061ffff60408401511615610da1565b5060c88160020b0760020b1515610d9a565b5060c88260020b0760020b1515610d93565b610eb6602082015160020b61234c565b610ec3825160020b61234c565b610d82565b508993508789876127108a0361196957604051606093610ee8858361216d565b600282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501918236602083013760405192610f25878561216d565b6002845236602085013773ffffffffffffffffffffffffffffffffffffffff8516610f4f826123a8565b5260035461ffff808260081c16612710031161193c5761ffff90610f72856123a8565b82808360081c166127100316905273ffffffffffffffffffffffffffffffffffffffff8160181c16610fa3846123e2565b5260081c16610fb1846123e2565b5260208a8c6040518273ffffffffffffffffffffffffffffffffffffffff858301927fa9059cbb000000000000000000000000000000000000000000000000000000008452817f00000000000000000000000000000000000000000000000000000000000000001660248201526b033b2e3c9fd0803ce800000060448201526044815261103f60648261216d565b5193165af1156119315789513d611928575073ffffffffffffffffffffffffffffffffffffffff8b163b155b6118e65773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163b156118e2579289916040519485927f554db1030000000000000000000000000000000000000000000000000000000084528d73ffffffffffffffffffffffffffffffffffffffff60c486019116600486015273ffffffffffffffffffffffffffffffffffffffff8b16602486015260c060448601528151809152602060e48601920190865b8181106118ad5750505060031984820301606485015260208084519283815201930190855b8181106118915750505090611171916003198483030160848501526122b7565b926003198285030160a483015260208082519586815201910193835b8181106118715750508192935003818373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561183857908791611858575b505073ffffffffffffffffffffffffffffffffffffffff6001816040519361120b85612135565b8187168552602085018960020b8152826040870192168252828c168b526004602052828060408d20975116167fffffffffffffffffffffffff0000000000000000000000000000000000000000875416178655517fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff86549160a01b76ffffff00000000000000000000000000000000000000001691161785555116920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055346114ad575b825173ffffffffffffffffffffffffffffffffffffffff169460808401519260208501519460408101519060a08101519060c00151916040519561131c60208861216d565b8587525f368137604051988998338a5260208a016101c090526101c08a0161134391612248565b89810360408b015261135491612248565b908882039089015261136591612248565b868103608088015261137691612248565b85810360a087015261138791612248565b9560020b60c08501528160e085015273ffffffffffffffffffffffffffffffffffffffff166101008401527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166101208401527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610140840152806101608401526101808301528184036101a083015273ffffffffffffffffffffffffffffffffffffffff861693611463916122b7565b037f9299d1d1a88d8e1abdc591ae7a167a6bc63a8f17d695804e9091ee33aa89fb6791a360016002556040519073ffffffffffffffffffffffffffffffffffffffff168152602090f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163b156117bd576040517fd0e30db000000000000000000000000000000000000000000000000000000000815285816004813473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156117c857908691611843575b505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517f095ea7b30000000000000000000000000000000000000000000000000000000081528160048201523460248201526020816044818a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561183857611800575b5073ffffffffffffffffffffffffffffffffffffffff845116906040519060e0820182811067ffffffffffffffff8211176117d357908892916040527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168252602082019373ffffffffffffffffffffffffffffffffffffffff8b168552604083019061271082528684019081526080840134815260a08501916001835260c08601938785526040519889977f04e45aaf0000000000000000000000000000000000000000000000000000000089525173ffffffffffffffffffffffffffffffffffffffff1660048901525173ffffffffffffffffffffffffffffffffffffffff1660248801525162ffffff1660448701525173ffffffffffffffffffffffffffffffffffffffff1660648601525160848501525160a48401525173ffffffffffffffffffffffffffffffffffffffff1660c4830152815a9360e492602095f180156117c857611799575b506112d7565b602090813d83116117c1575b6117af818361216d565b810103126117bd5786611793565b8480fd5b503d6117a5565b6040513d88823e3d90fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6020813d602011611830575b816118196020938361216d565b8101031261182c57518015158114611613575b8680fd5b3d915061180c565b6040513d89823e3d90fd5b8161184d9161216d565b6117bd57848761155d565b816118629161216d565b61186d5785886111e4565b8580fd5b855161ffff1683526020958601958d95508794509092019160010161118d565b825185528e965088955060209485019490920191600101611151565b92829597506020919496506040908260019451805160020b8352015160020b838201520194019101908794928e96949261112c565b8980fd5b60248a73ffffffffffffffffffffffffffffffffffffffff8d7f5274afe700000000000000000000000000000000000000000000000000000000835216600452fd5b6001141561106b565b6040513d8b823e3d90fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004877f4f5db42b000000000000000000000000000000000000000000000000000000008152fd5b6020906040516119a081612151565b8b81528b8382015282828901015201610c9d565b6119c19197505f9061216d565b5f955f610c53565b6040513d5f823e3d90fd5b5f80fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04610bc1565b6b048a170391f7dc42444e8fa290910260801c90610bba565b6d2216e584f5fa1ea926041bedfe9890920260801c91610bb0565b916e5d6af8dedb81196699c329225ee6040260801c91610ba5565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c91610b9a565b916f31be135f97d08fd981231505542fcfa60260801c91610b8f565b916f70d869a156d2a1b890bb3df62baf32f70260801c91610b85565b916fa9f746462d870fdf8a65dc1f90e061e50260801c91610b7b565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91610b71565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91610b67565b916ff3392b0822b70005940c7a398e4b70f30260801c91610b5d565b916ff987a7253ac413176f2b074cf7815e540260801c91610b53565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91610b49565b916ffe5dee046a99a2a811c461f1969c30530260801c91610b3f565b916fff2ea16466c96a3843ec78b326b528610260801c91610b36565b916fff973b41fa98c081472e6896dfb254c00260801c91610b2d565b916fffcb9843d60f6159c9db58835c9266440260801c91610b24565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91610b1b565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c91610b12565b916ffff97272373d413259a46990580e213a0260801c91610b09565b7f8b86327a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c5c91955060203d602011611c63575b611c54818361216d565b81019061228b565b935f610abe565b503d611c4a565b611c738261234c565b926109e9565b611c92915060203d602011611c6357611c54818361216d565b5f610990565b7f4f5db42b000000000000000000000000000000000000000000000000000000005f5260045ffd5b600a9150115f6107f8565b7f096c59fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fc0112c87000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fc73b9d7c000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6060833603126119d45760405190611d8282612135565b611d8b84612222565b8252611d9960208501612222565b602083015260408401359061ffff821682036119d4578260209260406060950152815201920191610783565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b346119d45760406003193601126119d457611e0b612112565b602435908115158092036119d457602073ffffffffffffffffffffffffffffffffffffffff7f55a5194bc0174fcaf12b2978bef43911466bf63b34db8d1dd1a0d5dcd5c41bea92611e5a612300565b1692835f526001825260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2005b346119d4575f6003193601126119d457602060405160c88152f35b346119d45760206003193601126119d45773ffffffffffffffffffffffffffffffffffffffff611ee4612112565b165f526001602052602060ff60405f2054166040519015158152f35b346119d4575f6003193601126119d457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346119d4575f6003193601126119d45760206040516127108152f35b346119d4575f6003193601126119d457602073ffffffffffffffffffffffffffffffffffffffff60035460181c16604051908152f35b346119d45760206003193601126119d45760043561ffff8116908181036119d457611fcb612300565b61271082116120425762ffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff917fd16dcc41d04d1e3e98e8476a7388602630d8b9a7d9d4a71b020ae1321421bc6260406003549581519061ffff8860081c1682526020820152a160081b169116176003555f80f35b7f42df8b5d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346119d4575f6003193601126119d457602060ff600354166040519015158152f35b346119d45760206003193601126119d45760609073ffffffffffffffffffffffffffffffffffffffff6120bd612112565b165f52600460205260405f2073ffffffffffffffffffffffffffffffffffffffff60018254920154169073ffffffffffffffffffffffffffffffffffffffff8116835260a01c60020b60208301526040820152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036119d457565b6060810190811067ffffffffffffffff821117611dc557604052565b6040810190811067ffffffffffffffff821117611dc557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611dc557604052565b81601f820112156119d45780359067ffffffffffffffff8211611dc55760405192612201601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561216d565b828452602083830101116119d457815f926020809301838601378301015290565b35908160020b82036119d457565b67ffffffffffffffff8111611dc55760051b60200190565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b908160209103126119d4575173ffffffffffffffffffffffffffffffffffffffff811681036119d45790565b90602080835192838152019201905f5b8181106122d45750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016122c7565b73ffffffffffffffffffffffffffffffffffffffff5f5416330361232057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b60020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000811461237b575f0390565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8051156123b55760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8051600110156123b55760400190565b80518210156123b55760209160051b010190560000000000000000000000009748d3fe02890f155489dc4f76e413bdcd97ae5a0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa000000000000000000000000caf681a66d020601342297493863e78c959e5cb20000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7300000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c80000000000000000000000000000000000000000000000000000000000001388
0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163065629801461208c575080630e136b191461206a5780631564ea4b14611fa2578063228871c514611f6c578063249d39e914611f505780633fc8cef314611f00578063429b62e514611eb657806346ca626b14611e9b5780634b0bddd214611df2578063506eecaf146105cb57806354fd4d50146105665780635b54918214610515578063715018a6146104975780638da5cb5b14610464578063926ff2551461039a5780639496700514610375578063b152f6cf1461034e578063c31c9c07146102fd578063d7b96d4e146102ac578063d848dee714610226578063dd1b9c4a14610209578063f2fde38b146101395763f7b24e081461011b575f80fd5b346101365780600319360112610136576020604051600a8152f35b80fd5b50346101365760206003193601126101365773ffffffffffffffffffffffffffffffffffffffff610168612112565b610170612300565b1680156101dd5773ffffffffffffffffffffffffffffffffffffffff8254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b503461013657806003193601126101365760206040516127108152f35b5034610136576020600319360112610136576004358015158091036102a85760207f20db9067ad1976f7d6ee4ee07eea48c1139e0716fd856ec6edf203236c37db8291610271612300565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006003541660ff821617600355604051908152a180f35b5080fd5b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c8168152f35b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000caf681a66d020601342297493863e78c959e5cb2168152f35b503461013657806003193601126101365760206040516b033b2e3c9fd0803ce80000008152f35b5034610136578060031936011261013657602061ffff60035460081c16604051908152f35b5034610136576020600319360112610136576103b4612112565b6103bc612300565b7fffffffffffffffffff0000000000000000000000000000000000000000ffffff76ffffffffffffffffffffffffffffffffffffffff000000600354927fb4a70636e7a4c9d224bbe13304010ccb0ac964b3cc46c612d9abaeacfa204bd96040805173ffffffffffffffffffffffffffffffffffffffff8760181c16815273ffffffffffffffffffffffffffffffffffffffff84166020820152a160181b1691161760035580f35b503461013657806003193601126101365773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b50346101365780600319360112610136576104b0612300565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610136578060031936011261013657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa168152f35b5034610136578060031936011261013657506105c760405161058960408261216d565b600481527f76332d31000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190612248565b0390f35b5060806003193601126119d45760043567ffffffffffffffff81116119d45761010060031982360301126119d457604051610100810181811067ffffffffffffffff821117611dc557604052816004013573ffffffffffffffffffffffffffffffffffffffff811681036119d4578152602482013567ffffffffffffffff81116119d45761065f90600436918501016121ae565b6020820152604482013567ffffffffffffffff81116119d45761068890600436918501016121ae565b6040820152606081019160648101358352608481013567ffffffffffffffff81116119d4576106bd90600436918401016121ae565b608083015260a481013567ffffffffffffffff81116119d4576106e690600436918401016121ae565b60a083015260c481013567ffffffffffffffff81116119d45761070f90600436918401016121ae565b60c083015260e460e0830191013581526024358060020b81036119d4576044359167ffffffffffffffff83116119d457366023840112156119d457826004013561075881612230565b93610766604051958661216d565b81855260246060602087019302820101903682116119d457602401915b818310611d6b575050506064359473ffffffffffffffffffffffffffffffffffffffff861686036119d4576002805414611d43576002805560035460ff8116611d1b5782514603611cf35760181c73ffffffffffffffffffffffffffffffffffffffff1615611ccb5783518015908115611cc0575b50611c98576108e660209161091a9361094f60405195869485947fdf4471e80000000000000000000000000000000000000000000000000000000086526040600487015273ffffffffffffffffffffffffffffffffffffffff8c511660448701526108ab8c60406108798b83015161010060648c01526101448b0190612248565b9101517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8983030160848a0152612248565b905160a487015260808c01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8783030160c4880152612248565b60a08b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8683030160e4870152612248565b60c08a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc85830301610104860152612248565b90516101248301526b033b2e3c9fd0803ce80000006024830152038173b78030203d2b6c16f485ded74bbc8770d99fa7fd5af49081156119c9575f91611c79575b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731673ffffffffffffffffffffffffffffffffffffffff8216105f14611c6a5781925b604051937fa167129500000000000000000000000000000000000000000000000000000000855273ffffffffffffffffffffffffffffffffffffffff8316600486015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602486015261271060448601526020856064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa165af19485156119c9575f95611c39575b5060020b8060ff1d8181011890620d89e88211611c0e57600182167001fffcb933bd6fad37aa2d162d1a59400102700100000000000000000000000000000000189160028116611bf2575b60048116611bd6575b60088116611bba575b60108116611b9e575b60208116611b82575b60408116611b66575b60808116611b4a575b6101008116611b2e575b6102008116611b12575b6104008116611af6575b6108008116611ada575b6110008116611abe575b6120008116611aa2575b6140008116611a86575b6180008116611a6a575b620100008116611a4e575b620200008116611a33575b620400008116611a18575b62080000166119ff575b5f126119d8575b73ffffffffffffffffffffffffffffffffffffffff85163b156119d45773ffffffffffffffffffffffffffffffffffffffff63ffffffff604051927ff637731d0000000000000000000000000000000000000000000000000000000084520160201c1660048201525f816024818373ffffffffffffffffffffffffffffffffffffffff8a165af180156119c9576119b4575b508051927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610c9a610c8486612230565b95610c92604051978861216d565b808752612230565b01885b8181106119915750508151957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610cec610cd689612230565b98610ce46040519a8b61216d565b808a52612230565b013660208901378895895b8451811015610ec857610d0a81866123f2565b519761ffff60408a0151168101809111610e1d579773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad731673ffffffffffffffffffffffffffffffffffffffff8816105f14610ea657805160020b602082015160020b5b8060020b8260020b12801590610e94575b8015610e82575b8015610e72575b610e4a579160409161ffff93835191610db983612151565b60020b825260020b6020820152610dd0858c6123f2565b52610ddb848b6123f2565b500151166b033b2e3c9fd0803ce8000000818102048103610e1d57906127106001926b033b2e3c9fd0803ce80000000204610e16828c6123f2565b5201610cf7565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b60048e7f4f5db42b000000000000000000000000000000000000000000000000000000008152fd5b5061ffff60408401511615610da1565b5060c88160020b0760020b1515610d9a565b5060c88260020b0760020b1515610d93565b610eb6602082015160020b61234c565b610ec3825160020b61234c565b610d82565b508993508789876127108a0361196957604051606093610ee8858361216d565b600282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08501918236602083013760405192610f25878561216d565b6002845236602085013773ffffffffffffffffffffffffffffffffffffffff8516610f4f826123a8565b5260035461ffff808260081c16612710031161193c5761ffff90610f72856123a8565b82808360081c166127100316905273ffffffffffffffffffffffffffffffffffffffff8160181c16610fa3846123e2565b5260081c16610fb1846123e2565b5260208a8c6040518273ffffffffffffffffffffffffffffffffffffffff858301927fa9059cbb000000000000000000000000000000000000000000000000000000008452817f00000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c81660248201526b033b2e3c9fd0803ce800000060448201526044815261103f60648261216d565b5193165af1156119315789513d611928575073ffffffffffffffffffffffffffffffffffffffff8b163b155b6118e65773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c8163b156118e2579289916040519485927f554db1030000000000000000000000000000000000000000000000000000000084528d73ffffffffffffffffffffffffffffffffffffffff60c486019116600486015273ffffffffffffffffffffffffffffffffffffffff8b16602486015260c060448601528151809152602060e48601920190865b8181106118ad5750505060031984820301606485015260208084519283815201930190855b8181106118915750505090611171916003198483030160848501526122b7565b926003198285030160a483015260208082519586815201910193835b8181106118715750508192935003818373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c8165af1801561183857908791611858575b505073ffffffffffffffffffffffffffffffffffffffff6001816040519361120b85612135565b8187168552602085018960020b8152826040870192168252828c168b526004602052828060408d20975116167fffffffffffffffffffffffff0000000000000000000000000000000000000000875416178655517fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff86549160a01b76ffffff00000000000000000000000000000000000000001691161785555116920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055346114ad575b825173ffffffffffffffffffffffffffffffffffffffff169460808401519260208501519460408101519060a08101519060c00151916040519561131c60208861216d565b8587525f368137604051988998338a5260208a016101c090526101c08a0161134391612248565b89810360408b015261135491612248565b908882039089015261136591612248565b868103608088015261137691612248565b85810360a087015261138791612248565b9560020b60c08501528160e085015273ffffffffffffffffffffffffffffffffffffffff166101008401527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7373ffffffffffffffffffffffffffffffffffffffff166101208401527f00000000000000000000000080b270ab7d8e46dbebbe2434a59a852dd94a03c873ffffffffffffffffffffffffffffffffffffffff16610140840152806101608401526101808301528184036101a083015273ffffffffffffffffffffffffffffffffffffffff861693611463916122b7565b037f9299d1d1a88d8e1abdc591ae7a167a6bc63a8f17d695804e9091ee33aa89fb6791a360016002556040519073ffffffffffffffffffffffffffffffffffffffff168152602090f35b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73163b156117bd576040517fd0e30db000000000000000000000000000000000000000000000000000000000815285816004813473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165af180156117c857908691611843575b505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000caf681a66d020601342297493863e78c959e5cb2166040517f095ea7b30000000000000000000000000000000000000000000000000000000081528160048201523460248201526020816044818a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165af1801561183857611800575b5073ffffffffffffffffffffffffffffffffffffffff845116906040519060e0820182811067ffffffffffffffff8211176117d357908892916040527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7373ffffffffffffffffffffffffffffffffffffffff168252602082019373ffffffffffffffffffffffffffffffffffffffff8b168552604083019061271082528684019081526080840134815260a08501916001835260c08601938785526040519889977f04e45aaf0000000000000000000000000000000000000000000000000000000089525173ffffffffffffffffffffffffffffffffffffffff1660048901525173ffffffffffffffffffffffffffffffffffffffff1660248801525162ffffff1660448701525173ffffffffffffffffffffffffffffffffffffffff1660648601525160848501525160a48401525173ffffffffffffffffffffffffffffffffffffffff1660c4830152815a9360e492602095f180156117c857611799575b506112d7565b602090813d83116117c1575b6117af818361216d565b810103126117bd5786611793565b8480fd5b503d6117a5565b6040513d88823e3d90fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6020813d602011611830575b816118196020938361216d565b8101031261182c57518015158114611613575b8680fd5b3d915061180c565b6040513d89823e3d90fd5b8161184d9161216d565b6117bd57848761155d565b816118629161216d565b61186d5785886111e4565b8580fd5b855161ffff1683526020958601958d95508794509092019160010161118d565b825185528e965088955060209485019490920191600101611151565b92829597506020919496506040908260019451805160020b8352015160020b838201520194019101908794928e96949261112c565b8980fd5b60248a73ffffffffffffffffffffffffffffffffffffffff8d7f5274afe700000000000000000000000000000000000000000000000000000000835216600452fd5b6001141561106b565b6040513d8b823e3d90fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004877f4f5db42b000000000000000000000000000000000000000000000000000000008152fd5b6020906040516119a081612151565b8b81528b8382015282828901015201610c9d565b6119c19197505f9061216d565b5f955f610c53565b6040513d5f823e3d90fd5b5f80fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04610bc1565b6b048a170391f7dc42444e8fa290910260801c90610bba565b6d2216e584f5fa1ea926041bedfe9890920260801c91610bb0565b916e5d6af8dedb81196699c329225ee6040260801c91610ba5565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c91610b9a565b916f31be135f97d08fd981231505542fcfa60260801c91610b8f565b916f70d869a156d2a1b890bb3df62baf32f70260801c91610b85565b916fa9f746462d870fdf8a65dc1f90e061e50260801c91610b7b565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91610b71565b916fe7159475a2c29b7443b29c7fa6e889d90260801c91610b67565b916ff3392b0822b70005940c7a398e4b70f30260801c91610b5d565b916ff987a7253ac413176f2b074cf7815e540260801c91610b53565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91610b49565b916ffe5dee046a99a2a811c461f1969c30530260801c91610b3f565b916fff2ea16466c96a3843ec78b326b528610260801c91610b36565b916fff973b41fa98c081472e6896dfb254c00260801c91610b2d565b916fffcb9843d60f6159c9db58835c9266440260801c91610b24565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91610b1b565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c91610b12565b916ffff97272373d413259a46990580e213a0260801c91610b09565b7f8b86327a000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b611c5c91955060203d602011611c63575b611c54818361216d565b81019061228b565b935f610abe565b503d611c4a565b611c738261234c565b926109e9565b611c92915060203d602011611c6357611c54818361216d565b5f610990565b7f4f5db42b000000000000000000000000000000000000000000000000000000005f5260045ffd5b600a9150115f6107f8565b7f096c59fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fc0112c87000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fc73b9d7c000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6060833603126119d45760405190611d8282612135565b611d8b84612222565b8252611d9960208501612222565b602083015260408401359061ffff821682036119d4578260209260406060950152815201920191610783565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b346119d45760406003193601126119d457611e0b612112565b602435908115158092036119d457602073ffffffffffffffffffffffffffffffffffffffff7f55a5194bc0174fcaf12b2978bef43911466bf63b34db8d1dd1a0d5dcd5c41bea92611e5a612300565b1692835f526001825260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a2005b346119d4575f6003193601126119d457602060405160c88152f35b346119d45760206003193601126119d45773ffffffffffffffffffffffffffffffffffffffff611ee4612112565b165f526001602052602060ff60405f2054166040519015158152f35b346119d4575f6003193601126119d457602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b346119d4575f6003193601126119d45760206040516127108152f35b346119d4575f6003193601126119d457602073ffffffffffffffffffffffffffffffffffffffff60035460181c16604051908152f35b346119d45760206003193601126119d45760043561ffff8116908181036119d457611fcb612300565b61271082116120425762ffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff917fd16dcc41d04d1e3e98e8476a7388602630d8b9a7d9d4a71b020ae1321421bc6260406003549581519061ffff8860081c1682526020820152a160081b169116176003555f80f35b7f42df8b5d000000000000000000000000000000000000000000000000000000005f5260045ffd5b346119d4575f6003193601126119d457602060ff600354166040519015158152f35b346119d45760206003193601126119d45760609073ffffffffffffffffffffffffffffffffffffffff6120bd612112565b165f52600460205260405f2073ffffffffffffffffffffffffffffffffffffffff60018254920154169073ffffffffffffffffffffffffffffffffffffffff8116835260a01c60020b60208301526040820152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036119d457565b6060810190811067ffffffffffffffff821117611dc557604052565b6040810190811067ffffffffffffffff821117611dc557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611dc557604052565b81601f820112156119d45780359067ffffffffffffffff8211611dc55760405192612201601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561216d565b828452602083830101116119d457815f926020809301838601378301015290565b35908160020b82036119d457565b67ffffffffffffffff8111611dc55760051b60200190565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b908160209103126119d4575173ffffffffffffffffffffffffffffffffffffffff811681036119d45790565b90602080835192838152019201905f5b8181106122d45750505090565b825173ffffffffffffffffffffffffffffffffffffffff168452602093840193909201916001016122c7565b73ffffffffffffffffffffffffffffffffffffffff5f5416330361232057565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b60020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000811461237b575f0390565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8051156123b55760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8051600110156123b55760400190565b80518210156123b55760209160051b01019056
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xffaf75…39123e | 33 days agoWed, 15 Jul 2026 04:47:17 UTC | 0x20db90…db82 | data: 0x000000000000000000…00000001 |
| 0x777a50…ab26a1 | 33 days agoWed, 15 Jul 2026 04:26:02 UTC | 0x9299d1…fb67 | [0] 0x000000000000…a6b9a21e [1] 0x000000000000…e7f2f8cc data: 0x000000000000000000…00000000 |
| 0xf65c58…ace4f1 | 33 days agoWed, 15 Jul 2026 04:20:26 UTC | 0x20db90…db82 | data: 0x000000000000000000…00000000 |
| 0xc712ed…631b6a | 33 days agoWed, 15 Jul 2026 04:20:23 UTC | 0xb4a706…4bd9 | data: 0x000000000000000000…cd97ae5a |
| 0x97efff…c8f4ab | 33 days agoWed, 15 Jul 2026 04:20:18 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…cd97ae5a |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x777a509b…ab26a1 | Transfer | 10,103,068 | 33 days agoWed, 15 Jul 2026 04:26:02 UTC | 0x8ad6…e26a | OUT | 0x80b2…03c8 | 1,000,000,000.000000 HOOD | HOOD (HOOD) | |
| 0x777a509b…ab26a1 | Transfer | 10,103,068 | 33 days agoWed, 15 Jul 2026 04:26:02 UTC | 0x0000…0000 | IN | 0x8ad6…e26a | 1,000,000,000.000000 HOOD | HOOD (HOOD) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xffaf75…39123e | setDeprecated | 10,115,753 | 33 days agoWed, 15 Jul 2026 04:47:17 UTC | 0x9748…ae5a | IN | QuiverV3 | $0.000 ETH | 0.00000152 | |
| 0x777a50…ab26a1 | deployToken | 10,103,068 | 33 days agoWed, 15 Jul 2026 04:26:02 UTC | 0x515e…f8cc | IN | QuiverV3 | $0.000 ETH | 0.00031325 | |
| 0xf65c58…ace4f1 | setDeprecated | 10,099,719 | 33 days agoWed, 15 Jul 2026 04:20:26 UTC | 0x9748…ae5a | IN | QuiverV3 | $0.000 ETH | 0.00000151 | |
| 0xc712ed…631b6a | setTeamFeeRecipient | 10,099,690 | 33 days agoWed, 15 Jul 2026 04:20:23 UTC | 0x9748…ae5a | IN | QuiverV3 | $0.000 ETH | 0.00000153 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 10,103,068 | 33 days agoWed, 15 Jul 2026 04:26:02 UTC | 0x777a50…ab26a1 | CREATE2 | deployToken | 0x8ad6…e26a | OUT | 0x08a7…a21e | 0 ETH |