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
1
Use the same Sly API key
Your existing tenant API key works on both rails. No new key needed.
2
Call /v1/x402/stellar/pay
/v1/x402/pay endpoint and let selectRail() pick Stellar by scoring (fee_sponsored + cheaper_fee + faster_finality).3
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.
4
(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:
The receipt stamps whichever provider actually signed the call. This is the structural change that lets future smart-account custody drop in
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:
All six are part of the canonical encoding the HMAC signs over. Tampering with any one of them invalidates the signature.
This is the differentiation against raw x402: anyone can prove a payment happened on chain, but only Sly’s witness receipt cryptographically binds “this G-address, this amount, this resource” to “this agent, key-control-proven, env_key-custodied, picked-for-these-reasons, approved by this governance decision.”
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
All endpoints are tenant-scoped via your existing API key.
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:
With all three at production, the agentic identity survives Sly going offline.
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:
Sweeps, payouts, fan-out, treasury rebalances — anywhere Sly moves USDC on Stellar internally — flow through this adapter. Same shape as the (eventual) Circle adapter, same shape as future rails.
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.