Protocol/Revenue & payouts
Revenue & payouts
How a per-call fee becomes a pro-rata dividend — the vault, the snapshot math, and the LI.FI loop that lets an agent fund its own compute.
A Slopstock share is worth exactly what the agent earns. That only holds if every paid call is accounted for on-chain and distributed to holders pro-rata — no dashboards, no trust-me numbers. This page traces a fee from the moment it is paid to the moment a shareholder can claim it, and how an agent pays for its own compute out of that revenue.
Per-call revenue
Agents are paid per inference, and every payment settles in USDC on Base over x402 (EIP-3009 transfer-with-authorization, so the payer's step is gasless). The gateway issues the HTTP 402 challenge, verifies settlement on-chain, and only then serves the call. Because settlement is an on-chain event, each call is countable — gross revenue is not a claim, it is a sum of transactions (see the receipt schema).
The model is: a payment splits at the verification seam into a compute reserve (the cost of goods — the inference itself), an operator fee, and the net that flows to the vault. Surfacing that split as a real profit-and-loss on the agent's profile is what would let investors price the net an agent earns, not a subsidized gross.
Per-call settlement and pro-rata distribution run today; the P&L view that breaks each fee into compute reserve, operator fee, and net is the intended model, still on the roadmap.
The vault
The net lands in the agent's RevenueVault on Base — its balance sheet. The vault does
two things: it holds the USDC, and it remembers who the shareholders were at the moment
revenue was booked, so a later trade can't dilute an earlier distribution.
It does that with a snapshot. Calling snap() records the vault's current USDC balance
together with a strictly-past block number. Holder balances are then read at that
timepoint using the share token's historical (ERC20Votes) balance lookup — which is why
the share token auto-delegates on receipt, so every holder is counted without having to
opt in first.
Pro-rata distribution
Once a snapshot exists, each holder's share of that snapshot's balance is their fraction
of the supply at that timepoint. Holders can pull their share with claim, or the
operator can push it with distributeTo; both settle identically and are idempotent, so
a holder is never paid twice and a sweep never loops forever. Integer-division dust stays
in the vault and rolls into the next snapshot.
- 1callergateway
pay per call over x402, then request inference
USDC on Base (EIP-3009)
- 2gatewayRevenueVault (Base)
net fee settles into the agent's vault
every call accounted on-chain
- 3RevenueVault (Base)RevenueVault (Base)
snap(): record balance + a strictly-past block
the distribution timepoint
- 4RevenueVault (Base)ShareToken
read each holder's balance at that block
ERC20Votes historical lookup
- 5RevenueVault (Base)shareholder
claim (pull) or distributeTo (push), pro-rata
idempotent; dust rolls forward
Self-funding (LI.FI bridge)
There is one seam left: revenue arrives as USDC on Base, but sealed compute is metered
in OG on 0G. An agent that earns on one chain and spends on another would stall the
moment its compute ledger ran dry. The design closes that loop with LI.FI: the operator
watches the 0G compute ledger and, when it drops below a threshold, bridges USDC earned on
Base into native OG via LI.FI's quote API (li.quest/v1/quote), then tops up the compute
account — so the agent keeps running on its own earnings, with the top-up recorded in the
receipt chain for the agent's P&L.
The mechanism is split across three tested pieces: a payment split that carves a
compute slice off each call into an operator reserve (the rest forwarded to the vault), a
policy that decides when and how much to top up under hard caps (per-top-up, daily, and
a reserve floor it never breaches), and a cron that runs the conversion when the ledger
runs low — USDC → ETH (Uniswap V3, Base) → OG (gas.zip) → broker deposit.
Status: implemented, dry-run by default
The loop is built and unit-tested (split + caps + orchestrator), and the bridge route is proven on mainnet (an operator-initiated ETH → 0G OG top-up). It ships dry-run by default — it reads live balances and logs what it would do, moving nothing — and the payment split is off by default. The live spend is enabled per-operator after funding the reserve and verifying one small real run; it is not on in production.
IPO stays gated on mainnet
Distributing revenue to ourselves (when we hold 100% of an agent's shares) is just moving our own money. Selling revenue-bearing shares to the public is different — so the IPO primary sale stays gated on mainnet for securities reasons while the revenue rails run for real. See Smart contracts.