// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
// Single-chain on Robinhood. Perps execute off-chain on Lighter (opened by the
// relayer per winner); this controller runs the pot, the epoch draw, and mints
// the ownership NFTs. Randomness is a commit-reveal by the relayer, made
// grind-proof by mixing the revealed secret with a blockhash from AFTER the
// commit — so not even the team can pick a favorable seed.
import {ConfirmedOwner} from "@chainlink/contracts/src/v0.8/shared/access/ConfirmedOwner.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {H2PositionNFT} from "./H2PositionNFT.sol";
/// Minimal WETH interface — winners are paid in NATIVE ETH by unwrapping their
/// WETH payout, so it lands spendable on Robinhood instead of as a wrapped token.
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
}
contract H2BaseController is ConfirmedOwner {
using SafeERC20 for IERC20;
address public immutable weth;
// ETH/USD price to size the $10-$50 slots into WETH — pushed on-chain by the
// relayer (Robinhood has no crypto price feed). Reads reject a stale price.
uint256 public ethUsdPxE8; // ETH/USD, 8 decimals
uint64 public ethUsdPxAt; // block.timestamp of the last push
uint256 public constant MAX_PX_AGE = 3600; // 1h staleness ceiling
// Lighter funding wallet — winner collateral is released here for the relayer
// to convert to USDG and post as margin on Lighter (owner-set).
address public lighterFunder;
// Commit-reveal window: reveal must land within this many blocks of the
// commit (so a valid future blockhash still exists to mix in).
uint256 public constant REVEAL_MAX_BLOCKS = 200;
uint16 public constant MAX_WINNERS_PER_EPOCH_CAP = 300;
uint16 public constant BPS_DENOM = 10_000;
uint256 public constant MIN_EPOCH_SECONDS = 60;
uint256 public constant MAX_EPOCH_SECONDS = 86_400;
// Close-fee split. Each close carves two 5% slices off the winner's gross
// (collateral + PnL): $H2 buyback+burn and ops — leaving 90% for the holder.
// A slice whose destination is unset rolls back to the holder, so the fee
// never applies before it's wired.
uint16 public constant CLOSE_FEE_SLICE_BPS = 500; // 5% each · 10% total
address public buybackVault; // WETH → H2 buyback vault (burns $H2)
address public opsWallet; // WETH → ops
uint16 public constant TIER_HI_USD = 50;
uint16 public constant TIER_MID_HI_USD = 35;
uint16 public constant TIER_LO_HI_USD = 20;
uint16 public constant TIER_LO_LO_USD = 10;
H2PositionNFT public immutable nft;
uint256 public epochSeconds = 900;
uint64 public lastEpochAt;
uint16 public takeFractionBps = 8000;
uint16 public maxWinnersPerEpoch = 300;
uint8 public batchSize = 15;
uint128 public minHolderWeight;
uint128 public pendingTriggerWethReserved;
// Winner payout at close = collateral +/- realized PnL, capped at this
// multiple of the winner's own collateral. Bounds the blast radius if the
// reporting key is ever compromised (a fabricated PnL can never pull more
// than cap*collateral per close), while staying generous enough for any
// real leveraged win. Owner-tunable.
uint16 public maxPayoutMultiple = 100;
address public holderRouter;
address[] public holders;
mapping(address => uint128) public weight;
struct Round {
uint256 vrfRequestId;
address winner;
uint256 baseTokenId;
uint128 sizeUsdE30;
uint128 collateralWeth;
bool sideLong;
bool dispatched;
bool closed;
uint8 leverage;
uint8 assetId; // which market the position is on (0 = ETH default)
}
uint256 public nextRoundId = 1;
mapping(uint256 => Round) public rounds;
// Multi-asset: winners are rolled across assets 0..numAssets-1 (0 = ETH).
// Each assetId maps 1:1 to a Lighter perp market (market_index) the relayer
// opens the position on. Owner sets numAssets to the count of wired markets.
uint8 public numAssets = 1;
// Per-asset max leverage — Lighter caps leverage per market (max = 10000/imf:
// ETH/BTC 50x, SOL 25x, majors 20x, most alts 10x). The rolled leverage is
// clamped to this so a winner's position can always open. 0 = uncapped (50x).
mapping(uint8 => uint8) public maxLevForAsset;
struct Trigger {
bytes32 seedCommit; // keccak256(secret), committed at trigger time
uint64 commitBlock; // block the commit landed in (for blockhash mixing)
uint256 vrfSeed; // final grind-proof seed (set at reveal)
uint64 startedAt;
uint16 totalSlots;
uint16 nextSlot;
uint16 mintedCount;
uint128 budgetWeth;
uint128 spentWeth;
bool fulfilled;
bool complete;
}
uint256 public nextTriggerId = 1;
mapping(uint256 => Trigger) public triggers;
mapping(uint256 => mapping(address => bool)) public wonThisTrigger;
event TriggerStarted(uint256 indexed triggerId, bytes32 seedCommit, uint16 totalSlots, uint128 budgetWeth);
event SeedRevealed(uint256 indexed triggerId, uint256 seed);
event TriggerComplete(uint256 indexed triggerId, uint16 mintedCount, uint128 spentWeth, uint128 releasedSlack);
event RoundStarted(uint256 indexed roundId, uint256 indexed triggerId, bool sideLong);
event WinnerPicked(uint256 indexed roundId, address indexed winner, uint256 indexed baseTokenId, uint8 leverage, bool sideLong, uint128 collateralWeth, uint8 assetId);
event RoundDispatched(uint256 indexed roundId, uint128 wethAmount, address to);
event CloseStamped(uint256 indexed roundId, uint128 closePxE18, int128 pnlUsdE18);
event ClosePaid(uint256 indexed roundId, address indexed holder, uint128 payoutWeth);
event CloseFee(uint256 indexed roundId, uint128 buybackWeth, uint128 opsWeth);
event CloseDestinationsSet(address buybackVault, address opsWallet);
event CloseRequestedByOwner(uint256 indexed roundId, address indexed owner, uint256 indexed baseTokenId);
event LighterFunderSet(address funder);
event HoldersUpdated(uint256 count);
event EpochParamsChanged(uint256 epochSeconds, uint16 takeFractionBps, uint16 maxWinnersPerEpoch, uint8 batchSize);
event MinHolderWeightSet(uint128 floor);
event TreasuryClaimed(address indexed to, uint256 amount);
error NotHolderRouter();
error EpochNotDue();
error PotTooSmall();
error NoHolders();
error FunderUnset();
error AlreadyDispatched();
error UnknownRound();
error AlreadyFulfilled();
error NotFulfilled();
error AlreadyComplete();
error BadParams();
error OracleBad();
error BadReveal();
error RevealTooEarly();
error RevealTooLate();
error FloatTooLow();
constructor(address _weth, address _nft) ConfirmedOwner(msg.sender) {
require(_weth != address(0) && _nft != address(0), "H2: zero arg");
weth = _weth;
nft = H2PositionNFT(_nft);
}
/// Wallet that receives released winner-collateral to post as USDG margin on
/// Lighter (the relayer's Lighter-funding address).
function setLighterFunder(address f) external onlyOwner {
require(f != address(0), "H2: zero funder");
lighterFunder = f;
emit LighterFunderSet(f);
}
/// Wire the close-fee slice destinations. Either left at address(0) is not
/// carved — that slice stays with the holder until it's set.
function setCloseDestinations(address _buyback, address _ops) external onlyOwner {
buybackVault = _buyback;
opsWallet = _ops;
emit CloseDestinationsSet(_buyback, _ops);
}
/// Relay the ETH/USD price (8-dec) from a public spot source, pushed by the
/// bot (Robinhood has no on-chain crypto feed). Owner or the bot (holderRouter)
/// only. Bounded blast radius: the price just sizes the $10-$50 slots into WETH
/// within the epoch budget, and converts USD PnL to WETH at close.
function setEthUsdPrice(uint256 pxE8) external {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
require(pxE8 > 0, "H2: zero px");
ethUsdPxE8 = pxE8;
ethUsdPxAt = uint64(block.timestamp);
}
receive() external payable {}
function setHolderRouter(address r) external onlyOwner { holderRouter = r; }
function setEpochParams(
uint256 _epochSeconds,
uint16 _takeFractionBps,
uint16 _maxWinnersPerEpoch,
uint8 _batchSize
) external onlyOwner {
if (_epochSeconds < MIN_EPOCH_SECONDS || _epochSeconds > MAX_EPOCH_SECONDS) revert BadParams();
if (_takeFractionBps == 0 || _takeFractionBps > BPS_DENOM) revert BadParams();
if (_maxWinnersPerEpoch == 0 || _maxWinnersPerEpoch > MAX_WINNERS_PER_EPOCH_CAP) revert BadParams();
if (_batchSize == 0) revert BadParams();
epochSeconds = _epochSeconds;
takeFractionBps = _takeFractionBps;
maxWinnersPerEpoch = _maxWinnersPerEpoch;
batchSize = _batchSize;
emit EpochParamsChanged(_epochSeconds, _takeFractionBps, _maxWinnersPerEpoch, _batchSize);
}
function setEpochSeconds(uint256 s) external onlyOwner {
if (s < MIN_EPOCH_SECONDS || s > MAX_EPOCH_SECONDS) revert BadParams();
epochSeconds = s;
emit EpochParamsChanged(s, takeFractionBps, maxWinnersPerEpoch, batchSize);
}
function setTakeFractionBps(uint16 bps) external onlyOwner {
if (bps == 0 || bps > BPS_DENOM) revert BadParams();
takeFractionBps = bps;
emit EpochParamsChanged(epochSeconds, bps, maxWinnersPerEpoch, batchSize);
}
function setMaxWinnersPerEpoch(uint16 n) external onlyOwner {
if (n == 0 || n > MAX_WINNERS_PER_EPOCH_CAP) revert BadParams();
maxWinnersPerEpoch = n;
emit EpochParamsChanged(epochSeconds, takeFractionBps, n, batchSize);
}
function setBatchSize(uint8 n) external onlyOwner {
if (n == 0) revert BadParams();
batchSize = n;
emit EpochParamsChanged(epochSeconds, takeFractionBps, maxWinnersPerEpoch, n);
}
// Number of assets winners are rolled across (1 = ETH-only). Set AFTER wiring
// the matching markets on the ArbController (setAsset for ids 0..n-1), else a
// winner could roll an asset with no market → open would revert.
function setNumAssets(uint8 n) external onlyOwner {
require(n >= 1 && n <= 64, "H2: numAssets range");
numAssets = n;
}
/// Set the Lighter leverage cap for an asset (0 = uncapped/50x). Wired at
/// deploy from each market's min_initial_margin_fraction (max = 10000/imf).
function setAssetMaxLev(uint8 assetId, uint8 maxLev) external onlyOwner {
maxLevForAsset[assetId] = maxLev;
}
function setMaxPayoutMultiple(uint16 m) external onlyOwner {
require(m >= 2, "H2: cap too low");
maxPayoutMultiple = m;
}
function clearStuckReservation(uint128 amount) external onlyOwner {
require(amount <= pendingTriggerWethReserved, "H2: amount > reserved");
pendingTriggerWethReserved -= amount;
}
function armEpoch() external onlyOwner {
if (nextTriggerId != 1) return;
if (lastEpochAt != 0) return;
lastEpochAt = uint64(block.timestamp);
}
function setMinHolderWeight(uint128 floor) external onlyOwner {
minHolderWeight = floor;
emit MinHolderWeightSet(floor);
}
function setHolders(address[] calldata _holders, uint128[] calldata _weights) external {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
require(_holders.length == _weights.length, "H2: length mismatch");
for (uint256 i = 0; i < holders.length; i++) {
weight[holders[i]] = 0;
}
delete holders;
uint128 floor = minHolderWeight;
uint256 kept = 0;
for (uint256 i = 0; i < _holders.length; i++) {
if (_weights[i] < floor) continue;
holders.push(_holders[i]);
weight[_holders[i]] = _weights[i];
kept++;
}
emit HoldersUpdated(kept);
}
function claimTreasury(uint256 amount, address to) external onlyOwner returns (uint256 claimed) {
require(to != address(0), "H2: zero recipient");
uint256 bal = IERC20(weth).balanceOf(address(this));
uint256 reserved = pendingTriggerWethReserved;
uint256 available = bal > reserved ? bal - reserved : 0;
if (available == 0) return 0;
claimed = (amount == 0 || amount > available) ? available : amount;
// Pay the treasury claim as NATIVE ETH (auto-unwrap) so it lands
// spendable in the owner's wallet, same as winner payouts. Falls back to
// WETH if `to` is a contract that can't receive ETH.
IWETH(weth).withdraw(claimed);
(bool sent, ) = payable(to).call{value: claimed}("");
if (!sent) {
IWETH(weth).deposit{value: claimed}();
IERC20(weth).safeTransfer(to, claimed);
}
emit TreasuryClaimed(to, claimed);
}
/// Arm an epoch. The relayer passes `seedCommit = keccak256(abi.encode(secret))`
/// — it locks in a secret it can't change later. Gated to the bot/owner since
/// the committer must follow through with revealSeed.
function triggerRound(bytes32 seedCommit) external returns (uint256 triggerId) {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
if (block.timestamp < uint256(lastEpochAt) + epochSeconds) revert EpochNotDue();
if (holders.length == 0) revert NoHolders();
if (lighterFunder == address(0)) revert FunderUnset();
if (seedCommit == bytes32(0)) revert BadParams();
uint256 bal = IERC20(weth).balanceOf(address(this));
uint256 reserved = pendingTriggerWethReserved;
if (bal <= reserved) revert PotTooSmall();
uint256 pot = bal - reserved;
uint256 budget = (pot * takeFractionBps) / BPS_DENOM;
uint256 rawPx = _readEthUsdPriceE8();
uint256 minWinnerWeth = _usdToWeth(TIER_LO_LO_USD, rawPx);
if (budget < minWinnerWeth) revert PotTooSmall();
pendingTriggerWethReserved = uint128(reserved + budget);
lastEpochAt = uint64(block.timestamp);
uint16 nSlots = maxWinnersPerEpoch;
triggerId = nextTriggerId++;
Trigger storage t = triggers[triggerId];
t.seedCommit = seedCommit;
t.commitBlock = uint64(block.number);
t.startedAt = uint64(block.timestamp);
t.totalSlots = nSlots;
t.budgetWeth = uint128(budget);
emit TriggerStarted(triggerId, seedCommit, nSlots, uint128(budget));
}
/// Reveal the committed secret. The final seed mixes the secret with the
/// blockhash of the block AFTER the commit — a value the committer could not
/// know when it committed, so it's impossible to grind a favorable seed.
/// Must reveal at least 2 blocks after the commit and within REVEAL_MAX_BLOCKS
/// (blockhash only resolves for the recent past + blocks indefinite withholding).
function revealSeed(uint256 triggerId, uint256 secret) external {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
Trigger storage t = triggers[triggerId];
if (t.seedCommit == bytes32(0)) revert UnknownRound();
if (t.fulfilled) revert AlreadyFulfilled();
if (keccak256(abi.encode(secret)) != t.seedCommit) revert BadReveal();
uint256 cb = uint256(t.commitBlock);
if (block.number <= cb + 1) revert RevealTooEarly();
if (block.number > cb + REVEAL_MAX_BLOCKS) revert RevealTooLate();
bytes32 mix = blockhash(cb + 1);
uint256 finalSeed = uint256(keccak256(abi.encode(secret, mix)));
t.vrfSeed = finalSeed;
t.fulfilled = true;
emit SeedRevealed(triggerId, finalSeed);
}
function mintRoundBatch(uint256 triggerId, uint16 count)
external
returns (uint16 mintedThisBatch)
{
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
Trigger storage t = triggers[triggerId];
if (t.seedCommit == bytes32(0)) revert UnknownRound();
if (!t.fulfilled) revert NotFulfilled();
if (t.complete) revert AlreadyComplete();
if (count == 0) return 0;
require(holders.length > 0, "H2: no holders mid-mint");
uint256 rawPx = _readEthUsdPriceE8();
uint256 seed = t.vrfSeed;
uint16 nextSlot = t.nextSlot;
uint16 endSlot = nextSlot + count;
if (endSlot > t.totalSlots) endSlot = t.totalSlots;
uint256 spent = t.spentWeth;
uint16 mintedCount = t.mintedCount;
bool stoppedForBudget = false;
for (uint16 slot = nextSlot; slot < endSlot; slot++) {
if (mintedCount >= holders.length) {
nextSlot = slot;
break;
}
uint256 word = uint256(keccak256(abi.encode(seed, slot)));
(uint256 usdCollat, bool fits) = _rollUsdForBudget(word, t.budgetWeth - spent, rawPx);
if (!fits) {
stoppedForBudget = true;
break;
}
uint128 collatWeth = uint128(_usdToWeth(usdCollat, rawPx));
if (spent + collatWeth > t.budgetWeth) {
stoppedForBudget = true;
break;
}
address winner = _pickWeighted(word);
if (wonThisTrigger[triggerId][winner]) {
nextSlot = slot + 1;
continue;
}
wonThisTrigger[triggerId][winner] = true;
mintedThisBatch += _mintOne(
triggerId, winner, word, usdCollat, collatWeth, rawPx
);
spent += collatWeth;
mintedCount++;
nextSlot = slot + 1;
}
t.nextSlot = nextSlot;
t.spentWeth = uint128(spent);
t.mintedCount = mintedCount;
if (nextSlot >= t.totalSlots || stoppedForBudget || mintedCount >= holders.length) {
t.complete = true;
uint128 slack = uint128(t.budgetWeth - spent);
if (slack > 0) {
uint256 res = pendingTriggerWethReserved;
pendingTriggerWethReserved = uint128(res > slack ? res - slack : 0);
}
emit TriggerComplete(triggerId, mintedCount, uint128(spent), slack);
}
}
function _mintOne(
uint256 triggerId,
address winner,
uint256 word,
uint256 usdCollat,
uint128 collatWeth,
uint256 rawPx
) internal returns (uint16) {
uint128 entryPxE18 = uint128(rawPx * 1e10);
bool sideLong = (word & 1) == 1;
// Roll the asset FIRST from an unused slice of the VRF word (side = bit 0,
// leverage = >>128, size = >>192, asset = >>224). 0 = ETH when numAssets==1.
uint8 assetId = numAssets <= 1 ? 0 : uint8((word >> 224) % numAssets);
// Then roll a random leverage from the tiers this market actually allows
// (weighted), so every winner gets a genuine random lev within bounds.
uint8 lev = _rollLeverage(word, maxLevForAsset[assetId]);
uint128 scaledSizeE30 = uint128(usdCollat * uint256(lev) * 1e30);
uint256 roundId = nextRoundId++;
uint256 tokenId = nft.mint(
winner,
scaledSizeE30 / 1e12,
collatWeth,
entryPxE18,
sideLong,
lev,
assetId,
bytes32(roundId)
);
// Field-by-field storage write (not a memory struct literal) to keep the
// Yul stack shallow — _mintOne already holds many locals/params.
Round storage r = rounds[roundId];
r.vrfRequestId = triggerId;
r.winner = winner;
r.baseTokenId = tokenId;
r.sizeUsdE30 = scaledSizeE30;
r.collateralWeth = collatWeth;
r.sideLong = sideLong;
r.leverage = lev;
r.assetId = assetId;
// dispatched / closed default to false
emit RoundStarted(roundId, triggerId, sideLong);
emit WinnerPicked(roundId, winner, tokenId, lev, sideLong, collatWeth, assetId);
return 1;
}
/// Weighted-random leverage from the tiers this market ALLOWS. `cap` = the
/// market's max leverage (0 = uncapped/50x). Tiers above the cap are dropped
/// and the remaining weights re-normalized, so e.g. a 10x market rolls a fair
/// 5x/10x and a 20x market rolls 5x/10x/20x — a genuine random pick within the
/// market's own bounds, not everything clamped down to the ceiling.
function _rollLeverage(uint256 randomWord, uint8 cap) internal pure returns (uint8) {
uint8[6] memory tiers = [uint8(5), 10, 20, 30, 40, 50];
uint8[6] memory wts = [uint8(22), 22, 20, 16, 12, 8];
uint256 total;
for (uint256 i = 0; i < 6; i++) {
if (cap == 0 || tiers[i] <= cap) total += wts[i];
}
if (total == 0) return 5; // cap below the smallest tier — floor at 5x
uint256 r = (randomWord >> 128) % total;
uint256 acc;
for (uint256 i = 0; i < 6; i++) {
if (cap != 0 && tiers[i] > cap) continue;
acc += wts[i];
if (r < acc) return tiers[i];
}
return 5;
}
function _rollDollarUsd(uint256 randomWord) internal pure returns (uint256) {
uint256 tier = (randomWord >> 200) & 0xFF;
uint256 jitter = (randomWord >> 192) & 0xFF;
tier = tier % 100;
uint256 lo;
uint256 hi;
if (tier < 70) {
lo = TIER_LO_LO_USD;
hi = TIER_LO_HI_USD;
} else if (tier < 95) {
lo = TIER_LO_HI_USD;
hi = TIER_MID_HI_USD;
} else {
lo = TIER_MID_HI_USD;
hi = TIER_HI_USD;
}
return lo + (jitter * (hi - lo)) / 255;
}
function _rollUsdForBudget(uint256 word, uint256 remainingWeth, uint256 rawPxE8)
internal pure
returns (uint256 usd, bool fits)
{
uint256 maxUsd = (remainingWeth * rawPxE8) / 1e26;
if (maxUsd < TIER_LO_LO_USD) return (0, false);
if (maxUsd >= TIER_HI_USD) {
return (_rollDollarUsd(word), true);
}
uint256 jitter = (word >> 192) & 0xFF;
return (TIER_LO_LO_USD + (jitter * (maxUsd - TIER_LO_LO_USD)) / 255, true);
}
function _readEthUsdPriceE8() internal view returns (uint256) {
uint256 px = ethUsdPxE8;
if (px == 0 || block.timestamp - ethUsdPxAt > MAX_PX_AGE) revert OracleBad();
return px;
}
function _usdToWeth(uint256 usdWhole, uint256 rawPxE8) internal pure returns (uint256) {
return (usdWhole * 1e26) / rawPxE8;
}
function _pickWeighted(uint256 rng) internal view returns (address) {
uint256 len = holders.length;
uint256 total;
for (uint256 i = 0; i < len; i++) total += weight[holders[i]];
require(total > 0, "H2: zero total weight");
uint256 r = rng % total;
uint256 acc;
for (uint256 i = 0; i < len; i++) {
acc += weight[holders[i]];
if (r < acc) return holders[i];
}
return holders[len - 1];
}
/// Release a winner's collateral to the Lighter funder wallet. The relayer
/// converts it to USDG and posts it as margin when it opens the winner's
/// Lighter position (all on Robinhood — no bridge). Gated to bot/owner.
function dispatchToLighter(uint256 roundId) external {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
if (lighterFunder == address(0)) revert FunderUnset();
Round storage r = rounds[roundId];
if (r.winner == address(0)) revert UnknownRound();
if (r.dispatched) revert AlreadyDispatched();
uint256 amount = r.collateralWeth;
uint256 res = pendingTriggerWethReserved;
pendingTriggerWethReserved = uint128(res > amount ? res - amount : 0);
r.dispatched = true;
IERC20(weth).safeTransfer(lighterFunder, amount);
emit RoundDispatched(roundId, uint128(amount), lighterFunder);
}
function requestClose(uint256 roundId) external {
Round storage r = rounds[roundId];
if (r.winner == address(0)) revert UnknownRound();
require(!r.closed, "H2: already closed");
require(nft.ownerOf(r.baseTokenId) == msg.sender, "H2: not NFT owner");
nft.markClosing(r.baseTokenId);
emit CloseRequestedByOwner(roundId, msg.sender, r.baseTokenId);
}
/// Settle a closed position. The relayer closes the winner's slice on Lighter,
/// reads its realized PnL, and reports it here. The current NFT holder is paid
/// their collateral +/- PnL in WETH from the pot's standing float, in this one
/// tx — made whole in seconds, no round-trip. The float is replenished
/// separately as the Lighter side settles, so if it's momentarily short this
/// reverts (FloatTooLow) and the relayer retries after topping it up; a holder
/// can never be paid the wrong amount or twice.
function adminReportClose(uint256 roundId, uint128 closePxE18, int128 pnlUsdE18) external {
if (msg.sender != owner() && msg.sender != holderRouter) revert NotHolderRouter();
Round storage r = rounds[roundId];
if (r.winner == address(0)) revert UnknownRound();
require(!r.closed, "H2: already closed");
// collateral +/- PnL, in WETH. PnL arrives in USD (1e18); convert at the
// freshest pushed ETH price (weth = usd * 1e8 / pxE8).
uint256 pxE8 = _readEthUsdPriceE8();
int256 pnlWeth = (int256(pnlUsdE18) * 1e8) / int256(pxE8);
int256 signed = int256(uint256(r.collateralWeth)) + pnlWeth;
uint256 payout = signed > 0 ? uint256(signed) : 0;
uint256 cap = uint256(r.collateralWeth) * maxPayoutMultiple;
if (payout > cap) payout = cap;
// Pay the CURRENT holder (the NFT may have changed hands since the win).
address holder = nft.ownerOf(r.baseTokenId);
// Effects before the transfers. A revert below rolls all of this back, so
// a FloatTooLow retry re-runs cleanly with no half-settled state.
r.closed = true;
nft.recordClose(r.baseTokenId, closePxE18, pnlUsdE18);
uint128 toBuyback;
uint128 toOps;
uint256 toHolder = payout;
if (payout > 0) {
uint256 bal = IERC20(weth).balanceOf(address(this));
uint256 reserved = pendingTriggerWethReserved;
uint256 avail = bal > reserved ? bal - reserved : 0;
if (avail < payout) revert FloatTooLow();
uint256 slice = (payout * CLOSE_FEE_SLICE_BPS) / BPS_DENOM;
if (buybackVault != address(0)) { toBuyback = uint128(slice); toHolder -= slice; }
if (opsWallet != address(0)) { toOps = uint128(slice); toHolder -= slice; }
// Fee slices go to their contracts as WETH.
if (toBuyback > 0) IERC20(weth).safeTransfer(buybackVault, toBuyback);
if (toOps > 0) IERC20(weth).safeTransfer(opsWallet, toOps);
// Winner is paid in NATIVE ETH: unwrap the WETH and send it so it
// lands spendable on Robinhood, not as a wrapped token they'd have
// to unwrap themselves. This is the ONLY call to an arbitrary
// address and runs LAST (checks-effects-interactions; r.closed is
// already set above so a reentrant close reverts). If the holder is
// a contract that can't receive ETH, re-wrap and pay WETH instead so
// the payout can never strand.
if (toHolder > 0) {
IWETH(weth).withdraw(toHolder);
(bool sent, ) = payable(holder).call{value: toHolder}("");
if (!sent) {
IWETH(weth).deposit{value: toHolder}();
IERC20(weth).safeTransfer(holder, toHolder);
}
}
}
emit CloseStamped(roundId, closePxE18, pnlUsdE18);
emit CloseFee(roundId, toBuyback, toOps);
emit ClosePaid(roundId, holder, uint128(toHolder));
}
function rescue(address token, uint256 amount, address to) external onlyOwner {
require(to != address(0), "H2: zero recipient");
if (token == address(0)) {
(bool ok, ) = to.call{value: amount}("");
require(ok, "H2: eth rescue failed");
} else {
IERC20(token).safeTransfer(to, amount);
}
}
function secondsUntilEpoch() external view returns (uint256) {
uint256 due = uint256(lastEpochAt) + epochSeconds;
if (block.timestamp >= due) return 0;
return due - block.timestamp;
}
function triggerRemaining(uint256 triggerId)
external view
returns (uint16 slotsLeft, uint128 budgetLeft, bool fulfilled, bool complete)
{
Trigger storage t = triggers[triggerId];
fulfilled = t.fulfilled;
complete = t.complete;
slotsLeft = complete ? uint16(0) : (t.totalSlots - t.nextSlot);
budgetLeft = complete ? uint128(0) : (t.budgetWeth - t.spentWeth);
}
function holdersLength() external view returns (uint256) {
return holders.length;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_weth",
"type": "address",
"internalType": "address"
},
{
"name": "_nft",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyComplete",
"type": "error",
"inputs": []
},
{
"name": "AlreadyDispatched",
"type": "error",
"inputs": []
},
{
"name": "AlreadyFulfilled",
"type": "error",
"inputs": []
},
{
"name": "BadParams",
"type": "error",
"inputs": []
},
{
"name": "BadReveal",
"type": "error",
"inputs": []
},
{
"name": "EpochNotDue",
"type": "error",
"inputs": []
},
{
"name": "FloatTooLow",
"type": "error",
"inputs": []
},
{
"name": "FunderUnset",
"type": "error",
"inputs": []
},
{
"name": "NoHolders",
"type": "error",
"inputs": []
},
{
"name": "NotFulfilled",
"type": "error",
"inputs": []
},
{
"name": "NotHolderRouter",
"type": "error",
"inputs": []
},
{
"name": "OracleBad",
"type": "error",
"inputs": []
},
{
"name": "PotTooSmall",
"type": "error",
"inputs": []
},
{
"name": "RevealTooEarly",
"type": "error",
"inputs": []
},
{
"name": "RevealTooLate",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "UnknownRound",
"type": "error",
"inputs": []
},
{
"name": "CloseDestinationsSet",
"type": "event",
"inputs": [
{
"name": "buybackVault",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "opsWallet",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CloseFee",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "buybackWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "opsWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "ClosePaid",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "holder",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "payoutWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "CloseRequestedByOwner",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "baseTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CloseStamped",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "closePxE18",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "pnlUsdE18",
"type": "int128",
"indexed": false,
"internalType": "int128"
}
],
"anonymous": false
},
{
"name": "EpochParamsChanged",
"type": "event",
"inputs": [
{
"name": "epochSeconds",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "takeFractionBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "maxWinnersPerEpoch",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "batchSize",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "HoldersUpdated",
"type": "event",
"inputs": [
{
"name": "count",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LighterFunderSet",
"type": "event",
"inputs": [
{
"name": "funder",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MinHolderWeightSet",
"type": "event",
"inputs": [
{
"name": "floor",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferRequested",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoundDispatched",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "wethAmount",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "to",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoundStarted",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "triggerId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "sideLong",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "SeedRevealed",
"type": "event",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "seed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TreasuryClaimed",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TriggerComplete",
"type": "event",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "mintedCount",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "spentWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "releasedSlack",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "TriggerStarted",
"type": "event",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "seedCommit",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "totalSlots",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "budgetWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "WinnerPicked",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "baseTokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "leverage",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "sideLong",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "collateralWeth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "assetId",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "BPS_DENOM",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "CLOSE_FEE_SLICE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_EPOCH_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PX_AGE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_WINNERS_PER_EPOCH_CAP",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MIN_EPOCH_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "REVEAL_MAX_BLOCKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TIER_HI_USD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER_LO_HI_USD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER_LO_LO_USD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TIER_MID_HI_USD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "adminReportClose",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "closePxE18",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "pnlUsdE18",
"type": "int128",
"internalType": "int128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "armEpoch",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "batchSize",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "buybackVault",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "claimTreasury",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "claimed",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "clearStuckReservation",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "dispatchToLighter",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "epochSeconds",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ethUsdPxAt",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "ethUsdPxE8",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "holderRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "holders",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "holdersLength",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "lastEpochAt",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "lighterFunder",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "maxLevForAsset",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "maxPayoutMultiple",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "maxWinnersPerEpoch",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "minHolderWeight",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "mintRoundBatch",
"type": "function",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "count",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [
{
"name": "mintedThisBatch",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "nonpayable"
},
{
"name": "nextRoundId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "nextTriggerId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "nft",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract H2PositionNFT"
}
],
"stateMutability": "view"
},
{
"name": "numAssets",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "opsWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingTriggerWethReserved",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "requestClose",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rescue",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revealSeed",
"type": "function",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "secret",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rounds",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "vrfRequestId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winner",
"type": "address",
"internalType": "address"
},
{
"name": "baseTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "sizeUsdE30",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "collateralWeth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "sideLong",
"type": "bool",
"internalType": "bool"
},
{
"name": "dispatched",
"type": "bool",
"internalType": "bool"
},
{
"name": "closed",
"type": "bool",
"internalType": "bool"
},
{
"name": "leverage",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "assetId",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "secondsUntilEpoch",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setAssetMaxLev",
"type": "function",
"inputs": [
{
"name": "assetId",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "maxLev",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setBatchSize",
"type": "function",
"inputs": [
{
"name": "n",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCloseDestinations",
"type": "function",
"inputs": [
{
"name": "_buyback",
"type": "address",
"internalType": "address"
},
{
"name": "_ops",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setEpochParams",
"type": "function",
"inputs": [
{
"name": "_epochSeconds",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_takeFractionBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_maxWinnersPerEpoch",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_batchSize",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setEpochSeconds",
"type": "function",
"inputs": [
{
"name": "s",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setEthUsdPrice",
"type": "function",
"inputs": [
{
"name": "pxE8",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setHolderRouter",
"type": "function",
"inputs": [
{
"name": "r",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setHolders",
"type": "function",
"inputs": [
{
"name": "_holders",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "_weights",
"type": "uint128[]",
"internalType": "uint128[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLighterFunder",
"type": "function",
"inputs": [
{
"name": "f",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxPayoutMultiple",
"type": "function",
"inputs": [
{
"name": "m",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxWinnersPerEpoch",
"type": "function",
"inputs": [
{
"name": "n",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinHolderWeight",
"type": "function",
"inputs": [
{
"name": "floor",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setNumAssets",
"type": "function",
"inputs": [
{
"name": "n",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTakeFractionBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "takeFractionBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "triggerRemaining",
"type": "function",
"inputs": [
{
"name": "triggerId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "slotsLeft",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "budgetLeft",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "fulfilled",
"type": "bool",
"internalType": "bool"
},
{
"name": "complete",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "triggerRound",
"type": "function",
"inputs": [
{
"name": "seedCommit",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "triggerId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "triggers",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "seedCommit",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "commitBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "vrfSeed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "startedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "totalSlots",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "nextSlot",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "mintedCount",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "budgetWeth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "spentWeth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "fulfilled",
"type": "bool",
"internalType": "bool"
},
{
"name": "complete",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "weight",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "wonThisTrigger",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60c0346101c057601f613a5738819003918201601f19168301916001600160401b038311848410176101c45780849260409485528339810103126101c057610052602061004b836101d8565b92016101d8565b90331561017b575f80546001600160a01b03191633179055610384600655600780546c0f012c1f40000000000000000064ffffffffff60401b19919091161790556008805461ffff60801b1916601960821b1790556001600c819055600e805460ff1916821790556010556001600160a01b038116151580610169575b15610135576080526001600160a01b031660a05260405161386a90816101ed823960805181818161071601528181610a740152818161144301528181611e7d0152612a13015260a0518181816112d801528181611d0f0152818161229e0152612f260152f35b60405162461bcd60e51b815260206004820152600c60248201526b48323a207a65726f2061726760a01b6044820152606490fd5b506001600160a01b03821615156100cf565b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000006044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c05756fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816298bf06146127015750806302bdfb5f146126e45780630a812c29146126625780630e81662c1461262d5780631434d0c2146125885780631c0362791461256b5780632a11ced01461252957806332ae529b146124a457806333c92e5d146123d55780633807825b1461223a578063388d4996146121a5578063389b97751461217b5780633d145f8f14611eac5780633fc8cef314611e675780634002eda614611e4957806340c3271414611d83578063412356e414611d5c57806342227fa414611d3e57806347ccca0214611cf95780635797f5c114611cdd5780635f4b157914611cc15780636637e38c14611ca45780636717f83914611c5a57806368db925a14611c3157806371e3f7ef14611c0c57806379ba509714611b615780637d2a761e14611b405780637da3b04714611b245780638069704214611a825780638180577a14611a5b5780638671d23b1461199f5780638b863422146119825780638c65c81f146118d95780638da5cb5b146118b25780639a53fa77146118875780639aa5db7b14611847578063a46fe83b14611826578063a4e38c4e146111af578063a56ebd701461115e578063a78dd42e14611094578063a7c2b70b14610f3c578063a8c613a914610f17578063b951883a14610e7c578063bae26d9114610e53578063bb343a8f14610dca578063bc0120a714610dac578063bd5cc9b814610d7d578063c0fa2d9f14610d58578063c141d23614610d31578063c9dcfbc714610ca0578063cb94d49e14610b07578063d3253c4b14610977578063d35b21f21461068e578063e31f3b28146105e8578063e73b3dc2146105cb578063e76c58a31461050f578063e991ba23146104f2578063eb9fdc6d146104d6578063f1f5c993146104ad578063f2fde38b146103f2578063f4396e2a146103af578063f4daaba11461038b578063fb5bb0c31461036d578063fb9337a81461034a578063fd40031e146103175763fe85cd190361000f5734610314578060031936011261031457602060405160148152f35b80fd5b503461031457604036600319011261031457602061033e610336612767565b600435612c41565b61ffff60405191168152f35b50346103145780600319360112610314576020610365612bfa565b604051908152f35b50346103145780600319360112610314576020600654604051908152f35b5034610314578060031936011261031457602060ff60075460601c16604051908152f35b5034610314576020366003190112610314576020906001600160801b03906040906001600160a01b036103e0612778565b168152600b8452205416604051908152f35b50346103145760203660031901126103145761040c612778565b61041461337e565b6001600160a01b031633811461046857600180546001600160a01b0319168217905581546001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b60405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606490fd5b50346103145780600319360112610314576004546040516001600160a01b039091168152602090f35b50346103145780600319360112610314576020604051603c8152f35b5034610314578060031936011261031457602060405161012c8152f35b503461031457602036600319011261031457610529612756565b61053161337e565b61ffff811680159081156105bf575b506105b0576007805469ffff00000000000000001916604083811b61ffff60401b169190911791829055600654815190815261ffff9384166020820152605083901c90931690830152606090811c60ff16908201525f805160206138158339815191529080608081015b0390a180f35b63019af63760e01b8252600482fd5b6127109150115f610540565b503461031457806003193601126103145760206040516101f48152f35b503461031457602036600319011261031457610602612756565b61060a61337e565b61ffff81168015908115610682575b506105b0576007805461ffff60501b1916605083901b61ffff60501b1617908190556006546040805191825282811c61ffff908116602084015290931692810192909252606090811c60ff16908201525f805160206138158339815191529080608081016105aa565b61012c9150115f610619565b50346103145760203660031901126103145760043560018060a01b0382541633141580610962575b610953576007546106d26006546001600160401b038316612bed565b421061094457600a54156109355760035460401c6001600160a01b031615610926578115610917576040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561090c5784926108d4575b506008546001600160801b03811692838111156108b15761078361077585612710936129cd565b61ffff8560401c16906128ba565b049261078d613450565b6b033b2e3c9fd0803ce800000081156108c0570484106108b157936001600160801b038461ffff7f6835ebf8c9cb88ce971ce1498360f18de797e425a233f6c42e47430a4e6acab095606095846107e960209c9a60409c612bed565b1690851916176008556001600160401b03421680916001600160401b0319161790816007556001600160401b0360036010549b8c9b6108278d612905565b6010558c815260118f522088815560018101838043161684198254161790550191166001600160401b0319825416178155805461ffff60401b80600160401b600160f01b038560101c1616169061ffff60401b191617815580548560701b8560701b16908660701b191617905560405194855260501c1688840152166040820152a2604051908152f35b63086aef5960e01b8652600486fd5b634e487b7160e01b5f52601260045260245ffd5b9091506020813d602011610904575b816108f06020938361287a565b810103126109005751905f61074e565b5f80fd5b3d91506108e3565b6040513d86823e3d90fd5b63019af63760e01b8352600483fd5b6368ea9e3b60e11b8352600483fd5b63ebae349360e01b8352600483fd5b63643d705560e01b8352600483fd5b631dc2035760e11b8252600482fd5b506009546001600160a01b03163314156106b6565b50346103145760203660031901126103145760043560018060a01b0382541633141580610af2575b6109535760035460401c6001600160a01b031615610ae357808252600d6020526040822060018101546001600160a01b031615610ad457600481019060ff825460081c16610ac557600301546008547fe3412281ee2f4933185eec91a1fc77351915e14a6d7ff5624785e2c5bf56dc7b9260409260801c91826001600160801b03821681811115610ab5576001600160801b0391610a3c916129cd565b6001600160801b0319909216911617600855805461ff001916610100179055600354610a99908290841c6001600160a01b03908116907f0000000000000000000000000000000000000000000000000000000000000000166133cf565b6003548251918252821c6001600160a01b03166020820152a280f35b50506001600160801b0387610a3c565b63180a857f60e11b8452600484fd5b632522613f60e01b8352600483fd5b6368ea9e3b60e11b8252600482fd5b506009546001600160a01b031633141561099f565b50346103145760403660031901126103145760043560243560018060a01b0383541633141580610c8b575b610c7c578183526011602052604083208054908115610c6d57600481019283549260ff8460801c16610c5e57604051602081019083825260208152610b7860408261287a565b51902003610c4f576001600160401b036001830154166001810190818111610c2c5781431115610c405760c88101809111610c2c574311610c1d57926002927f6ea81813eb74150321f70c7042dd54943d3d56e95b59bc3e7cd62a8f7622f98d95926020956040519087820192835240604082015260408152610bfc60608261287a565b519020930183905560ff60801b1916600160801b179055604051908152a280f35b630868379b60e21b8752600487fd5b634e487b7160e01b88526011600452602488fd5b63c349402d60e01b8852600488fd5b638ff14e0d60e01b8652600486fd5b634a4117f960e01b8752600487fd5b632522613f60e01b8552600485fd5b631dc2035760e11b8352600483fd5b506009546001600160a01b0316331415610b32565b5034610314576020366003190112610314577f70b2ba30145a796f710a3401cf88c3953a7df09b41b60aac7d0db465a33485ea6020610cdd6127d4565b610ce561337e565b600780546fffffffffffffffffffffffffffffffff60681b1916606883901b6fffffffffffffffffffffffffffffffff60681b161790556040516001600160801b03919091168152a180f35b503461031457806003193601126103145760206001600160401b0360035416604051908152f35b5034610314578060031936011261031457602061ffff60075460501c16604051908152f35b5034610314576040366003190112610314576020610365610d9c61278e565b610da461337e565b6004356129e4565b50346103145780600319360112610314576020600254604051908152f35b50346103145760203660031901126103145760ff610de661271a565b610dee61337e565b16600181101580610e48575b15610e0d5760ff19600e541617600e5580f35b60405162461bcd60e51b815260206004820152601360248201527248323a206e756d4173736574732072616e676560681b6044820152606490fd5b506040811115610dfa565b50346103145780600319360112610314576009546040516001600160a01b039091168152602090f35b50346103145760203660031901126103145760043560018060a01b0382541633141580610f02575b610953578015610ecf576002556001600160401b0342166001600160401b0319600354161760035580f35b60405162461bcd60e51b815260206004820152600b60248201526a090647440f4cae4de40e0f60ab1b6044820152606490fd5b506009546001600160a01b0316331415610ea4565b5034610314578060031936011261031457602061ffff60085460801c16604051908152f35b50346103145760803660031901126103145760043590610f5a612767565b6044359261ffff841693848103611090576064359460ff86169081870361108c57610f8361337e565b603c84108015611080575b6110655761ffff85168015908115611074575b50611065578015908115611059575b5061104a571561103b575f8051602061381583398151915293946105aa918360065560075460ff60601b8360601b169061ffff60401b8760401b16906cffffffffff000000000000000019161761ffff60501b8360501b16171760075560405194859485929361ffff60ff929695816060956080880199885216602087015216604085015216910152565b63019af63760e01b8452600484fd5b63019af63760e01b8552600485fd5b61012c9150115f610fb0565b63019af63760e01b8652600486fd5b6127109150115f610fa1565b50620151808411610f8e565b8580fd5b8380fd5b503461031457602036600319011261031457604061016091600435815260116020522060ff8154916001600160801b036001600160401b036001830154169160028101546004600383015492015493604051968752602087015260408601526001600160401b038116606086015261ffff8160401c16608086015261ffff8160501c1660a086015261ffff8160601c1660c086015260701c1660e08401526001600160801b038116610100840152818160801c16151561012084015260881c161515610140820152f35b50346103145760403660031901126103145761117861271a565b6024359060ff82168092036111ab5760ff9061119261337e565b168252600f602052604082209060ff1982541617905580f35b8280fd5b503461031457606036600319011261031457600435602435906001600160801b0382168092036111ab576044359182600f0b8093036110905783546001600160a01b031633141580611811575b61180257818452600d6020526040842060018101546001600160a01b031615610c6d57600481019384549161123760ff8460101c161561280a565b61123f613450565b6305f5e10083028381056305f5e10014841517156117da5781156117ee57600160ff1b81145f198314166117da570595600382015460801c968088019081128989129080158216911516176117da578893929190848113156117d3575b6112b1819961ffff60085460801c16906128ba565b8091116117cb575b50600291909101546040516331a9108f60e11b815260048101829052947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169290602087602481875afa9687156117c057869761178a575b5062ff0000191662010000179055813b15611090578391606483926040519687938492636a8a02b160e01b845260048401528a60248401528760448401525af192831561168357869361176f575b505086938791878015908115611427575b50507fa4f26ef98456923aa428b010efa87e6f1bca648c307ee62d3c0e5307ab5e08e3956001600160801b038594602097967f6b4dce04fbc4c79c16da0663005e5bdcb194b59a573726d29426f3c0c9cca8b560407fffd068fb35607873487fdab906930645b77bcb41b6507db3bfd2ec3d512a923897819782519182528c820152a2818451931683521686820152a26040516001600160801b039590951685526001600160a01b031693a380f35b6040516370a0823160e01b8152306004820152949550929391927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692909190602081602481875afa80156117645783918d9161172f575b506008546001600160801b031680821115611727576114a5916129cd565b10611718576101f48202908282046101f4141715611704576004546001600160a01b03169161271090910490826116e5575b506005546001600160a01b03166116be575b509087949392916001600160801b038816806116ad575b50506001600160801b03841680611690575b508861151f575b80611378565b8094503b1561165857604051632e1a7d4d60e01b8152600481018990529389808660248183865af1958615611683578996611668575b508080808c6001600160a01b038b165af161156e61298f565b50611519578094503b1561165857604051630d0e30db60e41b81529389856004818c855af1908a821561165c5789968b9361163a575b5050859487967f6b4dce04fbc4c79c16da0663005e5bdcb194b59a573726d29426f3c0c9cca8b560407fffd068fb35607873487fdab906930645b77bcb41b6507db3bfd2ec3d512a92389781976116287fa4f26ef98456923aa428b010efa87e6f1bca648c307ee62d3c0e5307ab5e08e39e9860209e6001600160801b03996133cf565b97509750505050949596505095611519565b6116499298975081935061287a565b61165857878794958a5f6115a4565b8880fd5b604051903d90823e3d90fd5b81929650906116769161287a565b611658578693895f611555565b50604051903d90823e3d90fd5b6005546116a791906001600160a01b0316836133cf565b5f611512565b6116b791836133cf565b5f80611500565b90988895506001600160801b038216949392916116da916129cd565b9890919293946114e9565b975098506116fd896001600160801b038116986129cd565b985f6114d7565b634e487b7160e01b8b52601160045260248bfd5b63555cfd9160e11b8b5260048bfd5b50508b6114a5565b9150506020813d60201161175c575b8161174b6020938361287a565b81010312610900578290515f611487565b3d915061173e565b6040513d8e823e3d90fd5b819293509061177d9161287a565b61108c578390865f611367565b620100009197506117b29060203d6020116117b9575b6117aa818361287a565b81019061289b565b9690611319565b503d6117a0565b6040513d88823e3d90fd5b97505f6112b9565b508361129c565b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b89526012600452602489fd5b631dc2035760e11b8452600484fd5b506009546001600160a01b03163314156111fc565b5034610314578060031936011261031457602060ff600e5416604051908152f35b503461031457602036600319011261031457611861612778565b61186961337e565b60018060a01b03166001600160601b0360a01b600954161760095580f35b50346103145780600319360112610314576003546040805191901c6001600160a01b03168152602090f35b5034610314578060031936011261031457546040516001600160a01b039091168152602090f35b5034610314576020366003190112610314576040610140916004358152600d6020522060ff81549160018060a01b036001820154169060028101546004600383015492015492604051958652602086015260408501526001600160801b038116606085015260801c6080840152818116151560a0840152818160081c16151560c0840152818160101c16151560e0840152818160181c1661010084015260201c16610120820152f35b50346103145780600319360112610314576020604051610e108152f35b503461031457606036600319011261031457806119ba612778565b60243590604435906001600160a01b038216808303611a57576119e6906119df61337e565b151561294e565b6001600160a01b031680611a4a575082809281925af1611a0461298f565b5015611a0d5780f35b60405162461bcd60e51b8152602060048201526015602482015274120c8e88195d1a081c995cd8dd594819985a5b1959605a1b6044820152606490fd5b611a5493506133cf565b80f35b8480fd5b503461031457806003193601126103145760206001600160801b0360085416604051908152f35b503461031457602036600319011261031457611a9c6127d4565b611aa461337e565b600854906001600160801b038216806001600160801b03831611611ae7576001600160801b0391611ad4916127ea565b16906001600160801b0319161760085580f35b60405162461bcd60e51b8152602060048201526015602482015274120c8e88185b5bdd5b9d080f881c995cd95c9d9959605a1b6044820152606490fd5b5034610314578060031936011261031457602060405160328152f35b5034610314578060031936011261031457611b5961337e565b611a54612913565b50346103145780600319360112610314576001546001600160a01b0381163303611bce5781546001600160a01b031980821633908117855592166001556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606490fd5b5034610314578060031936011261031457602061ffff60075460401c16604051908152f35b50346103145780600319360112610314576005546040516001600160a01b039091168152602090f35b5034610314576040366003190112610314576040611c7661278e565b9160043581526012602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461031457806003193601126103145760206040516127108152f35b50346103145780600319360112610314576020604051600a8152f35b5034610314578060031936011261031457602060405160238152f35b50346103145780600319360112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103145780600319360112610314576020601054604051908152f35b503461031457806003193601126103145760206001600160401b0360075416604051908152f35b503461031457602036600319011261031457611d9d612778565b611da561337e565b6001600160a01b038116908115611e12576003805468010000000000000000600160e01b031916604092831b68010000000000000000600160e01b0316179055519081527fde0b4c14e039263c8f09af407a4b48c2328a32d423b2e5c50860263b5cd7ceba90602090a180f35b60405162461bcd60e51b815260206004820152600f60248201526e24191d103d32b93790333ab73232b960891b6044820152606490fd5b50346103145780600319360112610314576020600c54604051908152f35b50346103145780600319360112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610314576040366003190112610314576004356001600160401b03811161217757611edd9036906004016127a4565b906024356001600160401b03811161109057611efd9036906004016127a4565b909160018060a01b0385541633141580612162575b6121535781840361211857845b600a54811015611f625780611f3560019261272a565b838060a01b0391549060031b1c168752600b602052604087206001600160801b0319815416905501611f1f565b508493600a5485600a55806120b8575b506001600160801b036007949392945460681c1690859486945b828610611fc257877f2b0f83664dfde1d434bff8e7e320d4ea0b7347741d1f3def95e58828b22e8064602089604051908152a180f35b909192939495846001600160801b03611fe4611fdf8a8a876128cd565b6128dd565b16106120af57611ffd611ff88886866128cd565b6128f1565b600a54600160401b81101561209b579161208e91612022846001809601600a5561272a565b819291549060031b91868060a01b0316821b91868060a01b03901b1916179055612050611fdf8a8a876128cd565b838060a01b03612064611ff88c8a8a6128cd565b168b52600b6020526001600160801b0360408c2091166001600160801b0319825416179055612905565b965b019493929190611f8c565b634e487b7160e01b8a52604160045260248afd5b95600190612090565b600a86527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8017fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b81811061210d5750611f72565b868155600101612100565b60405162461bcd60e51b8152602060048201526013602482015272090647440d8cadccee8d040dad2e6dac2e8c6d606b1b6044820152606490fd5b631dc2035760e11b8552600485fd5b506009546001600160a01b0316331415611f12565b5080fd5b503461031457806003193601126103145760206001600160801b0360075460681c16604051908152f35b5034610314576040366003190112610314577f88a0d4af74e0f0acf24faa3f1ad6b8d502d3a04c8877432330f841cf99cbe97460406121e2612778565b6121ea61278e565b906121f361337e565b60018060a01b031690816001600160601b0360a01b600454161760045560018060a01b0316806001600160601b0360a01b600554161760055582519182526020820152a180f35b5034610900576020366003190112610900576004355f818152600d6020526040902060018101546001600160a01b0316156123c65761228360ff600483015460101c161561280a565b60020180546040516331a9108f60e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190602081602481865afa908115612363575f916123a7575b50336001600160a01b039091160361236e57813b15610900575f91602483926040519485938492630eabee3560e31b845260048401525af180156123635761234e575b50549033907f4c83bfaa529c7dcc5a01dbc5d6539d8085784e074f32e153a9a10b3b40e899878480a480f35b61235b9193505f9061287a565b5f915f612322565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601160248201527024191d103737ba1027232a1037bbb732b960791b6044820152606490fd5b6123c0915060203d6020116117b9576117aa818361287a565b5f6122df565b632522613f60e01b5f5260045ffd5b34610900576020366003190112610900576004355f52601160205260405f2060048101549060ff8260881c16805f146124675760ff6080935f935b831561244457506001600160801b035f5b61ffff60405196168652166020850152841c161515604083015215156060820152f35b6124626001600160801b0360038193015460701c16828416906127ea565b612421565b600382015461ffff808260501c169160401c160361ffff81116124905760809360ff9193612410565b634e487b7160e01b5f52601160045260245ffd5b34610900576020366003190112610900576124bd612756565b6124c561337e565b600261ffff8216106124f2576008805461ffff60801b191660809290921b61ffff60801b16919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e48323a2063617020746f6f206c6f7760881b6044820152606490fd5b3461090057602036600319011261090057600435600a548110156109005761255260209161272a565b905460405160039290921b1c6001600160a01b03168152f35b34610900575f366003190112610900576020604051620151808152f35b34610900576020366003190112610900576125a161271a565b6125a961337e565b60ff81161561261e576007805460ff60601b1916606083811b60ff60601b1691909117918290556006546040805191825283811c61ffff908116602084015260509490941c9093169281019290925260ff909216918101919091525f805160206138158339815191529080608081015b0390a1005b63019af63760e01b5f5260045ffd5b346109005760203660031901126109005760ff61264861271a565b165f52600f602052602060ff60405f205416604051908152f35b346109005760203660031901126109005760043561267e61337e565b603c811080156126d8575b61261e5760068190556007546040805192835261ffff82821c81166020850152605083901c169083015260ff606091821c16908201525f80516020613815833981519152908060808101612619565b50620151808111612689565b34610900575f366003190112610900576020600a54604051908152f35b34610900575f366003190112610900578060c860209252f35b6004359060ff8216820361090057565b600a5481101561274257600a5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6004359061ffff8216820361090057565b6024359061ffff8216820361090057565b600435906001600160a01b038216820361090057565b602435906001600160a01b038216820361090057565b9181601f84011215610900578235916001600160401b038311610900576020808501948460051b01011161090057565b600435906001600160801b038216820361090057565b906001600160801b03809116911603906001600160801b03821161249057565b1561281157565b60405162461bcd60e51b8152602060048201526012602482015271120c8e88185b1c9958591e4818db1bdcd95960721b6044820152606490fd5b60c081019081106001600160401b0382111761286657604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761286657604052565b9081602091031261090057516001600160a01b03811681036109005790565b8181029291811591840414171561249057565b91908110156127425760051b0190565b356001600160801b03811681036109005790565b356001600160a01b03811681036109005790565b5f1981146124905760010190565b60016010540361294c576007546001600160401b0381166129495767ffffffffffffffff1916426001600160401b031617600755565b50565b565b1561295557565b60405162461bcd60e51b8152602060048201526012602482015271120c8e881e995c9bc81c9958da5c1a595b9d60721b6044820152606490fd5b3d156129c8573d906001600160401b03821161286657604051916129bd601f8201601f19166020018461287a565b82523d5f602084013e565b606090565b9190820391821161249057565b81156108c0570490565b5f92916001600160a01b03811691906129fe83151561294e565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169290602081602481875afa908115612363575f91612bbb575b506008546001600160801b031680821115612bb257612a72916129cd565b905b8115612ba85780158015612b9f575b15612b975750915b8295813b1561090057604051632e1a7d4d60e01b8152600481018590525f8160248183875af1801561236357612b84575b508080808087895af1612acd61298f565b5015612b04575b50505060207f0dafe5fda3d3c12f5534ba82c4393aaf90fe68d6198d310d71a7d9a6ea3cc1e091604051908152a2565b813b1561031457604051630d0e30db60e41b8152818160048188875af18015612b7957612b64575b505091612b5d816020937f0dafe5fda3d3c12f5534ba82c4393aaf90fe68d6198d310d71a7d9a6ea3cc1e0956133cf565b915f612ad4565b612b6f82809261287a565b6103145780612b2c565b6040513d84823e3d90fd5b612b9091505f9061287a565b5f80612abc565b905091612a8b565b50818111612a83565b505f955050505050565b50505f90612a74565b90506020813d602011612be5575b81612bd66020938361287a565b8101031261090057515f612a54565b3d9150612bc9565b9190820180921161249057565b612c126001600160401b036007541660065490612bed565b80421015612c2857612c259042906129cd565b90565b505f90565b61ffff60019116019061ffff821161249057565b91905f9260018060a01b035f541633141580613369575b61335a57805f52601160205260405f20938454156123c65760048501549260ff8460801c161561334b5760ff8460881c1661333c5761ffff1690811561333357600a54156132ee57612ca8613450565b9360028701549660038101549461ffff8660501c169485019261ffff84116124905761ffff84818960401c1691829116116132df575b5092985f9860609790971c61ffff169686956402540be4008a02959192916001600160801b03165b61ffff8d1661ffff8a1610156132cd57600a5461ffff8b1610156132ba57604051602081019084825261ffff8b16604082015260408152612d4860608261287a565b519020916001600160801b03600388015460701c1698612d728d612d6c858d6129cd565b86613491565b919091156132a2576a52b7d2dcc80cd2e400000082028281046a52b7d2dcc80cd2e40000001483151715612490578e612daa916129da565b9a612dbe6001600160801b038d1686612bed565b116131335750612dcd84613571565b90875f52601260205260405f2060018060a01b0383165f5260205260ff60405f205416613116575f8881526012602090815260408083206001600160a01b03861684529091529020805460ff191660011790558d156402540be4008f8c0414171561249057600e5460ff166001811161310057505f945b60ff86165f52600f602052612e6e612e6360ff60405f205416836136a9565b9260ff8416906128ba565b926c0c9f2c9cd04674edea400000008402938085046c0c9f2c9cd04674edea400000001490151715612490578c938c926001600160801b03600c5494612eb386612905565b600c556040516306aec23760e41b81526001600160a01b03868116600483015264e8d4a510008685160484166024830152988316604482015291166064820152600182811614608482015260ff86811660a48301528a1660c482015260e481018590529560209087906101049082905f907f0000000000000000000000000000000000000000000000000000000000000000165af1958615612363578f928d915f986130bc575b509360ff6130889b6001600160801b0388966001807f18fe9e8b9c11b8b54c2dc4579ed91231ff63a35619d7a86f7354c1844aceddc198849f9d9b986130809f9d8e60809b6004925f52600d60205260405f20918483558683018d888060a01b03166001600160601b0360a01b8254161790556002830155888060038401921616891982541617815580548980198f8b901b169116179055018819815416898580861614161781558d815463ff00000064ff000000008b60201b169260181b169064ffff0000001916171790558b7f8bd38388b5b208597d01b0f42d303f0756aced9ab5b52a56c8b52a3cae855168602060405186808716148152a3866040519c168c52161460208a015216604088015216606086015260018060a01b031693a4612c2d565b981690612bed565b9761ffff808216146124905761ffff60019116019961ffff8060016130ac8b612c2d565b9a5b01169897919b999050612d06565b9297509795939250506020813d82116130f8575b816130dd6020938361287a565b81010312610900575193959394919390918e918c9085612f5a565b3d91506130d0565b61310f60ff918760e01c613567565b1694612e44565b50509750989a905061ffff80600161312d8b612c2d565b9a6130ae565b9b9950509c50975050509750955090506001905b6003810180546004830180546001600160801b0319166001600160801b03881690811790915563ffffffff60501b19909116605088901b61ffff60501b1617606086901b61ffff60601b161791829055909561ffff948516949193604088901c831691909216108015919061329a575b50801561328e575b6131cc575b505050505050565b600401805460ff60881b1916600160881b1790557f184ec4c24ea3319fdc09f8e0df1a061da4d343c412510c2d259221e06254d30b936060936001600160801b039161321d919060701c83166129cd565b169081613241575b60405192835260208301526040820152a25f80808080806131c4565b600854826001600160801b0382168181111561327e576001600160801b0391613269916129cd565b16906001600160801b03191617600855613225565b50506001600160801b035f613269565b50600a548310156131bf565b90505f6131b7565b9b9950509c5097505050975095509050600190613147565b97949896509a5050979250955093613147565b97509a50509792509550939193613147565b93506001600160801b03612cde565b60405162461bcd60e51b815260206004820152601760248201527f48323a206e6f20686f6c64657273206d69642d6d696e740000000000000000006044820152606490fd5b505f9450505050565b632901a0f960e11b5f5260045ffd5b6303de361f60e11b5f5260045ffd5b631dc2035760e11b5f5260045ffd5b506009546001600160a01b0316331415612c58565b5f546001600160a01b0316330361339157565b60405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606490fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f511482161561342f575b6040521561340f5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661344757823b15153d15161690613404565b503d5f823e3d90fd5b60025480158015613472575b6134635790565b63066c7e0360e21b5f5260045ffd5b50610e1061348b6001600160401b0360035416426129cd565b1161345c565b916134a8906a52b7d2dcc80cd2e4000000926128ba565b0490600a821061355f5760328210156134ea5760091982019182116124905760ff91826134d89260c01c166128ba565b04600a0180600a116124905790600190565b6135299150606460ff8260c81c1606604681105f1461352f575060ff613522600a92826135188560146129cd565b9160c01c166128ba565b0490612bed565b90600190565b605f111561354b5760ff613522601492826135188560236129cd565b60ff613522602392826135188560326129cd565b50505f905f90565b81156108c0570690565b600a54905f805b8381106136585750801561361b5761358f91613567565b5f90815b8383106135c6575050505f198101908111612490576135b19061272a565b905460039190911b1c6001600160a01b031690565b6135fd906135d38461272a565b60018060a01b0391549060031b1c165f52600b6020526001600160801b0360405f20541690612bed565b9182821061360e5760010191613593565b9150506135b1915061272a565b60405162461bcd60e51b8152602060048201526015602482015274120c8e881e995c9bc81d1bdd185b081dd95a59da1d605a1b6044820152606490fd5b906136916001916136688461272a565b848060a01b0391549060031b1c165f52600b6020526001600160801b0360405f20541690612bed565b9101613578565b9060068110156127425760051b0190565b604051906136b68261284b565b60058252600a602083015260146040830152601e606083015260286080830152603260a0830152604051906136ea8261284b565b60168252601660208301526014604083015260106060830152600c6080830152600860a08301525f805b600681106137c5575080156137bb5761372f9160801c613567565b905f90815b6006831061374757505050505050600590565b60ff861680151590816137a4575b5061379b576137729060ff61376a8585613698565b511690612bed565b91828410613785576001905b0191613734565b9250505060ff925061379691613698565b511690565b9160019061377e565b905060ff6137b28588613698565b5116115f613755565b5050505050600590565b60ff861680159081156137fc575b506137e1575b600101613714565b906137f460019160ff61376a8588613698565b9190506137d9565b905060ff61380a8388613698565b511611155f6137d356fe2d8321450950dda3931a58ccc7759707d8d22e588253dd246920d114c4f01dafa26469706673582212203592a49eab09a83ba21d89e573cba60c350ec33f4ad00debde0edb064cfc731f64736f6c634300081a00330000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad730000000000000000000000006179f8dcc9a2904195355b8eb804d47098c1e12d
0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816298bf06146127015750806302bdfb5f146126e45780630a812c29146126625780630e81662c1461262d5780631434d0c2146125885780631c0362791461256b5780632a11ced01461252957806332ae529b146124a457806333c92e5d146123d55780633807825b1461223a578063388d4996146121a5578063389b97751461217b5780633d145f8f14611eac5780633fc8cef314611e675780634002eda614611e4957806340c3271414611d83578063412356e414611d5c57806342227fa414611d3e57806347ccca0214611cf95780635797f5c114611cdd5780635f4b157914611cc15780636637e38c14611ca45780636717f83914611c5a57806368db925a14611c3157806371e3f7ef14611c0c57806379ba509714611b615780637d2a761e14611b405780637da3b04714611b245780638069704214611a825780638180577a14611a5b5780638671d23b1461199f5780638b863422146119825780638c65c81f146118d95780638da5cb5b146118b25780639a53fa77146118875780639aa5db7b14611847578063a46fe83b14611826578063a4e38c4e146111af578063a56ebd701461115e578063a78dd42e14611094578063a7c2b70b14610f3c578063a8c613a914610f17578063b951883a14610e7c578063bae26d9114610e53578063bb343a8f14610dca578063bc0120a714610dac578063bd5cc9b814610d7d578063c0fa2d9f14610d58578063c141d23614610d31578063c9dcfbc714610ca0578063cb94d49e14610b07578063d3253c4b14610977578063d35b21f21461068e578063e31f3b28146105e8578063e73b3dc2146105cb578063e76c58a31461050f578063e991ba23146104f2578063eb9fdc6d146104d6578063f1f5c993146104ad578063f2fde38b146103f2578063f4396e2a146103af578063f4daaba11461038b578063fb5bb0c31461036d578063fb9337a81461034a578063fd40031e146103175763fe85cd190361000f5734610314578060031936011261031457602060405160148152f35b80fd5b503461031457604036600319011261031457602061033e610336612767565b600435612c41565b61ffff60405191168152f35b50346103145780600319360112610314576020610365612bfa565b604051908152f35b50346103145780600319360112610314576020600654604051908152f35b5034610314578060031936011261031457602060ff60075460601c16604051908152f35b5034610314576020366003190112610314576020906001600160801b03906040906001600160a01b036103e0612778565b168152600b8452205416604051908152f35b50346103145760203660031901126103145761040c612778565b61041461337e565b6001600160a01b031633811461046857600180546001600160a01b0319168217905581546001600160a01b03167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b60405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606490fd5b50346103145780600319360112610314576004546040516001600160a01b039091168152602090f35b50346103145780600319360112610314576020604051603c8152f35b5034610314578060031936011261031457602060405161012c8152f35b503461031457602036600319011261031457610529612756565b61053161337e565b61ffff811680159081156105bf575b506105b0576007805469ffff00000000000000001916604083811b61ffff60401b169190911791829055600654815190815261ffff9384166020820152605083901c90931690830152606090811c60ff16908201525f805160206138158339815191529080608081015b0390a180f35b63019af63760e01b8252600482fd5b6127109150115f610540565b503461031457806003193601126103145760206040516101f48152f35b503461031457602036600319011261031457610602612756565b61060a61337e565b61ffff81168015908115610682575b506105b0576007805461ffff60501b1916605083901b61ffff60501b1617908190556006546040805191825282811c61ffff908116602084015290931692810192909252606090811c60ff16908201525f805160206138158339815191529080608081016105aa565b61012c9150115f610619565b50346103145760203660031901126103145760043560018060a01b0382541633141580610962575b610953576007546106d26006546001600160401b038316612bed565b421061094457600a54156109355760035460401c6001600160a01b031615610926578115610917576040516370a0823160e01b8152306004820152906020826024817f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165afa91821561090c5784926108d4575b506008546001600160801b03811692838111156108b15761078361077585612710936129cd565b61ffff8560401c16906128ba565b049261078d613450565b6b033b2e3c9fd0803ce800000081156108c0570484106108b157936001600160801b038461ffff7f6835ebf8c9cb88ce971ce1498360f18de797e425a233f6c42e47430a4e6acab095606095846107e960209c9a60409c612bed565b1690851916176008556001600160401b03421680916001600160401b0319161790816007556001600160401b0360036010549b8c9b6108278d612905565b6010558c815260118f522088815560018101838043161684198254161790550191166001600160401b0319825416178155805461ffff60401b80600160401b600160f01b038560101c1616169061ffff60401b191617815580548560701b8560701b16908660701b191617905560405194855260501c1688840152166040820152a2604051908152f35b63086aef5960e01b8652600486fd5b634e487b7160e01b5f52601260045260245ffd5b9091506020813d602011610904575b816108f06020938361287a565b810103126109005751905f61074e565b5f80fd5b3d91506108e3565b6040513d86823e3d90fd5b63019af63760e01b8352600483fd5b6368ea9e3b60e11b8352600483fd5b63ebae349360e01b8352600483fd5b63643d705560e01b8352600483fd5b631dc2035760e11b8252600482fd5b506009546001600160a01b03163314156106b6565b50346103145760203660031901126103145760043560018060a01b0382541633141580610af2575b6109535760035460401c6001600160a01b031615610ae357808252600d6020526040822060018101546001600160a01b031615610ad457600481019060ff825460081c16610ac557600301546008547fe3412281ee2f4933185eec91a1fc77351915e14a6d7ff5624785e2c5bf56dc7b9260409260801c91826001600160801b03821681811115610ab5576001600160801b0391610a3c916129cd565b6001600160801b0319909216911617600855805461ff001916610100179055600354610a99908290841c6001600160a01b03908116907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73166133cf565b6003548251918252821c6001600160a01b03166020820152a280f35b50506001600160801b0387610a3c565b63180a857f60e11b8452600484fd5b632522613f60e01b8352600483fd5b6368ea9e3b60e11b8252600482fd5b506009546001600160a01b031633141561099f565b50346103145760403660031901126103145760043560243560018060a01b0383541633141580610c8b575b610c7c578183526011602052604083208054908115610c6d57600481019283549260ff8460801c16610c5e57604051602081019083825260208152610b7860408261287a565b51902003610c4f576001600160401b036001830154166001810190818111610c2c5781431115610c405760c88101809111610c2c574311610c1d57926002927f6ea81813eb74150321f70c7042dd54943d3d56e95b59bc3e7cd62a8f7622f98d95926020956040519087820192835240604082015260408152610bfc60608261287a565b519020930183905560ff60801b1916600160801b179055604051908152a280f35b630868379b60e21b8752600487fd5b634e487b7160e01b88526011600452602488fd5b63c349402d60e01b8852600488fd5b638ff14e0d60e01b8652600486fd5b634a4117f960e01b8752600487fd5b632522613f60e01b8552600485fd5b631dc2035760e11b8352600483fd5b506009546001600160a01b0316331415610b32565b5034610314576020366003190112610314577f70b2ba30145a796f710a3401cf88c3953a7df09b41b60aac7d0db465a33485ea6020610cdd6127d4565b610ce561337e565b600780546fffffffffffffffffffffffffffffffff60681b1916606883901b6fffffffffffffffffffffffffffffffff60681b161790556040516001600160801b03919091168152a180f35b503461031457806003193601126103145760206001600160401b0360035416604051908152f35b5034610314578060031936011261031457602061ffff60075460501c16604051908152f35b5034610314576040366003190112610314576020610365610d9c61278e565b610da461337e565b6004356129e4565b50346103145780600319360112610314576020600254604051908152f35b50346103145760203660031901126103145760ff610de661271a565b610dee61337e565b16600181101580610e48575b15610e0d5760ff19600e541617600e5580f35b60405162461bcd60e51b815260206004820152601360248201527248323a206e756d4173736574732072616e676560681b6044820152606490fd5b506040811115610dfa565b50346103145780600319360112610314576009546040516001600160a01b039091168152602090f35b50346103145760203660031901126103145760043560018060a01b0382541633141580610f02575b610953578015610ecf576002556001600160401b0342166001600160401b0319600354161760035580f35b60405162461bcd60e51b815260206004820152600b60248201526a090647440f4cae4de40e0f60ab1b6044820152606490fd5b506009546001600160a01b0316331415610ea4565b5034610314578060031936011261031457602061ffff60085460801c16604051908152f35b50346103145760803660031901126103145760043590610f5a612767565b6044359261ffff841693848103611090576064359460ff86169081870361108c57610f8361337e565b603c84108015611080575b6110655761ffff85168015908115611074575b50611065578015908115611059575b5061104a571561103b575f8051602061381583398151915293946105aa918360065560075460ff60601b8360601b169061ffff60401b8760401b16906cffffffffff000000000000000019161761ffff60501b8360501b16171760075560405194859485929361ffff60ff929695816060956080880199885216602087015216604085015216910152565b63019af63760e01b8452600484fd5b63019af63760e01b8552600485fd5b61012c9150115f610fb0565b63019af63760e01b8652600486fd5b6127109150115f610fa1565b50620151808411610f8e565b8580fd5b8380fd5b503461031457602036600319011261031457604061016091600435815260116020522060ff8154916001600160801b036001600160401b036001830154169160028101546004600383015492015493604051968752602087015260408601526001600160401b038116606086015261ffff8160401c16608086015261ffff8160501c1660a086015261ffff8160601c1660c086015260701c1660e08401526001600160801b038116610100840152818160801c16151561012084015260881c161515610140820152f35b50346103145760403660031901126103145761117861271a565b6024359060ff82168092036111ab5760ff9061119261337e565b168252600f602052604082209060ff1982541617905580f35b8280fd5b503461031457606036600319011261031457600435602435906001600160801b0382168092036111ab576044359182600f0b8093036110905783546001600160a01b031633141580611811575b61180257818452600d6020526040842060018101546001600160a01b031615610c6d57600481019384549161123760ff8460101c161561280a565b61123f613450565b6305f5e10083028381056305f5e10014841517156117da5781156117ee57600160ff1b81145f198314166117da570595600382015460801c968088019081128989129080158216911516176117da578893929190848113156117d3575b6112b1819961ffff60085460801c16906128ba565b8091116117cb575b50600291909101546040516331a9108f60e11b815260048101829052947f0000000000000000000000006179f8dcc9a2904195355b8eb804d47098c1e12d6001600160a01b03169290602087602481875afa9687156117c057869761178a575b5062ff0000191662010000179055813b15611090578391606483926040519687938492636a8a02b160e01b845260048401528a60248401528760448401525af192831561168357869361176f575b505086938791878015908115611427575b50507fa4f26ef98456923aa428b010efa87e6f1bca648c307ee62d3c0e5307ab5e08e3956001600160801b038594602097967f6b4dce04fbc4c79c16da0663005e5bdcb194b59a573726d29426f3c0c9cca8b560407fffd068fb35607873487fdab906930645b77bcb41b6507db3bfd2ec3d512a923897819782519182528c820152a2818451931683521686820152a26040516001600160801b039590951685526001600160a01b031693a380f35b6040516370a0823160e01b8152306004820152949550929391927f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031692909190602081602481875afa80156117645783918d9161172f575b506008546001600160801b031680821115611727576114a5916129cd565b10611718576101f48202908282046101f4141715611704576004546001600160a01b03169161271090910490826116e5575b506005546001600160a01b03166116be575b509087949392916001600160801b038816806116ad575b50506001600160801b03841680611690575b508861151f575b80611378565b8094503b1561165857604051632e1a7d4d60e01b8152600481018990529389808660248183865af1958615611683578996611668575b508080808c6001600160a01b038b165af161156e61298f565b50611519578094503b1561165857604051630d0e30db60e41b81529389856004818c855af1908a821561165c5789968b9361163a575b5050859487967f6b4dce04fbc4c79c16da0663005e5bdcb194b59a573726d29426f3c0c9cca8b560407fffd068fb35607873487fdab906930645b77bcb41b6507db3bfd2ec3d512a92389781976116287fa4f26ef98456923aa428b010efa87e6f1bca648c307ee62d3c0e5307ab5e08e39e9860209e6001600160801b03996133cf565b97509750505050949596505095611519565b6116499298975081935061287a565b61165857878794958a5f6115a4565b8880fd5b604051903d90823e3d90fd5b81929650906116769161287a565b611658578693895f611555565b50604051903d90823e3d90fd5b6005546116a791906001600160a01b0316836133cf565b5f611512565b6116b791836133cf565b5f80611500565b90988895506001600160801b038216949392916116da916129cd565b9890919293946114e9565b975098506116fd896001600160801b038116986129cd565b985f6114d7565b634e487b7160e01b8b52601160045260248bfd5b63555cfd9160e11b8b5260048bfd5b50508b6114a5565b9150506020813d60201161175c575b8161174b6020938361287a565b81010312610900578290515f611487565b3d915061173e565b6040513d8e823e3d90fd5b819293509061177d9161287a565b61108c578390865f611367565b620100009197506117b29060203d6020116117b9575b6117aa818361287a565b81019061289b565b9690611319565b503d6117a0565b6040513d88823e3d90fd5b97505f6112b9565b508361129c565b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b89526012600452602489fd5b631dc2035760e11b8452600484fd5b506009546001600160a01b03163314156111fc565b5034610314578060031936011261031457602060ff600e5416604051908152f35b503461031457602036600319011261031457611861612778565b61186961337e565b60018060a01b03166001600160601b0360a01b600954161760095580f35b50346103145780600319360112610314576003546040805191901c6001600160a01b03168152602090f35b5034610314578060031936011261031457546040516001600160a01b039091168152602090f35b5034610314576020366003190112610314576040610140916004358152600d6020522060ff81549160018060a01b036001820154169060028101546004600383015492015492604051958652602086015260408501526001600160801b038116606085015260801c6080840152818116151560a0840152818160081c16151560c0840152818160101c16151560e0840152818160181c1661010084015260201c16610120820152f35b50346103145780600319360112610314576020604051610e108152f35b503461031457606036600319011261031457806119ba612778565b60243590604435906001600160a01b038216808303611a57576119e6906119df61337e565b151561294e565b6001600160a01b031680611a4a575082809281925af1611a0461298f565b5015611a0d5780f35b60405162461bcd60e51b8152602060048201526015602482015274120c8e88195d1a081c995cd8dd594819985a5b1959605a1b6044820152606490fd5b611a5493506133cf565b80f35b8480fd5b503461031457806003193601126103145760206001600160801b0360085416604051908152f35b503461031457602036600319011261031457611a9c6127d4565b611aa461337e565b600854906001600160801b038216806001600160801b03831611611ae7576001600160801b0391611ad4916127ea565b16906001600160801b0319161760085580f35b60405162461bcd60e51b8152602060048201526015602482015274120c8e88185b5bdd5b9d080f881c995cd95c9d9959605a1b6044820152606490fd5b5034610314578060031936011261031457602060405160328152f35b5034610314578060031936011261031457611b5961337e565b611a54612913565b50346103145780600319360112610314576001546001600160a01b0381163303611bce5781546001600160a01b031980821633908117855592166001556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606490fd5b5034610314578060031936011261031457602061ffff60075460401c16604051908152f35b50346103145780600319360112610314576005546040516001600160a01b039091168152602090f35b5034610314576040366003190112610314576040611c7661278e565b9160043581526012602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461031457806003193601126103145760206040516127108152f35b50346103145780600319360112610314576020604051600a8152f35b5034610314578060031936011261031457602060405160238152f35b50346103145780600319360112610314576040517f0000000000000000000000006179f8dcc9a2904195355b8eb804d47098c1e12d6001600160a01b03168152602090f35b50346103145780600319360112610314576020601054604051908152f35b503461031457806003193601126103145760206001600160401b0360075416604051908152f35b503461031457602036600319011261031457611d9d612778565b611da561337e565b6001600160a01b038116908115611e12576003805468010000000000000000600160e01b031916604092831b68010000000000000000600160e01b0316179055519081527fde0b4c14e039263c8f09af407a4b48c2328a32d423b2e5c50860263b5cd7ceba90602090a180f35b60405162461bcd60e51b815260206004820152600f60248201526e24191d103d32b93790333ab73232b960891b6044820152606490fd5b50346103145780600319360112610314576020600c54604051908152f35b50346103145780600319360112610314576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b5034610314576040366003190112610314576004356001600160401b03811161217757611edd9036906004016127a4565b906024356001600160401b03811161109057611efd9036906004016127a4565b909160018060a01b0385541633141580612162575b6121535781840361211857845b600a54811015611f625780611f3560019261272a565b838060a01b0391549060031b1c168752600b602052604087206001600160801b0319815416905501611f1f565b508493600a5485600a55806120b8575b506001600160801b036007949392945460681c1690859486945b828610611fc257877f2b0f83664dfde1d434bff8e7e320d4ea0b7347741d1f3def95e58828b22e8064602089604051908152a180f35b909192939495846001600160801b03611fe4611fdf8a8a876128cd565b6128dd565b16106120af57611ffd611ff88886866128cd565b6128f1565b600a54600160401b81101561209b579161208e91612022846001809601600a5561272a565b819291549060031b91868060a01b0316821b91868060a01b03901b1916179055612050611fdf8a8a876128cd565b838060a01b03612064611ff88c8a8a6128cd565b168b52600b6020526001600160801b0360408c2091166001600160801b0319825416179055612905565b965b019493929190611f8c565b634e487b7160e01b8a52604160045260248afd5b95600190612090565b600a86527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8017fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b81811061210d5750611f72565b868155600101612100565b60405162461bcd60e51b8152602060048201526013602482015272090647440d8cadccee8d040dad2e6dac2e8c6d606b1b6044820152606490fd5b631dc2035760e11b8552600485fd5b506009546001600160a01b0316331415611f12565b5080fd5b503461031457806003193601126103145760206001600160801b0360075460681c16604051908152f35b5034610314576040366003190112610314577f88a0d4af74e0f0acf24faa3f1ad6b8d502d3a04c8877432330f841cf99cbe97460406121e2612778565b6121ea61278e565b906121f361337e565b60018060a01b031690816001600160601b0360a01b600454161760045560018060a01b0316806001600160601b0360a01b600554161760055582519182526020820152a180f35b5034610900576020366003190112610900576004355f818152600d6020526040902060018101546001600160a01b0316156123c65761228360ff600483015460101c161561280a565b60020180546040516331a9108f60e11b8152600481018290527f0000000000000000000000006179f8dcc9a2904195355b8eb804d47098c1e12d6001600160a01b03169190602081602481865afa908115612363575f916123a7575b50336001600160a01b039091160361236e57813b15610900575f91602483926040519485938492630eabee3560e31b845260048401525af180156123635761234e575b50549033907f4c83bfaa529c7dcc5a01dbc5d6539d8085784e074f32e153a9a10b3b40e899878480a480f35b61235b9193505f9061287a565b5f915f612322565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601160248201527024191d103737ba1027232a1037bbb732b960791b6044820152606490fd5b6123c0915060203d6020116117b9576117aa818361287a565b5f6122df565b632522613f60e01b5f5260045ffd5b34610900576020366003190112610900576004355f52601160205260405f2060048101549060ff8260881c16805f146124675760ff6080935f935b831561244457506001600160801b035f5b61ffff60405196168652166020850152841c161515604083015215156060820152f35b6124626001600160801b0360038193015460701c16828416906127ea565b612421565b600382015461ffff808260501c169160401c160361ffff81116124905760809360ff9193612410565b634e487b7160e01b5f52601160045260245ffd5b34610900576020366003190112610900576124bd612756565b6124c561337e565b600261ffff8216106124f2576008805461ffff60801b191660809290921b61ffff60801b16919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e48323a2063617020746f6f206c6f7760881b6044820152606490fd5b3461090057602036600319011261090057600435600a548110156109005761255260209161272a565b905460405160039290921b1c6001600160a01b03168152f35b34610900575f366003190112610900576020604051620151808152f35b34610900576020366003190112610900576125a161271a565b6125a961337e565b60ff81161561261e576007805460ff60601b1916606083811b60ff60601b1691909117918290556006546040805191825283811c61ffff908116602084015260509490941c9093169281019290925260ff909216918101919091525f805160206138158339815191529080608081015b0390a1005b63019af63760e01b5f5260045ffd5b346109005760203660031901126109005760ff61264861271a565b165f52600f602052602060ff60405f205416604051908152f35b346109005760203660031901126109005760043561267e61337e565b603c811080156126d8575b61261e5760068190556007546040805192835261ffff82821c81166020850152605083901c169083015260ff606091821c16908201525f80516020613815833981519152908060808101612619565b50620151808111612689565b34610900575f366003190112610900576020600a54604051908152f35b34610900575f366003190112610900578060c860209252f35b6004359060ff8216820361090057565b600a5481101561274257600a5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b6004359061ffff8216820361090057565b6024359061ffff8216820361090057565b600435906001600160a01b038216820361090057565b602435906001600160a01b038216820361090057565b9181601f84011215610900578235916001600160401b038311610900576020808501948460051b01011161090057565b600435906001600160801b038216820361090057565b906001600160801b03809116911603906001600160801b03821161249057565b1561281157565b60405162461bcd60e51b8152602060048201526012602482015271120c8e88185b1c9958591e4818db1bdcd95960721b6044820152606490fd5b60c081019081106001600160401b0382111761286657604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761286657604052565b9081602091031261090057516001600160a01b03811681036109005790565b8181029291811591840414171561249057565b91908110156127425760051b0190565b356001600160801b03811681036109005790565b356001600160a01b03811681036109005790565b5f1981146124905760010190565b60016010540361294c576007546001600160401b0381166129495767ffffffffffffffff1916426001600160401b031617600755565b50565b565b1561295557565b60405162461bcd60e51b8152602060048201526012602482015271120c8e881e995c9bc81c9958da5c1a595b9d60721b6044820152606490fd5b3d156129c8573d906001600160401b03821161286657604051916129bd601f8201601f19166020018461287a565b82523d5f602084013e565b606090565b9190820391821161249057565b81156108c0570490565b5f92916001600160a01b03811691906129fe83151561294e565b6040516370a0823160e01b81523060048201527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03169290602081602481875afa908115612363575f91612bbb575b506008546001600160801b031680821115612bb257612a72916129cd565b905b8115612ba85780158015612b9f575b15612b975750915b8295813b1561090057604051632e1a7d4d60e01b8152600481018590525f8160248183875af1801561236357612b84575b508080808087895af1612acd61298f565b5015612b04575b50505060207f0dafe5fda3d3c12f5534ba82c4393aaf90fe68d6198d310d71a7d9a6ea3cc1e091604051908152a2565b813b1561031457604051630d0e30db60e41b8152818160048188875af18015612b7957612b64575b505091612b5d816020937f0dafe5fda3d3c12f5534ba82c4393aaf90fe68d6198d310d71a7d9a6ea3cc1e0956133cf565b915f612ad4565b612b6f82809261287a565b6103145780612b2c565b6040513d84823e3d90fd5b612b9091505f9061287a565b5f80612abc565b905091612a8b565b50818111612a83565b505f955050505050565b50505f90612a74565b90506020813d602011612be5575b81612bd66020938361287a565b8101031261090057515f612a54565b3d9150612bc9565b9190820180921161249057565b612c126001600160401b036007541660065490612bed565b80421015612c2857612c259042906129cd565b90565b505f90565b61ffff60019116019061ffff821161249057565b91905f9260018060a01b035f541633141580613369575b61335a57805f52601160205260405f20938454156123c65760048501549260ff8460801c161561334b5760ff8460881c1661333c5761ffff1690811561333357600a54156132ee57612ca8613450565b9360028701549660038101549461ffff8660501c169485019261ffff84116124905761ffff84818960401c1691829116116132df575b5092985f9860609790971c61ffff169686956402540be4008a02959192916001600160801b03165b61ffff8d1661ffff8a1610156132cd57600a5461ffff8b1610156132ba57604051602081019084825261ffff8b16604082015260408152612d4860608261287a565b519020916001600160801b03600388015460701c1698612d728d612d6c858d6129cd565b86613491565b919091156132a2576a52b7d2dcc80cd2e400000082028281046a52b7d2dcc80cd2e40000001483151715612490578e612daa916129da565b9a612dbe6001600160801b038d1686612bed565b116131335750612dcd84613571565b90875f52601260205260405f2060018060a01b0383165f5260205260ff60405f205416613116575f8881526012602090815260408083206001600160a01b03861684529091529020805460ff191660011790558d156402540be4008f8c0414171561249057600e5460ff166001811161310057505f945b60ff86165f52600f602052612e6e612e6360ff60405f205416836136a9565b9260ff8416906128ba565b926c0c9f2c9cd04674edea400000008402938085046c0c9f2c9cd04674edea400000001490151715612490578c938c926001600160801b03600c5494612eb386612905565b600c556040516306aec23760e41b81526001600160a01b03868116600483015264e8d4a510008685160484166024830152988316604482015291166064820152600182811614608482015260ff86811660a48301528a1660c482015260e481018590529560209087906101049082905f907f0000000000000000000000006179f8dcc9a2904195355b8eb804d47098c1e12d165af1958615612363578f928d915f986130bc575b509360ff6130889b6001600160801b0388966001807f18fe9e8b9c11b8b54c2dc4579ed91231ff63a35619d7a86f7354c1844aceddc198849f9d9b986130809f9d8e60809b6004925f52600d60205260405f20918483558683018d888060a01b03166001600160601b0360a01b8254161790556002830155888060038401921616891982541617815580548980198f8b901b169116179055018819815416898580861614161781558d815463ff00000064ff000000008b60201b169260181b169064ffff0000001916171790558b7f8bd38388b5b208597d01b0f42d303f0756aced9ab5b52a56c8b52a3cae855168602060405186808716148152a3866040519c168c52161460208a015216604088015216606086015260018060a01b031693a4612c2d565b981690612bed565b9761ffff808216146124905761ffff60019116019961ffff8060016130ac8b612c2d565b9a5b01169897919b999050612d06565b9297509795939250506020813d82116130f8575b816130dd6020938361287a565b81010312610900575193959394919390918e918c9085612f5a565b3d91506130d0565b61310f60ff918760e01c613567565b1694612e44565b50509750989a905061ffff80600161312d8b612c2d565b9a6130ae565b9b9950509c50975050509750955090506001905b6003810180546004830180546001600160801b0319166001600160801b03881690811790915563ffffffff60501b19909116605088901b61ffff60501b1617606086901b61ffff60601b161791829055909561ffff948516949193604088901c831691909216108015919061329a575b50801561328e575b6131cc575b505050505050565b600401805460ff60881b1916600160881b1790557f184ec4c24ea3319fdc09f8e0df1a061da4d343c412510c2d259221e06254d30b936060936001600160801b039161321d919060701c83166129cd565b169081613241575b60405192835260208301526040820152a25f80808080806131c4565b600854826001600160801b0382168181111561327e576001600160801b0391613269916129cd565b16906001600160801b03191617600855613225565b50506001600160801b035f613269565b50600a548310156131bf565b90505f6131b7565b9b9950509c5097505050975095509050600190613147565b97949896509a5050979250955093613147565b97509a50509792509550939193613147565b93506001600160801b03612cde565b60405162461bcd60e51b815260206004820152601760248201527f48323a206e6f20686f6c64657273206d69642d6d696e740000000000000000006044820152606490fd5b505f9450505050565b632901a0f960e11b5f5260045ffd5b6303de361f60e11b5f5260045ffd5b631dc2035760e11b5f5260045ffd5b506009546001600160a01b0316331415612c58565b5f546001600160a01b0316330361339157565b60405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606490fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f511482161561342f575b6040521561340f5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b90600181151661344757823b15153d15161690613404565b503d5f823e3d90fd5b60025480158015613472575b6134635790565b63066c7e0360e21b5f5260045ffd5b50610e1061348b6001600160401b0360035416426129cd565b1161345c565b916134a8906a52b7d2dcc80cd2e4000000926128ba565b0490600a821061355f5760328210156134ea5760091982019182116124905760ff91826134d89260c01c166128ba565b04600a0180600a116124905790600190565b6135299150606460ff8260c81c1606604681105f1461352f575060ff613522600a92826135188560146129cd565b9160c01c166128ba565b0490612bed565b90600190565b605f111561354b5760ff613522601492826135188560236129cd565b60ff613522602392826135188560326129cd565b50505f905f90565b81156108c0570690565b600a54905f805b8381106136585750801561361b5761358f91613567565b5f90815b8383106135c6575050505f198101908111612490576135b19061272a565b905460039190911b1c6001600160a01b031690565b6135fd906135d38461272a565b60018060a01b0391549060031b1c165f52600b6020526001600160801b0360405f20541690612bed565b9182821061360e5760010191613593565b9150506135b1915061272a565b60405162461bcd60e51b8152602060048201526015602482015274120c8e881e995c9bc81d1bdd185b081dd95a59da1d605a1b6044820152606490fd5b906136916001916136688461272a565b848060a01b0391549060031b1c165f52600b6020526001600160801b0360405f20541690612bed565b9101613578565b9060068110156127425760051b0190565b604051906136b68261284b565b60058252600a602083015260146040830152601e606083015260286080830152603260a0830152604051906136ea8261284b565b60168252601660208301526014604083015260106060830152600c6080830152600860a08301525f805b600681106137c5575080156137bb5761372f9160801c613567565b905f90815b6006831061374757505050505050600590565b60ff861680151590816137a4575b5061379b576137729060ff61376a8585613698565b511690612bed565b91828410613785576001905b0191613734565b9250505060ff925061379691613698565b511690565b9160019061377e565b905060ff6137b28588613698565b5116115f613755565b5050505050600590565b60ff861680159081156137fc575b506137e1575b600101613714565b906137f460019160ff61376a8588613698565b9190506137d9565b905060ff61380a8388613698565b511611155f6137d356fe2d8321450950dda3931a58ccc7759707d8d22e588253dd246920d114c4f01dafa26469706673582212203592a49eab09a83ba21d89e573cba60c350ec33f4ad00debde0edb064cfc731f64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x14f0ba…69627b | 37 days agoFri, 10 Jul 2026 01:45:20 UTC | 0x0dafe5…c1e0 | [0] 0x000000000000…90fea951 data: 0x000000000000000000…62f6c573 |
| 0xd2d2ea…dd4dd3 | 37 days agoFri, 10 Jul 2026 01:32:20 UTC | 0x2b0f83…8064 | data: 0x000000000000000000…00000006 |
| 0x5badbc…afc84d | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xa4f26e…08e3 | [0] 0x000000000000…00000001 [1] 0x000000000000…2756bd76 data: 0x000000000000000000…eab3c44d |
| 0x5badbc…afc84d | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xffd068…9238 | [0] 0x000000000000…00000001 data: 0x000000000000000000…c5ed8ae7 |
| 0x5badbc…afc84d | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0x6b4dce…a8b5 | [0] 0x000000000000…00000001 data: 0x000000000000000000…769aa000 |
| 0xf7f1fa…19eb47 | 37 days agoFri, 10 Jul 2026 01:17:46 UTC | 0x4c83bf…9987 | [0] 0x000000000000…00000001 [1] 0x000000000000…2756bd76 [2] 0x000000000000…00000001 |
| 0xb852ab…ecdb8f | 37 days agoFri, 10 Jul 2026 01:16:11 UTC | 0xe34122…dc7b | [0] 0x000000000000…00000001 data: 0x000000000000000000…3abbc5ea |
| 0x50f8eb…11814e | 37 days agoFri, 10 Jul 2026 01:16:01 UTC | 0x184ec4…d30b | [0] 0x000000000000…00000001 data: 0x000000000000000000…9c60861c |
| 0x50f8eb…11814e | 37 days agoFri, 10 Jul 2026 01:16:01 UTC | 0x18fe9e…ddc1 | [0] 0x000000000000…00000001 [1] 0x000000000000…2756bd76 [2] 0x000000000000…00000001 data: 0x000000000000000000…0000001b |
| 0x50f8eb…11814e | 37 days agoFri, 10 Jul 2026 01:16:01 UTC | 0x8bd383…5168 | [0] 0x000000000000…00000001 [1] 0x000000000000…00000001 data: 0x000000000000000000…00000000 |
| 0xdef3e6…7adb2d | 37 days agoFri, 10 Jul 2026 01:16:00 UTC | 0x6ea818…f98d | [0] 0x000000000000…00000001 data: 0x54fbab53516abd4721…bd582bbe |
| 0xdea7b4…7d92c6 | 37 days agoFri, 10 Jul 2026 01:15:25 UTC | 0x6835eb…cab0 | [0] 0x000000000000…00000001 data: 0xeeb42b0b4a03a19748…9f471e08 |
| 0x0f6a5b…580793 | 37 days agoFri, 10 Jul 2026 01:12:34 UTC | 0x2b0f83…8064 | data: 0x000000000000000000…00000006 |
| 0x73afee…8c46d7 | 37 days agoFri, 10 Jul 2026 01:11:33 UTC | 0x2b0f83…8064 | data: 0x000000000000000000…00000006 |
| 0x95cfc1…640d40 | 37 days agoFri, 10 Jul 2026 01:05:30 UTC | 0x2b0f83…8064 | data: 0x000000000000000000…00000005 |
| 0x77edbf…30fb21 | 37 days agoFri, 10 Jul 2026 00:58:31 UTC | 0x88a0d4…e974 | data: 0x000000000000000000…3abbc5ea |
| 0xb7086e…3cac33 | 37 days agoFri, 10 Jul 2026 00:58:30 UTC | 0xde0b4c…ceba | data: 0x000000000000000000…3abbc5ea |
| 0xced6e2…8d562e | 37 days agoFri, 10 Jul 2026 00:58:28 UTC | 0x70b2ba…85ea | data: 0x000000000000000000…b2400000 |
| 0x4e2617…8741c5 | 37 days agoFri, 10 Jul 2026 00:58:25 UTC | 0x2d8321…1daf | data: 0x000000000000000000…00000005 |
| 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 | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xac804d…0c2ae3 | setEthUsdPrice | 5,696,123 | 37 days agoFri, 10 Jul 2026 01:48:07 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000163 | |
| 0x14f0ba…69627b | claimTreasury | 5,694,457 | 37 days agoFri, 10 Jul 2026 01:45:20 UTC | 0x9a7a…a951 | IN | H2BaseController | $0.000 ETH | 0.00000281 | |
| 0xe4e4ae…52932a | setEthUsdPrice | 5,692,991 | 37 days agoFri, 10 Jul 2026 01:42:53 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000167 | |
| 0x7f6b18…5e6223 | setEthUsdPrice | 5,689,944 | 37 days agoFri, 10 Jul 2026 01:37:47 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000168 | |
| 0x3b5466…9c5d33 | setEthUsdPrice | 5,686,888 | 37 days agoFri, 10 Jul 2026 01:32:41 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000168 | |
| 0xd2d2ea…dd4dd3 | setHolders | 5,686,682 | 37 days agoFri, 10 Jul 2026 01:32:20 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000415 | |
| 0xbbd44d…a14b60 | setEthUsdPrice | 5,683,732 | 37 days agoFri, 10 Jul 2026 01:27:24 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000167 | |
| 0x2675b2…4a72ad | setEthUsdPrice | 5,680,505 | 37 days agoFri, 10 Jul 2026 01:22:00 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000169 | |
| 0x5badbc…afc84d | adminReportClose | 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000646 | |
| 0xf7f1fa…19eb47 | requestClose | 5,677,965 | 37 days agoFri, 10 Jul 2026 01:17:46 UTC | 0xebd8…bd76 | IN | H2BaseController | $0.000 ETH | 0.00000208 | |
| 0x4ba91c…2cebf8 | setEthUsdPrice | 5,677,232 | 37 days agoFri, 10 Jul 2026 01:16:32 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000172 | |
| 0xb852ab…ecdb8f | dispatchToLighter | 5,677,022 | 37 days agoFri, 10 Jul 2026 01:16:11 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000312 | |
| 0x50f8eb…11814e | mintRoundBatch | 5,676,925 | 37 days agoFri, 10 Jul 2026 01:16:01 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00001906 | |
| 0xdef3e6…7adb2d | revealSeed | 5,676,915 | 37 days agoFri, 10 Jul 2026 01:16:00 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000358 | |
| 0xdea7b4…7d92c6 | triggerRound | 5,676,567 | 37 days agoFri, 10 Jul 2026 01:15:25 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000619 | |
| 0x0f6a5b…580793 | setHolders | 5,674,855 | 37 days agoFri, 10 Jul 2026 01:12:34 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000416 | |
| 0x73afee…8c46d7 | setHolders | 5,674,249 | 37 days agoFri, 10 Jul 2026 01:11:33 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000560 | |
| 0xdbf894…11ceb4 | setEthUsdPrice | 5,673,929 | 37 days agoFri, 10 Jul 2026 01:11:01 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000168 | |
| 0xef55eb…fbd366 | setEthUsdPrice | 5,670,653 | 37 days agoFri, 10 Jul 2026 01:05:32 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000171 | |
| 0x95cfc1…640d40 | setHolders | 5,670,632 | 37 days agoFri, 10 Jul 2026 01:05:30 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00001327 | |
| 0x5c271c…71c390 | armEpoch | 5,670,365 | 37 days agoFri, 10 Jul 2026 01:05:03 UTC | 0x9a7a…a951 | IN | H2BaseController | $0.000 ETH | 0.00000148 | |
| 0x0987c2…533090 | setEthUsdPrice | 5,667,623 | 37 days agoFri, 10 Jul 2026 01:00:28 UTC | 0xebaf…c5ea | IN | H2BaseController | $0.000 ETH | 0.00000255 | |
| 0x6c23d2…c35eb6 | setNumAssets | 5,667,536 | 37 days agoFri, 10 Jul 2026 01:00:20 UTC | 0x9a7a…a951 | IN | H2BaseController | $0.000 ETH | 0.00000138 | |
| 0xc22e26…4be894 | setAssetMaxLev | 5,667,518 | 37 days agoFri, 10 Jul 2026 01:00:18 UTC | 0x9a7a…a951 | IN | H2BaseController | $0.000 ETH | 0.00000222 | |
| 0xcd117a…8ff87e | setAssetMaxLev | 5,667,487 | 37 days agoFri, 10 Jul 2026 01:00:15 UTC | 0x9a7a…a951 | IN | H2BaseController | $0.000 ETH | 0.00000218 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x14f0bac3…69627b | Transfer | 5,694,457 | 37 days agoFri, 10 Jul 2026 01:45:20 UTC | 0xc1cd…ac10 | OUT | 0x0000…0000 | 0.000869 WETH | WETH (WETH) | |
| 0x5badbc47…afc84d | Transfer | 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xc1cd…ac10 | OUT | 0x0000…0000 | 0.031295 WETH | WETH (WETH) | |
| 0x5badbc47…afc84d | Transfer | 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xc1cd…ac10 | OUT | 0xebaf…c5ea | 0.001738 WETH | WETH (WETH) | |
| 0x5badbc47…afc84d | Transfer | 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0xc1cd…ac10 | OUT | 0xdc15…e7b3 | 0.001738 WETH | WETH (WETH) | |
| 0x6291c15a…590d90 | Transfer | 5,678,052 | 37 days agoFri, 10 Jul 2026 01:17:54 UTC | 0xebaf…c5ea | IN | 0xc1cd…ac10 | 0.026051 WETH | WETH (WETH) | |
| 0xb852ab01…ecdb8f | Transfer | 5,677,022 | 37 days agoFri, 10 Jul 2026 01:16:11 UTC | 0xc1cd…ac10 | OUT | 0xebaf…c5ea | 0.017263 WETH | WETH (WETH) | |
| 0xfa85ff23…2df197 | Transfer | 5,674,460 | 37 days agoFri, 10 Jul 2026 01:11:54 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000171 WETH | WETH (WETH) | |
| 0xae9b0aa2…a9234a | Transfer | 5,674,400 | 37 days agoFri, 10 Jul 2026 01:11:48 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000171 WETH | WETH (WETH) | |
| 0x7c43d643…3da9b6 | Transfer | 5,674,112 | 37 days agoFri, 10 Jul 2026 01:11:19 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000171 WETH | WETH (WETH) | |
| 0xea9047ef…50d8c8 | Transfer | 5,671,835 | 37 days agoFri, 10 Jul 2026 01:07:31 UTC | 0x9a7a…a951 | IN | 0xc1cd…ac10 | 0.025 WETH | WETH (WETH) | |
| 0x5d7fcd82…ec8f37 | Transfer | 5,670,385 | 37 days agoFri, 10 Jul 2026 01:05:05 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000267 WETH | WETH (WETH) | |
| 0x928133f2…496acd | Transfer | 5,670,384 | 37 days agoFri, 10 Jul 2026 01:05:05 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000267 WETH | WETH (WETH) | |
| 0xd09acb3c…02c57e | Transfer | 5,670,384 | 37 days agoFri, 10 Jul 2026 01:05:05 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000267 WETH | WETH (WETH) | |
| 0x8cb1d218…bc0eac | Transfer | 5,670,384 | 37 days agoFri, 10 Jul 2026 01:05:05 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000267 WETH | WETH (WETH) | |
| 0xae1610a2…eb7c60 | Transfer | 5,670,384 | 37 days agoFri, 10 Jul 2026 01:05:05 UTC | 0xe073…4088 | IN | 0xc1cd…ac10 | 0.000267 WETH | WETH (WETH) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 5,694,457 | 37 days agoFri, 10 Jul 2026 01:45:20 UTC | 0x14f0ba…69627b | CALL | claimTreasury | 0xc1cd…ac10 | OUT | 0x9a7a…a951 | 0.00086 ETH |
| 5,694,457 | 37 days agoFri, 10 Jul 2026 01:45:20 UTC | 0x14f0ba…69627b | CALL | claimTreasury | 0x0bd7…ad73 | IN | 0xc1cd…ac10 | 0.00086 ETH |
| 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0x5badbc…afc84d | CALL | adminReportClose | 0xc1cd…ac10 | OUT | 0xebd8…bd76 | 0.03129 ETH |
| 5,678,059 | 37 days agoFri, 10 Jul 2026 01:17:55 UTC | 0x5badbc…afc84d | CALL | adminReportClose | 0x0bd7…ad73 | IN | 0xc1cd…ac10 | 0.03129 ETH |