Docs

Every buy opens the box.

$QCAT is a memecoin on Robinhood Chain with one rule: every buy opens a box. Alive, the buyer is paid in $QUBT, a tokenized quantum-computing stock. Dead, the pot grows. This page explains exactly how, so you can check it yourself.

Overview

How a box opens

  1. You buy $QCAT on pons, on the launch curve or, after graduation, in its Uniswap v4 pool. Buys of at least the minimum (2 QUBT at launch) count.
  2. The keeper seals a box. It reads your buy from the chain and calls sealBoxes. The box records the wallet that received the $QCAT, the $QUBT you spent, and the L2 block it was sealed in. A buy is identified by its transaction hash and log index, so one buy can never get two boxes.
  3. The box opens a block later. openBoxes reads the hash of the block the box was sealed in and decides the outcome. Anyone can call it; the keeper does so automatically. If a box is not opened within 256 L2 blocks, its hash is no longer available and it is resealed to the current block.

Odds and payouts

OutcomeChancePays
Superposition1 in 50010% of the whole pot.
Alive50%The smaller of 10% of what you spent and 1% of the pot.
Dead50%Nothing. The pot keeps growing.

Payouts are sent in $QUBT to the wallet that received your $QCAT, in the same transaction that opens the box. No more than 30% of the pot can be paid out in any one hour. If a transfer fails (a stock token can refuse one), the amount is recorded as owed and you can collect it with claimOwed.

These are the launch settings. Until ownership is renounced they can be retuned within hard limits written into the contract (for example, superposition can never pay more than 25% of the pot). The current values are public: call config() on the box.

The pot

The pot is the $QUBT held by the box contract. It is filled by the $QCAT creator tax. Pons collects that tax on every trade and credits it to the box in the pons fee escrow; harvest() moves it into the pot. Anyone can call harvest(), and the keeper does it whenever fees are waiting.

Because sells pay the tax too and dead boxes pay nothing, the pot refills on its own. Because an alive box pays at most 1% of the pot, it never pays the pot to zero.

Randomness

Robinhood Chain is an Arbitrum chain, so the contract reads L2 block numbers and hashes from the ArbSys precompile. A box sealed in block N is opened with the hash of block N, which does not exist yet when the sealing transaction is sent: nobody, including the keeper, knows the outcome in advance.

seed = keccak256(abi.encode(blockHash(N), boxId, boxContract))
superposition  if seed % 500 == 0
alive          else if (seed >> 128) % 10000 < 5000
dead           otherwise

Every outcome can be recomputed from public chain data.

Contracts

Box (proxy)0x425d0aeb61e028D0F2647266c7843Ee85A175B0f
$QUBT0x59818904ab4cE163b3cE4FfB64f2D6Ca02c434B4
$QCATShown on the home page once launched.
ChainRobinhood Chain, chain id 4663

Useful reads

Ownership and safety

The box is an upgradeable (UUPS) contract so that it can be fixed during launch if anything goes wrong. Until ownership is renounced, the owner can:

The plan is to renounce ownership as soon as the first boxes are confirmed to open and pay correctly. After that nobody can upgrade, retune or withdraw. The home page reads owner() live, so you can see which state it is in.

A separate guardian role can only pause and replace the keeper. It exists so that a compromised keeper can be stopped even after ownership is renounced, and it can be removed for good with renounceGuardian().

The keeper

Buys happen on pons, not in the box contract, so a keeper watches the chain for $QCAT buys and seals a box for each one. It is stateless: its scan position is stored in the contract (scannedBlock), so it can restart at any time without skipping or repeating a buy. It runs every minute; opening itself is permissionless, so anyone can call openBoxes at any time.

Risks