Earn
StockKit Earn shares the revenue from the x402 pay-per-call tier with $STOCKKIT holders, every day, onchain. It is claim-based: rewards are never pushed to wallets, you claim them on the earn page during the daily claim window.
How it works
Section titled “How it works”Every settled x402 payment (USDG on Robinhood Chain, USDC on Base) is recorded into the day’s reward pool at its dollar value. The pool is split pro-rata by balance across every eligible wallet and paid in USDG on Robinhood Chain.
| Time (UTC) | |
|---|---|
| Snapshot locks | 23:00 |
| Claim window opens | 00:00 |
| Claim window closes | 01:00 |
- Eligibility: hold at least 1,000,000 $STOCKKIT in a wallet at the 23:00 UTC snapshot. The snapshot locks one hour before claims open and is verified against onchain balances.
- Share: pro-rata by balance. A wallet holding 2% of all eligible $STOCKKIT receives 2% of the pool.
- Rollover: anything unclaimed when the window closes rolls into the next day’s pool. Nothing is returned to the treasury.
- Gasless claim: claiming needs one wallet signature. The payout transaction is sent by StockKit, so the claiming wallet pays no gas.
Claiming
Section titled “Claiming”The easy way is stockkit.dev/earn: connect a wallet, and if you are in the snapshot the page shows your claimable amount and a claim button during the window.
Under the hood it is three public endpoints:
# Pool, schedule and the latest epochcurl https://api.stockkit.dev/v1/earn
# Your wallet's status, including the exact message to signcurl https://api.stockkit.dev/v1/earn/status/0xYourWalletTo claim, sign the message string returned by the status endpoint
(personal_sign, EOA wallets) and post it back:
curl -X POST https://api.stockkit.dev/v1/earn/claim \ -H 'content-type: application/json' \ -d '{"address":"0xYourWallet","epoch":20260914,"signature":"0x..."}'The response contains the payout transaction hash on Robinhood Chain. If a payout transaction fails, the claim is released and you can retry within the window.
The same flow with the SDK:
import { StockKit } from "@stockkit/sdk"
const stockkit = new StockKit()
const status = await stockkit.earn.status(account.address)
if (status.epoch?.claimOpen && status.epoch.message) { // Sign with your own wallet (viem shown); the SDK never touches keys const signature = await walletClient.signMessage({ message: status.epoch.message }) const { tx, amountUsd } = await stockkit.earn.claim({ address: account.address, epoch: status.epoch.id, signature, })}- Epochs are identified by the UTC date of their snapshot, as
YYYYMMDD. - Amounts are computed in USD with 6 decimals, matching USDG.
- Contract wallets (multisigs, smart accounts) are not supported for claiming yet; use an EOA.
- The snapshot is a point-in-time balance check. The eligible set and every wallet’s share are frozen at 23:00 UTC and are not affected by transfers after that.
