Solana • recurring payments on-chain
Subscriptions that live on-chain
You approve a single SPL delegate capped at one period — the contract pulls exactly one charge per period, and funds stay in your wallet until then.
Live on Solana devnet Program: 2jK5…vJuw
Plan count
LIVE6
plans on-chain
getProgramAccounts · live
Cost per charge
1 tx
per period
1 tx per period · 0.4% protocol fee + ~0.000005 SOL network fee
Security model
0
custody
funds stay in your ATA
Blinks integration
blink‑ready
4 actions · self-hosted
Compatible with Twitter/X
Zero Custody · SPL Delegate Engine
How the Iugis architecture works
Built on the native delegation mechanism of the Solana token program — no funds are ever frozen in a vault.
1 · Merchant lists a plan
Put a mint, amount and billing period into a plan PDA — one merchant, many plans namespaced by plan_id. Terms are immutable, so a new price is simply a new plan.
2 · You subscribe in one click
Your wallet signs approve (delegate = subscription PDA, capped at 1 period) plus subscribe — atomically, in one transaction.
3 · The contract charges every period
charge goes through only when now ≥ last_paid_at + period. Cancel anytime — revoke + cancel.
live delegate flow · model b
Live plans
On-chain data. Subscribing = approve + subscribe in a single transaction.
No plans in your own program yet?
Create your first plan on the Merchant page — it appears here once the transaction confirms on-chain.
on-chain proofs · live numbers
Proofs, not promises
Every figure below comes from the chain or the database. Empty states show a dash — never a mock.
Settled volume (test mint)
recorded charges · live
6
Live plans
getProgramAccounts · live
1
Merchants
distinct plan authorities
Sums recorded charge amounts as 6-decimal base units. Mixed mints add up raw — GET /api/stats/volume
Recent on-chain activity via Helius webhook · devnet
No on-chain events since webhook registration.
arbitrage & economic superiority
receipt · 4 metrics · auditableHard comparison table vs Stripe & TradFi
The same collection, three rails. Protocol mechanics — not marketing — decide each cell.
| Collection metric | Iugis | Stripe Billing | TradFi Direct Debit |
|---|---|---|---|
| Collection fee | 0.4% 40 bps to the protocol treasury; ~$0.000005 network fee per charge | 2.9% + $0.30 per successful card charge | ~1.5% plus per-return fees |
| Settlement finality | <400ms one transaction per period | T+2 card payout delay | T+2 SEPA / ACH clearing |
| Chargebacks & disputes | 0% signed delegate spend — no chargeback rail exists | 1–2% disputes + representment cost | reversals returns & indemnity claims |
| Custody & settlement | Zero custody funds stay in your ATA until charge day | merchant-held processor balance, then payout | bank-held batch clearing accounts |
Your savings ruler
Every unit you settle on-chain skips the card take. Estimate with your own volume — we publish the formula, not a figure:
saved ≈ volume × card_fee − volume × 0.004 − charges × $0.000005
No figure is precomputed — replace volume with your own.
strategic moat · agent control plane
3 mechanisms · 0 promisesAgent-Control-Plane: rails for autonomous AI payers
Only mechanisms that exist on-chain today. An agent gets exactly the leash the protocol enforces — nothing more.
-
Spending limits that hold
The approve delegate is capped at exactly one period. An agent can never move more than the next charge — the cap is enforced by the token program, not by a promise.
-
Domain allowlists
Sell on your own site: bind a domain to a plan and foreign origins get a 403. Your checkout widget only works where you allow it.
-
Kill-switch in one click
Cancel sets the subscription to Cancelled and revokes the delegate. From then on every charge fails — the agent is cut off instantly.
Open kill-switch (/manage)
judges · evaluation desk
docket · 4 items · verify eachHackathon Proofs & Judge FAQ
Short answers, each backed by a mechanism you can verify on-chain or in the repo.
Who holds the subscriber funds?
Nobody but the subscriber: funds stay in their associated token account until charge day. The program only pulls one period per transaction through a delegate capped at one period.
model B · delegateATA stays yours · delegate == 1 periodHow do I revoke a subscription?
Cancel in /manage: the subscription flips to Cancelled and the SPL delegate is revoked in the same flow. Any later charge fails its clock and delegate checks, so billing stops immediately.
Can a plan use a custom mint?
Yes — a plan stores any SPL mint address with its amount and period. Decimals are read on-chain at subscribe time, so UI amounts always convert to exact raw units.
any SPL mintplan.mint any SPL · decimals on-chainIs this mainnet-ready?
The program is cluster-agnostic: RPC, program id and the Actions chain id come from env config, devnet by default. Deploy the program to mainnet, point the env at it, and the same frontend works unchanged.
env-configuredRPC · PROGRAM_ID · ACTIONS_CHAIN from env
subscribe-client-SDK · 3 lines
Recurring payments in 3 lines of code
Fetch the plan, approve + subscribe atomically, then charge every period. No SDK to install — plain Actions endpoints.
GET /api/actions/subscribe?plan=<PLAN>&mint=<MINT>&amount=<RAW> → metadata + unsigned tx POST /api/actions/subscribe # approve(sub-PDA, 1 period) + subscribe() in one atomic tx POST /api/actions/charge?plan=<PLAN>&subscriber=<WALLET> # one period via transfer_checked
Solana Actions & Blinks
One link = one subscription
Turn any action — plan, subscription, cancel, charge — into a Blink. Paste the URL on X or Discord and people pay without ever opening this site.
Subscribe: 15 8bL6…XPTX / 30 days
merchant 3XiJ…pYch · blink preview · self-hosted
native in Phantom & Solflare