// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import {WarchestConstants as W} from "./WarchestConstants.sol";
import {IArbSys, IWarchestVault, IWarchestEvents} from "./interfaces/IWarchest.sol";
/// @title DrawEngine — the two clocks of every warchest.
/// @notice Permissionless strike at fixed UTC boundaries (00:00/12:00 for the 12h draw,
/// Friday 20:00 for the weekly mega-draw), commit-reveal seeded from ArbSys L2
/// block hashes (Chainlink VRF does not exist on chain 4663 — verified), and
/// claim-based payouts against a per-draw merkle root whose winner set is a
/// pure function of on-chain state (publicly reproducible via ExpandDraw).
contract DrawEngine is ReentrancyGuard, IWarchestEvents {
enum Status { None, Committed, Finalized, Claimable, Swept }
struct Draw {
uint8 kind; // 0 = 12h, 1 = weekly
uint256 boundary; // the UTC boundary this draw settles
uint64 targetBlock; // ArbSys L2 block whose hashes seed the draw
bytes32 seed; // set at finalize
bytes32 root; // set at postRoot
uint256 pot; // escrow taken at strike
uint256 remaining; // escrow still unspent (tips/claims/releases decrement)
uint256 claimDeadline; // boundary + CLAIM_WINDOW once claimable
address striker;
Status status;
}
address public rootPoster;
address public pendingRootPoster;
mapping(address => uint256) public drawCount; // vault => next id
mapping(address => mapping(uint256 => Draw)) public draws; // vault => id => draw
mapping(address => mapping(uint8 => uint256)) public lastBoundary; // vault => kind => struck boundary
mapping(address => mapping(uint8 => uint256)) public pendingDraw; // vault => kind => drawId+1 of a Committed draw (0 = none)
mapping(address => mapping(uint256 => mapping(address => bool))) public claimed;
error BoundaryNotReached();
error PreviousDrawPending();
error BadStatus();
error NotRootPoster();
error PayoutExceedsPot();
error RevealWindowClosed();
error RevealWindowOpen();
error TooEarly();
error AlreadyClaimed();
error BadProof();
error DeadlineNotPassed();
error DeadlinePassed();
constructor(address rootPoster_) {
rootPoster = rootPoster_;
}
function currentBoundary(uint8 kind) public view returns (uint256) {
return kind == 0 ? W.boundary12(block.timestamp) : W.boundaryWeek(block.timestamp);
}
/// @notice Open the draw for the latest unstruck boundary of `kind`. Permissionless;
/// the striker earns STRIKE_TIP_BPS of the pot immediately. INV5: one strike
/// per (vault, kind, boundary), enforced by the lastBoundary monotone.
function strike(address vault, uint8 kind) external nonReentrant returns (uint256 drawId) {
uint256 boundary = currentBoundary(kind); // reverts BadKind inside lockPot for kind>1
if (boundary <= lastBoundary[vault][kind]) revert BoundaryNotReached();
if (pendingDraw[vault][kind] != 0) revert PreviousDrawPending();
uint256 pot = IWarchestVault(vault).lockPot(kind); // also validates kind (BadKind)
lastBoundary[vault][kind] = boundary;
drawId = drawCount[vault]++;
Draw storage d = draws[vault][drawId];
d.kind = kind;
d.boundary = boundary;
d.pot = pot;
d.striker = msg.sender;
if (pot == 0) {
d.status = Status.Swept; // quiet pool: close, never jam the clock
emit Struck(vault, drawId, kind, boundary, 0, msg.sender);
emit Swept(vault, drawId, 0);
return drawId;
}
uint256 tip = pot * W.STRIKE_TIP_BPS / 10000;
d.remaining = pot - tip;
d.targetBlock = uint64(IArbSys(W.ARBSYS).arbBlockNumber() + W.REVEAL_DELAY);
d.status = Status.Committed;
pendingDraw[vault][kind] = drawId + 1;
if (tip > 0) IWarchestVault(vault).payEscrow(msg.sender, tip);
emit Struck(vault, drawId, kind, boundary, pot, msg.sender);
}
/// @dev Implemented in the next task; declared here so tests compile incrementally.
function finalize(address vault, uint256 drawId) external nonReentrant {
_finalize(vault, drawId);
}
/// @notice Re-target a draw whose reveal window was missed (at ~100ms blocks the
/// 256-hash window is ~25s — missing it must never brick a draw). Only
/// callable AFTER the window closed, so an open window can never be skipped
/// by someone who dislikes its hashes; and the new target is again in the
/// future, so the caller cannot know the seed they are arming.
function rearm(address vault, uint256 drawId) external nonReentrant {
Draw storage d = draws[vault][drawId];
if (d.status != Status.Committed) revert BadStatus();
uint256 bn = IArbSys(W.ARBSYS).arbBlockNumber();
if (bn <= uint256(d.targetBlock) + W.REVEAL_WINDOW) revert RevealWindowOpen();
d.targetBlock = uint64(bn + W.REVEAL_DELAY);
emit Rearmed(vault, drawId, d.targetBlock);
}
function _finalize(address vault, uint256 drawId) internal {
Draw storage d = draws[vault][drawId];
if (d.status != Status.Committed) revert BadStatus();
IArbSys arb = IArbSys(W.ARBSYS);
uint256 bn = arb.arbBlockNumber();
if (bn <= d.targetBlock) revert TooEarly();
if (bn > uint256(d.targetBlock) + W.REVEAL_WINDOW) revert RevealWindowClosed();
bytes32[5] memory hs;
for (uint256 i; i < 5; i++) hs[i] = arb.arbBlockHash(d.targetBlock - i);
d.seed = keccak256(abi.encode(hs, vault, d.kind, drawId));
d.status = Status.Finalized;
pendingDraw[vault][d.kind] = 0;
uint256 tip = d.pot * W.FINALIZE_TIP_BPS / 10000;
if (tip > 0) { d.remaining -= tip; IWarchestVault(vault).payEscrow(msg.sender, tip); }
emit Finalized(vault, drawId, d.seed, msg.sender);
}
/// @notice Publish the winner-set commitment for a finalized draw. rootPoster is
/// the F1 trust surface — but the winner set is a pure function of the
/// on-chain seed and boundary-block TWAB state, so any observer re-running
/// script/warchest/ExpandDraw.s.sol must reproduce this root bit-for-bit.
/// The undrawn share (floor-dropped tiers, rounding) returns to the pot NOW.
function postRoot(address vault, uint256 drawId, bytes32 root, uint256 totalPayout)
external nonReentrant
{
if (msg.sender != rootPoster) revert NotRootPoster();
Draw storage d = draws[vault][drawId];
if (d.status != Status.Finalized) revert BadStatus();
if (totalPayout > d.remaining) revert PayoutExceedsPot();
uint256 releaseBack = d.remaining - totalPayout;
d.remaining = totalPayout;
d.root = root;
d.claimDeadline = d.boundary + W.CLAIM_WINDOW;
d.status = Status.Claimable;
if (releaseBack > 0) IWarchestVault(vault).releaseEscrow(d.kind, releaseBack);
emit RootPosted(vault, drawId, root, totalPayout, releaseBack);
}
/// @notice Execute a winner's claim. Callable by anyone FOR the winner — the payout
/// address is bound inside the leaf, so a third-party caller can only ever
/// send the winner their own prize.
function claim(address vault, uint256 drawId, address account, uint256 amount, bytes32[] calldata proof)
external nonReentrant
{
Draw storage d = draws[vault][drawId];
if (d.status != Status.Claimable) revert BadStatus();
if (block.timestamp > d.claimDeadline) revert DeadlinePassed();
if (claimed[vault][drawId][account]) revert AlreadyClaimed();
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(vault, drawId, account, amount))));
if (!MerkleProof.verify(proof, d.root, leaf)) revert BadProof();
claimed[vault][drawId][account] = true;
d.remaining -= amount; // over-payout structurally impossible
IWarchestVault(vault).payEscrow(account, amount);
emit Claimed(vault, drawId, account, amount);
}
/// @notice After the claim window, roll whatever was never claimed back into the
/// SAME pool's pot of the same kind (spec: "volta pro pote da própria pool").
function sweepExpired(address vault, uint256 drawId) external nonReentrant {
Draw storage d = draws[vault][drawId];
if (d.status != Status.Claimable) revert BadStatus();
if (block.timestamp <= d.claimDeadline) revert DeadlineNotPassed();
uint256 back = d.remaining;
d.remaining = 0;
d.status = Status.Swept;
if (back > 0) IWarchestVault(vault).releaseEscrow(d.kind, back);
emit Swept(vault, drawId, back);
}
// ---- rootPoster rotation: two-step, mirror of the locker's recipient pattern ----
function proposeRootPoster(address to) external {
if (msg.sender != rootPoster) revert NotRootPoster();
pendingRootPoster = to;
emit RootPosterProposed(rootPoster, to);
}
function acceptRootPoster() external {
if (msg.sender != pendingRootPoster) revert NotRootPoster();
address from = rootPoster;
rootPoster = msg.sender;
delete pendingRootPoster;
emit RootPosterRotated(from, msg.sender);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "rootPoster_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyClaimed",
"type": "error",
"inputs": []
},
{
"name": "BadProof",
"type": "error",
"inputs": []
},
{
"name": "BadStatus",
"type": "error",
"inputs": []
},
{
"name": "BoundaryNotReached",
"type": "error",
"inputs": []
},
{
"name": "DeadlineNotPassed",
"type": "error",
"inputs": []
},
{
"name": "DeadlinePassed",
"type": "error",
"inputs": []
},
{
"name": "NotRootPoster",
"type": "error",
"inputs": []
},
{
"name": "PayoutExceedsPot",
"type": "error",
"inputs": []
},
{
"name": "PreviousDrawPending",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RevealWindowClosed",
"type": "error",
"inputs": []
},
{
"name": "RevealWindowOpen",
"type": "error",
"inputs": []
},
{
"name": "TooEarly",
"type": "error",
"inputs": []
},
{
"name": "Activated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "mode",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "beneficiary",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ExitExecuted",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "beneficiary",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ExitRequested",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "exitAfter",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Finalized",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "seed",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "finalizer",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Harvested",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wethToVault",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PrizeDeposited",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "toPot12",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "toWeek",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "toCorpus",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "toHouse",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Rearmed",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "newTargetBlock",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "RootPosted",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "root",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "totalPayout",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "releasedBack",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RootPosterProposed",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RootPosterRotated",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Staked",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newBalance",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Struck",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "kind",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "boundary",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "pot",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "striker",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Swept",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "returnedToPot",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Unstaked",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newBalance",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "acceptRootPoster",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "proof",
"type": "bytes32[]",
"internalType": "bytes32[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimed",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "currentBoundary",
"type": "function",
"inputs": [
{
"name": "kind",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "drawCount",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "draws",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "kind",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "boundary",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "targetBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "seed",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "root",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "pot",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "remaining",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "claimDeadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "striker",
"type": "address",
"internalType": "address"
},
{
"name": "status",
"type": "uint8",
"internalType": "enum DrawEngine.Status"
}
],
"stateMutability": "view"
},
{
"name": "finalize",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "lastBoundary",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingDraw",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingRootPoster",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "postRoot",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "root",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalPayout",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "proposeRootPoster",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rearm",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rootPoster",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "strike",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "kind",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "sweepExpired",
"type": "function",
"inputs": [
{
"name": "vault",
"type": "address",
"internalType": "address"
},
{
"name": "drawId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x608034607057601f611d3838819003918201601f19168301916001600160401b03831184841017607457808492602094604052833981010312607057516001600160a01b0381169081900360705760015f5560018060a01b03196001541617600155604051611caf90816100898239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f803560e01c80630553e156146111ea578063087af4d61461117057806312d18ed614610d76578063270f8fc614610ced5780632744302d14610c045780633a7ad71e14610bb257806346c53d9714610b5257806370c5b97c14610a6b5780637c15c606146108625780637e443c9e146107ff5780638860b04b146107ad5780639f0d20bc146104e5578063a192249d14610494578063c063d80014610362578063d71ed1f7146101465763dee9df4e146100ca575f80fd5b346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760ff60406101056115ff565b9273ffffffffffffffffffffffffffffffffffffffff610123611645565b9416815260066020522091165f52602052602060405f2054604051908152f35b80fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761017e6115ff565b73ffffffffffffffffffffffffffffffffffffffff6024359161019f611c42565b168083526004602052604083208284526020526040832060ff600882015460a01c1660058110156103355760010361030d57604051907fa3b1b31d00000000000000000000000000000000000000000000000000000000825260208260048160645afa9182156103025785926102c9575b506002019061022967ffffffffffffffff835416611713565b8111156102a15767ffffffffffffffff7fc13a4d39ef90a8b06dc2702fa7e6914f713b7feb4800f39798354416d78cd8bf928180610268602095611721565b16167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555416604051908152a36001815580f35b6004857fcbe6d1c6000000000000000000000000000000000000000000000000000000008152fd5b9091506020813d6020116102fa575b816102e560209383611655565b810103126102f65751906002610210565b5f80fd5b3d91506102d8565b6040513d87823e3d90fd5b6004847f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435773ffffffffffffffffffffffffffffffffffffffff6103af6115ff565b16815260046020526040812060243582526020526040812060ff8154169073ffffffffffffffffffffffffffffffffffffffff60018201549167ffffffffffffffff6002820154169060038101546004820154600583015490600684015492600860078601549501549560ff8760a01c16986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152166101008301526005811015610467576101409250610120820152f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610143576004359060ff821682036101435760206104dd83611bf1565b604051908152f35b50346101435760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761051d6115ff565b602435906044359060643590610531611c42565b73ffffffffffffffffffffffffffffffffffffffff6001541633036107855773ffffffffffffffffffffffffffffffffffffffff16918285526004602052604085208486526020526040852091600883019260ff845460a01c166005811015610758576002036107305760068101938454808411610708576105b48480926116c3565b955583600483015560018201546213c68081018091116106db57600783015580547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674030000000000000000000000000000000000000000179055869084610658575b5050907fff119ce44500ed28a4358ef71a789fc5031a696c5304ad2eaf37f60d5d09b5f69260609260405192835260208301526040820152a36001815580f35b5460ff16853b156106d7576040517f8f3df4c100000000000000000000000000000000000000000000000000000000815260ff919091166004820152602481018590528181604481838a5af180156106cc571561061857816106bc91949394611655565b6106c85790855f610618565b8580fd5b6040513d84823e3d90fd5b5080fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004897fed0894dc000000000000000000000000000000000000000000000000000000008152fd5b6004877f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6004857f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357604060209173ffffffffffffffffffffffffffffffffffffffff6108516115ff565b168152600383522054604051908152f35b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761089a6115ff565b73ffffffffffffffffffffffffffffffffffffffff602435916108bb611c42565b1680835260046020526040832082845260205260408320600881019060ff825460a01c166005811015610a3e57600303610a165760078101544211156109ee57806006869201928284549455740400000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8254161790558261097e575b505060207f8a89918ff5a1192aacedc279940d66eec9c0a1c2c6490aea91350ff42981c1a991604051908152a36001815580f35b5460ff16833b156106d7576040517f8f3df4c100000000000000000000000000000000000000000000000000000000815260ff91909116600482015260248101839052818160448183885af180156106cc571561094a57816109df91611655565b6109ea57835f61094a565b8380fd5b6004857f2eb35430000000000000000000000000000000000000000000000000000000008152fd5b6004857f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760025473ffffffffffffffffffffffffffffffffffffffff81163303610b2a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660025573ffffffffffffffffffffffffffffffffffffffff3391167fc9cd8f741667defec0767ce0fca45b2ab0bebda61398a3005f353fa40a30ca598380a380f35b6004827f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610143576020906001610ba8610b926115ff565b610b9a611645565b90610ba3611c42565b61172f565b9155604051908152f35b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357610c3c6115ff565b73ffffffffffffffffffffffffffffffffffffffff6001541690813303610cc55773ffffffffffffffffffffffffffffffffffffffff1690817fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002557fb92ede793667588d6058304554ce7affab6f0f0216795e1a97ec879681fb8d788380a380f35b6004837f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b50346101435760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435773ffffffffffffffffffffffffffffffffffffffff6040610d3c6115ff565b9282610d46611622565b94168152600760205281812060243582526020522091165f52602052602060ff60405f2054166040519015158152f35b50346101435760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357610dae6115ff565b602435610db9611622565b91606435906084359267ffffffffffffffff84116106c857366023850112156106c85783600401359467ffffffffffffffff861161116c578560051b93602485870101933685116111685773ffffffffffffffffffffffffffffffffffffffff90610e22611c42565b1691828952600460205260408920848a52602052604089209660ff600889015460a01c16600581101561113b5760030361111357600788015442116110eb57838a52600760205260408a20858b5260205260408a2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054166110c357604051956020870185815286604089015273ffffffffffffffffffffffffffffffffffffffff84169788606082015285608082015260808152610ee360a082611655565b5190206040516020810191825260208152610eff604082611655565b5190209160048a01549a610f1960206040519b018b611655565b8952602401602089015b8282106110b3575050509689975b8751891015610f735760208960051b89010151908181105f14610f62578b52602052600160408b205b980197610f31565b908b52602052600160408b20610f5a565b8a9750890361108b57906006879285845260076020526040842087855260205260408420885f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501610fd68482546116c3565b9055833b156106d7576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101839052818160448183885af180156106cc57611072575b505060207f8dab6d35466ca3cba614bc5b262979b277949786977e81107f375f7e39f7734a91604051908152a46001815580f35b8161107c91611655565b61108757848661103e565b8480fd5b6004877f7ca55c77000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610f23565b60048a7f646cf558000000000000000000000000000000000000000000000000000000008152fd5b60048a7f70f65caa000000000000000000000000000000000000000000000000000000008152fd5b60048a7f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b8880fd5b8680fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760ff60406111ac6115ff565b9273ffffffffffffffffffffffffffffffffffffffff6111ca611645565b9416815260056020522091165f52602052602060405f2054604051908152f35b50346102f65760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f6576112226115ff565b9073ffffffffffffffffffffffffffffffffffffffff60243592611244611c42565b16805f52600460205260405f20835f5260205260405f2091600883019360ff855460a01c1660058110156115d2576001036115aa57604051927fa3b1b31d00000000000000000000000000000000000000000000000000000000845260208460048160645afa93841561138f575f94611576575b5067ffffffffffffffff600286015416938481111561154e576112da85611713565b1061152657604051956112ee60a088611655565b60a03688375f5b600581101561139a5761130881876116c3565b90604051917f2b407a82000000000000000000000000000000000000000000000000000000008352600483015260208260248160645afa801561138f575f9061135d575b600192508160051b8a0152016112f5565b506020823d8211611387575b8161137660209383611655565b810103126102f6576001915161134c565b3d9150611369565b6040513d5f823e3d90fd5b50858760ff825416604051906020820192835f905b60058210611510575050508560c083015260e08201528561010082015261010081526113dd61012082611655565b5190209160038201928355740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff825416179055825f52600660205260405f2060ff80835416165f526020525f604081205561271061145360058301546116fd565b049081611495575b505060407f93be94673341e7ca1d0935965b5df66ada5ff3c882c00bf67010b4a7acdd1bee91548151908152336020820152a36001815580f35b6006016114a38282546116c3565b9055823b156102f6576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815233600482015260248101919091525f8160448183875af1801561138f576114fa575b8061145b565b6115079194505f90611655565b5f9260406114f4565b60208060019285518152019301910190916113af565b7f81b07242000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f085de625000000000000000000000000000000000000000000000000000000005f5260045ffd5b9093506020813d6020116115a2575b8161159260209383611655565b810103126102f65751925f6112b8565b3d9150611585565b7f5c975bda000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102f657565b6044359073ffffffffffffffffffffffffffffffffffffffff821682036102f657565b6024359060ff821682036102f657565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761169657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b919082039182116116d057565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b906032820291808304603214901517156116d057565b9060c882018092116116d057565b90602882018092116116d057565b919073ffffffffffffffffffffffffffffffffffffffff61174f82611bf1565b9316805f52600560205260405f2060ff83165f5260205260405f2054841115611bca57805f52600660205260405f2060ff83165f5260205260405f2054611ba25760ff604051927ffec70b3f000000000000000000000000000000000000000000000000000000008452168060048401526020836024815f865af192831561138f575f93611b6e575b50815f52600560205260405f20815f526020528460405f2055815f52600360205260405f20928354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85146116d0576001850190558395835f52600460205260405f20855f5260205260405f2094837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008754161786558160018701558260058701556008860190337fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782558315611abc57506127106118bb846116fd565b04956118c787856116c3565b60068201556040517fa3b1b31d00000000000000000000000000000000000000000000000000000000815260208160048160645afa90811561138f575f91611a89575b50600267ffffffffffffffff6119208193611721565b16920191167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82541617905560018701948588116116d0578795855f52600660205260405f20855f5260205260405f2055806119f4575b50916080917fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb099360405192835260208301526040820152336060820152a3565b92909450833b156102f6576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815233600482015260248101939093525f8360448183885af191821561138f5787957fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb0994608094611a79575b50919350916119b4565b5f611a8391611655565b5f611a6f565b90506020813d602011611ab4575b81611aa460209383611655565b810103126102f65751600261190a565b3d9150611a97565b96975086955084925085937fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb0992608092740400000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82541617905560405191825260208201525f6040820152336060820152a37f8a89918ff5a1192aacedc279940d66eec9c0a1c2c6490aea91350ff42981c1a960206040515f8152a390565b9092506020813d602011611b9a575b81611b8a60209383611655565b810103126102f65751915f6117d8565b3d9150611b7d565b7fde69a7e7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ecc4797000000000000000000000000000000000000000000000000000000005f5260045ffd5b60ff16611c0957611c0661a8c04206426116c3565b90565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd954042014281116116d05762093a80611c069106426116c3565b60025f5414611c515760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208b49b91fb10ba15529324f7f7b87df1078e2b8918a6ca7d72de1719443c778fd64736f6c634300081a0033000000000000000000000000f5d0cfff0995355b4d5158f80e9ea1a4cf314b2f
0x60806040526004361015610011575f80fd5b5f803560e01c80630553e156146111ea578063087af4d61461117057806312d18ed614610d76578063270f8fc614610ced5780632744302d14610c045780633a7ad71e14610bb257806346c53d9714610b5257806370c5b97c14610a6b5780637c15c606146108625780637e443c9e146107ff5780638860b04b146107ad5780639f0d20bc146104e5578063a192249d14610494578063c063d80014610362578063d71ed1f7146101465763dee9df4e146100ca575f80fd5b346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760ff60406101056115ff565b9273ffffffffffffffffffffffffffffffffffffffff610123611645565b9416815260066020522091165f52602052602060405f2054604051908152f35b80fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761017e6115ff565b73ffffffffffffffffffffffffffffffffffffffff6024359161019f611c42565b168083526004602052604083208284526020526040832060ff600882015460a01c1660058110156103355760010361030d57604051907fa3b1b31d00000000000000000000000000000000000000000000000000000000825260208260048160645afa9182156103025785926102c9575b506002019061022967ffffffffffffffff835416611713565b8111156102a15767ffffffffffffffff7fc13a4d39ef90a8b06dc2702fa7e6914f713b7feb4800f39798354416d78cd8bf928180610268602095611721565b16167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161781555416604051908152a36001815580f35b6004857fcbe6d1c6000000000000000000000000000000000000000000000000000000008152fd5b9091506020813d6020116102fa575b816102e560209383611655565b810103126102f65751906002610210565b5f80fd5b3d91506102d8565b6040513d87823e3d90fd5b6004847f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435773ffffffffffffffffffffffffffffffffffffffff6103af6115ff565b16815260046020526040812060243582526020526040812060ff8154169073ffffffffffffffffffffffffffffffffffffffff60018201549167ffffffffffffffff6002820154169060038101546004820154600583015490600684015492600860078601549501549560ff8760a01c16986040519a8b5260208b015260408a01526060890152608088015260a087015260c086015260e0850152166101008301526005811015610467576101409250610120820152f35b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610143576004359060ff821682036101435760206104dd83611bf1565b604051908152f35b50346101435760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761051d6115ff565b602435906044359060643590610531611c42565b73ffffffffffffffffffffffffffffffffffffffff6001541633036107855773ffffffffffffffffffffffffffffffffffffffff16918285526004602052604085208486526020526040852091600883019260ff845460a01c166005811015610758576002036107305760068101938454808411610708576105b48480926116c3565b955583600483015560018201546213c68081018091116106db57600783015580547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674030000000000000000000000000000000000000000179055869084610658575b5050907fff119ce44500ed28a4358ef71a789fc5031a696c5304ad2eaf37f60d5d09b5f69260609260405192835260208301526040820152a36001815580f35b5460ff16853b156106d7576040517f8f3df4c100000000000000000000000000000000000000000000000000000000815260ff919091166004820152602481018590528181604481838a5af180156106cc571561061857816106bc91949394611655565b6106c85790855f610618565b8580fd5b6040513d84823e3d90fd5b5080fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004897fed0894dc000000000000000000000000000000000000000000000000000000008152fd5b6004877f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6004857f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357604060209173ffffffffffffffffffffffffffffffffffffffff6108516115ff565b168152600383522054604051908152f35b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435761089a6115ff565b73ffffffffffffffffffffffffffffffffffffffff602435916108bb611c42565b1680835260046020526040832082845260205260408320600881019060ff825460a01c166005811015610a3e57600303610a165760078101544211156109ee57806006869201928284549455740400000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8254161790558261097e575b505060207f8a89918ff5a1192aacedc279940d66eec9c0a1c2c6490aea91350ff42981c1a991604051908152a36001815580f35b5460ff16833b156106d7576040517f8f3df4c100000000000000000000000000000000000000000000000000000000815260ff91909116600482015260248101839052818160448183885af180156106cc571561094a57816109df91611655565b6109ea57835f61094a565b8380fd5b6004857f2eb35430000000000000000000000000000000000000000000000000000000008152fd5b6004857f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760025473ffffffffffffffffffffffffffffffffffffffff81163303610b2a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660025573ffffffffffffffffffffffffffffffffffffffff3391167fc9cd8f741667defec0767ce0fca45b2ab0bebda61398a3005f353fa40a30ca598380a380f35b6004827f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610143576020906001610ba8610b926115ff565b610b9a611645565b90610ba3611c42565b61172f565b9155604051908152f35b503461014357807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346101435760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357610c3c6115ff565b73ffffffffffffffffffffffffffffffffffffffff6001541690813303610cc55773ffffffffffffffffffffffffffffffffffffffff1690817fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002557fb92ede793667588d6058304554ce7affab6f0f0216795e1a97ec879681fb8d788380a380f35b6004837f440f08eb000000000000000000000000000000000000000000000000000000008152fd5b50346101435760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435773ffffffffffffffffffffffffffffffffffffffff6040610d3c6115ff565b9282610d46611622565b94168152600760205281812060243582526020522091165f52602052602060ff60405f2054166040519015158152f35b50346101435760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014357610dae6115ff565b602435610db9611622565b91606435906084359267ffffffffffffffff84116106c857366023850112156106c85783600401359467ffffffffffffffff861161116c578560051b93602485870101933685116111685773ffffffffffffffffffffffffffffffffffffffff90610e22611c42565b1691828952600460205260408920848a52602052604089209660ff600889015460a01c16600581101561113b5760030361111357600788015442116110eb57838a52600760205260408a20858b5260205260408a2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054166110c357604051956020870185815286604089015273ffffffffffffffffffffffffffffffffffffffff84169788606082015285608082015260808152610ee360a082611655565b5190206040516020810191825260208152610eff604082611655565b5190209160048a01549a610f1960206040519b018b611655565b8952602401602089015b8282106110b3575050509689975b8751891015610f735760208960051b89010151908181105f14610f62578b52602052600160408b205b980197610f31565b908b52602052600160408b20610f5a565b8a9750890361108b57906006879285845260076020526040842087855260205260408420885f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501610fd68482546116c3565b9055833b156106d7576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101839052818160448183885af180156106cc57611072575b505060207f8dab6d35466ca3cba614bc5b262979b277949786977e81107f375f7e39f7734a91604051908152a46001815580f35b8161107c91611655565b61108757848661103e565b8480fd5b6004877f7ca55c77000000000000000000000000000000000000000000000000000000008152fd5b8135815260209182019101610f23565b60048a7f646cf558000000000000000000000000000000000000000000000000000000008152fd5b60048a7f70f65caa000000000000000000000000000000000000000000000000000000008152fd5b60048a7f5c975bda000000000000000000000000000000000000000000000000000000008152fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b8880fd5b8680fd5b50346101435760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101435760ff60406111ac6115ff565b9273ffffffffffffffffffffffffffffffffffffffff6111ca611645565b9416815260056020522091165f52602052602060405f2054604051908152f35b50346102f65760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f6576112226115ff565b9073ffffffffffffffffffffffffffffffffffffffff60243592611244611c42565b16805f52600460205260405f20835f5260205260405f2091600883019360ff855460a01c1660058110156115d2576001036115aa57604051927fa3b1b31d00000000000000000000000000000000000000000000000000000000845260208460048160645afa93841561138f575f94611576575b5067ffffffffffffffff600286015416938481111561154e576112da85611713565b1061152657604051956112ee60a088611655565b60a03688375f5b600581101561139a5761130881876116c3565b90604051917f2b407a82000000000000000000000000000000000000000000000000000000008352600483015260208260248160645afa801561138f575f9061135d575b600192508160051b8a0152016112f5565b506020823d8211611387575b8161137660209383611655565b810103126102f6576001915161134c565b3d9150611369565b6040513d5f823e3d90fd5b50858760ff825416604051906020820192835f905b60058210611510575050508560c083015260e08201528561010082015261010081526113dd61012082611655565b5190209160038201928355740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff825416179055825f52600660205260405f2060ff80835416165f526020525f604081205561271061145360058301546116fd565b049081611495575b505060407f93be94673341e7ca1d0935965b5df66ada5ff3c882c00bf67010b4a7acdd1bee91548151908152336020820152a36001815580f35b6006016114a38282546116c3565b9055823b156102f6576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815233600482015260248101919091525f8160448183875af1801561138f576114fa575b8061145b565b6115079194505f90611655565b5f9260406114f4565b60208060019285518152019301910190916113af565b7f81b07242000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f085de625000000000000000000000000000000000000000000000000000000005f5260045ffd5b9093506020813d6020116115a2575b8161159260209383611655565b810103126102f65751925f6112b8565b3d9150611585565b7f5c975bda000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102f657565b6044359073ffffffffffffffffffffffffffffffffffffffff821682036102f657565b6024359060ff821682036102f657565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761169657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b919082039182116116d057565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b906032820291808304603214901517156116d057565b9060c882018092116116d057565b90602882018092116116d057565b919073ffffffffffffffffffffffffffffffffffffffff61174f82611bf1565b9316805f52600560205260405f2060ff83165f5260205260405f2054841115611bca57805f52600660205260405f2060ff83165f5260205260405f2054611ba25760ff604051927ffec70b3f000000000000000000000000000000000000000000000000000000008452168060048401526020836024815f865af192831561138f575f93611b6e575b50815f52600560205260405f20815f526020528460405f2055815f52600360205260405f20928354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85146116d0576001850190558395835f52600460205260405f20855f5260205260405f2094837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008754161786558160018701558260058701556008860190337fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782558315611abc57506127106118bb846116fd565b04956118c787856116c3565b60068201556040517fa3b1b31d00000000000000000000000000000000000000000000000000000000815260208160048160645afa90811561138f575f91611a89575b50600267ffffffffffffffff6119208193611721565b16920191167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82541617905560018701948588116116d0578795855f52600660205260405f20855f5260205260405f2055806119f4575b50916080917fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb099360405192835260208301526040820152336060820152a3565b92909450833b156102f6576040517fe97e9f6300000000000000000000000000000000000000000000000000000000815233600482015260248101939093525f8360448183885af191821561138f5787957fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb0994608094611a79575b50919350916119b4565b5f611a8391611655565b5f611a6f565b90506020813d602011611ab4575b81611aa460209383611655565b810103126102f65751600261190a565b3d9150611a97565b96975086955084925085937fc4cd81dd3fa2d3c7286cba501084bda939d37c18c90f91a5e6527c14ca71bb0992608092740400000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff82541617905560405191825260208201525f6040820152336060820152a37f8a89918ff5a1192aacedc279940d66eec9c0a1c2c6490aea91350ff42981c1a960206040515f8152a390565b9092506020813d602011611b9a575b81611b8a60209383611655565b810103126102f65751915f6117d8565b3d9150611b7d565b7fde69a7e7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ecc4797000000000000000000000000000000000000000000000000000000005f5260045ffd5b60ff16611c0957611c0661a8c04206426116c3565b90565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd954042014281116116d05762093a80611c069106426116c3565b60025f5414611c515760025f55565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffdfea26469706673582212208b49b91fb10ba15529324f7f7b87df1078e2b8918a6ca7d72de1719443c778fd64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x397a60…53f9d4 | 29 days agoMon, 20 Jul 2026 00:55:01 UTC | 0x8dab6d…734a | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000003 [2] 0x000000000000…1a519e2a data: 0x000000000000000000…d6ff6580 |
| 0x34e5d7…c89276 | 29 days agoMon, 20 Jul 2026 00:54:56 UTC | 0xff119c…b5f6 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000003 data: 0x3316cdbe07ed837571…5bfd9601 |
| 0x87923c…0a1fc1 | 29 days agoMon, 20 Jul 2026 00:54:50 UTC | 0x93be94…1bee | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000003 data: 0x60eb567a69342e6d8f…a994977e |
| 0x2f8046…a25d5b | 29 days agoMon, 20 Jul 2026 00:54:45 UTC | 0xc4cd81…bb09 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000003 data: 0x000000000000000000…a994977e |
| 0x294b41…fe6fae | 30 days agoSun, 19 Jul 2026 00:02:08 UTC | 0xff119c…b5f6 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000002 data: 0x000000000000000000…4767aa01 |
| 0xff538d…de9658 | 30 days agoSun, 19 Jul 2026 00:02:03 UTC | 0x93be94…1bee | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000002 data: 0x397877ee98e2f856c8…a994977e |
| 0xcf3cba…d09ea0 | 30 days agoSun, 19 Jul 2026 00:01:57 UTC | 0xc4cd81…bb09 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000002 data: 0x000000000000000000…a994977e |
| 0x969d1b…34580d | 30 days agoSat, 18 Jul 2026 17:56:24 UTC | 0xff119c…b5f6 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000001 data: 0x000000000000000000…26945a01 |
| 0x5108f7…9d7473 | 30 days agoSat, 18 Jul 2026 17:56:18 UTC | 0x93be94…1bee | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000001 data: 0x1835ae4c4787074386…a994977e |
| 0x2cd3b5…324c1d | 30 days agoSat, 18 Jul 2026 17:56:11 UTC | 0xc4cd81…bb09 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000001 data: 0x000000000000000000…a994977e |
| 0x98dcc5…641359 | 30 days agoSat, 18 Jul 2026 17:56:06 UTC | 0xff119c…b5f6 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000000 data: 0x000000000000000000…33707801 |
| 0xcc5ef4…4e63e6 | 30 days agoSat, 18 Jul 2026 17:56:00 UTC | 0x93be94…1bee | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000000 data: 0x469d8735f5b6a822bf…a994977e |
| 0x97f449…3ec460 | 30 days agoSat, 18 Jul 2026 17:55:55 UTC | 0xc4cd81…bb09 | [0] 0x000000000000…702e6cb6 [1] 0x000000000000…00000000 data: 0x000000000000000000…a994977e |
| 0x0bade2…feaa87 | 30 days agoSat, 18 Jul 2026 17:53:55 UTC | 0xc9cd8f…ca59 | [0] 0x000000000000…cf314b2f [1] 0x000000000000…a994977e |
| 0x0d59c9…4e0427 | 30 days agoSat, 18 Jul 2026 17:53:52 UTC | 0xb92ede…8d78 | [0] 0x000000000000…cf314b2f [1] 0x000000000000…a994977e |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x397a60…53f9d4 | claim | 14,286,755 | 29 days agoMon, 20 Jul 2026 00:55:01 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000591 | |
| 0x34e5d7…c89276 | postRoot | 14,286,700 | 29 days agoMon, 20 Jul 2026 00:54:56 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000675 | |
| 0x87923c…0a1fc1 | finalize | 14,286,647 | 29 days agoMon, 20 Jul 2026 00:54:50 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000604 | |
| 0x2f8046…a25d5b | strike | 14,286,591 | 29 days agoMon, 20 Jul 2026 00:54:45 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00001252 | |
| 0x294b41…fe6fae | postRoot | 13,395,034 | 30 days agoSun, 19 Jul 2026 00:02:08 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000603 | |
| 0xff538d…de9658 | finalize | 13,394,981 | 30 days agoSun, 19 Jul 2026 00:02:03 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000717 | |
| 0xcf3cba…d09ea0 | strike | 13,394,925 | 30 days agoSun, 19 Jul 2026 00:01:57 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00001474 | |
| 0x969d1b…34580d | postRoot | 13,176,367 | 30 days agoSat, 18 Jul 2026 17:56:24 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000618 | |
| 0x5108f7…9d7473 | finalize | 13,176,313 | 30 days agoSat, 18 Jul 2026 17:56:18 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000730 | |
| 0x2cd3b5…324c1d | strike | 13,176,243 | 30 days agoSat, 18 Jul 2026 17:56:11 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00001806 | |
| 0x98dcc5…641359 | postRoot | 13,176,189 | 30 days agoSat, 18 Jul 2026 17:56:06 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000616 | |
| 0xcc5ef4…4e63e6 | finalize | 13,176,135 | 30 days agoSat, 18 Jul 2026 17:56:00 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000729 | |
| 0x97f449…3ec460 | strike | 13,176,079 | 30 days agoSat, 18 Jul 2026 17:55:55 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00001844 | |
| 0x0bade2…feaa87 | acceptRootPoster | 13,174,884 | 30 days agoSat, 18 Jul 2026 17:53:55 UTC | 0xc88c…977e | IN | DrawEngine | $0.000 ETH | 0.00000184 | |
| 0x0d59c9…4e0427 | proposeRootPoster | 13,174,856 | 30 days agoSat, 18 Jul 2026 17:53:52 UTC | 0xf5d0…4b2f | IN | DrawEngine | $0.000 ETH | 0.00000311 |