| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xc9078d…852155 | 22 days agoFri, 24 Jul 2026 22:19:24 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…ee2b93d7 data: 0x000000000000000000…27543553 |
| 0x0f848e…5aced4 | 22 days agoFri, 24 Jul 2026 22:19:16 UTC | Approval | [0] 0x000000000000…a7459046 [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0x48e52f…f33405 | 22 days agoFri, 24 Jul 2026 22:19:15 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…a7459046 data: 0x000000000000000000…89b82335 |
| 0xf069a1…957141 | 22 days agoFri, 24 Jul 2026 22:16:01 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…5e5367c3 data: 0x000000000000000000…8278b0f7 |
| 0xe5a81f…6f5ab2 | 22 days agoFri, 24 Jul 2026 22:16:00 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…113c68da data: 0x000000000000000000…0c2def85 |
| 0x5e82dd…5ecc8b | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | Approval | [0] 0x000000000000…113c68da [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0xea167b…28198d | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | Approval | [0] 0x000000000000…7ab24f49 [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0xb04ea5…9983a8 | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | Approval | [0] 0x000000000000…53997855 [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0xfb3895…9a8afb | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | Approval | [0] 0x000000000000…5e5367c3 [1] 0x000000000000…172bb7fe data: 0xffffffffffffffffff…ffffffff |
| 0x76c4ae…2bee63 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Transfer | [0] 0x000000000000…53997855 [1] 0x000000000000…9f3c9255 data: 0x000000000000000000…8817e965 |
| 0xa38fc1…ad8c7d | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Transfer | [0] 0x000000000000…113c68da [1] 0x000000000000…9f3c9255 data: 0x000000000000000000…0b3cc1e2 |
| 0xac8e49…cd9d80 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Approval | [0] 0x000000000000…113c68da [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x3f60eb…27dd95 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Transfer | [0] 0x000000000000…5e5367c3 [1] 0x000000000000…9f3c9255 data: 0x000000000000000000…d1759093 |
| 0x66d6db…9b800f | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Approval | [0] 0x000000000000…5e5367c3 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xa66e20…03c73c | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Transfer | [0] 0x000000000000…7ab24f49 [1] 0x000000000000…9f3c9255 data: 0x000000000000000000…18d20701 |
| 0x040af7…b19ea4 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Approval | [0] 0x000000000000…7ab24f49 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x241547…63c3fe | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | Approval | [0] 0x000000000000…53997855 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xed422f…f818d8 | 22 days agoFri, 24 Jul 2026 22:14:11 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…53997855 data: 0x000000000000000000…f09391a6 |
| 0xd26229…760de4 | 22 days agoFri, 24 Jul 2026 22:14:11 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…5e5367c3 data: 0x000000000000000000…07e102e2 |
| 0xd0853e…383328 | 22 days agoFri, 24 Jul 2026 22:14:11 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…113c68da data: 0x000000000000000000…af6d53f7 |
| 0xe40e99…94d436 | 22 days agoFri, 24 Jul 2026 22:14:11 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…7ab24f49 data: 0x000000000000000000…1601269e |
| 0x519b35…365cce | 22 days agoFri, 24 Jul 2026 22:14:03 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…113c68da data: 0x000000000000000000…76b04515 |
| 0x5a1d17…8fa0ad | 22 days agoFri, 24 Jul 2026 22:14:03 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…5e5367c3 data: 0x000000000000000000…78aeeb5a |
| 0xeb1158…268452 | 22 days agoFri, 24 Jul 2026 22:14:03 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…53997855 data: 0x000000000000000000…2a5f9fe1 |
| 0x0b8e00…f855d0 | 22 days agoFri, 24 Jul 2026 22:14:03 UTC | Transfer | [0] 0x000000000000…9f3c9255 [1] 0x000000000000…7ab24f49 data: 0x000000000000000000…0c48de05 |
| 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 | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x0f848e…5aced4 | Approve | 18,502,601 | 22 days agoFri, 24 Jul 2026 22:19:16 UTC | 0xe516…9046 | IN | PlotHood | $0.000 ETH | 0.00000494 | |
| 0xea167b…28198d | Approve | 18,500,521 | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | 0xf7d1…4f49 | IN | PlotHood | $0.000 ETH | 0.00000490 | |
| 0x5e82dd…5ecc8b | Approve | 18,500,521 | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | 0x73a4…68da | IN | PlotHood | $0.000 ETH | 0.00000490 | |
| 0xb04ea5…9983a8 | Approve | 18,500,520 | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | 0x6921…7855 | IN | PlotHood | $0.000 ETH | 0.00000490 | |
| 0xfb3895…9a8afb | Approve | 18,500,519 | 22 days agoFri, 24 Jul 2026 22:15:47 UTC | 0xf32c…67c3 | IN | PlotHood | $0.000 ETH | 0.00000495 | |
| 0x66d6db…9b800f | Approve | 18,499,604 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | 0xf32c…67c3 | IN | PlotHood | $0.000 ETH | 0.00000492 | |
| 0xac8e49…cd9d80 | Approve | 18,499,604 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | 0x73a4…68da | IN | PlotHood | $0.000 ETH | 0.00000492 | |
| 0x040af7…b19ea4 | Approve | 18,499,604 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | 0xf7d1…4f49 | IN | PlotHood | $0.000 ETH | 0.00000492 | |
| 0x241547…63c3fe | Approve | 18,499,604 | 22 days agoFri, 24 Jul 2026 22:14:16 UTC | 0x6921…7855 | IN | PlotHood | $0.000 ETH | 0.00000492 | |
| 0xa8eecb…1f707d | Approve | 18,498,631 | 22 days agoFri, 24 Jul 2026 22:12:38 UTC | 0x376c…93d7 | IN | PlotHood | $0.000 ETH | 0.00000487 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "forge-std/Script.sol";
import {LaunchRegistry} from "../src/LaunchRegistry.sol";
import {LPLock} from "../src/LPLock.sol";
import {VoterRewardsForwarder} from "../src/VoterRewardsForwarder.sol";
import {FeeCollector} from "../src/FeeCollector.sol";
import {LightspeedPoolHook} from "../src/LightspeedPoolHook.sol";
import {TestnetLightspeedPoolHook} from "../src/TestnetLightspeedPoolHook.sol";
import {EpochSettlement} from "../src/EpochSettlement.sol";
import {Voter} from "../src/Voter.sol";
import {EmissionsPot} from "../src/EmissionsPot.sol";
import {LaunchFactory} from "../src/LaunchFactory.sol";
import {IPoolManager} from "v4-core/src/interfaces/IPoolManager.sol";
import {Currency} from "v4-core/src/types/Currency.sol";
import {PoolKey} from "v4-core/src/types/PoolKey.sol";
import {IHooks} from "v4-core/src/interfaces/IHooks.sol";
import {IFeeCollectorSwapper} from "../src/IFeeCollectorSwapper.sol";
import {V4FeeCollectorSwapper} from "../src/V4FeeCollectorSwapper.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {MockFeeCollectorSwapper} from "../test/mocks/MockFeeCollectorSwapper.sol";
import {MockPoolInitializer} from "../test/mocks/MockPoolInitializer.sol";
import {LightspeedPoolInitializer} from "../src/LightspeedPoolInitializer.sol";
/// PRE-MAINNET GATE (M-6): Before mainnet deploy, verify in v4-periphery that PositionManager
/// forwards the MINT_POSITION_FROM_DELTAS hookData as the `data` argument to safeTransferFrom
/// → onERC721Received. LPLock depends on this to self-register positions; if not forwarded, every
/// launch would revert with InvalidHookData. See LPLock.onERC721Received @dev.
/// @notice Mintable ERC20 for testnet deploy when USE_MOCK_TOKENS=1
contract MockERC20Deploy is ERC20 {
constructor(string memory name, string memory symbol, uint256 initialSupply) ERC20(name, symbol) {
_mint(msg.sender, initialSupply);
}
}
contract DeployLightspeed is Script {
uint256 public constant BASE_SEPOLIA = 84532;
uint256 public constant DEFAULT_TOP_K = 10;
/// @dev Canonical WETH on Base / Base Sepolia (OP Stack)
address public constant BASE_WETH = 0x4200000000000000000000000000000000000006;
/// @dev Mainnet: 1 week; test: set EPOCH_LENGTH_SECONDS=3600 for 1-hour epochs
uint256 public constant DEFAULT_EPOCH_LENGTH = 604800; // 1 week
uint256 public constant DEFAULT_LOCK_DURATION = 52 * 604800; // 52 weeks
/// @dev Base Sepolia V4 (Uniswap deployments); used when chainId == BASE_SEPOLIA and env not set
address public constant BASE_SEPOLIA_POOL_MANAGER = 0x05E73354cFDd6745C338b50BcFDfA3Aa6fA03408;
address public constant BASE_SEPOLIA_POSITION_MANAGER = 0x4B2C77d209D3405F41a037Ec6c77F7F5b8e2ca80;
function run() external {
bool isBaseSepolia = block.chainid == BASE_SEPOLIA;
address poolManager = vm.envOr("POOL_MANAGER", isBaseSepolia ? BASE_SEPOLIA_POOL_MANAGER : address(0));
address positionManager = vm.envOr("POSITION_MANAGER", isBaseSepolia ? BASE_SEPOLIA_POSITION_MANAGER : address(0));
if (poolManager == address(0)) poolManager = vm.envAddress("POOL_MANAGER");
if (positionManager == address(0)) positionManager = vm.envAddress("POSITION_MANAGER");
bool useMockTokens = vm.envOr("USE_MOCK_TOKENS", false);
address weth = vm.envOr("WETH", block.chainid == BASE_SEPOLIA ? BASE_WETH : address(0));
if (weth == address(0)) weth = vm.envAddress("WETH");
address speed;
address warpcore;
if (useMockTokens) {
speed = address(0); // set below inside broadcast
warpcore = address(0);
} else {
speed = vm.envAddress("SPEED");
warpcore = vm.envAddress("WARPCORE");
}
vm.startBroadcast();
if (useMockTokens) {
MockERC20Deploy speedToken = new MockERC20Deploy("SPEED", "SPEED", 10_000_000 * 1e18);
MockERC20Deploy warpcoreToken = new MockERC20Deploy("Warpcore", "WARP", 10_000_000 * 1e18);
speed = address(speedToken);
warpcore = address(warpcoreToken);
console.log("SPEED (mock)=%s", speed);
console.log("WARPCORE (mock)=%s", warpcore);
}
address speedcli = vm.envOr("SPEEDCLI", msg.sender);
address swapper = vm.envOr("SWAPPER", address(0));
address poolInitializer = vm.envOr("POOL_INITIALIZER", address(0));
uint256 topK = vm.envOr("TOP_K", DEFAULT_TOP_K);
bool useTestHook = vm.envOr("USE_TEST_HOOK", block.chainid == BASE_SEPOLIA);
address canonicalFee = vm.envOr("CANONICAL_FEE_CURRENCY", speed);
bool useRealTestnet = vm.envOr("USE_REAL_TESTNET", isBaseSepolia);
// Test: 1-hour epochs + shorter lock; mainnet: 1 week + 52 weeks (set env to override)
uint256 epochLength = vm.envOr("EPOCH_LENGTH_SECONDS", (block.chainid == BASE_SEPOLIA || useMockTokens) ? 3600 : DEFAULT_EPOCH_LENGTH);
uint256 lockDuration = vm.envOr("LOCK_DURATION_SECONDS", (block.chainid == BASE_SEPOLIA || useMockTokens) ? 52 * 3600 : DEFAULT_LOCK_DURATION);
LaunchRegistry registry = new LaunchRegistry();
if (poolInitializer == address(0)) {
if (useRealTestnet) {
LightspeedPoolInitializer realInit = new LightspeedPoolInitializer(
IPoolManager(poolManager), positionManager
);
poolInitializer = address(realInit);
} else {
MockPoolInitializer mockInit = new MockPoolInitializer();
poolInitializer = address(mockInit);
}
}
LPLock lplock = new LPLock(positionManager, poolInitializer);
VoterRewardsForwarder forwarder = new VoterRewardsForwarder(weth);
if (swapper == address(0)) {
if (useRealTestnet && useMockTokens && speed != address(0)) {
// Real testnet: create SPEED/WETH pool (no hook) and use V4 swapper
(address c0, address c1) = speed < weth ? (speed, weth) : (weth, speed);
PoolKey memory speedWethKey = PoolKey({
currency0: Currency.wrap(c0),
currency1: Currency.wrap(c1),
fee: 3000,
tickSpacing: 60,
hooks: IHooks(address(0))
});
IPoolManager(poolManager).initialize(speedWethKey, 79228162514264337593543950336);
V4FeeCollectorSwapper v4Swapper = new V4FeeCollectorSwapper(
IPoolManager(poolManager), speedWethKey, weth
);
swapper = address(v4Swapper);
} else {
MockFeeCollectorSwapper mockSwapper = new MockFeeCollectorSwapper(IERC20(weth));
swapper = address(mockSwapper);
}
}
FeeCollector feeCollector = new FeeCollector(weth, address(forwarder), speedcli, IFeeCollectorSwapper(swapper));
forwarder.setFeeCollector(address(feeCollector));
address hookAddr;
if (useTestHook) {
TestnetLightspeedPoolHook hook = new TestnetLightspeedPoolHook(
IPoolManager(poolManager), address(feeCollector), Currency.wrap(canonicalFee), epochLength
);
hookAddr = address(hook);
} else {
LightspeedPoolHook hook = new LightspeedPoolHook(
IPoolManager(poolManager), address(feeCollector), Currency.wrap(canonicalFee), epochLength
);
hookAddr = address(hook);
}
EpochSettlement epochSettlement = new EpochSettlement(hookAddr, address(registry), topK, epochLength);
Voter voter = new Voter(warpcore, weth, address(registry), address(forwarder), epochSettlement, epochLength);
forwarder.setVoter(address(voter));
EmissionsPot emissionsPot = new EmissionsPot(speed, address(voter), address(registry), epochLength);
LaunchFactory factory = new LaunchFactory(
speed, address(emissionsPot), poolInitializer, address(registry), address(lplock), hookAddr, address(feeCollector), epochLength, lockDuration
);
registry.setFactory(address(factory));
emissionsPot.setFactory(address(factory));
vm.stopBroadcast();
_logAddresses(
address(registry),
address(factory),
address(voter),
address(emissionsPot),
address(feeCollector),
address(lplock),
address(epochSettlement),
hookAddr,
poolInitializer
);
}
function _logAddresses(
address registry,
address factory,
address voter,
address emissionsPot,
address feeCollector,
address lplock,
address epochSettlement,
address hook,
address poolInitializer
) internal pure {
console.log("LAUNCH_REGISTRY_ADDRESS=%s", registry);
console.log("LAUNCH_FACTORY_ADDRESS=%s", factory);
console.log("LAUNCH_VOTER_ADDRESS=%s", voter);
console.log("LAUNCH_EMISSIONS_POT_ADDRESS=%s", emissionsPot);
console.log("LAUNCH_FEE_COLLECTOR_ADDRESS=%s", feeCollector);
console.log("LAUNCH_LPLOCK_ADDRESS=%s", lplock);
console.log("LAUNCH_EPOCH_SETTLEMENT_ADDRESS=%s", epochSettlement);
console.log("LAUNCH_HOOK_ADDRESS=%s", hook);
console.log("POOL_INITIALIZER_ADDRESS=%s", poolInitializer);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "initialSupply",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x60406080815234620003845762000aa1803803806200001e8162000388565b9283398101606082820312620003845781516001600160401b03929083811162000384578262000050918301620003ae565b60209283830151858111620003845786916200006e918501620003ae565b9201519381518181116200028f576003908154906001948583811c9316801562000379575b8884101462000365578190601f9384811162000312575b508890848311600114620002af575f92620002a3575b50505f1982851b1c191690851b1782555b84519283116200028f5760049485548581811c9116801562000284575b88821014620002715782811162000229575b5086918411600114620001c2579383949184925f95620001b6575b50501b925f19911b1c19161781555b3315620001a057600254908382018092116200018d57505f917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160025533835282815284832084815401905584519384523393a35161068290816200041f8239f35b601190634e487b7160e01b5f525260245ffd5b6024905f85519163ec442f0560e01b8352820152fd5b015193505f806200011b565b9190601f19841692865f5284885f20945f5b8a89838310620002115750505010620001f7575b50505050811b0181556200012a565b01519060f8845f19921b161c191690555f808080620001e8565b868601518955909701969485019488935001620001d4565b865f52875f208380870160051c8201928a881062000267575b0160051c019086905b8281106200025b57505062000100565b5f81550186906200024b565b9250819262000242565b602287634e487b7160e01b5f525260245ffd5b90607f1690620000ee565b634e487b7160e01b5f52604160045260245ffd5b015190505f80620000c0565b90879350601f19831691865f528a5f20925f5b8c828210620002fb5750508411620002e3575b505050811b018255620000d1565b01515f1983871b60f8161c191690555f8080620002d5565b8385015186558b97909501949384019301620002c2565b909150845f52885f208480850160051c8201928b86106200035b575b918991869594930160051c01915b8281106200034c575050620000aa565b5f81558594508991016200033c565b925081926200032e565b634e487b7160e01b5f52602260045260245ffd5b92607f169262000093565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176200028f57604052565b919080601f84011215620003845782516001600160401b0381116200028f57602090620003e4601f8201601f1916830162000388565b9281845282828701011162000384575f5b8181106200040a5750825f9394955001015290565b8581018301518482018401528201620003f556fe6080604090808252600480361015610015575f80fd5b5f3560e01c91826306fdde031461042757508163095ea7b31461037f57816318160ddd1461036157816323b872dd1461026f578163313ce5671461025457816370a082311461021e57816395d89b41146100ff57508063a9059cbb146100cf5763dd62ed3e14610083575f80fd5b346100cb57806003193601126100cb5760209061009e610546565b6100a661055c565b9060018060a01b038091165f5260018452825f2091165f528252805f20549051908152f35b5f80fd5b50346100cb57806003193601126100cb576020906100f86100ee610546565b6024359033610572565b5160018152f35b82346100cb575f3660031901126100cb578051905f835460018160011c9060018316928315610214575b6020938484108114610201578388529081156101e55750600114610191575b505050829003601f01601f191682019267ffffffffffffffff84118385101761017e575082918261017a9252826104ff565b0390f35b604190634e487b7160e01b5f525260245ffd5b5f878152929350837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106101d15750505050830101848080610148565b8054888601830152930192849082016101bb565b60ff1916878501525050151560051b8401019050848080610148565b602289634e487b7160e01b5f525260245ffd5b91607f1691610129565b82346100cb5760203660031901126100cb576020906001600160a01b03610243610546565b165f525f8252805f20549051908152f35b82346100cb575f3660031901126100cb576020905160128152f35b9050346100cb5760603660031901126100cb5761028a610546565b61029261055c565b906044359260018060a01b038216805f526001602052855f20335f52602052855f2054915f1983106102cd575b6020876100f8888888610572565b85831061033557811561031f57331561030957505f908152600160209081528682203383528152908690209185900390915582906100f86102bf565b6024905f885191634a1406b160e11b8352820152fd5b6024905f88519163e602df0560e01b8352820152fd5b8651637dc7a0d960e11b8152339181019182526020820193909352604081018690528291506060010390fd5b82346100cb575f3660031901126100cb576020906002549051908152f35b82346100cb57806003193601126100cb57610398610546565b602435903315610411576001600160a01b03169081156103fb5760209350335f5260018452825f20825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8251634a1406b160e11b81525f81860152602490fd5b825163e602df0560e01b81525f81860152602490fd5b83346100cb575f3660031901126100cb575f60035460018160011c90600183169283156104f5575b6020938484108114610201578388529081156101e5575060011461049f57505050829003601f01601f191682019267ffffffffffffffff84118385101761017e575082918261017a9252826104ff565b60035f908152929350837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106104e15750505050830101848080610148565b8054888601830152930192849082016104cb565b91607f169161044f565b602080825282518183018190529093925f5b82811061053257505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501610511565b600435906001600160a01b03821682036100cb57565b602435906001600160a01b03821682036100cb57565b916001600160a01b03808416928315610634571692831561061c57825f525f60205260405f2054908282106105ea5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f5260405f20818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b60405163ec442f0560e01b81525f6004820152602490fd5b604051634b637e8f60e11b81525f6004820152602490fdfea2646970667358221220869f4d9ebc33ebb1e5f4c93661c7f939190d9843313cba104d53b7c802cf601c64736f6c63430008180033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000000000000000000000000008506c6f74486f6f64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000550484f4f44000000000000000000000000000000000000000000000000000000
0x6080604090808252600480361015610015575f80fd5b5f3560e01c91826306fdde031461042757508163095ea7b31461037f57816318160ddd1461036157816323b872dd1461026f578163313ce5671461025457816370a082311461021e57816395d89b41146100ff57508063a9059cbb146100cf5763dd62ed3e14610083575f80fd5b346100cb57806003193601126100cb5760209061009e610546565b6100a661055c565b9060018060a01b038091165f5260018452825f2091165f528252805f20549051908152f35b5f80fd5b50346100cb57806003193601126100cb576020906100f86100ee610546565b6024359033610572565b5160018152f35b82346100cb575f3660031901126100cb578051905f835460018160011c9060018316928315610214575b6020938484108114610201578388529081156101e55750600114610191575b505050829003601f01601f191682019267ffffffffffffffff84118385101761017e575082918261017a9252826104ff565b0390f35b604190634e487b7160e01b5f525260245ffd5b5f878152929350837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106101d15750505050830101848080610148565b8054888601830152930192849082016101bb565b60ff1916878501525050151560051b8401019050848080610148565b602289634e487b7160e01b5f525260245ffd5b91607f1691610129565b82346100cb5760203660031901126100cb576020906001600160a01b03610243610546565b165f525f8252805f20549051908152f35b82346100cb575f3660031901126100cb576020905160128152f35b9050346100cb5760603660031901126100cb5761028a610546565b61029261055c565b906044359260018060a01b038216805f526001602052855f20335f52602052855f2054915f1983106102cd575b6020876100f8888888610572565b85831061033557811561031f57331561030957505f908152600160209081528682203383528152908690209185900390915582906100f86102bf565b6024905f885191634a1406b160e11b8352820152fd5b6024905f88519163e602df0560e01b8352820152fd5b8651637dc7a0d960e11b8152339181019182526020820193909352604081018690528291506060010390fd5b82346100cb575f3660031901126100cb576020906002549051908152f35b82346100cb57806003193601126100cb57610398610546565b602435903315610411576001600160a01b03169081156103fb5760209350335f5260018452825f20825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8251634a1406b160e11b81525f81860152602490fd5b825163e602df0560e01b81525f81860152602490fd5b83346100cb575f3660031901126100cb575f60035460018160011c90600183169283156104f5575b6020938484108114610201578388529081156101e5575060011461049f57505050829003601f01601f191682019267ffffffffffffffff84118385101761017e575082918261017a9252826104ff565b60035f908152929350837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8385106104e15750505050830101848080610148565b8054888601830152930192849082016104cb565b91607f169161044f565b602080825282518183018190529093925f5b82811061053257505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501610511565b600435906001600160a01b03821682036100cb57565b602435906001600160a01b03821682036100cb57565b916001600160a01b03808416928315610634571692831561061c57825f525f60205260405f2054908282106105ea5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f5260405f20818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b60405163ec442f0560e01b81525f6004820152602490fd5b604051634b637e8f60e11b81525f6004820152602490fdfea2646970667358221220869f4d9ebc33ebb1e5f4c93661c7f939190d9843313cba104d53b7c802cf601c64736f6c63430008180033