// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {DrandEvmnetOracle} from "./DrandEvmnetOracle.sol";
import {IEligibilityVerifier} from "./interfaces/IEligibilityVerifier.sol";
import {ILivoMasterFeeHandler} from "./interfaces/ILivoMasterFeeHandler.sol";
import {IPurchaseGuard} from "./interfaces/IPurchaseGuard.sol";
import {ISnapshotVerifier} from "./interfaces/ISnapshotVerifier.sol";
import {IStockPurchaseAdapter} from "./interfaces/IStockPurchaseAdapter.sol";
interface IArbSys {
function arbBlockNumber() external view returns (uint256);
}
/// @title FreestockRoundDistributor
/// @notice Locks Livo tax ETH into 30-minute rounds, buys a Robinhood Stock
/// Token, and lets drand-selected token holders claim equal prize slots.
/// @dev Holder balances are committed as cumulative-weight Merkle intervals by
/// an immutable snapshot quorum. Commitment and purchase execution are open to
/// any relayer after the exact intent has enough EIP-712 approvals.
contract FreestockRoundDistributor is AccessControl, ReentrancyGuard {
using SafeERC20 for IERC20;
bytes32 public constant ROUND_DOMAIN = keccak256("freestock.round.v1");
bytes32 public constant STOCK_SELECTION_DOMAIN =
keccak256("freestock.stock-selection.v1");
bytes32 public constant SNAPSHOT_LEAF_DOMAIN = keccak256("freestock.snapshot-leaf.v1");
bytes32 public constant WINNER_SLOT_DOMAIN = keccak256("freestock.winner-slot.v1");
uint64 public constant ROUND_ETHEREUM_BLOCKS = 150;
// Retained as a public compatibility getter for existing automation. New
// deployments use a fixed winner count and therefore have no growth interval.
uint64 public constant WINNER_GROWTH_ETHEREUM_BLOCKS = 0;
uint64 public constant CANCELLATION_DELAY_ETHEREUM_BLOCKS = 7_200;
uint64 public constant DRAND_COMMITMENT_DELAY_SECONDS = 30;
uint32 public constant INITIAL_WINNER_SLOTS = 15;
address internal constant ARBSYS = address(100);
enum RoundState {
Unset,
Committed,
Resolved,
Settling,
Purchased,
Cancelled
}
struct Round {
RoundState state;
uint64 closeEthereumBlock;
uint64 committedEthereumBlock;
uint64 snapshotL2Block;
uint64 targetDrandRound;
uint32 winnerSlots;
uint32 bonusPrizeSlots;
bytes32 holderRoot;
bytes32 randomness;
uint256 totalWeight;
uint256 ethBudget;
uint256 stockPurchased;
uint256 basePrize;
address stockToken;
IStockPurchaseAdapter adapter;
IEligibilityVerifier eligibilityVerifier;
IPurchaseGuard purchaseGuard;
}
DrandEvmnetOracle public immutable ORACLE;
ILivoMasterFeeHandler public immutable LIVO_FEE_HANDLER;
bytes32 public immutable STOCK_BASKET_HASH;
uint64 public immutable genesisEthereumBlock;
address[] private stockBasket;
address public freestockToken;
ISnapshotVerifier public currentSnapshotVerifier;
IStockPurchaseAdapter public currentAdapter;
IEligibilityVerifier public currentEligibilityVerifier;
IPurchaseGuard public currentPurchaseGuard;
uint64 public lastBoundaryIndex;
uint64 public lastSnapshotL2Block;
uint256 public nextRoundId;
uint256 public reservedEth;
mapping(address stockToken => bool allowed) public isStockTokenAllowed;
mapping(uint256 roundId => Round value) public rounds;
mapping(uint256 roundId => bytes32 manifestHash) public snapshotManifestHashByRound;
mapping(uint256 roundId => ISnapshotVerifier verifier) public snapshotVerifierByRound;
mapping(uint256 roundId => mapping(uint256 word => uint256 bitmap)) private claimedSlots;
error AdapterOutputMismatch(uint256 reported, uint256 received);
error BeaconNotDue();
error BoundaryMismatch(uint256 actual, uint256 expected);
error CancellationNotDue();
error ClaimAlreadyProcessed();
error DeadlineExpired();
error FreestockTokenAlreadySet();
error FreestockTokenNotSet();
error FutureSnapshot();
error HolderProofInvalid();
error InvalidBudgetRange();
error InvalidHolderInterval();
error InvalidRoundState();
error NoRoundFunds();
error NotEligible();
error NotWinningInterval();
error PrizeTooSmall();
error RoundNotDue();
error StaleSnapshot();
error EmptyStockBasket();
error DuplicateStockToken();
error Uint64Overflow();
error WinnerSlotOutOfRange();
error ZeroAddress();
error ZeroManifestHash();
error ZeroRoot();
error ZeroWeight();
event CurrentAdapterSet(address indexed adapter);
event CurrentEligibilityVerifierSet(address indexed verifier);
event CurrentPurchaseGuardSet(address indexed guard);
event CurrentSnapshotVerifierSet(address indexed verifier);
event FreestockTokenSet(address indexed token);
event LivoFeesClaimed(address indexed caller, uint256 amount);
event NativeTaxReceived(address indexed sender, uint256 amount);
event RoundCancelled(uint256 indexed roundId, uint256 releasedEth);
event RoundCommitted(
uint256 indexed roundId,
uint64 indexed closeEthereumBlock,
address indexed executor,
uint64 snapshotL2Block,
uint64 targetDrandRound,
uint32 winnerSlots,
bytes32 holderRoot,
bytes32 snapshotManifestHash,
uint256 totalWeight,
uint256 ethBudget,
uint256 minimumEthBudget,
uint256 maximumEthBudget,
bytes32 stockBasketHash,
address snapshotVerifier,
address adapter,
address eligibilityVerifier,
address purchaseGuard
);
event RoundResolved(
uint256 indexed roundId,
uint64 indexed targetDrandRound,
address indexed stockToken,
bytes32 beaconRandomness,
bytes32 roundRandomness
);
event StockTokenAllowed(address indexed stockToken, bool allowed);
event StockTokensPurchased(
uint256 indexed roundId,
address indexed stockToken,
address indexed executor,
address purchaseGuard,
uint256 nativeInput,
uint256 minStockOut,
uint256 deadline,
uint256 stockReceived,
uint256 basePrize,
uint32 bonusPrizeSlots
);
event WinnerClaimed(
uint256 indexed roundId,
uint32 indexed slot,
address indexed account,
uint256 ticket,
uint256 stockAmount
);
constructor(
address oracle,
address livoFeeHandler,
address initialAdmin,
address initialSnapshotVerifier,
address initialAdapter,
address initialPurchaseGuard,
address initialEligibilityVerifier,
address[] memory initialStockBasket
) {
if (
oracle == address(0) || livoFeeHandler == address(0)
|| initialAdmin == address(0)
|| initialSnapshotVerifier == address(0)
|| initialAdapter == address(0) || initialPurchaseGuard == address(0)
|| initialEligibilityVerifier == address(0)
) {
revert ZeroAddress();
}
if (
oracle.code.length == 0 || livoFeeHandler.code.length == 0
|| initialSnapshotVerifier.code.length == 0
|| initialAdapter.code.length == 0 || initialPurchaseGuard.code.length == 0
|| initialEligibilityVerifier.code.length == 0
) {
revert ZeroAddress();
}
if (block.number > type(uint64).max) revert Uint64Overflow();
ORACLE = DrandEvmnetOracle(oracle);
LIVO_FEE_HANDLER = ILivoMasterFeeHandler(livoFeeHandler);
uint256 basketLength = initialStockBasket.length;
if (basketLength == 0) revert EmptyStockBasket();
for (uint256 i; i < basketLength; ++i) {
address stockToken = initialStockBasket[i];
if (stockToken == address(0) || stockToken.code.length == 0) {
revert ZeroAddress();
}
for (uint256 j; j < i; ++j) {
if (initialStockBasket[j] == stockToken) {
revert DuplicateStockToken();
}
}
stockBasket.push(stockToken);
isStockTokenAllowed[stockToken] = true;
emit StockTokenAllowed(stockToken, true);
}
STOCK_BASKET_HASH = keccak256(abi.encode(initialStockBasket));
genesisEthereumBlock = uint64(block.number);
currentSnapshotVerifier = ISnapshotVerifier(initialSnapshotVerifier);
currentAdapter = IStockPurchaseAdapter(initialAdapter);
currentPurchaseGuard = IPurchaseGuard(initialPurchaseGuard);
currentEligibilityVerifier = IEligibilityVerifier(initialEligibilityVerifier);
_grantRole(DEFAULT_ADMIN_ROLE, initialAdmin);
}
receive() external payable {
emit NativeTaxReceived(msg.sender, msg.value);
}
/// @notice Recover a direct-forward failure recorded as claimable by Livo.
/// @dev Anyone may trigger the claim, but the handler always pays this contract.
function claimLivoFees(address[] calldata tokens)
external
nonReentrant
returns (uint256 amount)
{
return _claimLivoFees(tokens);
}
function _claimLivoFees(address[] memory tokens)
private
returns (uint256 amount)
{
uint256 startingBalance = address(this).balance;
LIVO_FEE_HANDLER.claim(tokens);
amount = address(this).balance - startingBalance;
emit LivoFeesClaimed(msg.sender, amount);
}
function setFreestockToken(address token) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (freestockToken != address(0)) revert FreestockTokenAlreadySet();
if (token == address(0) || token.code.length == 0) revert ZeroAddress();
freestockToken = token;
emit FreestockTokenSet(token);
}
function setCurrentAdapter(address adapter) external onlyRole(DEFAULT_ADMIN_ROLE) {
if (adapter == address(0) || adapter.code.length == 0) revert ZeroAddress();
currentAdapter = IStockPurchaseAdapter(adapter);
emit CurrentAdapterSet(adapter);
}
function setCurrentSnapshotVerifier(address verifier)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
if (verifier == address(0) || verifier.code.length == 0) revert ZeroAddress();
currentSnapshotVerifier = ISnapshotVerifier(verifier);
emit CurrentSnapshotVerifierSet(verifier);
}
function setCurrentPurchaseGuard(address guard)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
if (guard == address(0) || guard.code.length == 0) revert ZeroAddress();
currentPurchaseGuard = IPurchaseGuard(guard);
emit CurrentPurchaseGuardSet(guard);
}
function setCurrentEligibilityVerifier(address verifier)
external
onlyRole(DEFAULT_ADMIN_ROLE)
{
if (verifier == address(0) || verifier.code.length == 0) revert ZeroAddress();
currentEligibilityVerifier = IEligibilityVerifier(verifier);
emit CurrentEligibilityVerifierSet(verifier);
}
function stockBasketLength() external view returns (uint256) {
return stockBasket.length;
}
function stockBasketAt(uint256 index) external view returns (address) {
return stockBasket[index];
}
/// @notice Claim pending FREESTOCK tax and lock all unreserved ETH into a round.
/// @dev Missed 150-block boundaries are skipped. This prevents a late keeper from
/// opening many retroactive rounds against the same present-day holder snapshot.
function commitRound(
uint64 expectedBoundaryIndex,
bytes32 holderRoot,
uint256 totalWeight,
uint64 snapshotL2Block,
bytes32 snapshotManifestHash,
uint256 minimumEthBudget,
uint256 maximumEthBudget,
bytes calldata snapshotApproval
) external nonReentrant returns (uint256 roundId) {
address token = freestockToken;
if (token == address(0)) revert FreestockTokenNotSet();
address[] memory livoTokens = new address[](1);
livoTokens[0] = token;
_claimLivoFees(livoTokens);
if (holderRoot == bytes32(0)) revert ZeroRoot();
if (snapshotManifestHash == bytes32(0)) revert ZeroManifestHash();
if (totalWeight == 0) revert ZeroWeight();
if (
minimumEthBudget == 0 || maximumEthBudget < minimumEthBudget
) revert InvalidBudgetRange();
uint256 boundaryIndex = currentBoundaryIndex();
if (boundaryIndex == 0 || boundaryIndex <= lastBoundaryIndex) revert RoundNotDue();
if (boundaryIndex > type(uint64).max) revert Uint64Overflow();
if (boundaryIndex != expectedBoundaryIndex) {
revert BoundaryMismatch(boundaryIndex, expectedBoundaryIndex);
}
uint256 observedL2Block = currentL2Block();
if (snapshotL2Block > observedL2Block) revert FutureSnapshot();
if (snapshotL2Block <= lastSnapshotL2Block) revert StaleSnapshot();
uint256 budget = address(this).balance - reservedEth;
if (budget == 0) revert NoRoundFunds();
if (budget < minimumEthBudget || budget > maximumEthBudget) {
revert InvalidBudgetRange();
}
uint256 closeBlock =
uint256(genesisEthereumBlock) + boundaryIndex * ROUND_ETHEREUM_BLOCKS;
uint256 winnerSlots = uint256(INITIAL_WINNER_SLOTS);
if (closeBlock > type(uint64).max || block.number > type(uint64).max) {
revert Uint64Overflow();
}
uint64 targetDrandRound =
ORACLE.firstRoundAfter(block.timestamp + DRAND_COMMITMENT_DELAY_SECONDS);
ISnapshotVerifier snapshotVerifier = currentSnapshotVerifier;
IStockPurchaseAdapter adapter = currentAdapter;
IPurchaseGuard purchaseGuard = currentPurchaseGuard;
IEligibilityVerifier verifier = currentEligibilityVerifier;
roundId = nextRoundId;
snapshotVerifier.verifySnapshot(
address(this),
roundId,
uint64(boundaryIndex),
holderRoot,
totalWeight,
snapshotL2Block,
snapshotManifestHash,
STOCK_BASKET_HASH,
minimumEthBudget,
maximumEthBudget,
snapshotApproval
);
nextRoundId = roundId + 1;
snapshotManifestHashByRound[roundId] = snapshotManifestHash;
snapshotVerifierByRound[roundId] = snapshotVerifier;
rounds[roundId] = Round({
state: RoundState.Committed,
closeEthereumBlock: uint64(closeBlock),
committedEthereumBlock: uint64(block.number),
snapshotL2Block: snapshotL2Block,
targetDrandRound: targetDrandRound,
winnerSlots: uint32(winnerSlots),
bonusPrizeSlots: 0,
holderRoot: holderRoot,
randomness: bytes32(0),
totalWeight: totalWeight,
ethBudget: budget,
stockPurchased: 0,
basePrize: 0,
stockToken: address(0),
adapter: adapter,
eligibilityVerifier: verifier,
purchaseGuard: purchaseGuard
});
lastBoundaryIndex = uint64(boundaryIndex);
lastSnapshotL2Block = snapshotL2Block;
reservedEth += budget;
emit RoundCommitted(
roundId,
uint64(closeBlock),
msg.sender,
snapshotL2Block,
targetDrandRound,
uint32(winnerSlots),
holderRoot,
snapshotManifestHash,
totalWeight,
budget,
minimumEthBudget,
maximumEthBudget,
STOCK_BASKET_HASH,
address(snapshotVerifier),
address(adapter),
address(verifier),
address(purchaseGuard)
);
}
/// @notice Verify or reuse the exact future drand beacon pinned at commitment.
function resolveRound(uint256 roundId, uint256[2] calldata signature)
external
nonReentrant
{
Round storage round = rounds[roundId];
if (round.state != RoundState.Committed) revert InvalidRoundState();
if (block.timestamp < ORACLE.roundTime(round.targetDrandRound)) revert BeaconNotDue();
bytes32 beaconRandomness;
if (ORACLE.isSubmitted(round.targetDrandRound)) {
beaconRandomness = ORACLE.randomnessByRound(round.targetDrandRound);
} else {
beaconRandomness = ORACLE.submitBeacon(round.targetDrandRound, signature);
}
bytes32 stockSelectionRandomness = keccak256(
abi.encode(
STOCK_SELECTION_DOMAIN,
address(this),
block.chainid,
roundId,
STOCK_BASKET_HASH,
beaconRandomness
)
);
address selectedStock = stockBasket[
uint256(stockSelectionRandomness) % stockBasket.length
];
bytes32 roundRandomness = keccak256(
abi.encode(
ROUND_DOMAIN,
address(this),
block.chainid,
roundId,
round.closeEthereumBlock,
round.snapshotL2Block,
round.holderRoot,
snapshotManifestHashByRound[roundId],
address(snapshotVerifierByRound[roundId]),
round.totalWeight,
round.ethBudget,
selectedStock,
address(round.adapter),
address(round.eligibilityVerifier),
address(round.purchaseGuard),
beaconRandomness
)
);
round.stockToken = selectedStock;
round.randomness = roundRandomness;
round.state = RoundState.Resolved;
emit RoundResolved(
roundId,
round.targetDrandRound,
selectedStock,
beaconRandomness,
roundRandomness
);
}
/// @notice Spend this round's locked ETH through its committed venue adapter.
/// @dev The caller supplies a fresh firm quote and an explicit output floor.
function purchaseStock(
uint256 roundId,
uint256 minStockOut,
uint256 deadline,
bytes calldata purchaseApproval
) external nonReentrant {
Round storage round = rounds[roundId];
if (round.state != RoundState.Resolved) revert InvalidRoundState();
if (block.timestamp > deadline) revert DeadlineExpired();
if (minStockOut < round.winnerSlots) revert PrizeTooSmall();
round.purchaseGuard.verifyPurchase(
address(this),
roundId,
round.stockToken,
address(round.adapter),
round.ethBudget,
minStockOut,
deadline,
purchaseApproval
);
round.state = RoundState.Settling;
reservedEth -= round.ethBudget;
uint256 startingBalance = IERC20(round.stockToken).balanceOf(address(this));
uint256 reported = round.adapter.buyStock{value: round.ethBudget}(
round.stockToken, minStockOut, deadline
);
uint256 received = IERC20(round.stockToken).balanceOf(address(this)) - startingBalance;
if (reported != received) revert AdapterOutputMismatch(reported, received);
if (received < minStockOut || received < round.winnerSlots) revert PrizeTooSmall();
round.stockPurchased = received;
round.basePrize = received / round.winnerSlots;
round.bonusPrizeSlots = uint32(received % round.winnerSlots);
round.state = RoundState.Purchased;
emit StockTokensPurchased(
roundId,
round.stockToken,
msg.sender,
address(round.purchaseGuard),
round.ethBudget,
minStockOut,
deadline,
received,
round.basePrize,
round.bonusPrizeSlots
);
}
/// @notice Claim one sampled slot. Anyone can relay; stock always goes to the winner.
function claim(
uint256 roundId,
uint32 slot,
address account,
uint256 cumulativeStart,
uint256 cumulativeEnd,
bytes32[] calldata proof
) external nonReentrant {
Round storage round = rounds[roundId];
if (round.state != RoundState.Purchased) revert InvalidRoundState();
if (slot >= round.winnerSlots) revert WinnerSlotOutOfRange();
if (isClaimed(roundId, slot)) revert ClaimAlreadyProcessed();
if (
account == address(0) || cumulativeStart >= cumulativeEnd
|| cumulativeEnd > round.totalWeight
) {
revert InvalidHolderInterval();
}
if (!round.eligibilityVerifier.isEligible(account, round.stockToken)) {
revert NotEligible();
}
bytes32 leaf =
holderLeaf(roundId, account, cumulativeStart, cumulativeEnd);
if (!MerkleProof.verifyCalldata(proof, round.holderRoot, leaf)) {
revert HolderProofInvalid();
}
uint256 ticket = winnerTicket(roundId, slot);
if (ticket < cumulativeStart || ticket >= cumulativeEnd) {
revert NotWinningInterval();
}
uint256 word = uint256(slot) >> 8;
uint256 mask = 1 << (uint256(slot) & 255);
claimedSlots[roundId][word] |= mask;
uint256 amount = round.basePrize;
if (slot < round.bonusPrizeSlots) ++amount;
IERC20(round.stockToken).safeTransfer(account, amount);
emit WinnerClaimed(roundId, slot, account, ticket, amount);
}
/// @notice Release an unpurchased round's ETH after approximately one day.
/// The released ETH becomes available to a later round and is never sent to an admin.
function cancelStaleRound(uint256 roundId) external nonReentrant {
Round storage round = rounds[roundId];
if (
round.state != RoundState.Committed && round.state != RoundState.Resolved
) {
revert InvalidRoundState();
}
if (!isCancellationDue(roundId)) {
revert CancellationNotDue();
}
round.state = RoundState.Cancelled;
reservedEth -= round.ethBudget;
emit RoundCancelled(roundId, round.ethBudget);
}
function holderLeaf(
uint256 roundId,
address account,
uint256 cumulativeStart,
uint256 cumulativeEnd
) public view returns (bytes32) {
return keccak256(
abi.encode(
SNAPSHOT_LEAF_DOMAIN,
address(this),
block.chainid,
roundId,
freestockToken,
account,
cumulativeStart,
cumulativeEnd
)
);
}
function winnerTicket(uint256 roundId, uint32 slot) public view returns (uint256) {
Round storage round = rounds[roundId];
if (
round.state != RoundState.Resolved && round.state != RoundState.Purchased
) {
revert InvalidRoundState();
}
if (slot >= round.winnerSlots) revert WinnerSlotOutOfRange();
return uint256(keccak256(abi.encode(WINNER_SLOT_DOMAIN, round.randomness, slot)))
% round.totalWeight;
}
function prizeForSlot(uint256 roundId, uint32 slot) external view returns (uint256) {
Round storage round = rounds[roundId];
if (round.state != RoundState.Purchased) revert InvalidRoundState();
if (slot >= round.winnerSlots) revert WinnerSlotOutOfRange();
return round.basePrize + (slot < round.bonusPrizeSlots ? 1 : 0);
}
function isClaimed(uint256 roundId, uint32 slot) public view returns (bool) {
uint256 word = uint256(slot) >> 8;
uint256 mask = 1 << (uint256(slot) & 255);
return claimedSlots[roundId][word] & mask != 0;
}
function currentBoundaryIndex() public view returns (uint256) {
return
(block.number - uint256(genesisEthereumBlock))
/ ROUND_ETHEREUM_BLOCKS;
}
function currentEthereumBlock() external view returns (uint256) {
return block.number;
}
function pendingLivoFees() public view returns (uint256) {
address token = freestockToken;
if (token == address(0)) return 0;
address[] memory livoTokens = new address[](1);
livoTokens[0] = token;
uint256[] memory amounts =
LIVO_FEE_HANDLER.getClaimable(livoTokens, address(this));
return amounts.length == 0 ? 0 : amounts[0];
}
function isCancellationDue(uint256 roundId) public view returns (bool) {
Round storage round = rounds[roundId];
if (
round.state != RoundState.Committed
&& round.state != RoundState.Resolved
) {
return false;
}
return
block.number
>= uint256(round.committedEthereumBlock)
+ CANCELLATION_DELAY_ETHEREUM_BLOCKS;
}
/// @notice The L2 height used for Transfer-log snapshots.
/// @dev Robinhood Chain exposes Ethereum's estimated L1 height through
/// `block.number`; ArbSys returns the actual L2 height. Local EVMs fall back.
function currentL2Block() public view returns (uint256) {
(bool success, bytes memory data) = ARBSYS.staticcall(
abi.encodeWithSelector(IArbSys.arbBlockNumber.selector)
);
if (success && data.length >= 32) return abi.decode(data, (uint256));
return block.number;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "oracle",
"type": "address",
"internalType": "address"
},
{
"name": "livoFeeHandler",
"type": "address",
"internalType": "address"
},
{
"name": "initialAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "initialSnapshotVerifier",
"type": "address",
"internalType": "address"
},
{
"name": "initialAdapter",
"type": "address",
"internalType": "address"
},
{
"name": "initialPurchaseGuard",
"type": "address",
"internalType": "address"
},
{
"name": "initialEligibilityVerifier",
"type": "address",
"internalType": "address"
},
{
"name": "initialStockBasket",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AccessControlBadConfirmation",
"type": "error",
"inputs": []
},
{
"name": "AccessControlUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "neededRole",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "AdapterOutputMismatch",
"type": "error",
"inputs": [
{
"name": "reported",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "received",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "BeaconNotDue",
"type": "error",
"inputs": []
},
{
"name": "BoundaryMismatch",
"type": "error",
"inputs": [
{
"name": "actual",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "expected",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "CancellationNotDue",
"type": "error",
"inputs": []
},
{
"name": "ClaimAlreadyProcessed",
"type": "error",
"inputs": []
},
{
"name": "DeadlineExpired",
"type": "error",
"inputs": []
},
{
"name": "DuplicateStockToken",
"type": "error",
"inputs": []
},
{
"name": "EmptyStockBasket",
"type": "error",
"inputs": []
},
{
"name": "FreestockTokenAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "FreestockTokenNotSet",
"type": "error",
"inputs": []
},
{
"name": "FutureSnapshot",
"type": "error",
"inputs": []
},
{
"name": "HolderProofInvalid",
"type": "error",
"inputs": []
},
{
"name": "InvalidBudgetRange",
"type": "error",
"inputs": []
},
{
"name": "InvalidHolderInterval",
"type": "error",
"inputs": []
},
{
"name": "InvalidRoundState",
"type": "error",
"inputs": []
},
{
"name": "NoRoundFunds",
"type": "error",
"inputs": []
},
{
"name": "NotEligible",
"type": "error",
"inputs": []
},
{
"name": "NotWinningInterval",
"type": "error",
"inputs": []
},
{
"name": "PrizeTooSmall",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RoundNotDue",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "StaleSnapshot",
"type": "error",
"inputs": []
},
{
"name": "Uint64Overflow",
"type": "error",
"inputs": []
},
{
"name": "WinnerSlotOutOfRange",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroManifestHash",
"type": "error",
"inputs": []
},
{
"name": "ZeroRoot",
"type": "error",
"inputs": []
},
{
"name": "ZeroWeight",
"type": "error",
"inputs": []
},
{
"name": "CurrentAdapterSet",
"type": "event",
"inputs": [
{
"name": "adapter",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CurrentEligibilityVerifierSet",
"type": "event",
"inputs": [
{
"name": "verifier",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CurrentPurchaseGuardSet",
"type": "event",
"inputs": [
{
"name": "guard",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CurrentSnapshotVerifierSet",
"type": "event",
"inputs": [
{
"name": "verifier",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FreestockTokenSet",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LivoFeesClaimed",
"type": "event",
"inputs": [
{
"name": "caller",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "NativeTaxReceived",
"type": "event",
"inputs": [
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RoleAdminChanged",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "previousAdminRole",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "newAdminRole",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "RoleGranted",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoleRevoked",
"type": "event",
"inputs": [
{
"name": "role",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoundCancelled",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "releasedEth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RoundCommitted",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "closeEthereumBlock",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "executor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "snapshotL2Block",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "targetDrandRound",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "winnerSlots",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
},
{
"name": "holderRoot",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "snapshotManifestHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "totalWeight",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethBudget",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "minimumEthBudget",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "maximumEthBudget",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "stockBasketHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "snapshotVerifier",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "adapter",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "eligibilityVerifier",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "purchaseGuard",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RoundResolved",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "targetDrandRound",
"type": "uint64",
"indexed": true,
"internalType": "uint64"
},
{
"name": "stockToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "beaconRandomness",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "roundRandomness",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "StockTokenAllowed",
"type": "event",
"inputs": [
{
"name": "stockToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "StockTokensPurchased",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "stockToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "executor",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "purchaseGuard",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "nativeInput",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "minStockOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "stockReceived",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "basePrize",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "bonusPrizeSlots",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "WinnerClaimed",
"type": "event",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "slot",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ticket",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "stockAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CANCELLATION_DELAY_ETHEREUM_BLOCKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "DEFAULT_ADMIN_ROLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "DRAND_COMMITMENT_DELAY_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "INITIAL_WINNER_SLOTS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "LIVO_FEE_HANDLER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ILivoMasterFeeHandler"
}
],
"stateMutability": "view"
},
{
"name": "ORACLE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract DrandEvmnetOracle"
}
],
"stateMutability": "view"
},
{
"name": "ROUND_DOMAIN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "ROUND_ETHEREUM_BLOCKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "SNAPSHOT_LEAF_DOMAIN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "STOCK_BASKET_HASH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "STOCK_SELECTION_DOMAIN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "WINNER_GROWTH_ETHEREUM_BLOCKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "WINNER_SLOT_DOMAIN",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "cancelStaleRound",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "slot",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "cumulativeStart",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "cumulativeEnd",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "proof",
"type": "bytes32[]",
"internalType": "bytes32[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimLivoFees",
"type": "function",
"inputs": [
{
"name": "tokens",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "commitRound",
"type": "function",
"inputs": [
{
"name": "expectedBoundaryIndex",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "holderRoot",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalWeight",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "snapshotL2Block",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "snapshotManifestHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "minimumEthBudget",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maximumEthBudget",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "snapshotApproval",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "currentAdapter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IStockPurchaseAdapter"
}
],
"stateMutability": "view"
},
{
"name": "currentBoundaryIndex",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentEligibilityVerifier",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IEligibilityVerifier"
}
],
"stateMutability": "view"
},
{
"name": "currentEthereumBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentL2Block",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentPurchaseGuard",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPurchaseGuard"
}
],
"stateMutability": "view"
},
{
"name": "currentSnapshotVerifier",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISnapshotVerifier"
}
],
"stateMutability": "view"
},
{
"name": "freestockToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "genesisEthereumBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "getRoleAdmin",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "grantRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "hasRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "holderLeaf",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "cumulativeStart",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "cumulativeEnd",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "isCancellationDue",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isClaimed",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "slot",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isStockTokenAllowed",
"type": "function",
"inputs": [
{
"name": "stockToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "allowed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "lastBoundaryIndex",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "lastSnapshotL2Block",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "nextRoundId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingLivoFees",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "prizeForSlot",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "slot",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "purchaseStock",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minStockOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "purchaseApproval",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "callerConfirmation",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "reservedEth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "resolveRound",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "signature",
"type": "uint256[2]",
"internalType": "uint256[2]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revokeRole",
"type": "function",
"inputs": [
{
"name": "role",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rounds",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "state",
"type": "uint8",
"internalType": "enum FreestockRoundDistributor.RoundState"
},
{
"name": "closeEthereumBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "committedEthereumBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "snapshotL2Block",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "targetDrandRound",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "winnerSlots",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "bonusPrizeSlots",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "holderRoot",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "randomness",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalWeight",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "ethBudget",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "stockPurchased",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "basePrize",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "stockToken",
"type": "address",
"internalType": "address"
},
{
"name": "adapter",
"type": "address",
"internalType": "contract IStockPurchaseAdapter"
},
{
"name": "eligibilityVerifier",
"type": "address",
"internalType": "contract IEligibilityVerifier"
},
{
"name": "purchaseGuard",
"type": "address",
"internalType": "contract IPurchaseGuard"
}
],
"stateMutability": "view"
},
{
"name": "setCurrentAdapter",
"type": "function",
"inputs": [
{
"name": "adapter",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCurrentEligibilityVerifier",
"type": "function",
"inputs": [
{
"name": "verifier",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCurrentPurchaseGuard",
"type": "function",
"inputs": [
{
"name": "guard",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCurrentSnapshotVerifier",
"type": "function",
"inputs": [
{
"name": "verifier",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFreestockToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "snapshotManifestHashByRound",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "manifestHash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "snapshotVerifierByRound",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "verifier",
"type": "address",
"internalType": "contract ISnapshotVerifier"
}
],
"stateMutability": "view"
},
{
"name": "stockBasketAt",
"type": "function",
"inputs": [
{
"name": "index",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "stockBasketLength",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "supportsInterface",
"type": "function",
"inputs": [
{
"name": "interfaceId",
"type": "bytes4",
"internalType": "bytes4"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "winnerTicket",
"type": "function",
"inputs": [
{
"name": "roundId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "slot",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x61010080604052346104c65761339d803803809161001d82856104ca565b83398101610100828203126104c657610035826104ed565b91610042602082016104ed565b61004e604083016104ed565b9261005b606084016104ed565b610067608085016104ed565b9161007460a086016104ed565b9361008160c087016104ed565b60e087015190966001600160401b0382116104c657019782601f8a0112156104c6578851926001600160401b0384116103a0578360051b99604051946100ca60208d01876104ca565b855260208501906020829c8201019283116104c657602001905b8282106104ae57505060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055506001600160a01b038116908115801561049d575b801561048c575b801561047b575b801561046a575b8015610459575b8015610448575b6103e5573b15801561043f575b8015610436575b801561042d575b8015610424575b801561041b575b6103e5576001600160401b03431161040c576080526001600160a01b031660a052805180156103fd575f5b8181106102dd5750506040516020810191604082019060208452518091526060820198905f5b8181106102be575050506101e38161024b9903601f1981018352826104ca565b51902060c052436001600160401b031660e052600380546001600160a01b03199081166001600160a01b039384161790915560048054821693831693909317909255600680548316938216939093179092556005805490911692909116919091179055610515565b50604051612dde908161059f8239608051818181610eb60152818161171201526122c7015260a051818181611557015281816128970152612cd2015260c051818181610f78015281816112db0152818161184d0152612515015260e051818181610e530152818161169f0152612ade0152f35b82516001600160a01b03168b5260209a8b019a909201916001016101c3565b6001600160a01b036102ef8285610501565b511690811580156103f4575b6103e5575f5b8181106103b4575060015491680100000000000000008310156103a057600183018060015583101561038c57600192835f5260205f200181848060a01b0319825416179055805f52600a60205260405f208360ff198254161790557fb0018dfe5cd3b37a29c728aef2241f21b5306c5813225b3427dc7cdbeae77edf6020604051858152a20161019d565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b826001600160a01b036103c78388610501565b5116146103d657600101610301565b63fd9443bd60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b50813b156102fb565b6344ea353f60e11b5f5260045ffd5b63d0687b8760e01b5f5260045ffd5b50863b15610172565b50853b1561016b565b50843b15610164565b50833b1561015d565b50813b15610156565b506001600160a01b03881615610149565b506001600160a01b03871615610142565b506001600160a01b0386161561013b565b506001600160a01b03851615610134565b506001600160a01b0389161561012d565b506001600160a01b03831615610126565b602080916104bb846104ed565b8152019101906100e4565b5f80fd5b601f909101601f19168101906001600160401b038211908210176103a057604052565b51906001600160a01b03821682036104c657565b805182101561038c5760209160051b010190565b6001600160a01b0381165f9081525f51602061337d5f395f51905f52602052604090205460ff16610599576001600160a01b03165f8181525f51602061337d5f395f51905f5260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f9056fe6080806040526004361015610048575b50361561001a575f80fd5b6040513481527f42b9e91ef066d6410c2579e01e8f0282fb9c089ffba5bdc2ddccec6ce36cedda60203392a2005b5f905f3560e01c908163016d3bd0146125005750806301ffc9a7146124aa578063026181761461248d578063175a92091461246757806318982c7e1461242d578063243c1bf914612412578063248a9ca3146123e857806329fc6388146123c05780632f2ff15d1461238357806331b4163a1461236657806336568abe1461232057806337f44f12146122f657806338013f02146122b257806338512ddc1461228a5780634002eda61461226d5780634155338414612245578063477c11651461219457806348eee0db1461216c57806355bc967a146120a05780635d2200df1461207a5780635ef06fa514611c1c57806365482ba814611c0157806365e5b4cb14611bd25780636728644c14611ba95780636b1882d514611b6e5780636d333658146116c35780636f72de701461167f57806373f7699f146116445780637a87f0f5146116055780637f7a898c146115865780638271d3251461154157806384ce592e1461152657806388b341da14610cde57806388b7e88314610c335780638c65c81f14610af257806391d1485414610aa957806392a984e514610a2a578063943e320c14610a0d578063964d5e72146109d25780639e02135d146109a8578063a217fddf1461072a578063a3b523811461097f578063b3198e97146108be578063b5dc7c7814610886578063bae64e7b14610807578063c1c11499146107ec578063cf026d7f146107d0578063d547741f14610789578063e1cc0a6b14610762578063e4fc1a2914610746578063e545c51f1461072a578063f027f96414610707578063f47e8b3e14610370578063f695b5951461033d5763f802f5b90361000f573461033a57602036600319011261033a576102c6612561565b6102ce612b08565b6001600160a01b038116908115908115610330575b5061032157600680546001600160a01b031916821790557fbe77fbf63dd8cec5db4fcee2f6c5b221c744859f3e7771931b136a8d6a9e7fde8280a280f35b63d92e233d60e01b8252600482fd5b90503b155f6102e3565b80fd5b503461033a57602036600319011261033a576020906004358152600d8252604060018060a01b0391205416604051908152f35b503461033a5760c036600319011261033a5760043561038d612538565b906044356001600160a01b03811680820361070357606435936084359360a4356001600160401b0381116106ff576103c9903690600401612577565b9690946103d4612c97565b828952600b602052604089209060ff82541660068110156106eb576004036106dc57600182019163ffffffff835460401c169563ffffffff8116968710156106cd5761042081876125d4565b6106be57871580156106b4575b80156106a7575b61069857600a820154600883018054604051631e7f734360e31b8152600481018c90526001600160a01b0391821660248201529195928f929160209183916044918391165afa91821561068c579161065d575b501561064e579961049b81878e9d8a612983565b8d600285015491819d8e5b10156104e557816040918f8f906001955060051b0135908181105f146104d9578252602052205b9c019b8e908e8e6104a6565b908252602052206104cd565b909b500361063f576104f782886126f2565b958610908115610634575b506106255763ffffffff91600791878b52600e60205260408b2062ffffff8260081c168c52602052600160ff60408d2092161b81541790550154925460601c1685106105ff575b5460405163a9059cbb60e01b88526004879052602483905292906001600160a01b031660208860448180855af160018951148116156105e0575b84604052156105ce5750825260208201527ffe485ce691c10f74147970932c1533e999bf051a3abd70cbec060c447a4a75db90604090a460015f516020612d895f395f51905f525580f35b635274afe760e01b8852600452602487fd5b60018115166105f657813b15153d151616610583565b843d8a823e3d90fd5b905f1981146106115760010190610549565b634e487b7160e01b87526011600452602487fd5b63f0e6fbcf60e01b8952600489fd5b90508510158a610502565b630f4e142f60e21b8a5260048afd5b637c75aa6f60e11b8d5260048dfd5b61067f915060203d602011610685575b610677818361267b565b810190612a03565b5f610487565b503d61066d565b604051903d90823e3d90fd5b637af118cd60e11b8c5260048cfd5b5060048201548a11610434565b508985101561042d565b634b34e6d960e01b8c5260048cfd5b6318717c0b60e11b8c5260048cfd5b6329ca8bd160e01b8a5260048afd5b634e487b7160e01b8b52602160045260248bfd5b8780fd5b8480fd5b503461033a578060031936011261033a576020610722612acf565b604051908152f35b503461033a578060031936011261033a57602090604051908152f35b503461033a578060031936011261033a57602060405160968152f35b503461033a578060031936011261033a5760206001600160401b0360075416604051908152f35b503461033a57604036600319011261033a576107cc6004356107a961254b565b906107c76107c2825f525f602052600160405f20015490565b612b57565b612c17565b5080f35b503461033a578060031936011261033a576020604051600f8152f35b503461033a578060031936011261033a576020604051438152f35b503461033a57602036600319011261033a57610821612561565b610829612b08565b6001600160a01b03811690811590811561087c575b5061032157600480546001600160a01b031916821790557f4edc773ec962a1e319c5b80ecbfbb14d7391dc7e23b808be0b1a42f689d39aec8280a280f35b90503b155f61083e565b503461033a57602036600319011261033a5760206108a5600435612a1b565b905460405160039290921b1c6001600160a01b03168152f35b503461033a57604036600319011261033a576108d8612538565b906004358152600b6020526040812060ff815416600681101561096b5760040361095c5763ffffffff600182015493169063ffffffff8460401c1682101561094d57916020939163ffffffff60076107229501549360601c16115f14610945575060ff60015b1690612600565b60ff9061093e565b6318717c0b60e11b8352600483fd5b6329ca8bd160e01b8252600482fd5b634e487b7160e01b83526021600452602483fd5b503461033a578060031936011261033a576004546040516001600160a01b039091168152602090f35b503461033a578060031936011261033a5760206001600160401b0360065460a01c16604051908152f35b503461033a578060031936011261033a5760206040517f8b9666fb9d4e928494ab8f5bd72f64e875c2158de5867508dc9e328b7eb06b588152f35b503461033a578060031936011261033a576020604051611c208152f35b503461033a57602036600319011261033a57610a44612561565b610a4c612b08565b6001600160a01b038116908115908115610a9f575b5061032157600580546001600160a01b031916821790557fbd98bb6d2184f8674fecb05f911fa5291e25c5c918ded731bfc9a178190f4f048280a280f35b90503b155f610a61565b503461033a57604036600319011261033a576040610ac561254b565b91600435815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461033a57602036600319011261033a576004358152600b602052604081209081549160ff831690600181015493600282015460038301546004840154600585015460068601549160078701549360018060a01b036008890154169560018060a01b0360098a0154169760018060a01b03600a8b01541699600b60018060a01b03910154169a6040519c6006821015610c1f57509c8c60606102209f63ffffffff946001600160401b03918452818160081c166020850152818160481c16604085015260881c169101528c60806001600160401b0383169101528c60a0838360401c1691015260601c1660c08c015260e08b01526101008a01526101208901526101408801526101608701526101808601526101a08501526101c08401526101e0830152610200820152f35b634e487b7160e01b81526021600452602490fd5b503461033a57602036600319011261033a57610c4d612561565b610c55612b08565b6002546001600160a01b038116610ccf576001600160a01b038216918215908115610cc5575b50610cb6576001600160a01b03191681176002557fa3b17e06f3c80269dfee379abc17b3bbdf0842781f3d82ad825b77f9dde034798280a280f35b63d92e233d60e01b8352600483fd5b90503b155f610c7b565b637083be8160e01b8352600483fd5b503461033a5761010036600319011261033a576004356001600160401b03811680910361152257606435916001600160401b038316830361033a5760e4356001600160401b03811161152257610d389036906004016125a7565b929093610d43612c97565b6002546001600160a01b031692831561151357610d87604094855190610d69878361267b565b60018252601f198701366020840137610d81826127d0565b52612ccf565b506024351561150457608435156114f557604435156114e65760a4351580156114d9575b6114ca57610db7612acf565b958615938480156114b2575b6114a3576001600160401b0388116114125780880361148c5750610de5612a33565b6001600160401b0384161161147d576001600160401b03600754166001600160401b038416111561146e57610e1d47600954906126c7565b93841561145f5760a43585108015611454575b611445576096880290888204609614171561143157610e78906001600160401b037f000000000000000000000000000000000000000000000000000000000000000016612600565b936001600160401b0385118015611421575b61141257601e4201908142116113fe578651635185fa8b60e01b815260048101929092526020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9182156113f45784926113ac575b506003546004546006546005546008549b6001600160a01b03928316989183169793831696949092169493929091853b156113a8578d8d610fc26001600160401b03948f94868f8997519889978897635e389f4160e01b89523060048a01526024890152166044870152602435606487015260443560848701521660a485015260843560c48501527f000000000000000000000000000000000000000000000000000000000000000060e485015260a43561010485015260c4356101248501526101606101448501526101648401916127b0565b0381885afa801561139e57908291611389575b505060018b018b116113755760018b016008558a8152600c60209081528a822060843590558b8252600d905289812080546001600160a01b0319166001600160a01b03861617905589516001600160401b036102208201908111908211176113615761022081018b52600181526001600160401b038a1660208201526001600160401b0343168b8201526001600160401b03891660608201526001600160401b0383166080820152600f60a08201528160c082015260243560e082015281610100820152604435610120820152836101408201528161016082015281610180820152816101a0820152856101c0820152866101e0820152876102008201528b8252600b6020528a8220918151906006821015610c1f575091600b60209e926111af8e6001600160401b03979660ff80198754169116178555602083015185548960481b8386015160481b169068ffffffffffffffff008b60881b606088015160881b169360081b1690610100600160c81b0319161717178555600185019088608085015116891983541617825560a08401519082549163ffffffff60401b911b169063ffffffff60401b191617815563ffffffff60c08401511681549063ffffffff60601b9060601b169063ffffffff60601b1916179055565b60e081015160028401556101008101516003840155610120810151600484015561014081015160058401556101608101516006808501919091556101808201516007808601919091556101a08301516008860180546001600160a01b03199081166001600160a01b03938416179091556101c0850151600980890180548416928516929092179091556101e0860151600a89018054841691851691909117905561020090950151959096018054909616941693909317909355825460a087811b19909116948716901b9390931790915580548419168a851617905554611296908490612600565b600955818a5198168852168a870152600f888701526024356060870152608435608087015260443560a087015260c086015260a43560e086015260c4356101008601527f00000000000000000000000000000000000000000000000000000000000000006101208601526101408501526101608401526101808301526101a0820152837f47d3bfd45606a996ca86f667dc73d108ffb0bf79bccd1b88dfae12a490bcfe426101c06001600160401b0333951693a460015f516020612d895f395f51905f525551908152f35b634e487b7160e01b82526041600452602482fd5b634e487b7160e01b81526011600452602490fd5b816113939161267b565b61033a57805f610fd5565b8b513d84823e3d90fd5b8280fd5b9091506020813d6020116113ec575b816113c86020938361267b565b810103126113e857516001600160401b03811681036113e857905f610eee565b8380fd5b3d91506113bb565b87513d86823e3d90fd5b634e487b7160e01b84526011600452602484fd5b63d0687b8760e01b8352600483fd5b506001600160401b034311610e8a565b634e487b7160e01b83526011600452602483fd5b63d53a37f560e01b8352600483fd5b5060c4358511610e30565b63aa2bebc360e01b8352600483fd5b6337225f0360e21b8252600482fd5b630f8cf9a960e41b8252600482fd5b630c9dbbf760e41b83526004889052602452604482fd5b630a8f87b560e11b8352600483fd5b506001600160401b0360065460a01c16881115610dc3565b63d53a37f560e01b8152600490fd5b5060a43560c43510610dab565b6319a2a9bd60e01b8152600490fd5b6317bdb7f360e21b8152600490fd5b63b263ae7360e01b8152600490fd5b6320c2758360e01b8152600490fd5b5080fd5b503461033a578060031936011261033a576020610722612a33565b503461033a578060031936011261033a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461033a57602036600319011261033a576115a0612561565b6115a8612b08565b6001600160a01b0381169081159081156115fb575b5061032157600380546001600160a01b031916821790557f9b37036474fc1dc642a0afaf0ba19fcccc9ba9d29e12042b09ba197c5c03ad688280a280f35b90503b155f6115bd565b503461033a57602036600319011261033a5760209060ff906040906001600160a01b03611630612561565b168152600a84522054166040519015158152f35b503461033a578060031936011261033a5760206040517f2739b1dd4a828bb291987abce221f56efb0fcd53a9f0954540395bea9506bf6a8152f35b503461033a578060031936011261033a5760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461033a57606036600319011261033a5760043536606411611522576116e8612c97565b808252600b6020526040822060ff8154166006811015611b5a57600103611b4b5760018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169160018201926001600160401b0384541660405163062af40560e01b8152816004820152602081602481865afa908115611b40578791611b0e575b504210611aff57859060405162fe3f4d60e31b8152816004820152602081602481875afa908115611af4578391611ad5575b5015611a4257505060206001600160401b038554166024604051809481936310fa319960e21b835260048301525afa908115611a37578591611a00575b5060407f293d482d421a53d7cb1157a86d635d9bb7cb642090718e5707dc01084005c493915b6001600160401b03611897611892845160208101907f8b9666fb9d4e928494ab8f5bd72f64e875c2158de5867508dc9e328b7eb06b58825230878201524660608201528860808201527f000000000000000000000000000000000000000000000000000000000000000060a08201528560c082015260c0815261188660e08261267b565b519020600154906126d4565b612a1b565b60018060a01b0391549060031b1c16968587546002890154828c52600c602052898c84898220549152600d6020528d8960018060a01b0391205416600483015460058401549160018060a01b036009860154169360018060a01b03600a8701541695600b60018060a01b0391015416968b8e519960208b019b7f1ae679fc5790eb6759861405764b3be7914a2852a601a3b3a3790470b118ab678d523060408d01524660608d015260808c0152818160081c1660a08c015260881c1660c08a015260e08901526101008801526101208701526101408601526101608501528c6101808501526101a08401526101c08301526101e08201528461020082015261020081526119a66102208261267b565b5190206008880180546001600160a01b0319166001600160a01b038b1617905560038801819055875460ff1916600217909755548351928352602083019690965290941693a460015f516020612d895f395f51905f525580f35b90506020813d602011611a2f575b81611a1b6020938361267b565b81010312611a2b575160406117dc565b5f80fd5b3d9150611a0e565b6040513d87823e3d90fd5b916064602092936040519485938492630e26101760e31b8452600484015260406024808501375af1908115611a37578591611aa2575b5060407f293d482d421a53d7cb1157a86d635d9bb7cb642090718e5707dc01084005c49391611802565b90506020813d602011611acd575b81611abd6020938361267b565b81010312611a2b57516040611a78565b3d9150611ab0565b611aee915060203d60201161068557610677818361267b565b5f61179f565b6040513d85823e3d90fd5b63b7db6b7160e01b8652600486fd5b90506020813d602011611b38575b81611b296020938361267b565b81010312611a2b57515f61176d565b3d9150611b1c565b6040513d89823e3d90fd5b6329ca8bd160e01b8352600483fd5b634e487b7160e01b84526021600452602484fd5b503461033a578060031936011261033a5760206040517f1ae679fc5790eb6759861405764b3be7914a2852a601a3b3a3790470b118ab678152f35b503461033a578060031936011261033a576006546040516001600160a01b039091168152602090f35b503461033a57608036600319011261033a576020610722611bf161254b565b6064359060443590600435612983565b503461033a578060031936011261033a57602061072261282d565b5034611a2b576080366003190112611a2b576044356024356004356064356001600160401b038111611a2b57611c569036906004016125a7565b93611c5f612c97565b825f52600b60205260405f209160ff8354166006811015612066576002036120575781421161204857600183019163ffffffff835460401c16861061203957600b8401805460088601805460098801805460058a018054909d969c9298929694959094936001600160a01b0392831693918316921690823b15611a2b57611d308d915f9660405198899788968796633cab8a3560e21b885230600489015260248801526044870152606486015260848501528a60a48501528b60c485015261010060e48501526101048401916127b0565b03915afa801561202e57612019575b50600360ff19875416178655611d5889546009546126c7565b60095580546040516370a0823160e01b81523060048201526001600160a01b0390911694602082602481895afa918215611f99578c92611fe4575b50548a5460405163403fe80960e01b81526004810197909752602487018590526044870186905260209187916064918391906001600160a01b03165af1948515611fd9578b95611fa4575b5081546040516370a0823160e01b81523060048201529190602090839060249082906001600160a01b03165afa8015611f99578c90611f65575b611e2292506126c7565b93848103611f4e57508184108015611f3b575b611f2c5783600687015563ffffffff855460401c16958615611f18579063ffffffff91611e8f83611e708a89049a600785019b8c55896126d4565b895463ffffffff60601b1916911660601b63ffffffff60601b16178855565b600460ff1982541617905560018060a01b039054169760018060a01b0390541698549554945460601c1694604051988952602089015260408801526060870152608086015260a085015260c08401527f9365cc71c1dc8c6e9789abd5400b4f33c303ae6979b79aaa493cc1a4aa2b036760e03394a460015f516020612d895f395f51905f525580f35b634e487b7160e01b8b52601260045260248bfd5b63fcd1fd0760e01b8a5260048afd5b5063ffffffff855460401c168410611e35565b63cbbeb21760e01b8b52600452602484905260448afd5b506020823d602011611f91575b81611f7f6020938361267b565b81010312611a2b57611e229151611e18565b3d9150611f72565b6040513d8e823e3d90fd5b9094506020813d602011611fd1575b81611fc06020938361267b565b81010312611a2b5751936024611dde565b3d9150611fb3565b6040513d8d823e3d90fd5b9091506020813d602011612011575b816120006020938361267b565b81010312611a2b5751906020611d93565b3d9150611ff3565b612026919a505f9061267b565b5f985f611d3f565b6040513d5f823e3d90fd5b63fcd1fd0760e01b5f5260045ffd5b631ab7da6b60e01b5f5260045ffd5b6329ca8bd160e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b34611a2b576040366003190112611a2b576020610722612098612538565b6004356126f2565b34611a2b576020366003190112611a2b576004356120bc612c97565b805f52600b60205260405f2060ff81541660068110156120665760018114159081612160575b50612057576120f082612621565b1561215157602060057f392fcf1e3627793dc153feb861f66451c925fa12c027044233166cd28f481d85928160ff198254161781550161213381546009546126c7565b60095554604051908152a260015f516020612d895f395f51905f5255005b634a71400560e01b5f5260045ffd5b600291501415836120e2565b34611a2b575f366003190112611a2b576002546040516001600160a01b039091168152602090f35b34611a2b576020366003190112611a2b576004356001600160401b038111611a2b576121c4903690600401612577565b6121cc612c97565b6121d5816126b0565b916121e3604051938461267b565b818352602083019160051b810190368211611a2b57915b81831061222557602061220c85612ccf565b60015f516020612d895f395f51905f5255604051908152f35b82356001600160a01b0381168103611a2b578152602092830192016121fa565b34611a2b575f366003190112611a2b576005546040516001600160a01b039091168152602090f35b34611a2b575f366003190112611a2b576020600854604051908152f35b34611a2b576020366003190112611a2b5760206122a8600435612621565b6040519015158152f35b34611a2b575f366003190112611a2b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34611a2b576020366003190112611a2b576004355f52600c602052602060405f2054604051908152f35b34611a2b576040366003190112611a2b5761233961254b565b336001600160a01b038216036123575761235590600435612c17565b005b63334bd91960e11b5f5260045ffd5b34611a2b575f366003190112611a2b576020600954604051908152f35b34611a2b576040366003190112611a2b576123556004356123a261254b565b906123bb6107c2825f525f602052600160405f20015490565b612b8f565b34611a2b575f366003190112611a2b576003546040516001600160a01b039091168152602090f35b34611a2b576020366003190112611a2b5760206107226004355f525f602052600160405f20015490565b34611a2b575f366003190112611a2b576020604051601e8152f35b34611a2b575f366003190112611a2b5760206040517f7832f21232b1af5a4e55252aa8344f1a270f8b6a8557f97d3934894b837f62258152f35b34611a2b576040366003190112611a2b5760206122a8612485612538565b6004356125d4565b34611a2b575f366003190112611a2b576020600154604051908152f35b34611a2b576020366003190112611a2b5760043563ffffffff60e01b8116809103611a2b57602090637965db0b60e01b81149081156124ef575b506040519015158152f35b6301ffc9a760e01b149050826124e4565b34611a2b575f366003190112611a2b576020907f00000000000000000000000000000000000000000000000000000000000000008152f35b6024359063ffffffff82168203611a2b57565b602435906001600160a01b0382168203611a2b57565b600435906001600160a01b0382168203611a2b57565b9181601f84011215611a2b578235916001600160401b038311611a2b576020808501948460051b010111611a2b57565b9181601f84011215611a2b578235916001600160401b038311611a2b5760208381860195010111611a2b57565b60019160ff915f52600e60205260405f2062ffffff8260081c165f52602052161b60405f205416151590565b9190820180921161260d57565b634e487b7160e01b5f52601160045260245ffd5b5f52600b60205260405f205460ff81166006811015612066576001811415908161266f575b5061266a576001600160401b039060481c16611c20810180911161260d5743101590565b505f90565b6002915014155f612646565b90601f801991011681019081106001600160401b0382111761269c57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161269c5760051b60200190565b9190820391821161260d57565b81156126de570690565b634e487b7160e01b5f52601260045260245ffd5b5f52600b60205260405f2060ff815416600681101561206657600281141590816127a4575b506120575763ffffffff80600183015460401c16921691821015612795576004612792926003830154906040519060208201927f7832f21232b1af5a4e55252aa8344f1a270f8b6a8557f97d3934894b837f62258452604083015260608201526060815261278660808261267b565b519020910154906126d4565b90565b6318717c0b60e11b5f5260045ffd5b6004915014155f612717565b908060209392818452848401375f828201840152601f01601f1916010190565b8051156127dd5760200190565b634e487b7160e01b5f52603260045260245ffd5b90602080835192838152019201905f5b81811061280e5750505090565b82516001600160a01b0316845260209384019390920191600101612801565b6002546001600160a01b0316801561266a5761288d905f604091825190612854848361267b565b60018252601f19840136602084013761286c826127d0565b5282518094819263eb2e619360e01b835285600484015260448301906127f1565b30602483015203817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215612979575f926128e9575b505080516128dc57505f90565b6128e5906127d0565b5190565b9091503d805f833e6128fb818361267b565b810190602081830312611a2b578051906001600160401b038211611a2b570181601f82011215611a2b5780519061293d612934836126b0565b9451948561267b565b81845260208085019260051b820101928311611a2b57602001905b828210612969575050505f806128cf565b8151815260209182019101612958565b50513d5f823e3d90fd5b92909160018060a01b0360025416926040519360208501957f2739b1dd4a828bb291987abce221f56efb0fcd53a9f0954540395bea9506bf6a8752306040870152466060870152608086015260a085015260018060a01b031660c084015260e083015261010082015261010081526129fd6101208261267b565b51902090565b90816020910312611a2b57518015158103611a2b5790565b6001548110156127dd5760015f5260205f2001905f90565b5f80604051602081019063a3b1b31d60e01b825260048152612a5660248261267b565b519060645afa3d15612ac7573d906001600160401b03821161269c5760405191612a8a601f8201601f19166020018461267b565b82523d5f602084013e5b80612abb575b612aa357504390565b60208151918180820193849201010312611a2b575190565b50602081511015612a9a565b606090612a94565b6096612b046001600160401b037f000000000000000000000000000000000000000000000000000000000000000016436126c7565b0490565b335f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1615612b4057565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181526020818152604080832033845290915290205460ff1615612b795750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f818152602081815260408083206001600160a01b038616845290915290205460ff16612c11575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615612c11575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60025f516020612d895f395f51905f525414612cc05760025f516020612d895f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b477f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15611a2b5760405163318d9e5d60e01b815260206004820152925f918491829084908290612d2e9060248301906127f1565b03925af191821561202e57612d4992612d78575b50476126c7565b906040518281527f0c7f96827822550aa7e53f49cbdd46b678cbe976d121d7e0ef14ab4ae424ce4b60203392a2565b5f612d829161267b565b5f612d4256fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c02b4422d8fa5224d00521153c1cd87492b9780618f35be1721fb09e63e82f2a64736f6c63430008210033ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb500000000000000000000000038fb0751662baa4475eb470c81513f01afd998f90000000000000000000000007766e3a6a8c98a76308cfb4040e330c3308f7c730000000000000000000000006f2adb786b61a23d1fb98035fb82489e2d87ce2a000000000000000000000000cafa1c8eb451bb52a4d6f908123bc6c4c35941b6000000000000000000000000078f4d1badcdba9bbc6c9517f69f3e13359f26ba00000000000000000000000007bcaf824b1b8deedd51e8c752769290f3b4fec1000000000000000000000000cef0672811857f2285f200b0aeb83d70a0b5c2cc0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000322f0929c4625ed5bad873c95208d54e1c003b2d000000000000000000000000d0601ce157db5bdc3162bbac2a2c8af5320d9eec000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9000000000000000000000000e93237c50d904957cf27e7b1133b510c669c2e7400000000000000000000000012f190a9f9d7d37a250758b26824b97ce941bf540000000000000000000000002e0847e8910a9732eb3fb1bb4b70a580adad4fe3000000000000000000000000c0d6457c16cc70d6790dd43521c899c87ce02f350000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea000000000000000000000000117cc2133c37b721f49de2a7a74833232b3b4c0c000000000000000000000000d5f3879160bc7c32ebb4dc785f8a4f505888de68
0x6080806040526004361015610048575b50361561001a575f80fd5b6040513481527f42b9e91ef066d6410c2579e01e8f0282fb9c089ffba5bdc2ddccec6ce36cedda60203392a2005b5f905f3560e01c908163016d3bd0146125005750806301ffc9a7146124aa578063026181761461248d578063175a92091461246757806318982c7e1461242d578063243c1bf914612412578063248a9ca3146123e857806329fc6388146123c05780632f2ff15d1461238357806331b4163a1461236657806336568abe1461232057806337f44f12146122f657806338013f02146122b257806338512ddc1461228a5780634002eda61461226d5780634155338414612245578063477c11651461219457806348eee0db1461216c57806355bc967a146120a05780635d2200df1461207a5780635ef06fa514611c1c57806365482ba814611c0157806365e5b4cb14611bd25780636728644c14611ba95780636b1882d514611b6e5780636d333658146116c35780636f72de701461167f57806373f7699f146116445780637a87f0f5146116055780637f7a898c146115865780638271d3251461154157806384ce592e1461152657806388b341da14610cde57806388b7e88314610c335780638c65c81f14610af257806391d1485414610aa957806392a984e514610a2a578063943e320c14610a0d578063964d5e72146109d25780639e02135d146109a8578063a217fddf1461072a578063a3b523811461097f578063b3198e97146108be578063b5dc7c7814610886578063bae64e7b14610807578063c1c11499146107ec578063cf026d7f146107d0578063d547741f14610789578063e1cc0a6b14610762578063e4fc1a2914610746578063e545c51f1461072a578063f027f96414610707578063f47e8b3e14610370578063f695b5951461033d5763f802f5b90361000f573461033a57602036600319011261033a576102c6612561565b6102ce612b08565b6001600160a01b038116908115908115610330575b5061032157600680546001600160a01b031916821790557fbe77fbf63dd8cec5db4fcee2f6c5b221c744859f3e7771931b136a8d6a9e7fde8280a280f35b63d92e233d60e01b8252600482fd5b90503b155f6102e3565b80fd5b503461033a57602036600319011261033a576020906004358152600d8252604060018060a01b0391205416604051908152f35b503461033a5760c036600319011261033a5760043561038d612538565b906044356001600160a01b03811680820361070357606435936084359360a4356001600160401b0381116106ff576103c9903690600401612577565b9690946103d4612c97565b828952600b602052604089209060ff82541660068110156106eb576004036106dc57600182019163ffffffff835460401c169563ffffffff8116968710156106cd5761042081876125d4565b6106be57871580156106b4575b80156106a7575b61069857600a820154600883018054604051631e7f734360e31b8152600481018c90526001600160a01b0391821660248201529195928f929160209183916044918391165afa91821561068c579161065d575b501561064e579961049b81878e9d8a612983565b8d600285015491819d8e5b10156104e557816040918f8f906001955060051b0135908181105f146104d9578252602052205b9c019b8e908e8e6104a6565b908252602052206104cd565b909b500361063f576104f782886126f2565b958610908115610634575b506106255763ffffffff91600791878b52600e60205260408b2062ffffff8260081c168c52602052600160ff60408d2092161b81541790550154925460601c1685106105ff575b5460405163a9059cbb60e01b88526004879052602483905292906001600160a01b031660208860448180855af160018951148116156105e0575b84604052156105ce5750825260208201527ffe485ce691c10f74147970932c1533e999bf051a3abd70cbec060c447a4a75db90604090a460015f516020612d895f395f51905f525580f35b635274afe760e01b8852600452602487fd5b60018115166105f657813b15153d151616610583565b843d8a823e3d90fd5b905f1981146106115760010190610549565b634e487b7160e01b87526011600452602487fd5b63f0e6fbcf60e01b8952600489fd5b90508510158a610502565b630f4e142f60e21b8a5260048afd5b637c75aa6f60e11b8d5260048dfd5b61067f915060203d602011610685575b610677818361267b565b810190612a03565b5f610487565b503d61066d565b604051903d90823e3d90fd5b637af118cd60e11b8c5260048cfd5b5060048201548a11610434565b508985101561042d565b634b34e6d960e01b8c5260048cfd5b6318717c0b60e11b8c5260048cfd5b6329ca8bd160e01b8a5260048afd5b634e487b7160e01b8b52602160045260248bfd5b8780fd5b8480fd5b503461033a578060031936011261033a576020610722612acf565b604051908152f35b503461033a578060031936011261033a57602090604051908152f35b503461033a578060031936011261033a57602060405160968152f35b503461033a578060031936011261033a5760206001600160401b0360075416604051908152f35b503461033a57604036600319011261033a576107cc6004356107a961254b565b906107c76107c2825f525f602052600160405f20015490565b612b57565b612c17565b5080f35b503461033a578060031936011261033a576020604051600f8152f35b503461033a578060031936011261033a576020604051438152f35b503461033a57602036600319011261033a57610821612561565b610829612b08565b6001600160a01b03811690811590811561087c575b5061032157600480546001600160a01b031916821790557f4edc773ec962a1e319c5b80ecbfbb14d7391dc7e23b808be0b1a42f689d39aec8280a280f35b90503b155f61083e565b503461033a57602036600319011261033a5760206108a5600435612a1b565b905460405160039290921b1c6001600160a01b03168152f35b503461033a57604036600319011261033a576108d8612538565b906004358152600b6020526040812060ff815416600681101561096b5760040361095c5763ffffffff600182015493169063ffffffff8460401c1682101561094d57916020939163ffffffff60076107229501549360601c16115f14610945575060ff60015b1690612600565b60ff9061093e565b6318717c0b60e11b8352600483fd5b6329ca8bd160e01b8252600482fd5b634e487b7160e01b83526021600452602483fd5b503461033a578060031936011261033a576004546040516001600160a01b039091168152602090f35b503461033a578060031936011261033a5760206001600160401b0360065460a01c16604051908152f35b503461033a578060031936011261033a5760206040517f8b9666fb9d4e928494ab8f5bd72f64e875c2158de5867508dc9e328b7eb06b588152f35b503461033a578060031936011261033a576020604051611c208152f35b503461033a57602036600319011261033a57610a44612561565b610a4c612b08565b6001600160a01b038116908115908115610a9f575b5061032157600580546001600160a01b031916821790557fbd98bb6d2184f8674fecb05f911fa5291e25c5c918ded731bfc9a178190f4f048280a280f35b90503b155f610a61565b503461033a57604036600319011261033a576040610ac561254b565b91600435815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b503461033a57602036600319011261033a576004358152600b602052604081209081549160ff831690600181015493600282015460038301546004840154600585015460068601549160078701549360018060a01b036008890154169560018060a01b0360098a0154169760018060a01b03600a8b01541699600b60018060a01b03910154169a6040519c6006821015610c1f57509c8c60606102209f63ffffffff946001600160401b03918452818160081c166020850152818160481c16604085015260881c169101528c60806001600160401b0383169101528c60a0838360401c1691015260601c1660c08c015260e08b01526101008a01526101208901526101408801526101608701526101808601526101a08501526101c08401526101e0830152610200820152f35b634e487b7160e01b81526021600452602490fd5b503461033a57602036600319011261033a57610c4d612561565b610c55612b08565b6002546001600160a01b038116610ccf576001600160a01b038216918215908115610cc5575b50610cb6576001600160a01b03191681176002557fa3b17e06f3c80269dfee379abc17b3bbdf0842781f3d82ad825b77f9dde034798280a280f35b63d92e233d60e01b8352600483fd5b90503b155f610c7b565b637083be8160e01b8352600483fd5b503461033a5761010036600319011261033a576004356001600160401b03811680910361152257606435916001600160401b038316830361033a5760e4356001600160401b03811161152257610d389036906004016125a7565b929093610d43612c97565b6002546001600160a01b031692831561151357610d87604094855190610d69878361267b565b60018252601f198701366020840137610d81826127d0565b52612ccf565b506024351561150457608435156114f557604435156114e65760a4351580156114d9575b6114ca57610db7612acf565b958615938480156114b2575b6114a3576001600160401b0388116114125780880361148c5750610de5612a33565b6001600160401b0384161161147d576001600160401b03600754166001600160401b038416111561146e57610e1d47600954906126c7565b93841561145f5760a43585108015611454575b611445576096880290888204609614171561143157610e78906001600160401b037f000000000000000000000000000000000000000000000000000000000187233416612600565b936001600160401b0385118015611421575b61141257601e4201908142116113fe578651635185fa8b60e01b815260048101929092526020826024817f00000000000000000000000038fb0751662baa4475eb470c81513f01afd998f96001600160a01b03165afa9182156113f45784926113ac575b506003546004546006546005546008549b6001600160a01b03928316989183169793831696949092169493929091853b156113a8578d8d610fc26001600160401b03948f94868f8997519889978897635e389f4160e01b89523060048a01526024890152166044870152602435606487015260443560848701521660a485015260843560c48501527fb5ae23317a288374a6498406acba4dfa0eaa33679ed234acd145f199742e9ae160e485015260a43561010485015260c4356101248501526101606101448501526101648401916127b0565b0381885afa801561139e57908291611389575b505060018b018b116113755760018b016008558a8152600c60209081528a822060843590558b8252600d905289812080546001600160a01b0319166001600160a01b03861617905589516001600160401b036102208201908111908211176113615761022081018b52600181526001600160401b038a1660208201526001600160401b0343168b8201526001600160401b03891660608201526001600160401b0383166080820152600f60a08201528160c082015260243560e082015281610100820152604435610120820152836101408201528161016082015281610180820152816101a0820152856101c0820152866101e0820152876102008201528b8252600b6020528a8220918151906006821015610c1f575091600b60209e926111af8e6001600160401b03979660ff80198754169116178555602083015185548960481b8386015160481b169068ffffffffffffffff008b60881b606088015160881b169360081b1690610100600160c81b0319161717178555600185019088608085015116891983541617825560a08401519082549163ffffffff60401b911b169063ffffffff60401b191617815563ffffffff60c08401511681549063ffffffff60601b9060601b169063ffffffff60601b1916179055565b60e081015160028401556101008101516003840155610120810151600484015561014081015160058401556101608101516006808501919091556101808201516007808601919091556101a08301516008860180546001600160a01b03199081166001600160a01b03938416179091556101c0850151600980890180548416928516929092179091556101e0860151600a89018054841691851691909117905561020090950151959096018054909616941693909317909355825460a087811b19909116948716901b9390931790915580548419168a851617905554611296908490612600565b600955818a5198168852168a870152600f888701526024356060870152608435608087015260443560a087015260c086015260a43560e086015260c4356101008601527fb5ae23317a288374a6498406acba4dfa0eaa33679ed234acd145f199742e9ae16101208601526101408501526101608401526101808301526101a0820152837f47d3bfd45606a996ca86f667dc73d108ffb0bf79bccd1b88dfae12a490bcfe426101c06001600160401b0333951693a460015f516020612d895f395f51905f525551908152f35b634e487b7160e01b82526041600452602482fd5b634e487b7160e01b81526011600452602490fd5b816113939161267b565b61033a57805f610fd5565b8b513d84823e3d90fd5b8280fd5b9091506020813d6020116113ec575b816113c86020938361267b565b810103126113e857516001600160401b03811681036113e857905f610eee565b8380fd5b3d91506113bb565b87513d86823e3d90fd5b634e487b7160e01b84526011600452602484fd5b63d0687b8760e01b8352600483fd5b506001600160401b034311610e8a565b634e487b7160e01b83526011600452602483fd5b63d53a37f560e01b8352600483fd5b5060c4358511610e30565b63aa2bebc360e01b8352600483fd5b6337225f0360e21b8252600482fd5b630f8cf9a960e41b8252600482fd5b630c9dbbf760e41b83526004889052602452604482fd5b630a8f87b560e11b8352600483fd5b506001600160401b0360065460a01c16881115610dc3565b63d53a37f560e01b8152600490fd5b5060a43560c43510610dab565b6319a2a9bd60e01b8152600490fd5b6317bdb7f360e21b8152600490fd5b63b263ae7360e01b8152600490fd5b6320c2758360e01b8152600490fd5b5080fd5b503461033a578060031936011261033a576020610722612a33565b503461033a578060031936011261033a576040517f0000000000000000000000007766e3a6a8c98a76308cfb4040e330c3308f7c736001600160a01b03168152602090f35b503461033a57602036600319011261033a576115a0612561565b6115a8612b08565b6001600160a01b0381169081159081156115fb575b5061032157600380546001600160a01b031916821790557f9b37036474fc1dc642a0afaf0ba19fcccc9ba9d29e12042b09ba197c5c03ad688280a280f35b90503b155f6115bd565b503461033a57602036600319011261033a5760209060ff906040906001600160a01b03611630612561565b168152600a84522054166040519015158152f35b503461033a578060031936011261033a5760206040517f2739b1dd4a828bb291987abce221f56efb0fcd53a9f0954540395bea9506bf6a8152f35b503461033a578060031936011261033a5760206040516001600160401b037f0000000000000000000000000000000000000000000000000000000001872334168152f35b503461033a57606036600319011261033a5760043536606411611522576116e8612c97565b808252600b6020526040822060ff8154166006811015611b5a57600103611b4b5760018060a01b037f00000000000000000000000038fb0751662baa4475eb470c81513f01afd998f9169160018201926001600160401b0384541660405163062af40560e01b8152816004820152602081602481865afa908115611b40578791611b0e575b504210611aff57859060405162fe3f4d60e31b8152816004820152602081602481875afa908115611af4578391611ad5575b5015611a4257505060206001600160401b038554166024604051809481936310fa319960e21b835260048301525afa908115611a37578591611a00575b5060407f293d482d421a53d7cb1157a86d635d9bb7cb642090718e5707dc01084005c493915b6001600160401b03611897611892845160208101907f8b9666fb9d4e928494ab8f5bd72f64e875c2158de5867508dc9e328b7eb06b58825230878201524660608201528860808201527fb5ae23317a288374a6498406acba4dfa0eaa33679ed234acd145f199742e9ae160a08201528560c082015260c0815261188660e08261267b565b519020600154906126d4565b612a1b565b60018060a01b0391549060031b1c16968587546002890154828c52600c602052898c84898220549152600d6020528d8960018060a01b0391205416600483015460058401549160018060a01b036009860154169360018060a01b03600a8701541695600b60018060a01b0391015416968b8e519960208b019b7f1ae679fc5790eb6759861405764b3be7914a2852a601a3b3a3790470b118ab678d523060408d01524660608d015260808c0152818160081c1660a08c015260881c1660c08a015260e08901526101008801526101208701526101408601526101608501528c6101808501526101a08401526101c08301526101e08201528461020082015261020081526119a66102208261267b565b5190206008880180546001600160a01b0319166001600160a01b038b1617905560038801819055875460ff1916600217909755548351928352602083019690965290941693a460015f516020612d895f395f51905f525580f35b90506020813d602011611a2f575b81611a1b6020938361267b565b81010312611a2b575160406117dc565b5f80fd5b3d9150611a0e565b6040513d87823e3d90fd5b916064602092936040519485938492630e26101760e31b8452600484015260406024808501375af1908115611a37578591611aa2575b5060407f293d482d421a53d7cb1157a86d635d9bb7cb642090718e5707dc01084005c49391611802565b90506020813d602011611acd575b81611abd6020938361267b565b81010312611a2b57516040611a78565b3d9150611ab0565b611aee915060203d60201161068557610677818361267b565b5f61179f565b6040513d85823e3d90fd5b63b7db6b7160e01b8652600486fd5b90506020813d602011611b38575b81611b296020938361267b565b81010312611a2b57515f61176d565b3d9150611b1c565b6040513d89823e3d90fd5b6329ca8bd160e01b8352600483fd5b634e487b7160e01b84526021600452602484fd5b503461033a578060031936011261033a5760206040517f1ae679fc5790eb6759861405764b3be7914a2852a601a3b3a3790470b118ab678152f35b503461033a578060031936011261033a576006546040516001600160a01b039091168152602090f35b503461033a57608036600319011261033a576020610722611bf161254b565b6064359060443590600435612983565b503461033a578060031936011261033a57602061072261282d565b5034611a2b576080366003190112611a2b576044356024356004356064356001600160401b038111611a2b57611c569036906004016125a7565b93611c5f612c97565b825f52600b60205260405f209160ff8354166006811015612066576002036120575781421161204857600183019163ffffffff835460401c16861061203957600b8401805460088601805460098801805460058a018054909d969c9298929694959094936001600160a01b0392831693918316921690823b15611a2b57611d308d915f9660405198899788968796633cab8a3560e21b885230600489015260248801526044870152606486015260848501528a60a48501528b60c485015261010060e48501526101048401916127b0565b03915afa801561202e57612019575b50600360ff19875416178655611d5889546009546126c7565b60095580546040516370a0823160e01b81523060048201526001600160a01b0390911694602082602481895afa918215611f99578c92611fe4575b50548a5460405163403fe80960e01b81526004810197909752602487018590526044870186905260209187916064918391906001600160a01b03165af1948515611fd9578b95611fa4575b5081546040516370a0823160e01b81523060048201529190602090839060249082906001600160a01b03165afa8015611f99578c90611f65575b611e2292506126c7565b93848103611f4e57508184108015611f3b575b611f2c5783600687015563ffffffff855460401c16958615611f18579063ffffffff91611e8f83611e708a89049a600785019b8c55896126d4565b895463ffffffff60601b1916911660601b63ffffffff60601b16178855565b600460ff1982541617905560018060a01b039054169760018060a01b0390541698549554945460601c1694604051988952602089015260408801526060870152608086015260a085015260c08401527f9365cc71c1dc8c6e9789abd5400b4f33c303ae6979b79aaa493cc1a4aa2b036760e03394a460015f516020612d895f395f51905f525580f35b634e487b7160e01b8b52601260045260248bfd5b63fcd1fd0760e01b8a5260048afd5b5063ffffffff855460401c168410611e35565b63cbbeb21760e01b8b52600452602484905260448afd5b506020823d602011611f91575b81611f7f6020938361267b565b81010312611a2b57611e229151611e18565b3d9150611f72565b6040513d8e823e3d90fd5b9094506020813d602011611fd1575b81611fc06020938361267b565b81010312611a2b5751936024611dde565b3d9150611fb3565b6040513d8d823e3d90fd5b9091506020813d602011612011575b816120006020938361267b565b81010312611a2b5751906020611d93565b3d9150611ff3565b612026919a505f9061267b565b5f985f611d3f565b6040513d5f823e3d90fd5b63fcd1fd0760e01b5f5260045ffd5b631ab7da6b60e01b5f5260045ffd5b6329ca8bd160e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b34611a2b576040366003190112611a2b576020610722612098612538565b6004356126f2565b34611a2b576020366003190112611a2b576004356120bc612c97565b805f52600b60205260405f2060ff81541660068110156120665760018114159081612160575b50612057576120f082612621565b1561215157602060057f392fcf1e3627793dc153feb861f66451c925fa12c027044233166cd28f481d85928160ff198254161781550161213381546009546126c7565b60095554604051908152a260015f516020612d895f395f51905f5255005b634a71400560e01b5f5260045ffd5b600291501415836120e2565b34611a2b575f366003190112611a2b576002546040516001600160a01b039091168152602090f35b34611a2b576020366003190112611a2b576004356001600160401b038111611a2b576121c4903690600401612577565b6121cc612c97565b6121d5816126b0565b916121e3604051938461267b565b818352602083019160051b810190368211611a2b57915b81831061222557602061220c85612ccf565b60015f516020612d895f395f51905f5255604051908152f35b82356001600160a01b0381168103611a2b578152602092830192016121fa565b34611a2b575f366003190112611a2b576005546040516001600160a01b039091168152602090f35b34611a2b575f366003190112611a2b576020600854604051908152f35b34611a2b576020366003190112611a2b5760206122a8600435612621565b6040519015158152f35b34611a2b575f366003190112611a2b576040517f00000000000000000000000038fb0751662baa4475eb470c81513f01afd998f96001600160a01b03168152602090f35b34611a2b576020366003190112611a2b576004355f52600c602052602060405f2054604051908152f35b34611a2b576040366003190112611a2b5761233961254b565b336001600160a01b038216036123575761235590600435612c17565b005b63334bd91960e11b5f5260045ffd5b34611a2b575f366003190112611a2b576020600954604051908152f35b34611a2b576040366003190112611a2b576123556004356123a261254b565b906123bb6107c2825f525f602052600160405f20015490565b612b8f565b34611a2b575f366003190112611a2b576003546040516001600160a01b039091168152602090f35b34611a2b576020366003190112611a2b5760206107226004355f525f602052600160405f20015490565b34611a2b575f366003190112611a2b576020604051601e8152f35b34611a2b575f366003190112611a2b5760206040517f7832f21232b1af5a4e55252aa8344f1a270f8b6a8557f97d3934894b837f62258152f35b34611a2b576040366003190112611a2b5760206122a8612485612538565b6004356125d4565b34611a2b575f366003190112611a2b576020600154604051908152f35b34611a2b576020366003190112611a2b5760043563ffffffff60e01b8116809103611a2b57602090637965db0b60e01b81149081156124ef575b506040519015158152f35b6301ffc9a760e01b149050826124e4565b34611a2b575f366003190112611a2b576020907fb5ae23317a288374a6498406acba4dfa0eaa33679ed234acd145f199742e9ae18152f35b6024359063ffffffff82168203611a2b57565b602435906001600160a01b0382168203611a2b57565b600435906001600160a01b0382168203611a2b57565b9181601f84011215611a2b578235916001600160401b038311611a2b576020808501948460051b010111611a2b57565b9181601f84011215611a2b578235916001600160401b038311611a2b5760208381860195010111611a2b57565b60019160ff915f52600e60205260405f2062ffffff8260081c165f52602052161b60405f205416151590565b9190820180921161260d57565b634e487b7160e01b5f52601160045260245ffd5b5f52600b60205260405f205460ff81166006811015612066576001811415908161266f575b5061266a576001600160401b039060481c16611c20810180911161260d5743101590565b505f90565b6002915014155f612646565b90601f801991011681019081106001600160401b0382111761269c57604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b03811161269c5760051b60200190565b9190820391821161260d57565b81156126de570690565b634e487b7160e01b5f52601260045260245ffd5b5f52600b60205260405f2060ff815416600681101561206657600281141590816127a4575b506120575763ffffffff80600183015460401c16921691821015612795576004612792926003830154906040519060208201927f7832f21232b1af5a4e55252aa8344f1a270f8b6a8557f97d3934894b837f62258452604083015260608201526060815261278660808261267b565b519020910154906126d4565b90565b6318717c0b60e11b5f5260045ffd5b6004915014155f612717565b908060209392818452848401375f828201840152601f01601f1916010190565b8051156127dd5760200190565b634e487b7160e01b5f52603260045260245ffd5b90602080835192838152019201905f5b81811061280e5750505090565b82516001600160a01b0316845260209384019390920191600101612801565b6002546001600160a01b0316801561266a5761288d905f604091825190612854848361267b565b60018252601f19840136602084013761286c826127d0565b5282518094819263eb2e619360e01b835285600484015260448301906127f1565b30602483015203817f0000000000000000000000007766e3a6a8c98a76308cfb4040e330c3308f7c736001600160a01b03165afa918215612979575f926128e9575b505080516128dc57505f90565b6128e5906127d0565b5190565b9091503d805f833e6128fb818361267b565b810190602081830312611a2b578051906001600160401b038211611a2b570181601f82011215611a2b5780519061293d612934836126b0565b9451948561267b565b81845260208085019260051b820101928311611a2b57602001905b828210612969575050505f806128cf565b8151815260209182019101612958565b50513d5f823e3d90fd5b92909160018060a01b0360025416926040519360208501957f2739b1dd4a828bb291987abce221f56efb0fcd53a9f0954540395bea9506bf6a8752306040870152466060870152608086015260a085015260018060a01b031660c084015260e083015261010082015261010081526129fd6101208261267b565b51902090565b90816020910312611a2b57518015158103611a2b5790565b6001548110156127dd5760015f5260205f2001905f90565b5f80604051602081019063a3b1b31d60e01b825260048152612a5660248261267b565b519060645afa3d15612ac7573d906001600160401b03821161269c5760405191612a8a601f8201601f19166020018461267b565b82523d5f602084013e5b80612abb575b612aa357504390565b60208151918180820193849201010312611a2b575190565b50602081511015612a9a565b606090612a94565b6096612b046001600160401b037f000000000000000000000000000000000000000000000000000000000187233416436126c7565b0490565b335f9081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1615612b4057565b63e2517d3f60e01b5f52336004525f60245260445ffd5b5f8181526020818152604080832033845290915290205460ff1615612b795750565b63e2517d3f60e01b5f523360045260245260445ffd5b5f818152602081815260408083206001600160a01b038616845290915290205460ff16612c11575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b50505f90565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615612c11575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60025f516020612d895f395f51905f525414612cc05760025f516020612d895f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b477f0000000000000000000000007766e3a6a8c98a76308cfb4040e330c3308f7c736001600160a01b0316803b15611a2b5760405163318d9e5d60e01b815260206004820152925f918491829084908290612d2e9060248301906127f1565b03925af191821561202e57612d4992612d78575b50476126c7565b906040518281527f0c7f96827822550aa7e53f49cbdd46b678cbe976d121d7e0ef14ab4ae424ce4b60203392a2565b5f612d829161267b565b5f612d4256fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c02b4422d8fa5224d00521153c1cd87492b9780618f35be1721fb09e63e82f2a64736f6c63430008210033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x302543…9bd69a | claim | 23,655,163 | 17 days agoThu, 30 Jul 2026 21:56:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000206 | |
| 0x53ee58…32308b | claim | 23,655,146 | 17 days agoThu, 30 Jul 2026 21:56:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0xd47823…135c7a | claim | 23,655,128 | 17 days agoThu, 30 Jul 2026 21:56:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000212 | |
| 0x7c49dc…8039f4 | claim | 23,654,566 | 17 days agoThu, 30 Jul 2026 21:55:15 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000211 | |
| 0x30e5a2…d64a10 | claim | 23,654,548 | 17 days agoThu, 30 Jul 2026 21:55:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0xd3257e…4c5f2c | claim | 23,654,530 | 17 days agoThu, 30 Jul 2026 21:55:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000212 | |
| 0x7475c3…930db0 | claim | 23,653,968 | 17 days agoThu, 30 Jul 2026 21:54:15 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000216 | |
| 0x045ed9…bc08ec | claim | 23,653,950 | 17 days agoThu, 30 Jul 2026 21:54:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000246 | |
| 0xe97436…8ebb18 | claim | 23,653,933 | 17 days agoThu, 30 Jul 2026 21:54:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0x524df2…6d2b85 | claim | 23,653,370 | 17 days agoThu, 30 Jul 2026 21:53:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000215 | |
| 0x00e3cc…917cf7 | claim | 23,653,352 | 17 days agoThu, 30 Jul 2026 21:53:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000211 | |
| 0x49a10a…23edae | claim | 23,653,335 | 17 days agoThu, 30 Jul 2026 21:53:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0xab37b4…d8c65e | claim | 23,652,808 | 17 days agoThu, 30 Jul 2026 21:52:18 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0x364ce0…e2401c | claim | 23,652,790 | 17 days agoThu, 30 Jul 2026 21:52:16 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000213 | |
| 0x42face…3a1c3f | claim | 23,652,773 | 17 days agoThu, 30 Jul 2026 21:52:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000286 | |
| 0xf1a944…570574 | purchaseStock | 23,652,128 | 17 days agoThu, 30 Jul 2026 21:51:10 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000662 | |
| 0x070d03…b74111 | resolveRound | 23,651,530 | 17 days agoThu, 30 Jul 2026 21:50:10 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000770 | |
| 0xe20497…d62b61 | commitRound | 23,651,015 | 17 days agoThu, 30 Jul 2026 21:49:18 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000704 | |
| 0xadd628…b0d071 | claim | 22,684,585 | 18 days agoWed, 29 Jul 2026 18:54:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000234 | |
| 0x34e508…de43c9 | claim | 22,684,567 | 18 days agoWed, 29 Jul 2026 18:54:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000241 | |
| 0xbbc291…809180 | claim | 22,684,550 | 18 days agoWed, 29 Jul 2026 18:54:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000278 | |
| 0xff8af3…b54003 | claim | 22,683,988 | 18 days agoWed, 29 Jul 2026 18:53:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000282 | |
| 0xb56d1b…a24931 | claim | 22,683,971 | 18 days agoWed, 29 Jul 2026 18:53:13 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000279 | |
| 0x157532…415516 | claim | 22,683,953 | 18 days agoWed, 29 Jul 2026 18:53:11 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000242 | |
| 0xabdcdc…b24aaa | claim | 22,683,392 | 18 days agoWed, 29 Jul 2026 18:52:14 UTC | 0x6f2a…ce2a | IN | FreestockRoundDistributor | $0.000 ETH | 0.00000282 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xcc504f…0d7373 | 7 days agoSun, 09 Aug 2026 16:58:25 UTC | 0x42b9e9…edda | [0] 0x000000000000…308f7c73 data: 0x000000000000000000…4c90365d |
| 0xddf70c…6be4a7 | 15 days agoSat, 01 Aug 2026 08:22:43 UTC | 0x42b9e9…edda | [0] 0x000000000000…308f7c73 data: 0x000000000000000000…c9eeffdd |
| 0x302543…9bd69a | 17 days agoThu, 30 Jul 2026 21:56:14 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…0000000e [2] 0x000000000000…0c76b790 data: 0x000000000000000000…15ad3230 |
| 0x53ee58…32308b | 17 days agoThu, 30 Jul 2026 21:56:13 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…0000000d [2] 0x000000000000…3950d9b5 data: 0x000000000000000000…15ad3230 |
| 0xd47823…135c7a | 17 days agoThu, 30 Jul 2026 21:56:11 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…0000000c [2] 0x000000000000…46e5c9fc data: 0x000000000000000000…15ad3230 |
| 0x7c49dc…8039f4 | 17 days agoThu, 30 Jul 2026 21:55:15 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…0000000b [2] 0x000000000000…0c76b790 data: 0x000000000000000000…15ad3230 |
| 0x30e5a2…d64a10 | 17 days agoThu, 30 Jul 2026 21:55:13 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…0000000a [2] 0x000000000000…b4b00627 data: 0x000000000000000000…15ad3230 |
| 0xd3257e…4c5f2c | 17 days agoThu, 30 Jul 2026 21:55:11 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000009 [2] 0x000000000000…46e5c9fc data: 0x000000000000000000…15ad3230 |
| 0x7475c3…930db0 | 17 days agoThu, 30 Jul 2026 21:54:15 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000008 [2] 0x000000000000…f5c6caba data: 0x000000000000000000…15ad3230 |
| 0x045ed9…bc08ec | 17 days agoThu, 30 Jul 2026 21:54:13 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000007 [2] 0x000000000000…3950d9b5 data: 0x000000000000000000…15ad3231 |
| 0xe97436…8ebb18 | 17 days agoThu, 30 Jul 2026 21:54:11 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000006 [2] 0x000000000000…46e5c9fc data: 0x000000000000000000…15ad3231 |
| 0x524df2…6d2b85 | 17 days agoThu, 30 Jul 2026 21:53:14 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000005 [2] 0x000000000000…0c76b790 data: 0x000000000000000000…15ad3231 |
| 0x00e3cc…917cf7 | 17 days agoThu, 30 Jul 2026 21:53:13 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000004 [2] 0x000000000000…297a3146 data: 0x000000000000000000…15ad3231 |
| 0x49a10a…23edae | 17 days agoThu, 30 Jul 2026 21:53:11 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000003 [2] 0x000000000000…f5c6caba data: 0x000000000000000000…15ad3231 |
| 0xab37b4…d8c65e | 17 days agoThu, 30 Jul 2026 21:52:18 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000002 [2] 0x000000000000…297a3146 data: 0x000000000000000000…15ad3231 |
| 0x364ce0…e2401c | 17 days agoThu, 30 Jul 2026 21:52:16 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000001 [2] 0x000000000000…0c76b790 data: 0x000000000000000000…15ad3231 |
| 0x42face…3a1c3f | 17 days agoThu, 30 Jul 2026 21:52:14 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000f [1] 0x000000000000…00000000 [2] 0x000000000000…b4b00627 data: 0x000000000000000000…15ad3231 |
| 0xf1a944…570574 | 17 days agoThu, 30 Jul 2026 21:51:10 UTC | 0x9365cc…0367 | [0] 0x000000000000…0000000f [1] 0x000000000000…2b3b4c0c [2] 0x000000000000…2d87ce2a data: 0x000000000000000000…00000008 |
| 0x070d03…b74111 | 17 days agoThu, 30 Jul 2026 21:50:10 UTC | 0x293d48…c493 | [0] 0x000000000000…0000000f [1] 0x000000000000…0126a1ef [2] 0x000000000000…2b3b4c0c data: 0xf9179afb56f74904b6…1038285d |
| 0xe20497…d62b61 | 17 days agoThu, 30 Jul 2026 21:49:18 UTC | 0x47d3bf…fe42 | [0] 0x000000000000…0000000f [1] 0x000000000000…01875d36 [2] 0x000000000000…2d87ce2a data: 0x000000000000000000…f3b4fec1 |
| 0xe20497…d62b61 | 17 days agoThu, 30 Jul 2026 21:49:18 UTC | 0x0c7f96…ce4b | [0] 0x000000000000…2d87ce2a data: 0x000000000000000000…00000000 |
| 0x29424c…aad235 | 17 days agoThu, 30 Jul 2026 21:48:26 UTC | 0x42b9e9…edda | [0] 0x000000000000…308f7c73 data: 0x000000000000000000…033cb986 |
| 0x96443a…7bd625 | 17 days agoThu, 30 Jul 2026 21:48:26 UTC | 0x42b9e9…edda | [0] 0x000000000000…308f7c73 data: 0x000000000000000000…2f6099ee |
| 0xadd628…b0d071 | 18 days agoWed, 29 Jul 2026 18:54:14 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000e [1] 0x000000000000…0000000e [2] 0x000000000000…a6c11d38 data: 0x000000000000000000…e0eed39d |
| 0x34e508…de43c9 | 18 days agoWed, 29 Jul 2026 18:54:13 UTC | 0xfe485c…75db | [0] 0x000000000000…0000000e [1] 0x000000000000…0000000d [2] 0x000000000000…a6c11d38 data: 0x000000000000000000…e0eed39d |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 32,097,585 | 7 days agoSun, 09 Aug 2026 16:58:25 UTC | 0xcc504f…0d7373 | CALL | swap | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00117 ETH |
| 24,892,249 | 15 days agoSat, 01 Aug 2026 08:22:43 UTC | 0xddf70c…6be4a7 | CALL | exec | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00117 ETH |
| 22,681,537 | 18 days agoWed, 29 Jul 2026 18:49:10 UTC | 0x26f632…2dfbcc | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00374 ETH |
| 22,679,870 | 18 days agoWed, 29 Jul 2026 18:46:22 UTC | 0xca4724…49e5e4 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00374 ETH |
| 22,516,812 | 18 days agoWed, 29 Jul 2026 14:14:10 UTC | 0x2df782…a4db5d | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.01180 ETH |
| 22,515,526 | 18 days agoWed, 29 Jul 2026 14:12:00 UTC | 0x62b6a9…135137 | CALL | exec | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00491 ETH |
| 22,515,469 | 18 days agoWed, 29 Jul 2026 14:11:55 UTC | 0xc21cf0…c637d5 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00688 ETH |
| 22,489,293 | 18 days agoWed, 29 Jul 2026 13:28:10 UTC | 0x557c20…9baffe | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.01076 ETH |
| 22,487,900 | 18 days agoWed, 29 Jul 2026 13:25:50 UTC | 0x1a7693…d4ef09 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00383 ETH |
| 22,487,866 | 18 days agoWed, 29 Jul 2026 13:25:46 UTC | 0x59e864…919740 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00383 ETH |
| 22,487,866 | 18 days agoWed, 29 Jul 2026 13:25:46 UTC | 0x09ce6a…69aff8 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00383 ETH |
| 22,487,866 | 18 days agoWed, 29 Jul 2026 13:25:46 UTC | 0x3f6643…f3acbd | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00692 ETH |
| 22,416,933 | 18 days agoWed, 29 Jul 2026 11:27:10 UTC | 0x781da0…f460a1 | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00482 ETH |
| 22,415,322 | 18 days agoWed, 29 Jul 2026 11:24:28 UTC | 0x087db8…c2dc3f | CALL | Execute | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00482 ETH |
| 22,299,230 | 18 days agoWed, 29 Jul 2026 08:10:10 UTC | 0xaf403d…0d2f7a | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00564 ETH |
| 22,284,892 | 18 days agoWed, 29 Jul 2026 07:46:10 UTC | 0x0b5d93…f7ecfc | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00564 ETH |
| 22,283,090 | 18 days agoWed, 29 Jul 2026 07:43:10 UTC | 0x6e7b40…7b8784 | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00554 ETH |
| 22,281,636 | 18 days agoWed, 29 Jul 2026 07:40:43 UTC | 0x4db415…c213df | CALL | exec | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00554 ETH |
| 22,243,071 | 18 days agoWed, 29 Jul 2026 06:36:10 UTC | 0xacc88e…6537cc | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00935 ETH |
| 22,241,999 | 18 days agoWed, 29 Jul 2026 06:34:22 UTC | 0x709d47…6fe9c5 | CALL | Execute | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00935 ETH |
| 22,028,891 | 18 days agoWed, 29 Jul 2026 00:38:10 UTC | 0xcfa132…af2fb1 | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.00922 ETH |
| 22,016,706 | 18 days agoWed, 29 Jul 2026 00:17:49 UTC | 0x89659e…7e56ce | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00922 ETH |
| 22,012,111 | 18 days agoWed, 29 Jul 2026 00:10:10 UTC | 0x184b3d…6b3c56 | CALL | purchaseStock | 0xf6ab…7032 | OUT | 0x078f…26ba | 0.02133 ETH |
| 22,010,641 | 18 days agoWed, 29 Jul 2026 00:07:42 UTC | 0x0e5a2f…9486dd | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.00753 ETH |
| 22,010,640 | 18 days agoWed, 29 Jul 2026 00:07:42 UTC | 0xd5457e…3c3b53 | CALL | 0x39ecce49 | 0x7766…7c73 | IN | 0xf6ab…7032 | 0.01380 ETH |