// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {MirrorNFT} from "./MirrorNFT.sol";
/// @title PackSale
/// @notice Takes USDG for a configured Collector Crypt machine, holds it until the pack is
/// fulfilled or the order times out, and enforces the launch caps.
/// @dev Doc 03 §1. Thin, boring, capped: this contract decides almost nothing. Its only
/// job is that user funds are never stranded and never double-spent — an order is
/// FULFILLED xor REFUNDED, exactly once, forever.
contract PackSale is Ownable, Pausable, ReentrancyGuard {
using SafeERC20 for IERC20;
enum OrderStatus {
NONE,
PENDING,
FULFILLED,
REFUNDED
}
struct Order {
address buyer;
uint96 price; // USDG has 6 decimals; uint96 covers ~7.9e22 units. Packed with buyer.
bytes32 machineId;
uint64 createdAt;
uint64 deadline;
OrderStatus status;
/// @notice The operator has taken this order's payment out to fund the pack purchase.
/// Once true the contract no longer holds the money, so refund() cannot pay
/// it back and reverts. Packs into the slot with createdAt/deadline/status.
bool drawn;
/// @notice The buyer asked for a turbo open.
///
/// @dev Recorded here and echoed in OrderCreated because the worker learns about
/// orders from the CHAIN, not from the website. Without this it has no way to
/// know an order was meant to be turbo, which is why Turbo could not ship at
/// all. Shares the packed slot with `drawn`, so it costs no extra storage.
bool turbo;
}
struct Machine {
uint96 priceUsdg;
bool enabled;
}
/// @notice Minimum age before the owner-only escape hatch can fire. Deliberately far
/// longer than any plausible ORDER_TIMEOUT (10 min) so forceRefund can never
/// race a fulfillment that is merely slow. Immutable by design — an operator
/// under pressure must not be able to shorten it.
uint64 public constant FORCE_REFUND_MIN_AGE = 2 hours;
IERC20 public immutable usdg;
/// @notice Consulted by forceRefund to prove no mirror was ever minted for an order.
MirrorNFT public immutable mirror;
address public operator;
/// @notice The hot EOA allowed to draw an order's payment out to fund its pack purchase.
///
/// @dev Deliberately NOT `operator`. In production `operator` is the Fulfiller CONTRACT,
/// so that mint and markFulfilled can only ever happen together. A contract cannot
/// bridge to Solana; that needs an EOA holding a key. Reusing `operator` here
/// would have sent every draw to the Fulfiller, where the money would be stranded.
address public drawer;
address public guardian;
address public revenueRecipient;
uint64 public orderTimeout = 10 minutes;
/// @notice Raised from the testing-phase 10, but deliberately NOT unlimited.
///
/// @dev High enough that it can never constrain real usage: the worker's gas runs out
/// after roughly 35 opens, so this ceiling is about 14x further away than the
/// binding constraint. It will not get in the way.
///
/// Low enough to still be a brake. It was briefly set to type(uint32).max on the
/// reasoning that the operator no longer fronts pack money (see drawForOpen), so
/// volume costs bridge fees and gas rather than principal. That reasoning is
/// sound but it was written while drawForOpen was undeployed working-tree code —
/// reasoning from a mechanism that is not live is exactly the mistake this
/// codebase keeps making.
///
/// And the argument does not actually survive scrutiny even once the draw ships.
/// Uncapped, the worst case is not a runaway bleed: the worker simply exhausts
/// its ETH after ~35 opens (~$125 of bridge fees) and then HALTS, with orders
/// mid-flight and buyer money sitting in the worker wallet. What a cap really
/// bounds is how much damage accumulates before a human notices, and that holds
/// no matter who funds the pack.
///
/// `maxOpenOrders` remains the sharper limit — it bounds how much buyer money is
/// in flight at once, and raising it costs working capital rather than gas.
///
/// Adjustable through setCaps with no redeploy.
uint32 public dailyPackCap = 500;
uint96 public maxPackPrice;
uint32 public maxOpenOrders = 5;
uint256 public nextOrderId = 1;
uint256 public openOrderCount;
/// @notice Open orders per buyer, so one address cannot consume every slot.
/// @dev `maxOpenOrders` bounds systemic exposure — how many buyers can sit in the drawn
/// state at once, where refund() reverts by design and only the worker can make
/// them whole. That bound must stay. What it could not do is stop ONE address
/// taking all of it: five concurrent buys closed the storefront for everyone for
/// the order timeout, at zero principal cost to the griefer, since every order is
/// refunded in full.
mapping(address => uint32) public openOrdersOf;
/// @notice Per-buyer cap. 0 disables it, leaving only the global `maxOpenOrders`.
uint32 public maxOpenOrdersPerBuyer = 2;
/// @notice USDG owed to buyers of still-pending orders. Every transfer out is checked
/// against this so revenue can never be paid from another user's escrow.
uint256 public escrowedUsdg;
mapping(uint256 orderId => Order) public orders;
mapping(bytes32 machineId => Machine) public machines;
mapping(uint256 utcDay => uint32 count) public dailyCount;
/// @dev `turbo` is NOT indexed: the worker reads every order anyway, and an extra topic
/// costs gas on the hottest event in the system for a filter nobody needs.
event OrderCreated(
uint256 indexed orderId,
address indexed buyer,
bytes32 indexed machineId,
uint256 price,
uint64 deadline,
bool turbo
);
event OrderFulfilled(uint256 indexed orderId, uint256 mirrorTokenId, bytes32 ccTxSigHash);
event OrderRefunded(uint256 indexed orderId, address indexed buyer, uint256 price);
/// @notice Payment left escrow to fund the pack purchase. After this the contract holds
/// nothing for the order and only the operator can make the buyer whole.
event OrderDrawn(uint256 indexed orderId, address indexed to, uint256 price);
event DrawerUpdated(address indexed previous, address indexed next);
event ForceRefunded(uint256 indexed orderId, address indexed buyer, uint256 price, string reason);
event MachineUpdated(bytes32 indexed machineId, uint256 priceUsdg, bool enabled);
event CapsUpdated(uint32 dailyCap, uint96 maxPrice, uint32 maxOpen);
event PerBuyerCapUpdated(uint32 previous, uint32 current);
event TimeoutUpdated(uint64 previous, uint64 current);
event OperatorUpdated(address indexed previous, address indexed current);
event GuardianUpdated(address indexed previous, address indexed current);
event RevenueRecipientUpdated(address indexed previous, address indexed current);
error NotOperator();
error NotGuardianOrOwner();
error ZeroAddress();
error MachineDisabled(bytes32 machineId);
error PriceAboveMax(uint256 price, uint256 maxPrice);
error DailyCapReached(uint32 cap);
error TooManyOpenOrders(uint32 cap);
/// @notice This buyer already has the maximum number of orders in flight.
error TooManyOpenOrdersForBuyer(uint32 cap);
error OrderNotPending(uint256 orderId, OrderStatus status);
/// @notice This order's payment has already left escrow to fund its pack. The contract
/// cannot pay it out a second time, whether as a draw or as a refund.
error AlreadyDrawn(uint256 orderId);
error NotDrawer();
/// @notice This order's payment is still in escrow, so refund() is the correct route.
error NotDrawn(uint256 orderId);
error DeadlineNotPassed(uint256 orderId, uint64 deadline);
error OrderTooYoung(uint256 orderId, uint64 eligibleAt);
error MirrorAlreadyMinted(uint256 orderId, uint256 tokenId);
error EmptyReason();
error UnexpectedTokenBalance();
error InvalidTimeout();
error InvalidCaps();
modifier onlyOperator() {
if (msg.sender != operator) revert NotOperator();
_;
}
constructor(
address usdg_,
address mirror_,
address owner_,
address operator_,
address guardian_,
address revenueRecipient_,
uint96 maxPackPrice_
) Ownable(owner_) {
if (usdg_ == address(0) || mirror_ == address(0) || owner_ == address(0)) {
revert ZeroAddress();
}
if (operator_ == address(0) || guardian_ == address(0) || revenueRecipient_ == address(0)) {
revert ZeroAddress();
}
usdg = IERC20(usdg_);
mirror = MirrorNFT(mirror_);
operator = operator_;
guardian = guardian_;
revenueRecipient = revenueRecipient_;
maxPackPrice = maxPackPrice_;
}
// ---------------------------------------------------------------- user
/// @notice Pay for a pack. Price comes from on-chain machine config, synced from CC's
/// live menu by the ops job — never from the caller.
function buy(bytes32 machineId) external whenNotPaused nonReentrant returns (uint256 orderId) {
return _buy(machineId, false);
}
/// @notice Buy a pack, optionally in turbo mode.
///
/// @dev Separate entry point rather than a changed signature: every existing caller,
/// including the deployed frontend, keeps working unchanged. A turbo Common is
/// auto-sold by Collector Crypt into USDC on Solana with no NFT, so the buyer is
/// owed money over the inbound bridge rather than a card — the worker needs to
/// know which it is BEFORE it opens the pack.
function buyTurbo(bytes32 machineId) external whenNotPaused nonReentrant returns (uint256 orderId) {
return _buy(machineId, true);
}
function _buy(bytes32 machineId, bool turbo) private returns (uint256 orderId) {
Machine memory m = machines[machineId];
if (!m.enabled) revert MachineDisabled(machineId);
if (m.priceUsdg > maxPackPrice) revert PriceAboveMax(m.priceUsdg, maxPackPrice);
uint256 today = block.timestamp / 1 days;
uint32 count = dailyCount[today];
if (count >= dailyPackCap) revert DailyCapReached(dailyPackCap);
if (openOrderCount >= maxOpenOrders) revert TooManyOpenOrders(maxOpenOrders);
if (maxOpenOrdersPerBuyer > 0 && openOrdersOf[msg.sender] >= maxOpenOrdersPerBuyer) {
revert TooManyOpenOrdersForBuyer(maxOpenOrdersPerBuyer);
}
// Balance-diff accounting so a fee-on-transfer USDG can never leave escrow short.
// Paxos tokens do not take fees today; this makes that assumption non-load-bearing.
uint256 before = usdg.balanceOf(address(this));
usdg.safeTransferFrom(msg.sender, address(this), m.priceUsdg);
uint256 received = usdg.balanceOf(address(this)) - before;
if (received != m.priceUsdg) revert UnexpectedTokenBalance();
orderId = nextOrderId++;
uint64 deadline = uint64(block.timestamp) + orderTimeout;
orders[orderId] = Order({
buyer: msg.sender,
price: m.priceUsdg,
machineId: machineId,
createdAt: uint64(block.timestamp),
deadline: deadline,
status: OrderStatus.PENDING,
drawn: false,
turbo: turbo
});
dailyCount[today] = count + 1;
openOrderCount += 1;
openOrdersOf[msg.sender] += 1;
escrowedUsdg += m.priceUsdg;
emit OrderCreated(orderId, msg.sender, machineId, m.priceUsdg, deadline, turbo);
}
/// @notice Reclaim a timed-out order. Callable by ANYONE — a user must never depend on
/// us to get their money back. Allowed while paused, deliberately.
function refund(uint256 orderId) external nonReentrant {
Order storage o = orders[orderId];
if (o.status != OrderStatus.PENDING) revert OrderNotPending(orderId, o.status);
if (block.timestamp <= o.deadline) revert DeadlineNotPassed(orderId, o.deadline);
// The contract no longer holds this money; the operator does. Refunding from here
// would pay the buyer out of somebody else's escrow.
if (o.drawn) revert AlreadyDrawn(orderId);
_settleRefund(o);
emit OrderRefunded(orderId, o.buyer, o.price);
}
// ---------------------------------------------------------------- operator
/// @notice Take an order's payment out of escrow so it can fund the pack purchase.
///
/// @dev THE POINT OF THIS FUNCTION. Opening a pack means bridging USDG to Solana and
/// buying from Collector Crypt, and a bridge sends from an EOA, not from this
/// contract. Without this the operator would have to front the full pack price
/// out of its own working capital for every order and wait to be reimbursed at
/// markFulfilled. That is capital the operator does not have, and it scales with
/// maxOpenOrders rather than with revenue.
///
/// The buyer's protection is deliberately preserved either side of this call:
///
/// not drawn -> refund() is permissionless and paid by the contract. This
/// covers every failure BEFORE we commit: machine sold out, bridge
/// quote too expensive, deadline passed, insufficient funds.
/// drawn -> the contract holds nothing, so refund() reverts. The operator
/// now holds the money and refunds directly. This is the same
/// boundary the fulfilment pipeline already treats as
/// must-complete, so no new class of stuck order is created.
///
/// Drawer-gated and one-shot: a second call reverts, so an order can never be
/// drained twice.
function drawForOpen(uint256 orderId) external nonReentrant {
if (msg.sender != drawer) revert NotDrawer();
Order storage o = orders[orderId];
if (o.status != OrderStatus.PENDING) revert OrderNotPending(orderId, o.status);
if (o.drawn) revert AlreadyDrawn(orderId);
/**
* A draw may NEVER happen once the order is refundable.
*
* Without this the "permissionless refund before the draw" guarantee is worthless:
* nothing bounded WHEN a draw could occur, so the drawer could sit on an expired
* order for a year, or watch the mempool and front-run the buyer's own refund
* transaction, converting a fully refundable order into one with no on-chain remedy
* at all. Found by adversarial review of this function, 19 Jul 2026.
*
* There is no legitimate reason to draw an expired order. Past the deadline the only
* correct action is to refund it, and now that is the only action available.
*/
if (block.timestamp > o.deadline) revert DeadlineNotPassed(orderId, o.deadline);
uint256 price = o.price;
o.drawn = true;
escrowedUsdg -= price;
usdg.safeTransfer(msg.sender, price);
emit OrderDrawn(orderId, msg.sender, price);
}
/// @notice Close a DRAWN order that can never be fulfilled, freeing its open-order slot.
///
/// @dev The other half of drawForOpen, and it is not optional.
///
/// `openOrderCount` decrements only in markFulfilled and _settleRefund. A drawn
/// order that then fails before purchase — the Solana float gate is the documented
/// common case, not an exotic one — is refunded to the buyer DIRECTLY by the
/// worker, because the contract no longer holds their money. Without this function
/// that order stays PENDING forever and keeps its slot. Five of them close the
/// storefront for everyone, permanently, with no automated recovery.
///
/// Safe by construction: a drawn order has no escrow here, so nothing is
/// transferred and no other buyer's money can be touched. The drawer calls it
/// immediately after paying the buyer back, so the on-chain state matches ours.
///
/// Deliberately drawer-gated rather than owner-gated: the worker must be able to
/// self-heal within seconds. forceRefund remains the owner's 2-hour escape for
/// orders that got further, and still works for these.
function closeDrawnOrder(uint256 orderId, string calldata reason) external nonReentrant {
if (msg.sender != drawer) revert NotDrawer();
Order storage o = orders[orderId];
if (o.status != OrderStatus.PENDING) revert OrderNotPending(orderId, o.status);
if (!o.drawn) revert NotDrawn(orderId);
if (bytes(reason).length == 0) revert EmptyReason();
o.status = OrderStatus.REFUNDED;
_releaseSlot(o.buyer);
emit ForceRefunded(orderId, o.buyer, o.price, reason);
}
/// @notice Release escrow to the treasury once the mirror is minted. Called atomically
/// with the mint by Fulfiller so the two can never diverge.
/// @dev Intentionally allowed after the deadline: a slow-but-successful fulfillment
/// should complete, not refund. Only an actual refund closes that door.
function markFulfilled(uint256 orderId, uint256 mirrorTokenId, bytes32 ccTxSigHash)
external
onlyOperator
nonReentrant
{
Order storage o = orders[orderId];
if (o.status != OrderStatus.PENDING) revert OrderNotPending(orderId, o.status);
uint256 price = o.price;
bool drawn = o.drawn;
o.status = OrderStatus.FULFILLED;
_releaseSlot(o.buyer);
// A drawn order was already paid out to the operator to fund the pack, and its
// escrow was decremented then. Paying again here would send money this contract does
// not have earmarked, draining another order's escrow to do it.
if (!drawn) {
escrowedUsdg -= price;
usdg.safeTransfer(revenueRecipient, price);
}
emit OrderFulfilled(orderId, mirrorTokenId, ccTxSigHash);
}
// ---------------------------------------------------------------- owner escape hatch
/// @notice Refund a buyer whose pack opened on Solana but whose mirror mint is
/// permanently unrecoverable. Human-triggered only: the worker holds the
/// operator key, not the owner key, so automation cannot reach this.
/// @dev Doc 06 runbook 6. The card we hold becomes SALVAGE inventory. `reason` is
/// permanent and public — write what actually broke.
function forceRefund(uint256 orderId, string calldata reason) external onlyOwner nonReentrant {
Order storage o = orders[orderId];
if (o.status != OrderStatus.PENDING) revert OrderNotPending(orderId, o.status);
if (bytes(reason).length == 0) revert EmptyReason();
uint64 eligibleAt = o.createdAt + FORCE_REFUND_MIN_AGE;
if (block.timestamp < eligibleAt) revert OrderTooYoung(orderId, eligibleAt);
// Checked against the NFT contract, not our own bookkeeping: a mint that landed
// while the worker lost track still blocks the refund, so a user can never end up
// holding both the card and their money back.
uint256 tokenId = mirror.mintedForOrder(orderId);
if (tokenId != 0) revert MirrorAlreadyMinted(orderId, tokenId);
/**
* A DRAWN order has no escrow here to give back — we already took it to buy the pack.
* It must still be closable, or the order is stuck PENDING forever and permanently
* consumes one of the `maxOpenOrders` slots. Five of those halt the storefront for
* everyone, and it happens by ACCIDENT to any contract wallet that cannot receive an
* ERC-721, because `_safeMint` then reverts on every attempt.
*
* So the status and the slot are settled here, and the operator owes the buyer their
* money directly. The 2 hour minimum age above still applies, and the reason is
* permanent and public.
*/
if (o.drawn) {
o.status = OrderStatus.REFUNDED;
_releaseSlot(o.buyer);
emit ForceRefunded(orderId, o.buyer, o.price, reason);
return;
}
_settleRefund(o);
emit ForceRefunded(orderId, o.buyer, o.price, reason);
}
// ---------------------------------------------------------------- internal
/// @dev Single refund path shared by `refund` and `forceRefund`, so both land in the
/// same terminal state and neither can follow the other.
/**
* Close an order's slot, globally and for its buyer, together.
*
* The two counters MUST move as one. There are four paths that close an order —
* markFulfilled, closeDrawnOrder, forceRefund's drawn branch, and _settleRefund — and a
* per-buyer counter that missed any one of them would leak a slot the buyer never gets
* back, locking them out of the store permanently. That is a worse bug than the griefing
* this cap exists to stop, so there is exactly one place that decrements.
*
* Guarded rather than trusting: a buyer whose count is somehow already zero must not
* underflow into 4 billion slots.
*/
function _releaseSlot(address buyer) private {
openOrderCount -= 1;
uint32 open = openOrdersOf[buyer];
if (open > 0) openOrdersOf[buyer] = open - 1;
}
function _settleRefund(Order storage o) private {
uint256 price = o.price;
address buyer = o.buyer;
o.status = OrderStatus.REFUNDED;
_releaseSlot(buyer);
escrowedUsdg -= price;
usdg.safeTransfer(buyer, price);
}
// ---------------------------------------------------------------- views
function getOrder(uint256 orderId) external view returns (Order memory) {
return orders[orderId];
}
function packsLeftToday() external view returns (uint256) {
uint32 used = dailyCount[block.timestamp / 1 days];
return used >= dailyPackCap ? 0 : dailyPackCap - used;
}
// ---------------------------------------------------------------- admin
function setMachine(bytes32 machineId, uint96 priceUsdg, bool enabled) external onlyOwner {
if (enabled && priceUsdg > maxPackPrice) revert PriceAboveMax(priceUsdg, maxPackPrice);
machines[machineId] = Machine({priceUsdg: priceUsdg, enabled: enabled});
emit MachineUpdated(machineId, priceUsdg, enabled);
}
function setCaps(uint32 dailyCap, uint96 maxPrice, uint32 maxOpen) external onlyOwner {
if (maxOpen == 0) revert InvalidCaps();
dailyPackCap = dailyCap;
maxPackPrice = maxPrice;
maxOpenOrders = maxOpen;
emit CapsUpdated(dailyCap, maxPrice, maxOpen);
}
/// @notice Set the per-buyer open-order cap. 0 disables it, leaving only `maxOpenOrders`.
/// @dev Separate from setCaps so it can be tuned without touching the systemic limits,
/// and so raising it is never a side effect of adjusting daily volume.
function setMaxOpenOrdersPerBuyer(uint32 perBuyer) external onlyOwner {
emit PerBuyerCapUpdated(maxOpenOrdersPerBuyer, perBuyer);
maxOpenOrdersPerBuyer = perBuyer;
}
function setTimeout(uint64 seconds_) external onlyOwner {
// Bounded: too short strands fulfilments in refunds, too long strands user funds.
if (seconds_ < 1 minutes || seconds_ > 1 hours) revert InvalidTimeout();
emit TimeoutUpdated(orderTimeout, seconds_);
orderTimeout = seconds_;
}
/// @notice Set the hot EOA that may draw order payments to fund pack purchases.
/// @dev Zero disables drawing entirely, which puts the contract back to pure escrow.
function setDrawer(address drawer_) external onlyOwner {
emit DrawerUpdated(drawer, drawer_);
drawer = drawer_;
}
function setOperator(address operator_) external onlyOwner {
if (operator_ == address(0)) revert ZeroAddress();
emit OperatorUpdated(operator, operator_);
operator = operator_;
}
function setGuardian(address guardian_) external onlyOwner {
if (guardian_ == address(0)) revert ZeroAddress();
emit GuardianUpdated(guardian, guardian_);
guardian = guardian_;
}
function setRevenueRecipient(address revenueRecipient_) external onlyOwner {
if (revenueRecipient_ == address(0)) revert ZeroAddress();
emit RevenueRecipientUpdated(revenueRecipient, revenueRecipient_);
revenueRecipient = revenueRecipient_;
}
/// @notice Guardian (the automated health monitor) can ONLY pause, never unpause.
function pause() external {
if (msg.sender != guardian && msg.sender != owner()) revert NotGuardianOrOwner();
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
/// @notice Recover tokens sent here by mistake. Cannot touch user escrow: only the
/// balance above `escrowedUsdg` is ever movable.
function sweepSurplus(address token, address to) external onlyOwner {
if (to == address(0)) revert ZeroAddress();
uint256 balance = IERC20(token).balanceOf(address(this));
uint256 movable = token == address(usdg) ? balance - escrowedUsdg : balance;
IERC20(token).safeTransfer(to, movable);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "usdg_",
"type": "address",
"internalType": "address"
},
{
"name": "mirror_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "operator_",
"type": "address",
"internalType": "address"
},
{
"name": "guardian_",
"type": "address",
"internalType": "address"
},
{
"name": "revenueRecipient_",
"type": "address",
"internalType": "address"
},
{
"name": "maxPackPrice_",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyDrawn",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "DailyCapReached",
"type": "error",
"inputs": [
{
"name": "cap",
"type": "uint32",
"internalType": "uint32"
}
]
},
{
"name": "DeadlineNotPassed",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint64",
"internalType": "uint64"
}
]
},
{
"name": "EmptyReason",
"type": "error",
"inputs": []
},
{
"name": "EnforcedPause",
"type": "error",
"inputs": []
},
{
"name": "ExpectedPause",
"type": "error",
"inputs": []
},
{
"name": "InvalidCaps",
"type": "error",
"inputs": []
},
{
"name": "InvalidTimeout",
"type": "error",
"inputs": []
},
{
"name": "MachineDisabled",
"type": "error",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "MirrorAlreadyMinted",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotDrawer",
"type": "error",
"inputs": []
},
{
"name": "NotDrawn",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotGuardianOrOwner",
"type": "error",
"inputs": []
},
{
"name": "NotOperator",
"type": "error",
"inputs": []
},
{
"name": "OrderNotPending",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "status",
"type": "uint8",
"internalType": "enum PackSale.OrderStatus"
}
]
},
{
"name": "OrderTooYoung",
"type": "error",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "eligibleAt",
"type": "uint64",
"internalType": "uint64"
}
]
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PriceAboveMax",
"type": "error",
"inputs": [
{
"name": "price",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxPrice",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "TooManyOpenOrders",
"type": "error",
"inputs": [
{
"name": "cap",
"type": "uint32",
"internalType": "uint32"
}
]
},
{
"name": "TooManyOpenOrdersForBuyer",
"type": "error",
"inputs": [
{
"name": "cap",
"type": "uint32",
"internalType": "uint32"
}
]
},
{
"name": "UnexpectedTokenBalance",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "CapsUpdated",
"type": "event",
"inputs": [
{
"name": "dailyCap",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
},
{
"name": "maxPrice",
"type": "uint96",
"indexed": false,
"internalType": "uint96"
},
{
"name": "maxOpen",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "DrawerUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "next",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ForceRefunded",
"type": "event",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "price",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "reason",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "GuardianUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MachineUpdated",
"type": "event",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "priceUsdg",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "enabled",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "OperatorUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OrderCreated",
"type": "event",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "machineId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "price",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "turbo",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "OrderDrawn",
"type": "event",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "price",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OrderFulfilled",
"type": "event",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "mirrorTokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ccTxSigHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "OrderRefunded",
"type": "event",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "price",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Paused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PerBuyerCapUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
},
{
"name": "current",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "RevenueRecipientUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TimeoutUpdated",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "current",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "Unpaused",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FORCE_REFUND_MIN_AGE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "buyTurbo",
"type": "function",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "closeDrawnOrder",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "reason",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "dailyCount",
"type": "function",
"inputs": [
{
"name": "utcDay",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "count",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "dailyPackCap",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "drawForOpen",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "drawer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "escrowedUsdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "forceRefund",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "reason",
"type": "string",
"internalType": "string"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "getOrder",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "buyer",
"type": "address",
"internalType": "address"
},
{
"name": "price",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "createdAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "deadline",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "status",
"type": "uint8",
"internalType": "enum PackSale.OrderStatus"
},
{
"name": "drawn",
"type": "bool",
"internalType": "bool"
},
{
"name": "turbo",
"type": "bool",
"internalType": "bool"
}
],
"internalType": "struct PackSale.Order"
}
],
"stateMutability": "view"
},
{
"name": "guardian",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "machines",
"type": "function",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "priceUsdg",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "markFulfilled",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mirrorTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "ccTxSigHash",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "maxOpenOrders",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "maxOpenOrdersPerBuyer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "maxPackPrice",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint96",
"internalType": "uint96"
}
],
"stateMutability": "view"
},
{
"name": "mirror",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract MirrorNFT"
}
],
"stateMutability": "view"
},
{
"name": "nextOrderId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "openOrderCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "openOrdersOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "operator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "orderTimeout",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "orders",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "buyer",
"type": "address",
"internalType": "address"
},
{
"name": "price",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "createdAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "deadline",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "status",
"type": "uint8",
"internalType": "enum PackSale.OrderStatus"
},
{
"name": "drawn",
"type": "bool",
"internalType": "bool"
},
{
"name": "turbo",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "packsLeftToday",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "refund",
"type": "function",
"inputs": [
{
"name": "orderId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "revenueRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "setCaps",
"type": "function",
"inputs": [
{
"name": "dailyCap",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "maxPrice",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "maxOpen",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setDrawer",
"type": "function",
"inputs": [
{
"name": "drawer_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGuardian",
"type": "function",
"inputs": [
{
"name": "guardian_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMachine",
"type": "function",
"inputs": [
{
"name": "machineId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "priceUsdg",
"type": "uint96",
"internalType": "uint96"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxOpenOrdersPerBuyer",
"type": "function",
"inputs": [
{
"name": "perBuyer",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOperator",
"type": "function",
"inputs": [
{
"name": "operator_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRevenueRecipient",
"type": "function",
"inputs": [
{
"name": "revenueRecipient_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTimeout",
"type": "function",
"inputs": [
{
"name": "seconds_",
"type": "uint64",
"internalType": "uint64"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sweepSurplus",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unpause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
}
]0x60c0604052600580546001600160a01b03167d01f4000000000000025800000000000000000000000000000000000000001790556006805463ffffffff60601b19166c050000000000000000000000001790556001600755600a8054600263ffffffff1990911617905534801562000075575f80fd5b506040516200293d3803806200293d83398101604081905262000098916200025f565b846001600160a01b038116620000c757604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000d281620001f4565b505f805460ff60a01b19169055600180556001600160a01b03871615806200010157506001600160a01b038616155b806200011457506001600160a01b038516155b15620001335760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03841615806200015157506001600160a01b038316155b806200016457506001600160a01b038216155b15620001835760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0396871660805294861660a052600280549387166001600160a01b031994851617905560048054928716928416929092179091556005805491909516911617909255600680546001600160601b039092166001600160601b031990921691909117905550620002fe565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200025a575f80fd5b919050565b5f805f805f805f60e0888a03121562000276575f80fd5b620002818862000243565b9650620002916020890162000243565b9550620002a16040890162000243565b9450620002b16060890162000243565b9350620002c16080890162000243565b9250620002d160a0890162000243565b60c08901519092506001600160601b0381168114620002ee575f80fd5b8091505092959891949750929550565b60805160a0516125e5620003585f395f81816103dd0152610a4401525f81816106aa0152818161077b0152818161125f0152818161151c0152818161191201528181611c7d01528181611d010152611d5501526125e55ff3fe608060405234801561000f575f80fd5b5060043610610260575f3560e01c80638456cb591161014b578063b3ab15fb116100bf578063d09ef24111610084578063d09ef24114610648578063d701d61914610668578063f2fde38b1461067f578063f572076914610692578063f5b91b7b146106a5578063f98120ba146106cc575f80fd5b8063b3ab15fb146105d7578063ba206004146105ea578063c97b22f71461061c578063cb81a8a214610625578063cf88df7914610638575f80fd5b80639c9a1061116101105780639c9a1061146104ee5780639ee701fe14610501578063a5d7c49914610514578063a85c38ef1461051d578063afd03065146105b1578063b0fc4873146105c4575f80fd5b80638456cb591461049d57806386fe5d19146104a557806389fcbdc5146104b85780638a0dac4a146104cb5780638da5cb5b146104de575f80fd5b806341e276e9116101e25780634ff8e499116101a75780634ff8e49914610437578063570ca7351461044a5780635b0a09881461045d5780635b2a9e42146104665780635c975abb14610479578063715018a614610495575f80fd5b806341e276e914610387578063442c6724146103b3578063444d9172146103d8578063452a9320146103ff5780634fdc897314610412575f80fd5b806333bf42851161022857806333bf4285146102fe5780633ae5ef0e146103515780633b26314d146103645780633d19e88e146103775780633f4ba83a1461037f575f80fd5b806311bc5315146102645780631c47165f14610294578063278ecde1146102a95780632a58b330146102bc5780632e6b86cb146102d3575b5f80fd5b600354610277906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6102a76102a2366004612158565b6106df565b005b6102a76102b7366004612189565b6107e1565b6102c560075481565b60405190815260200161028b565b6006546102e6906001600160601b031681565b6040516001600160601b03909116815260200161028b565b61033261030c366004612189565b600d6020525f90815260409020546001600160601b03811690600160601b900460ff1682565b604080516001600160601b03909316835290151560208301520161028b565b6102a761035f3660046121a0565b61093e565b600554610277906001600160a01b031681565b6102c5610bf6565b6102a7610c62565b60065461039e90600160601b900463ffffffff1681565b60405163ffffffff909116815260200161028b565b61039e6103c1366004612214565b60096020525f908152604090205463ffffffff1681565b6102777f000000000000000000000000000000000000000000000000000000000000000081565b600454610277906001600160a01b031681565b61039e610420366004612189565b600e6020525f908152604090205463ffffffff1681565b6102a76104453660046121a0565b610c74565b600254610277906001600160a01b031681565b6102c560085481565b6102a7610474366004612247565b610de6565b5f54600160a01b900460ff16604051901515815260200161028b565b6102a7610e4e565b6102a7610e5f565b6102c56104b3366004612189565b610eaa565b6102a76104c6366004612214565b610ed6565b6102a76104d9366004612214565b610f60565b5f546001600160a01b0316610277565b6102c56104fc366004612189565b610fea565b6102a761050f366004612276565b611005565b6102c5600b5481565b61059d61052b366004612189565b600c6020525f90815260409020805460018201546002909201546001600160a01b03821692600160a01b9092046001600160601b031691906001600160401b0380821691600160401b810490911690600160801b810460ff90811691600160881b8104821691600160901b9091041688565b60405161028b9897969594939291906122eb565b6102a76105bf366004612189565b6110f5565b6102a76105d2366004612351565b6112c8565b6102a76105e5366004612214565b611389565b60055461060490600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161028b565b610604611c2081565b6102a7610633366004612391565b611413565b600a5461039e9063ffffffff1681565b61065b610656366004612189565b61158c565b60405161028b91906123ba565b60055461039e90600160e01b900463ffffffff1681565b6102a761068d366004612214565b61169f565b6102a76106a0366004612214565b6116d9565b6102777f000000000000000000000000000000000000000000000000000000000000000081565b6102a76106da36600461244f565b61173c565b6106e76117ff565b6001600160a01b03811661070e5760405163d92e233d60e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107769190612475565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316146107b857816107c5565b600b546107c590836124a0565b90506107db6001600160a01b038516848361182b565b50505050565b6107e961188a565b5f818152600c6020526040902060016002820154600160801b900460ff166003811115610818576108186122b7565b1461085457818160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b60405180910390fd5b6002810154600160401b90046001600160401b031642116108a657600281015460405163ec63058960e01b815260048101849052600160401b9091046001600160401b0316602482015260440161084b565b6002810154600160881b900460ff16156108d657604051637e62addd60e01b81526004810183905260240161084b565b6108df816118b4565b8054604051600160a01b82046001600160601b031681526001600160a01b039091169083907fe18debf292fbfc1f009a15d4e4932c1da2be34d7343f86f50989d09a04571e1b9060200160405180910390a35061093b60018055565b50565b6109466117ff565b61094e61188a565b5f838152600c6020526040902060016002820154600160801b900460ff16600381111561097d5761097d6122b7565b146109b057838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b5f8290036109d15760405163db72b02360e01b815260040160405180910390fd5b60028101545f906109ee90611c20906001600160401b03166124cd565b9050806001600160401b0316421015610a2c576040516312fdd81560e01b8152600481018690526001600160401b038216602482015260440161084b565b60405163fe9a5ecf60e01b8152600481018690525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fe9a5ecf90602401602060405180830381865afa158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab59190612475565b90508015610ae057604051634e2e295d60e11b8152600481018790526024810182905260440161084b565b6002830154600160881b900460ff1615610b805760028301805460ff60801b1916600360801b1790558254610b1d906001600160a01b0316611939565b82546040516001600160a01b0382169188917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610b7091600160a01b9091046001600160601b0316908a908a906124ed565b60405180910390a3505050610be8565b610b89836118b4565b82546040516001600160a01b0382169188917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610bdc91600160a01b9091046001600160601b0316908a908a906124ed565b60405180910390a35050505b610bf160018055565b505050565b5f80600e81610c08620151804261252b565b815260208101919091526040015f205460055463ffffffff9182169250600160e01b900416811015610c5457600554610c4f908290600160e01b900463ffffffff1661254a565b610c56565b5f5b63ffffffff1691505090565b610c6a6117ff565b610c726119b3565b565b610c7c61188a565b6003546001600160a01b03163314610ca75760405163fb777b1160e01b815260040160405180910390fd5b5f838152600c6020526040902060016002820154600160801b900460ff166003811115610cd657610cd66122b7565b14610d0957838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b6002810154600160881b900460ff16610d3757604051625396db60e81b81526004810185905260240161084b565b5f829003610d585760405163db72b02360e01b815260040160405180910390fd5b60028101805460ff60801b1916600360801b1790558054610d81906001600160a01b0316611939565b80546040516001600160a01b0382169186917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610dd491600160a01b9091046001600160601b031690889088906124ed565b60405180910390a350610bf160018055565b610dee6117ff565b600a546040805163ffffffff928316815291831660208301527f97fb393df7c7c075c7e8a23b6006352cd55c78abd1e507146434c3d1d5563904910160405180910390a1600a805463ffffffff191663ffffffff92909216919091179055565b610e566117ff565b610c725f611a07565b6004546001600160a01b03163314801590610e8457505f546001600160a01b03163314155b15610ea257604051630fd901ef60e01b815260040160405180910390fd5b610c72611a56565b5f610eb3611a98565b610ebb61188a565b610ec6826001611ac2565b9050610ed160018055565b919050565b610ede6117ff565b6001600160a01b038116610f055760405163d92e233d60e01b815260040160405180910390fd5b6005546040516001600160a01b038084169216907f54faf859f8b04a3fce57f3bf185c6dcb0df7cdf90060a9617bcc9334e9d785ab905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b610f686117ff565b6001600160a01b038116610f8f5760405163d92e233d60e01b815260040160405180910390fd5b6004546040516001600160a01b038084169216907f064d28d3d3071c5cbc271a261c10c2f0f0d9e319390397101aa0eb23c6bad909905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b5f610ff3611a98565b610ffb61188a565b610ec6825f611ac2565b61100d6117ff565b80801561102857506006546001600160601b03908116908316115b1561105d57600654604051638b8675a560e01b81526001600160601b038085166004830152909116602482015260440161084b565b6040805180820182526001600160601b0384811680835284151560208085018281525f8a8152600d83528790209551865491511515600160601b026cffffffffffffffffffffffffff199092169516949094179390931790935583519081529081019190915284917fdfa51c82a47110ff7ce47e4c65b8142842c7ec1c1924636b13470181203e2c02910160405180910390a2505050565b6110fd61188a565b6003546001600160a01b031633146111285760405163fb777b1160e01b815260040160405180910390fd5b5f818152600c6020526040902060016002820154600160801b900460ff166003811115611157576111576122b7565b1461118a57818160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b6002810154600160881b900460ff16156111ba57604051637e62addd60e01b81526004810183905260240161084b565b6002810154600160401b90046001600160401b031642111561120d57600281015460405163ec63058960e01b815260048101849052600160401b9091046001600160401b0316602482015260440161084b565b8054600282018054600160881b60ff60881b19909116179055600b8054600160a01b9092046001600160601b0316918291905f9061124c9084906124a0565b9091555061128690506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338361182b565b604051818152339084907f76ed9929ad3093112b3005cd531f7a4280baaebf560dffc358c7ac3c738734879060200160405180910390a3505061093b60018055565b6112d06117ff565b8063ffffffff165f036112f657604051630b93c23d60e31b815260040160405180910390fd5b600580546001600160e01b0316600160e01b63ffffffff86811691820292909217909255600680546001600160601b0386166001600160801b03199091168117600160601b938616938402179091556040805193845260208401919091528201527f9a342b9359e713295c2d48257359e0e34ecbd076ad9b4d28759fd7835a7208f89060600160405180910390a1505050565b6113916117ff565b6001600160a01b0381166113b85760405163d92e233d60e01b815260040160405180910390fd5b6002546040516001600160a01b038084169216907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03905f90a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461143e57604051631f0853c160e21b815260040160405180910390fd5b61144661188a565b5f838152600c6020526040902060016002820154600160801b900460ff166003811115611475576114756122b7565b146114a857838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b805460028201805460ff60801b198116600160811b17909155600160a01b82046001600160601b031691600160881b90910460ff16906114f0906001600160a01b0316611939565b806115455781600b5f82825461150691906124a0565b9091555050600554611545906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168461182b565b604080518681526020810186905287917fb547dcb7300e27a54b8f46a9d11ef86fc9e3cc3822cb77c4bfc00e35d93fb53b910160405180910390a2505050610bf160018055565b60408051610100810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091525f828152600c602090815260409182902082516101008101845281546001600160a01b0381168252600160a01b90046001600160601b03169281019290925260018101549282019290925260028201546001600160401b038082166060840152600160401b820416608083015290919060a0830190600160801b900460ff16600381111561165c5761165c6122b7565b600381111561166d5761166d6122b7565b81526002919091015460ff600160881b8204811615156020840152600160901b90910416151560409091015292915050565b6116a76117ff565b6001600160a01b0381166116d057604051631e4fbdf760e01b81525f600482015260240161084b565b61093b81611a07565b6116e16117ff565b6003546040516001600160a01b038084169216907f7300644728ff5d8b1edc830268697a431e2a947836fbf29cdaaf10e6aa7746f8905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6117446117ff565b603c816001600160401b031610806117665750610e10816001600160401b0316115b1561178457604051631ffb86f160e21b815260040160405180910390fd5b600554604080516001600160401b03600160a01b9093048316815291831660208301527fed6aaaa82e25ab6c4364f383fe9a53a89891df4e49530257706e7d5090d39bff910160405180910390a1600580546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b5f546001600160a01b03163314610c725760405163118cdaa760e01b815233600482015260240161084b565b6040516001600160a01b03838116602483015260448201839052610bf191859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612074565b6002600154036118ad57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b805460028201805460ff60801b1916600360801b1790556001600160601b03600160a01b820416906001600160a01b03166118ee81611939565b81600b5f8282546118ff91906124a0565b90915550610bf190506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016828461182b565b600160085f82825461194b91906124a0565b90915550506001600160a01b0381165f9081526009602052604090205463ffffffff1680156119af5761197f60018261254a565b6001600160a01b0383165f908152600960205260409020805463ffffffff191663ffffffff929092169190911790555b5050565b6119bb6120e0565b5f805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611a5e611a98565b5f805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119ea3390565b5f54600160a01b900460ff1615610c725760405163d93c066560e01b815260040160405180910390fd5b5f828152600d602090815260408083208151808301909252546001600160601b0381168252600160601b900460ff16151591810182905290611b1a57604051633567933360e11b81526004810185905260240161084b565b60065481516001600160601b0391821691161115611b63578051600654604051638b8675a560e01b81526001600160601b0392831660048201529116602482015260440161084b565b5f611b71620151804261252b565b5f818152600e602052604090205460055491925063ffffffff90811691600160e01b9004168110611bc7576005546040516378cbcd5360e11b8152600160e01b90910463ffffffff16600482015260240161084b565b600654600854600160601b90910463ffffffff1611611c0b5760065460405163703199d760e01b8152600160601b90910463ffffffff16600482015260240161084b565b600a5463ffffffff1615801590611c3c5750600a54335f9081526009602052604090205463ffffffff918216911610155b15611c6657600a54604051630f97f7db60e01b815263ffffffff909116600482015260240161084b565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611cca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cee9190612475565b8451909150611d34906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690339030906001600160601b0316612109565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbe9190612475565b611dc891906124a0565b85519091506001600160601b03168114611df55760405163bcca95c160e01b815260040160405180910390fd5b60078054905f611e0483612567565b909155506005549096505f90611e2a90600160a01b90046001600160401b0316426124cd565b604080516101008101825233815288516001600160601b031660208201529081018b90526001600160401b0342811660608301528216608082015290915060a08101600181525f60208083018290528b15156040938401528a8252600c8152908290208351918401516001600160601b0316600160a01b026001600160a01b03909216919091178155908201516001820155606082015160028201805460808501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911780825560a0840151919060ff60801b1916600160801b836003811115611f1b57611f1b6122b7565b021790555060c08201516002909101805460e0909301511515600160901b0260ff60901b19921515600160881b029290921661ffff60881b1990931692909217179055611f6984600161257f565b5f868152600e60205260408120805463ffffffff191663ffffffff93909316929092179091556008805460019290611fa290849061259c565b9091555050335f908152600960205260408120805460019290611fcc90849063ffffffff1661257f565b92506101000a81548163ffffffff021916908363ffffffff160217905550855f01516001600160601b0316600b5f828254612007919061259c565b90915550508551604080516001600160601b0390921682526001600160401b0383166020830152891515908201528990339089907fde0e222b8480b92aceb27f2999b52f957061b2873ac0c4a9c67a0c426bca95ad9060600160405180910390a450505050505092915050565b5f8060205f8451602086015f885af180612093576040513d5f823e3d81fd5b50505f513d915081156120aa5780600114156120b7565b6001600160a01b0384163b155b156107db57604051635274afe760e01b81526001600160a01b038516600482015260240161084b565b5f54600160a01b900460ff16610c7257604051638dfc202b60e01b815260040160405180910390fd5b6040516001600160a01b0384811660248301528381166044830152606482018390526107db9186918216906323b872dd90608401611858565b80356001600160a01b0381168114610ed1575f80fd5b5f8060408385031215612169575f80fd5b61217283612142565b915061218060208401612142565b90509250929050565b5f60208284031215612199575f80fd5b5035919050565b5f805f604084860312156121b2575f80fd5b8335925060208401356001600160401b03808211156121cf575f80fd5b818601915086601f8301126121e2575f80fd5b8135818111156121f0575f80fd5b876020828501011115612201575f80fd5b6020830194508093505050509250925092565b5f60208284031215612224575f80fd5b61222d82612142565b9392505050565b803563ffffffff81168114610ed1575f80fd5b5f60208284031215612257575f80fd5b61222d82612234565b80356001600160601b0381168114610ed1575f80fd5b5f805f60608486031215612288575f80fd5b8335925061229860208501612260565b9150604084013580151581146122ac575f80fd5b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b600481106122e757634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03891681526001600160601b0388166020820152604081018790526001600160401b03868116606083015285166080820152610100810161233660a08301866122cb565b92151560c082015290151560e0909101529695505050505050565b5f805f60608486031215612363575f80fd5b61236c84612234565b925061237a60208501612260565b915061238860408501612234565b90509250925092565b5f805f606084860312156123a3575f80fd5b505081359360208301359350604090920135919050565b5f6101008201905060018060a01b0383511682526001600160601b0360208401511660208301526040830151604083015260608301516001600160401b038082166060850152806080860151166080850152505060a083015161242060a08401826122cb565b5060c083015161243460c084018215159052565b5060e083015161244860e084018215159052565b5092915050565b5f6020828403121561245f575f80fd5b81356001600160401b038116811461222d575f80fd5b5f60208284031215612485575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156124b3576124b361248c565b92915050565b8281526040810161222d60208301846122cb565b6001600160401b038181168382160190808211156124485761244861248c565b6001600160601b038416815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8261254557634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff8281168282160390808211156124485761244861248c565b5f600182016125785761257861248c565b5060010190565b63ffffffff8181168382160190808211156124485761244861248c565b808201808211156124b3576124b361248c56fea26469706673582212203f8fb863bf5f707a22e563b3e497e5d7980ecf13f99429cdb7be346ac74cfe8a64736f6c634300081800330000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16800000000000000000000000024eb4103ea447ae25a333ce6c0099e53fd09e04800000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac00000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac00000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac00000000000000000000000000770e4b22527021a7e0e3b317602e57d7157dac000000000000000000000000000000000000000000000000000000003b9aca00
0x608060405234801561000f575f80fd5b5060043610610260575f3560e01c80638456cb591161014b578063b3ab15fb116100bf578063d09ef24111610084578063d09ef24114610648578063d701d61914610668578063f2fde38b1461067f578063f572076914610692578063f5b91b7b146106a5578063f98120ba146106cc575f80fd5b8063b3ab15fb146105d7578063ba206004146105ea578063c97b22f71461061c578063cb81a8a214610625578063cf88df7914610638575f80fd5b80639c9a1061116101105780639c9a1061146104ee5780639ee701fe14610501578063a5d7c49914610514578063a85c38ef1461051d578063afd03065146105b1578063b0fc4873146105c4575f80fd5b80638456cb591461049d57806386fe5d19146104a557806389fcbdc5146104b85780638a0dac4a146104cb5780638da5cb5b146104de575f80fd5b806341e276e9116101e25780634ff8e499116101a75780634ff8e49914610437578063570ca7351461044a5780635b0a09881461045d5780635b2a9e42146104665780635c975abb14610479578063715018a614610495575f80fd5b806341e276e914610387578063442c6724146103b3578063444d9172146103d8578063452a9320146103ff5780634fdc897314610412575f80fd5b806333bf42851161022857806333bf4285146102fe5780633ae5ef0e146103515780633b26314d146103645780633d19e88e146103775780633f4ba83a1461037f575f80fd5b806311bc5315146102645780631c47165f14610294578063278ecde1146102a95780632a58b330146102bc5780632e6b86cb146102d3575b5f80fd5b600354610277906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6102a76102a2366004612158565b6106df565b005b6102a76102b7366004612189565b6107e1565b6102c560075481565b60405190815260200161028b565b6006546102e6906001600160601b031681565b6040516001600160601b03909116815260200161028b565b61033261030c366004612189565b600d6020525f90815260409020546001600160601b03811690600160601b900460ff1682565b604080516001600160601b03909316835290151560208301520161028b565b6102a761035f3660046121a0565b61093e565b600554610277906001600160a01b031681565b6102c5610bf6565b6102a7610c62565b60065461039e90600160601b900463ffffffff1681565b60405163ffffffff909116815260200161028b565b61039e6103c1366004612214565b60096020525f908152604090205463ffffffff1681565b6102777f00000000000000000000000024eb4103ea447ae25a333ce6c0099e53fd09e04881565b600454610277906001600160a01b031681565b61039e610420366004612189565b600e6020525f908152604090205463ffffffff1681565b6102a76104453660046121a0565b610c74565b600254610277906001600160a01b031681565b6102c560085481565b6102a7610474366004612247565b610de6565b5f54600160a01b900460ff16604051901515815260200161028b565b6102a7610e4e565b6102a7610e5f565b6102c56104b3366004612189565b610eaa565b6102a76104c6366004612214565b610ed6565b6102a76104d9366004612214565b610f60565b5f546001600160a01b0316610277565b6102c56104fc366004612189565b610fea565b6102a761050f366004612276565b611005565b6102c5600b5481565b61059d61052b366004612189565b600c6020525f90815260409020805460018201546002909201546001600160a01b03821692600160a01b9092046001600160601b031691906001600160401b0380821691600160401b810490911690600160801b810460ff90811691600160881b8104821691600160901b9091041688565b60405161028b9897969594939291906122eb565b6102a76105bf366004612189565b6110f5565b6102a76105d2366004612351565b6112c8565b6102a76105e5366004612214565b611389565b60055461060490600160a01b90046001600160401b031681565b6040516001600160401b03909116815260200161028b565b610604611c2081565b6102a7610633366004612391565b611413565b600a5461039e9063ffffffff1681565b61065b610656366004612189565b61158c565b60405161028b91906123ba565b60055461039e90600160e01b900463ffffffff1681565b6102a761068d366004612214565b61169f565b6102a76106a0366004612214565b6116d9565b6102777f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881565b6102a76106da36600461244f565b61173c565b6106e76117ff565b6001600160a01b03811661070e5760405163d92e233d60e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107769190612475565b90505f7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316846001600160a01b0316146107b857816107c5565b600b546107c590836124a0565b90506107db6001600160a01b038516848361182b565b50505050565b6107e961188a565b5f818152600c6020526040902060016002820154600160801b900460ff166003811115610818576108186122b7565b1461085457818160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b60405180910390fd5b6002810154600160401b90046001600160401b031642116108a657600281015460405163ec63058960e01b815260048101849052600160401b9091046001600160401b0316602482015260440161084b565b6002810154600160881b900460ff16156108d657604051637e62addd60e01b81526004810183905260240161084b565b6108df816118b4565b8054604051600160a01b82046001600160601b031681526001600160a01b039091169083907fe18debf292fbfc1f009a15d4e4932c1da2be34d7343f86f50989d09a04571e1b9060200160405180910390a35061093b60018055565b50565b6109466117ff565b61094e61188a565b5f838152600c6020526040902060016002820154600160801b900460ff16600381111561097d5761097d6122b7565b146109b057838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b5f8290036109d15760405163db72b02360e01b815260040160405180910390fd5b60028101545f906109ee90611c20906001600160401b03166124cd565b9050806001600160401b0316421015610a2c576040516312fdd81560e01b8152600481018690526001600160401b038216602482015260440161084b565b60405163fe9a5ecf60e01b8152600481018690525f907f00000000000000000000000024eb4103ea447ae25a333ce6c0099e53fd09e0486001600160a01b03169063fe9a5ecf90602401602060405180830381865afa158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab59190612475565b90508015610ae057604051634e2e295d60e11b8152600481018790526024810182905260440161084b565b6002830154600160881b900460ff1615610b805760028301805460ff60801b1916600360801b1790558254610b1d906001600160a01b0316611939565b82546040516001600160a01b0382169188917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610b7091600160a01b9091046001600160601b0316908a908a906124ed565b60405180910390a3505050610be8565b610b89836118b4565b82546040516001600160a01b0382169188917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610bdc91600160a01b9091046001600160601b0316908a908a906124ed565b60405180910390a35050505b610bf160018055565b505050565b5f80600e81610c08620151804261252b565b815260208101919091526040015f205460055463ffffffff9182169250600160e01b900416811015610c5457600554610c4f908290600160e01b900463ffffffff1661254a565b610c56565b5f5b63ffffffff1691505090565b610c6a6117ff565b610c726119b3565b565b610c7c61188a565b6003546001600160a01b03163314610ca75760405163fb777b1160e01b815260040160405180910390fd5b5f838152600c6020526040902060016002820154600160801b900460ff166003811115610cd657610cd66122b7565b14610d0957838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b6002810154600160881b900460ff16610d3757604051625396db60e81b81526004810185905260240161084b565b5f829003610d585760405163db72b02360e01b815260040160405180910390fd5b60028101805460ff60801b1916600360801b1790558054610d81906001600160a01b0316611939565b80546040516001600160a01b0382169186917ff41c8928bb462cbb7672a128cc0787f74d1e4dd14ab43e0fd37b44d12c769c8691610dd491600160a01b9091046001600160601b031690889088906124ed565b60405180910390a350610bf160018055565b610dee6117ff565b600a546040805163ffffffff928316815291831660208301527f97fb393df7c7c075c7e8a23b6006352cd55c78abd1e507146434c3d1d5563904910160405180910390a1600a805463ffffffff191663ffffffff92909216919091179055565b610e566117ff565b610c725f611a07565b6004546001600160a01b03163314801590610e8457505f546001600160a01b03163314155b15610ea257604051630fd901ef60e01b815260040160405180910390fd5b610c72611a56565b5f610eb3611a98565b610ebb61188a565b610ec6826001611ac2565b9050610ed160018055565b919050565b610ede6117ff565b6001600160a01b038116610f055760405163d92e233d60e01b815260040160405180910390fd5b6005546040516001600160a01b038084169216907f54faf859f8b04a3fce57f3bf185c6dcb0df7cdf90060a9617bcc9334e9d785ab905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b610f686117ff565b6001600160a01b038116610f8f5760405163d92e233d60e01b815260040160405180910390fd5b6004546040516001600160a01b038084169216907f064d28d3d3071c5cbc271a261c10c2f0f0d9e319390397101aa0eb23c6bad909905f90a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b5f610ff3611a98565b610ffb61188a565b610ec6825f611ac2565b61100d6117ff565b80801561102857506006546001600160601b03908116908316115b1561105d57600654604051638b8675a560e01b81526001600160601b038085166004830152909116602482015260440161084b565b6040805180820182526001600160601b0384811680835284151560208085018281525f8a8152600d83528790209551865491511515600160601b026cffffffffffffffffffffffffff199092169516949094179390931790935583519081529081019190915284917fdfa51c82a47110ff7ce47e4c65b8142842c7ec1c1924636b13470181203e2c02910160405180910390a2505050565b6110fd61188a565b6003546001600160a01b031633146111285760405163fb777b1160e01b815260040160405180910390fd5b5f818152600c6020526040902060016002820154600160801b900460ff166003811115611157576111576122b7565b1461118a57818160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b6002810154600160881b900460ff16156111ba57604051637e62addd60e01b81526004810183905260240161084b565b6002810154600160401b90046001600160401b031642111561120d57600281015460405163ec63058960e01b815260048101849052600160401b9091046001600160401b0316602482015260440161084b565b8054600282018054600160881b60ff60881b19909116179055600b8054600160a01b9092046001600160601b0316918291905f9061124c9084906124a0565b9091555061128690506001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16816338361182b565b604051818152339084907f76ed9929ad3093112b3005cd531f7a4280baaebf560dffc358c7ac3c738734879060200160405180910390a3505061093b60018055565b6112d06117ff565b8063ffffffff165f036112f657604051630b93c23d60e31b815260040160405180910390fd5b600580546001600160e01b0316600160e01b63ffffffff86811691820292909217909255600680546001600160601b0386166001600160801b03199091168117600160601b938616938402179091556040805193845260208401919091528201527f9a342b9359e713295c2d48257359e0e34ecbd076ad9b4d28759fd7835a7208f89060600160405180910390a1505050565b6113916117ff565b6001600160a01b0381166113b85760405163d92e233d60e01b815260040160405180910390fd5b6002546040516001600160a01b038084169216907ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03905f90a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b0316331461143e57604051631f0853c160e21b815260040160405180910390fd5b61144661188a565b5f838152600c6020526040902060016002820154600160801b900460ff166003811115611475576114756122b7565b146114a857838160020160109054906101000a900460ff16604051637c22d34560e11b815260040161084b9291906124b9565b805460028201805460ff60801b198116600160811b17909155600160a01b82046001600160601b031691600160881b90910460ff16906114f0906001600160a01b0316611939565b806115455781600b5f82825461150691906124a0565b9091555050600554611545906001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168811691168461182b565b604080518681526020810186905287917fb547dcb7300e27a54b8f46a9d11ef86fc9e3cc3822cb77c4bfc00e35d93fb53b910160405180910390a2505050610bf160018055565b60408051610100810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091525f828152600c602090815260409182902082516101008101845281546001600160a01b0381168252600160a01b90046001600160601b03169281019290925260018101549282019290925260028201546001600160401b038082166060840152600160401b820416608083015290919060a0830190600160801b900460ff16600381111561165c5761165c6122b7565b600381111561166d5761166d6122b7565b81526002919091015460ff600160881b8204811615156020840152600160901b90910416151560409091015292915050565b6116a76117ff565b6001600160a01b0381166116d057604051631e4fbdf760e01b81525f600482015260240161084b565b61093b81611a07565b6116e16117ff565b6003546040516001600160a01b038084169216907f7300644728ff5d8b1edc830268697a431e2a947836fbf29cdaaf10e6aa7746f8905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6117446117ff565b603c816001600160401b031610806117665750610e10816001600160401b0316115b1561178457604051631ffb86f160e21b815260040160405180910390fd5b600554604080516001600160401b03600160a01b9093048316815291831660208301527fed6aaaa82e25ab6c4364f383fe9a53a89891df4e49530257706e7d5090d39bff910160405180910390a1600580546001600160401b03909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b5f546001600160a01b03163314610c725760405163118cdaa760e01b815233600482015260240161084b565b6040516001600160a01b03838116602483015260448201839052610bf191859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612074565b6002600154036118ad57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b805460028201805460ff60801b1916600360801b1790556001600160601b03600160a01b820416906001600160a01b03166118ee81611939565b81600b5f8282546118ff91906124a0565b90915550610bf190506001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16816828461182b565b600160085f82825461194b91906124a0565b90915550506001600160a01b0381165f9081526009602052604090205463ffffffff1680156119af5761197f60018261254a565b6001600160a01b0383165f908152600960205260409020805463ffffffff191663ffffffff929092169190911790555b5050565b6119bb6120e0565b5f805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611a5e611a98565b5f805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586119ea3390565b5f54600160a01b900460ff1615610c725760405163d93c066560e01b815260040160405180910390fd5b5f828152600d602090815260408083208151808301909252546001600160601b0381168252600160601b900460ff16151591810182905290611b1a57604051633567933360e11b81526004810185905260240161084b565b60065481516001600160601b0391821691161115611b63578051600654604051638b8675a560e01b81526001600160601b0392831660048201529116602482015260440161084b565b5f611b71620151804261252b565b5f818152600e602052604090205460055491925063ffffffff90811691600160e01b9004168110611bc7576005546040516378cbcd5360e11b8152600160e01b90910463ffffffff16600482015260240161084b565b600654600854600160601b90910463ffffffff1611611c0b5760065460405163703199d760e01b8152600160601b90910463ffffffff16600482015260240161084b565b600a5463ffffffff1615801590611c3c5750600a54335f9081526009602052604090205463ffffffff918216911610155b15611c6657600a54604051630f97f7db60e01b815263ffffffff909116600482015260240161084b565b6040516370a0823160e01b81523060048201525f907f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316906370a0823190602401602060405180830381865afa158015611cca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cee9190612475565b8451909150611d34906001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1681690339030906001600160601b0316612109565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16816906370a0823190602401602060405180830381865afa158015611d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbe9190612475565b611dc891906124a0565b85519091506001600160601b03168114611df55760405163bcca95c160e01b815260040160405180910390fd5b60078054905f611e0483612567565b909155506005549096505f90611e2a90600160a01b90046001600160401b0316426124cd565b604080516101008101825233815288516001600160601b031660208201529081018b90526001600160401b0342811660608301528216608082015290915060a08101600181525f60208083018290528b15156040938401528a8252600c8152908290208351918401516001600160601b0316600160a01b026001600160a01b03909216919091178155908201516001820155606082015160028201805460808501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911780825560a0840151919060ff60801b1916600160801b836003811115611f1b57611f1b6122b7565b021790555060c08201516002909101805460e0909301511515600160901b0260ff60901b19921515600160881b029290921661ffff60881b1990931692909217179055611f6984600161257f565b5f868152600e60205260408120805463ffffffff191663ffffffff93909316929092179091556008805460019290611fa290849061259c565b9091555050335f908152600960205260408120805460019290611fcc90849063ffffffff1661257f565b92506101000a81548163ffffffff021916908363ffffffff160217905550855f01516001600160601b0316600b5f828254612007919061259c565b90915550508551604080516001600160601b0390921682526001600160401b0383166020830152891515908201528990339089907fde0e222b8480b92aceb27f2999b52f957061b2873ac0c4a9c67a0c426bca95ad9060600160405180910390a450505050505092915050565b5f8060205f8451602086015f885af180612093576040513d5f823e3d81fd5b50505f513d915081156120aa5780600114156120b7565b6001600160a01b0384163b155b156107db57604051635274afe760e01b81526001600160a01b038516600482015260240161084b565b5f54600160a01b900460ff16610c7257604051638dfc202b60e01b815260040160405180910390fd5b6040516001600160a01b0384811660248301528381166044830152606482018390526107db9186918216906323b872dd90608401611858565b80356001600160a01b0381168114610ed1575f80fd5b5f8060408385031215612169575f80fd5b61217283612142565b915061218060208401612142565b90509250929050565b5f60208284031215612199575f80fd5b5035919050565b5f805f604084860312156121b2575f80fd5b8335925060208401356001600160401b03808211156121cf575f80fd5b818601915086601f8301126121e2575f80fd5b8135818111156121f0575f80fd5b876020828501011115612201575f80fd5b6020830194508093505050509250925092565b5f60208284031215612224575f80fd5b61222d82612142565b9392505050565b803563ffffffff81168114610ed1575f80fd5b5f60208284031215612257575f80fd5b61222d82612234565b80356001600160601b0381168114610ed1575f80fd5b5f805f60608486031215612288575f80fd5b8335925061229860208501612260565b9150604084013580151581146122ac575f80fd5b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b600481106122e757634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03891681526001600160601b0388166020820152604081018790526001600160401b03868116606083015285166080820152610100810161233660a08301866122cb565b92151560c082015290151560e0909101529695505050505050565b5f805f60608486031215612363575f80fd5b61236c84612234565b925061237a60208501612260565b915061238860408501612234565b90509250925092565b5f805f606084860312156123a3575f80fd5b505081359360208301359350604090920135919050565b5f6101008201905060018060a01b0383511682526001600160601b0360208401511660208301526040830151604083015260608301516001600160401b038082166060850152806080860151166080850152505060a083015161242060a08401826122cb565b5060c083015161243460c084018215159052565b5060e083015161244860e084018215159052565b5092915050565b5f6020828403121561245f575f80fd5b81356001600160401b038116811461222d575f80fd5b5f60208284031215612485575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156124b3576124b361248c565b92915050565b8281526040810161222d60208301846122cb565b6001600160401b038181168382160190808211156124485761244861248c565b6001600160601b038416815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8261254557634e487b7160e01b5f52601260045260245ffd5b500490565b63ffffffff8281168282160390808211156124485761244861248c565b5f600182016125785761257861248c565b5060010190565b63ffffffff8181168382160190808211156124485761244861248c565b808201808211156124b3576124b361248c56fea26469706673582212203f8fb863bf5f707a22e563b3e497e5d7980ecf13f99429cdb7be346ac74cfe8a64736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Global Dollar (USDG) | USDG | 26.475 | $1 | $26.48 |
| Global Dollar (USDG) | USDG | 2 | $1 | $2 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x170f98…18c0cd | 26 days agoTue, 21 Jul 2026 17:11:15 UTC | 0xb547dc…b53b | [0] 0x000000000000…0000000a data: 0x000000000000000000…ade787a0 |
| 0x63740f…ff67b1 | 26 days agoTue, 21 Jul 2026 17:10:43 UTC | 0x76ed99…3487 | [0] 0x000000000000…0000000a [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0x012263…008cd7 | 26 days agoTue, 21 Jul 2026 17:10:38 UTC | 0xde0e22…95ad | [0] 0x000000000000…0000000a [1] 0x000000000000…1ad0625b [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0x9211c2…b61251 | 26 days agoTue, 21 Jul 2026 16:02:16 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000009 data: 0x000000000000000000…563b7a6f |
| 0x47fd49…3a4ac3 | 26 days agoTue, 21 Jul 2026 16:02:00 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000009 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0xd5f543…ccc236 | 26 days agoTue, 21 Jul 2026 16:01:54 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000009 [1] 0x000000000000…c64d2a6f [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0xe00c4d…781bb0 | 26 days agoTue, 21 Jul 2026 15:59:53 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000008 data: 0x000000000000000000…62621e44 |
| 0x3e7cc5…f5bd72 | 26 days agoTue, 21 Jul 2026 15:59:40 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000008 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0x9b6632…bb7fa3 | 26 days agoTue, 21 Jul 2026 15:59:31 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000008 [1] 0x000000000000…c64d2a6f [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0xe6d591…090be6 | 26 days agoTue, 21 Jul 2026 15:55:11 UTC | 0xfbe5b6…ad03 | [0] 0x000000000000…330bfce9 [1] 0x000000000000…5a822144 |
| 0xcb018f…89f32d | 26 days agoTue, 21 Jul 2026 15:53:45 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000007 data: 0x000000000000000000…4168dfcd |
| 0x4ee9d9…28fc3d | 26 days agoTue, 21 Jul 2026 15:53:30 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000007 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0x9df940…5436eb | 26 days agoTue, 21 Jul 2026 15:53:27 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000007 [1] 0x000000000000…c64d2a6f [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0x8dd9e0…46b11b | 26 days agoTue, 21 Jul 2026 15:38:37 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000006 data: 0x000000000000000000…2689a915 |
| 0xe9c88d…7033f6 | 26 days agoTue, 21 Jul 2026 15:38:18 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000006 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0x55102f…24d0d8 | 26 days agoTue, 21 Jul 2026 15:38:15 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000006 [1] 0x000000000000…d7157dac [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0x353ae2…5737fe | 26 days agoTue, 21 Jul 2026 15:32:05 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000005 data: 0x000000000000000000…8218fb98 |
| 0x21f0c9…687689 | 26 days agoTue, 21 Jul 2026 15:31:46 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000005 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0xa14fad…1569be | 26 days agoTue, 21 Jul 2026 15:31:44 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000005 [1] 0x000000000000…d7157dac [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| 0x82bcd3…767520 | 26 days agoTue, 21 Jul 2026 07:24:28 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000004 data: 0x000000000000000000…236a2d11 |
| 0xb06e80…c666cb | 26 days agoTue, 21 Jul 2026 07:24:15 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000004 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0623a7c0 |
| 0xac086c…4562b9 | 26 days agoTue, 21 Jul 2026 07:24:07 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000004 [1] 0x000000000000…a7f70d07 [2] 0x77617465725f…00000000 data: 0x000000000000000000…00000000 |
| 0x706a0f…c03acb | 26 days agoTue, 21 Jul 2026 04:27:14 UTC | 0xb547dc…b53b | [0] 0x000000000000…00000003 data: 0x000000000000000000…2d16d92a |
| 0xbe8fa3…41e2df | 26 days agoTue, 21 Jul 2026 04:27:00 UTC | 0x76ed99…3487 | [0] 0x000000000000…00000003 [1] 0x000000000000…d7157dac data: 0x000000000000000000…0328b740 |
| 0x011da8…295f20 | 26 days agoTue, 21 Jul 2026 04:26:55 UTC | 0xde0e22…95ad | [0] 0x000000000000…00000003 [1] 0x000000000000…70293057 [2] 0x706f6b656d6f…00000000 data: 0x000000000000000000…00000000 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x63740f…ff67b1 | drawForOpen | 15,732,172 | 26 days agoTue, 21 Jul 2026 17:10:43 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000391 | |
| 0x012263…008cd7 | buy | 15,732,126 | 26 days agoTue, 21 Jul 2026 17:10:38 UTC | 0xf3cc…625b | IN | PackSale | $0.000 ETH | 0.00001554 | |
| 0x47fd49…3a4ac3 | drawForOpen | 15,691,004 | 26 days agoTue, 21 Jul 2026 16:02:00 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000382 | |
| 0xd5f543…ccc236 | buy | 15,690,945 | 26 days agoTue, 21 Jul 2026 16:01:54 UTC | 0x2b8f…2a6f | IN | PackSale | $0.000 ETH | 0.00001474 | |
| 0x3e7cc5…f5bd72 | drawForOpen | 15,689,614 | 26 days agoTue, 21 Jul 2026 15:59:40 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000381 | |
| 0x9b6632…bb7fa3 | buy | 15,689,530 | 26 days agoTue, 21 Jul 2026 15:59:31 UTC | 0x2b8f…2a6f | IN | PackSale | $0.000 ETH | 0.00001519 | |
| 0xe6d591…090be6 | setOperator | 15,686,931 | 26 days agoTue, 21 Jul 2026 15:55:11 UTC | 0x3b67…1884 | IN | PackSale | $0.000 ETH | 0.00000195 | |
| 0x4ee9d9…28fc3d | drawForOpen | 15,685,921 | 26 days agoTue, 21 Jul 2026 15:53:30 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000381 | |
| 0x9df940…5436eb | buy | 15,685,899 | 26 days agoTue, 21 Jul 2026 15:53:27 UTC | 0x2b8f…2a6f | IN | PackSale | $0.000 ETH | 0.00001505 | |
| 0xe9c88d…7033f6 | drawForOpen | 15,676,806 | 26 days agoTue, 21 Jul 2026 15:38:18 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000380 | |
| 0x55102f…24d0d8 | buy | 15,676,774 | 26 days agoTue, 21 Jul 2026 15:38:15 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00001465 | |
| 0x21f0c9…687689 | drawForOpen | 15,672,894 | 26 days agoTue, 21 Jul 2026 15:31:46 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000392 | |
| 0xa14fad…1569be | buy | 15,672,873 | 26 days agoTue, 21 Jul 2026 15:31:44 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00001483 | |
| 0xb06e80…c666cb | drawForOpen | 15,381,079 | 26 days agoTue, 21 Jul 2026 07:24:15 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000351 | |
| 0xac086c…4562b9 | buy | 15,381,002 | 26 days agoTue, 21 Jul 2026 07:24:07 UTC | 0x3baa…0d07 | IN | PackSale | $0.000 ETH | 0.00001358 | |
| 0xbe8fa3…41e2df | drawForOpen | 15,275,055 | 26 days agoTue, 21 Jul 2026 04:27:00 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000355 | |
| 0x011da8…295f20 | buy | 15,275,006 | 26 days agoTue, 21 Jul 2026 04:26:55 UTC | 0xfdeb…3057 | IN | PackSale | $0.000 ETH | 0.00001478 | |
| 0xca6f95…00b51d | drawForOpen | 15,107,140 | 26 days agoMon, 20 Jul 2026 23:46:24 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000355 | |
| 0xebdb3e…1eff66 | buy | 15,107,085 | 26 days agoMon, 20 Jul 2026 23:46:19 UTC | 0x45a3…2c9c | IN | PackSale | $0.000 ETH | 0.00001354 | |
| 0x6b36a4…4a514e | refund | 15,077,175 | 26 days agoMon, 20 Jul 2026 22:56:21 UTC | 0x0077…7dac | IN | PackSale | $0.000 ETH | 0.00000377 | |
| 0x756615…73297d | buy | 15,070,900 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | 0x45a3…2c9c | IN | PackSale | $0.000 ETH | 0.00001477 | |
| 0xff3d26…25bed7 | setCaps | 15,016,218 | 27 days agoMon, 20 Jul 2026 21:14:38 UTC | 0x3b67…1884 | IN | PackSale | $0.000 ETH | 0.00000174 | |
| 0x22007d…90fa86 | setMachine | 15,016,169 | 27 days agoMon, 20 Jul 2026 21:14:33 UTC | 0x3b67…1884 | IN | PackSale | $0.000 ETH | 0.00000287 | |
| 0x16e973…7a60d9 | setMachine | 15,016,142 | 27 days agoMon, 20 Jul 2026 21:14:31 UTC | 0x3b67…1884 | IN | PackSale | $0.000 ETH | 0.00000282 | |
| 0x79f534…9883ec | setMachine | 15,016,110 | 27 days agoMon, 20 Jul 2026 21:14:27 UTC | 0x3b67…1884 | IN | PackSale | $0.000 ETH | 0.00000289 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf22c0cc7…d7b701 | Transfer | 15,819,733 | 26 days agoTue, 21 Jul 2026 19:36:54 UTC | 0x8c94…ec08 | IN | 0x44ed…b750 | 16.225 USDG | Global Dollar (USDG) | |
| 0x63740f3a…ff67b1 | Transfer | 15,732,172 | 26 days agoTue, 21 Jul 2026 17:10:43 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0x012263cb…008cd7 | Transfer | 15,732,126 | 26 days agoTue, 21 Jul 2026 17:10:38 UTC | 0xf3cc…625b | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x47fd49f0…3a4ac3 | Transfer | 15,691,004 | 26 days agoTue, 21 Jul 2026 16:02:00 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0xd5f543c4…ccc236 | Transfer | 15,690,945 | 26 days agoTue, 21 Jul 2026 16:01:54 UTC | 0x2b8f…2a6f | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x3e7cc5bb…f5bd72 | Transfer | 15,689,614 | 26 days agoTue, 21 Jul 2026 15:59:40 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0x9b66322d…bb7fa3 | Transfer | 15,689,530 | 26 days agoTue, 21 Jul 2026 15:59:31 UTC | 0x2b8f…2a6f | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x4ee9d925…28fc3d | Transfer | 15,685,921 | 26 days agoTue, 21 Jul 2026 15:53:30 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0x9df940ff…5436eb | Transfer | 15,685,899 | 26 days agoTue, 21 Jul 2026 15:53:27 UTC | 0x2b8f…2a6f | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0xe9c88d18…7033f6 | Transfer | 15,676,806 | 26 days agoTue, 21 Jul 2026 15:38:18 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0x55102f3e…24d0d8 | Transfer | 15,676,774 | 26 days agoTue, 21 Jul 2026 15:38:15 UTC | 0x0077…7dac | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x21f0c941…687689 | Transfer | 15,672,894 | 26 days agoTue, 21 Jul 2026 15:31:46 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0xa14fad5c…1569be | Transfer | 15,672,873 | 26 days agoTue, 21 Jul 2026 15:31:44 UTC | 0x0077…7dac | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x2b15c26b…c04795 | Transfer | 15,527,524 | 26 days agoTue, 21 Jul 2026 11:29:07 UTC | 0x8c94…ec08 | IN | 0x44ed…b750 | 10.25 USDG | Global Dollar (USDG) | |
| 0xb06e800a…c666cb | Transfer | 15,381,079 | 26 days agoTue, 21 Jul 2026 07:24:15 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $103.33103 USDG | Global Dollar (USDG) | |
| 0xac086cce…4562b9 | Transfer | 15,381,002 | 26 days agoTue, 21 Jul 2026 07:24:07 UTC | 0x3baa…0d07 | IN | 0x44ed…b750 | $103.33103 USDG | Global Dollar (USDG) | |
| 0xc205bfb5…19b689 | Transfer | 15,355,801 | 26 days agoTue, 21 Jul 2026 06:41:58 UTC | 0xd2e4…b70c | IN | 0x44ed…b750 | 2 USDG | Global Dollar (USDG) | |
| 0xbe8fa33b…41e2df | Transfer | 15,275,055 | 26 days agoTue, 21 Jul 2026 04:27:00 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0x011da894…295f20 | Transfer | 15,275,006 | 26 days agoTue, 21 Jul 2026 04:26:55 UTC | 0xfdeb…3057 | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0xca6f95ea…00b51d | Transfer | 15,107,140 | 26 days agoMon, 20 Jul 2026 23:46:24 UTC | 0x44ed…b750 | OUT | 0x0077…7dac | $53.1753 USDG | Global Dollar (USDG) | |
| 0xebdb3e57…1eff66 | Transfer | 15,107,085 | 26 days agoMon, 20 Jul 2026 23:46:19 UTC | 0x45a3…2c9c | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) | |
| 0x6b36a4b8…4a514e | Transfer | 15,077,175 | 26 days agoMon, 20 Jul 2026 22:56:21 UTC | 0x44ed…b750 | OUT | 0x45a3…2c9c | $53.1753 USDG | Global Dollar (USDG) | |
| 0x75661573…73297d | Transfer | 15,070,900 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | 0x45a3…2c9c | IN | 0x44ed…b750 | $53.1753 USDG | Global Dollar (USDG) |