Sealroom
  1. Docs
  2. Fees and distribution

Fees and distribution

Every paid call puts USDC into one lane vault. A distribution then empties the vault's available balance in a single transaction: first the protocol fee, then the model's split, which includes the operator's share. This page shows who pays what, how each amount is computed and how deferred payouts are claimed.

Who pays what

WhoPaysToWhen
CallerThe call's price in USDC (fixed per call, or metered up to a ceiling)The lane vaultOn each call
FacilitatorThe Solana network fee for each payment transactionSolanaOn each call
Anyone who distributesThe network fee for distributeSolanaWhenever a vault holds funds
Lane vaultThe protocol feeThe protocol treasuryAt distribution
Lane vaultThe rest, by the model's splitThe owner, the lane's operator, contributorsAt distribution
Model ownerNetwork fees and rent for the Model account, and for lanes it opensSolanaOn listing and when opening lanes
OperatorThe bond in USDC (returned after unbonding unless slashed), plus network fees and rent for its platforms and nodesThe bond vault, SolanaOn deposit and registration
Dispute claimantThe dispute deposit in USDCThe dispute's vaultOn opening a dispute

Fees, bonds and deposits are all USDC. The protocol fee is what buys and burns $SEALROOM; see Token.

The protocol fee

The protocol fee is 500 bps (5%) of each distribution at launch. It is taken from the lane vault at distribution, never at call time, and paid to the protocol treasury. The protocol's whole fee share is used for one thing: buying $SEALROOM on the market and burning it.

GET <api-url>/v1/parameters returns the live value as protocolFeeBps. A change to the fee is proposed by the admin multisig and can be applied 48 hours later; while one is waiting, pendingProtocolFee shows the new value and its effectiveAt time.

The operator's share

The operator's share is the operator entry in each model's split, set by the model's owner. At distribution it is paid to the payout account of the operator whose node serves the lane, so each lane pays its own operator. The deployment's suggested default is operatorShareDefaultBps in the parameters; the app's Your share, % field starts from it when you list a model.

The split

A split has 1 to 8 entries whose shares sum to 10,000 bps. Each entry pays a canonical USDC account and has a role: owner, operator, base_model or contributor. Locked entries can only be lowered with the recipient's signature, and a split change takes effect after 7 days. List a model covers both.

How a distribution is computed

distribute works on the vault's available balance: its USDC minus any amounts already held for claims. All amounts are integers in USDC base units (1 USDC = 1,000,000 base units).

available = vault_balance - reserved_for_claims fee = floor(available * protocol_fee_bps / 10000) net = available - fee share[i] = floor(net * bps[i] / 10000) share[last] = share[last] + (net - sum(share))

Every division rounds down, and the last entry of the split receives whatever the rounding left over, so the fee plus all shares always equal the available balance exactly.

The lane's activeSplit is the split used. When the model's split has changed, the lane first distributes its available balance under the split that was active when those funds arrived, then switches to the new one.

Worked example

A model costs 0.025 USDC per call. Its split is 70% to the owner, 20% to the operator and a locked 10% to the base model it was fine-tuned from. A lane on one node has served 1,000 calls, so its vault holds 25 USDC. Anyone sends distribute:

StepBase unitsUSDC
Available in the vault25,000,00025.000000
Protocol fee, 500 bps1,250,0001.250000
Net after the fee23,750,00023.750000
Owner, 7,000 bps16,625,00016.625000
Operator of this lane's node, 2,000 bps4,750,0004.750000
Base-model owner, 1,000 bps (locked)2,375,0002.375000
Total paid out25,000,00025.000000

All four transfers happen in one transaction. The model's page records the distribution with its gross amount and four recipients, and each recipient's USDC arrives in its canonical account.

Rounding example

A vault holds 101 base units, the fee is 500 bps and the split is 3,333 / 3,333 / 3,334 bps:

StepComputationBase units
Feefloor(101 × 500 / 10,000) = floor(5.05)5
Net101 − 596
Entry 1floor(96 × 3,333 / 10,000) = floor(31.9968)31
Entry 2floor(96 × 3,333 / 10,000)31
Entry 3floor(96 × 3,334 / 10,000) = 32, plus the remainder 96 − 94 = 234

5 + 31 + 31 + 34 = 101.

Deferred payouts and claims

A distribution pays each recipient directly into its canonical USDC account. A recipient whose account is missing, frozen or has changed owner cannot receive a transfer, so its share is held in the lane as a claim while every other recipient is paid normally.

  1. Prepare. A held share needs a claim account. When one is missing, the distribute preview returns CLAIM_PREPARATION_REQUIRED. Anyone sends prepare_claim with the laneId, recipientAta and recipientOwner, then distributes again.
  2. Hold. The distribution records the share against the claim and keeps it in the lane vault. The lane's claimable list shows the recipient and the amount, and its reservedAmount grows by the same sum. Later distributions leave reserved funds untouched.
  3. Claim. The recipient sends claim with the laneId and recipientAta. The funds go to the recipient's canonical USDC account, or to the destinationAta it names when the deployment's settlementPolicies.claimDestination is any_owned_usdc.

Only the recipient can claim its funds, and claims do not expire. In each distribution record, a payout shows amount (paid now), allocatedAmount (its full share) and deferredAmount (held as a claim).

Where to see it

WhatWhere
A lane's vault, total in and total distributedThe model's page, Lanes table; GET /v1/lanes/<lane>
Each distribution and its payoutsThe model's page, Distributions table; GET /v1/distributions?laneId=<lane>
A model's or operator's totalsrevenue on GET /v1/models/<model> and GET /v1/operators/<operator>
USDC distributed across SealroomThe Registry page, Distributed, USDC; GET /v1/summary
The protocol fee and pending changesGET /v1/parameters