sha256(kyc_document) and anchors it on-chain via XLS-70 NFT. Raw PII never leaves the institution's systems. v2: XLS-96 confidential balances + MPT selective disclosure — XRPL native, zero breaking changes.tfBurnable only, not transferable. Burns atomically with EscrowFinish in F·06, making replay structurally impossible.DuplicatePolicyError · VaultCapExceededError · CredentialExpiredError.health_ratio < 1.5, it requires 3 consecutive ledger closes before firing a verified default event — preventing single-block manipulation, flash crashes, and oracle noise.ClaimRejectedError with reason code and failed check index.account_nfts query · Error: NFT_NOT_FOUNDcurrent_ledger_index < expiry_ledger (from NFT URI) · Error: POLICY_EXPIREDVAULT_MISMATCHlsfLoanDefault across 3 closes · Error: DEFAULT_NOT_CONFIRMEDcollateral_value / loan_value < 1.5 · Error: COLLATERAL_SUFFICIENTESCROW_ALREADY_PENDINGKYC_CREDENTIAL_INVALIDDOMAIN_NOT_AUTHORIZEDRATE_LIMIT_EXCEEDEDClaimRejectedError(reason_code, failed_check). No off-chain data source required or permitted at any step.FinishAfter.| Phase | XRPL State Change | Transaction | Signer | Ward Signs? |
|---|---|---|---|---|
| Vault registered | XLS-66 vault object + XLS-80 domain entry | VaultCreate + AccountSet | Institution | Never |
| Credential issued | XLS-70 credential NFT (taxon=282) in depositor account | NFTokenMint | Institution | Never |
| Policy active | Policy NFT (taxon=281, tfBurnable) in depositor wallet | NFTokenMint | Institution | Never |
| Default confirmed | Detection only — no state change required | WebSocket event | — | Never |
| Claim validated | 9 on-chain reads — no write | Read-only queries | — | Never |
| Escrow created | EscrowObject on-chain, funds locked 48h | EscrowCreate | Institution | Never |
| Claim settled | XRP transferred to claimant, EscrowObject removed | EscrowFinish | Claimant | Never |
| Policy burned | NFT absent from account_nfts — replay impossible | NFTokenBurn | Claimant (atomic) | Never |