Programmable Economics
NorthStar sessions are gasless by default on devnet — but that's just one configuration of a fully-programmable fee market. Operators set their own economics per session: any fee schedule, any token, any revenue split.
What's configurable per session
Every session opens with a FeeStructure parameter that decides:
Fee level — gasless, sub-cent, or any amount the operator chooses.
Fee token — SOL, USDC, the operator's own SPL token, or no token at all.
Revenue split — the slice that goes to the grid operator vs. the protocol.
Per-instruction overrides — different fee bands per workload (place_intent vs. settle_intent vs. data feeds).
The default zero_fee_structure() is a useful starting point for marketing demos and developer-experience flows. Production grids will run their own.
Why programmable fees matter
Three direct consequences:
Builders set their own runway. A team running a market-data feed can charge per-read in their own token; a privacy-focused DeFi venue can charge premium fees for sealed-bid auctions; an agent-sandbox operator can subsidize the agent's transactions to remove user friction.
Aggregators and wallets become operators. A wallet that opens grids on behalf of users captures a share of the fees on every transaction in that grid. New revenue stream, no separate validator infrastructure.
No protocol-level rent. The protocol's take is a parameter, not a fixed tax. Operators can run thin margins for high-volume workloads or fat margins for premium ones.
API surface
The FeeStructure is a parameter on the Portal program's OpenSession instruction. The full schema lives in the SDK reference. A typical opening for a custom-fee grid looks like:
Roadmap
The SDK exposure of custom-fee configuration is tracked in ENG-6886. Three deliverables under that umbrella:
SDK + docs surface for what's already supported.
Custom-token fees (USDC + arbitrary SPL).
Revenue capture for grid operators.
See also
Sessions — what a session is and what's bound to one.
Settle-back guarantees — how state returns to L1 when a session closes.
Migrate from L1 — what changes when you move an existing program to a session.
Last updated
