Available now on sandbox. Stellar testnet (
stellar:testnet) settlement
is live for every Sly tenant. Stellar mainnet (stellar:pubnet) ships with
production access — contact us once you’ve
worked through the production access
checklist.Why Stellar
Sly is rail-neutral by design — the four primitives (Identity, Governance, Policy, Receipts) work on any chain. Stellar is a production rail and changes the economics of agent micro-payments. Three properties matter:- Fees are sponsored. The x402.org facilitator sets
areFeesSponsored=truefor Stellar — your agent’s Stellar account doesn’t need XLM for transaction fees, only enough USDC to cover the payment itself. This is what makes sub-cent settles economically viable. - Native USDC since 2021 with deep liquidity, no bridging risk.
- The fiat edge. 475K+ MoneyGram cash-out locations, Yellowcard across 20+ African markets, Flutterwave — the routes Sly’s emerging-markets remittance story rides on.
selectRail() decision function that picks for you.
The three-layer identity stack
The Stellar rail is where Sly built out its agentic-identity thesis end-to-end. Three layers of evidence the dashboard surfaces and the receipt carries — each provable independently of the others.Sly’s full identity model is a four-facet framework that
applies across rails. This page covers the three chain-side
layers as they’re implemented on Stellar. For the unified view —
including KYA tier (the Sly-side facet) and how all four facets
bind together in the receipt envelope — see
Agentic identity.
Control
SEP-10 key-control. The agent’s Stellar keypair signs a Sly-issued challenge. Receipt stamps
agent_chain_proof: "sep10".Custody
Custody provider. The receipt names whoever signed:
env_key, oz_soroban, etc. Honest disclosure today, structurally ready for tomorrow.Discoverability
On-chain anchor. Receipt hash + schema published to Soroban via AttestProtocol. Discoverable from chain alone.
The flow
Quickstart
Call /v1/x402/stellar/pay
/v1/x402/pay endpoint and let selectRail() pick Stellar by scoring (fee_sponsored + cheaper_fee + faster_finality).Receive a signed witness receipt
Success returns HTTP 200 with the full envelope, including the three identity fields:Every highlighted field is in the canonical encoding. Every highlighted field is in the HMAC. Tampering with any one of them invalidates the signature.
(Optional) Verify the receipt offline
Receipts are HMAC-signed by Sly over a stable canonical encoding (This is the proof. The on-chain Soroban tx is the settlement; the receipt is the governance attestation that turns the on-chain movement into “agent X at KYA tier 2, with SEP-10-proven key control, custodied by env_key, paid Y under Sly governance, for resource Z, on rail picked for these three reasons.”
json-sort-keys-v1). Anyone with your tenant’s witness key can re-derive the signature without any network call:Layer 1 — Control (SEP-10 key-control proof)
Phase A baseline: every receipt named the agent. Strong, but assertive — the receipt named the G-address; it didn’t prove the agent controlled it. SEP-10 key-control binding closes that gap. The agent runs through SEP-10 Web Authentication against Sly:agent_chain_proof: "sep10". Until then, agent_chain_proof: "asserted" — and the dashboard’s Chain Bindings panel shows an amber asserted badge with a tooltip explaining what’s NOT cryptographically backed.
Where to see it:
- Receipt field:
agent_chain_proof - Dashboard:
/dashboard/agents/<id>→ KYA tab → Chain Bindings panel →✓ SEP-10 PROVENbadge - DB:
kya_chain_bindingstable (proof_method = 'sep10')
@stellar/stellar-sdk’s WebAuth.verifyChallengeTxSigners(). Standards-compliant: matches what Stellar wallets and anchors already trust.
Layer 2 — Custody (provider disclosure)
The second honesty axis. The receipt stampsagent_custody_provider with one of three values today:
| Value | What it means | Status |
|---|---|---|
env_key | Private key in env (sandbox default) | ✅ Live |
oz_soroban | OpenZeppelin Soroban smart account | 🚧 In development — receipt-side abstraction live, on-chain custody contract still being deployed |
crossmint | Crossmint-managed wallets | 📋 Future |
oz_soroban without breaking any receipt verifier — the canonical encoding handles new values by design.
Why this matters. The most common identity mistake in agentic-payment systems is conflating “the agent’s address is X” with “the agent controls X’s keys.” Layer 1 proves the agent signed once at bind time; Layer 2 discloses whether the keys still live where the binding promised, or whether they’ve moved to a smart account, custodian, etc. Both layers in the same envelope, both in the HMAC.
Layer 3 — Discoverability (AttestProtocol on Soroban)
Phase A receipts are discoverable through Sly’s API and the tenant’s database. Layer 3 makes the receipt’s existence visible from chain alone — without trusting Sly. The/v1/x402/stellar/receipts/:id/anchor route publishes the receipt hash to Soroban via AttestProtocol under Sly’s schema:
@attestprotocol/stellar-sdk returns Storage::MissingValue on first attestation against the testnet contract — an open upstream contract-initialization question we’re tracking with the AttestProtocol team. The response makes this explicit:
attestation_uid + tx_hash + explorer URL without any code change at the route surface.
In the meantime, the EAS anchor path on Base Sepolia is in production today — see Settlement on Base.
Agentic identity in the receipt (cheat sheet)
Six identity-bearing fields, in canonical-encoding order:| Field | Source | Why it matters |
|---|---|---|
agent_id | Sly | UUID — opaque identifier |
agent_name | Sly | Human-readable, audit-log-friendly |
agent_kya_tier | Sly | KYA tier at sign time. Frozen in the receipt even if the agent’s tier later changes. |
agent_chain_proof | Layer 1 | sep10 (proven) vs asserted (claimed only) |
agent_custody_provider | Layer 2 | Discloses who actually signed |
rail_selection | selectRail() | Why this rail won — auditable, replayable |
Deny artifacts also carry identity
Denied payments don’t just return an error — they return a signed artifact in the same shape. T0 agents below the minimum tier never touch the network; Sly emits a signed deny:API surface
| Endpoint | Purpose |
|---|---|
POST /v1/x402/stellar/pay | Governed payment — L1–L5 + Stellar settle + receipt mint |
GET /v1/x402/stellar/info | Network, facilitator URL, demo agent address (sandbox sanity) |
GET /v1/x402/stellar/receipts/:receipt_id | Fetch the full signed envelope by rcpt_* id |
GET /v1/x402/stellar/denies?limit=25 | Recent governance denials from the audit log |
POST /v1/x402/stellar/receipts/:id/anchor | Anchor a witness receipt hash — backend = attest-stellar (Soroban) or eas-base (Base Sepolia) |
POST /v1/agents/:id/stellar/challenge | Issue a SEP-10 chain-binding challenge |
POST /v1/agents/:id/stellar/bind | Bind a Stellar address with a signed challenge XDR |
GET /v1/agents/:id/chain-bindings | List active chain bindings for the agent (cross-rail) |
Dashboard
Stellar settlements render in/dashboard/transfers with:
- A 🌟 stellar testnet rail badge (or 🌟 stellar for mainnet)
- The Rail column on the transfers list
- An “All Rails” filter (All / Base / Base Sepolia / Stellar / Internal)
- Sly-Governed x402 Settlement block at the top
- Agentic Identity callout — agent name (linked to the agent’s detail page) with the KYA tier badge at sign time
- Counterparties — G/C address chips with click-through to stellar.expert
- Witness Receipt panel — full envelope with Download JSON and Copy verify command buttons
/dashboard/agents/<id>) reads as an identity record:
- Allowed Rails chips at the top of the header card (intersected
tenant.allowed_rails ∩ agent.allowed_rails) - Chain Bindings panel (under the KYA tab) — every chain this agent has proven key-control on, with the proof method badge. SEP-10 bindings carry a green
✓ SEP-10 PROVENbadge; asserted bindings carry an amberassertedbadge with the tooltip explaining what’s cryptographically backed and what isn’t. G-address links through to stellar.expert.
See it in action — the narrated demo
Three layers of agentic identity on Stellar
~2:10 narrated walkthrough of every Stellar layer Sly has shipped. Six beats — the new receipt with the three identity fields, the dashboard’s Chain Bindings panel with the live SEP-10 binding, the
selectRail() decision tree, and the honest framing of the AttestProtocol contract-init blocker. The demo-day asset for Epic 102 (CV Labs / Meridian Lisbon).Five layers of evidence
Verifying a Stellar settle, weakest to strongest:- Sly UI —
/dashboard/transfers/<id>(UX surface, not proof) - Sly DB — your tenant’s
transfersrow +protocol_metadata.witness_receipt - Offline receipt verify —
node verify-offline.mjs receipt.json(HMAC re-derives — identity + amount + decision + custody + rail-selection are tamper-proof) - Horizon —
curl https://horizon-testnet.stellar.org/accounts/<G>(USDC actually moved between G-addresses) - stellar.expert — direct on-chain visual confirmation of the Soroban
invoke_host_functioncall
What Phase A does NOT yet prove
Three intentional limitations and where they stand now:| Gap | Status | Tracking |
|---|---|---|
| The agent ACTUALLY controls the G-address | ✅ Shipped — agent_chain_proof: "sep10" flips on bound agents | POST /v1/agents/:id/stellar/challenge → sign → POST /stellar/bind |
| Identity discoverable from chain alone | 🟡 Wired, latent — code path complete, blocked on upstream AttestProtocol contract init | Work in progress, tracked with upstream |
| Enforced at the rail even if Sly is offline | 🟡 Abstraction shipped — oz_soroban flag in receipt, on-chain custody contract still being deployed | Work in progress |
StellarRailAdapter — the settlement-side capability
The buyer-side x402 endpoint (/v1/x402/stellar/pay) stays specialized for the protocol’s 402-challenge-then-pay flow. The underlying capability — “Sly can move USDC on Stellar” — is generalized in StellarRailAdapter, Sly’s first concrete (non-mock) RailAdapter implementation.
It exposes the same interface as Sly’s other rail adapters:
| Method | Implementation |
|---|---|
submitSettlement | Validates inputs + signs SAC USDC transfer + returns idempotent externalId |
getTransaction | Looks up tx hash via Horizon |
getTransactions | Paginated Horizon history for reconciliation |
getBalance | Classic USDC balance via Horizon /accounts/<G> |
healthCheck | Parallel ping of Horizon + Soroban RPC, 3s timeout each |
Limitations & known steps
- Sandbox uses
stellar:testnet. Mainnet (stellar:pubnet) is fully implemented and ships once your tenant has production access. - The buyer needs SAC USDC. Friendbot funds XLM; the Soroban USDC contract requires a classic USDC balance behind a trustline. Use Circle’s testnet faucet → select Stellar Testnet → paste your buyer G-address. ~1 second to land.
- Witness mode (not bilateral). Sly signs receipts alone. Bilateral ed25519 (payer + payee + Sly) ships with Epic 97.
Roadmap
Shipped
Stellar testnet + mainnet settlement · L1–L5 governance · witness receipts with full agentic identity (SEP-10, custody disclosure, rail selection) · dashboard surface · offline verification.
Work in progress
OZ Soroban smart-account custody (`oz_soroban` provider) · CCTP V2 treasury rebalance · AttestProtocol on-chain anchoring (pending upstream contract init).
Compare rails
Side-by-side: Base vs Stellar,
selectRail(), allow-list configuration.Want production Stellar?
Email us with your use case and we’ll get you onto mainnet.