Skip to content

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

LIVE

6

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.

STEP 01

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.

PDA: seeds = ["plan", merchant, plan_id.le]
amount > 0 · period > 0 · immutable
STEP 02

2 · You subscribe in one click

Your wallet signs approve (delegate = subscription PDA, capped at 1 period) plus subscribe — atomically, in one transaction.

ix 1: approve(sub-PDA, allowance) // wallet
ix 2: subscribe() → Active, last_paid_at = 0
STEP 03

3 · The contract charges every period

charge goes through only when now ≥ last_paid_at + period. Cancel anytime — revoke + cancel.

ix: transfer_checked(amount) · sub-PDA signer
Security: CPI signed by Subscription PDA

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.

Create a plan

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 · auditable

Hard 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 promises

Agent-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.

  1. 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.

  2. 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.

  3. 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 each

Hackathon Proofs & Judge FAQ

Short answers, each backed by a mechanism you can verify on-chain or in the repo.

  1. 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 · delegate ATA stays yours · delegate == 1 period
  2. How 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.

    cancel + revoke state → Cancelled · revoke(delegate) Open /manage →
  3. 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 mint plan.mint any SPL · decimals on-chain
  4. Is 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-configured RPC · 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.

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

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.

No redirects from X
Phantom & Solflare native
plan_id parametrized in the URL
Metadata preview in Discord
Iugis solana actions preview
solana-action:// actions spec ready

Subscribe: 15 8bL6…XPTX / 30 days

merchant 3XiJ…pYch · blink preview · self-hosted

view action JSON

native in Phantom & Solflare