Shield Protocol

Level 1 works with any SEP-24 anchor today; level 2 lets anchors deposit into the pool natively.

The Shield Protocol is built on SEP-24, SEP-10, SEP-53 and a Stellar Private Payments pool with an allow-list, a block-list and a Global View Key. The name has no brand so any anchor can adopt it.

Roles

RoleDoes
UserDerives pool keys in the wallet; spending keys never leave it
AnchorSEP-24 on-ramp: KYC, takes the fiat payment, pays the asset
ASPMaintains the pool's allow-list and block-list
AuditorHolds the Global View Key and can decrypt every note
Shield (level 1)ASP + omnibus account + SEP-24 client in front of any anchor

Level 1: Shield as middleware (implemented)

Onboarding

  1. The wallet derives the note key, the encryption key and the ASP leaf. The user does not register in the pool's public key registry, because that transaction would publish their address.
  2. The account signs the keys (SEP-53) and sends them to the ASP.
  3. After KYC, the ASP inserts the leaf into the allow-list. Blocking inserts the note key into the block-list.

Deposit

  1. Shield authenticates with the anchor (SEP-10) as its omnibus account, with an id memo for the user.
  2. Shield requests an interactive deposit (SEP-24) to its omnibus account, with a random id memo for the intent.
  3. The user pays in the anchor's widget; the anchor pays the omnibus account.
  4. Shield funds the intent only with the transaction the anchor reports (stellar_transaction_id), never just because a payment carries the memo.
  5. Shield deposits into the pool (ext_amount > 0), then transfers privately to the user (ext_amount = 0).

Level 2: native shielded deposits (draft)

The anchor deposits straight into the pool to the user's keys, which removes Shield's custody step.

stellar.toml
SHIELD_PROTOCOL_VERSION = "0.1"
SHIELD_POOL_CONTRACT = "C…"
SHIELD_ASP_ENDPOINT = "https://…"
GET /info (SEP-24)
{ "features": { "shielded_deposit": true } }
SEP-24 interactive deposit
POST /transactions/deposit/interactive
asset_code=USDC
destination_type=shielded
shielded_recipient=<note_public_key>:<encryption_public_key>

The full draft, with settlement, withdrawals, security considerations and open questions, is in docs/protocol/shield-protocol.md.