Deterministic default resolution for XLS-66 lending vaults on the XRP Ledger
Project description
Ward Protocol
ward_signed = False — always.Ward constructs unsigned transactions. Institutions sign. XRPL settles. Ward is never a counterparty, never a custodian, never a signatory.
Overview
Ward Protocol is the open specification for deterministic default resolution on XLS-66 institutional lending vaults on the XRP Ledger. When a borrower defaults, nine on-chain checks run automatically against live ledger state — no oracle, no human judgment, no Ward signature. The outcome is the same every time, for every institution, regardless of who runs the vault. See real-world scenarios at wardprotocol.org/use-cases.
How It Works
Full specification at wardprotocol.org/spec.
Nine deterministic steps — all state from the XRPL ledger:
| Step | Check |
|---|---|
| 1 | NFT existence + taxon 281 (XLS-20) |
| 2 | Policy validity — ledger close_time + matching on-chain premium payment |
| 3 | Vault address binding — NFT metadata vault == defaulted vault |
| 4 | LSF_LOAN_DEFAULT flag on LedgerEntry(index=loan_id) |
| 5 | Vault loss > 0 drops |
| 6 | Pool usable balance ≥ vault loss (balance − XRPL reserve) |
| 7 | Replay protection — NFT still live (burn-on-settlement) |
| 8 | Claimant holds NFT — AccountNFTs(account=claimant) |
| 9 | Pool solvency + rate limit (≤ 3/NFT/300 s, ratio ≥ 1.5×) |
Live Status
| Metric | Value |
|---|---|
| SDK Version | v0.2.5 |
| Hosted API | api.wardprotocol.org — live |
| Python Tests | 317/317 passing (3.10 · 3.11 · 3.12) |
| Rust Tests | 40/40 passing |
| TypeScript Tests | 45/45 passing |
| Altnet E2E | F·01–F·04 confirmed on-chain |
| XRPLF Standard | Discussion #474 — active |
| Swell 2026 | Application submitted |
Quick Start
pip install ward-protocol==0.2.5
import asyncio
from ward import WardClient, ClaimValidator
# Purchase default-protection coverage
client = WardClient(url="https://s.altnet.rippletest.net:51234/")
result = await client.purchase_coverage(
wallet=depositor_wallet, # institution signs — Ward never does
vault_address="rVaultXXX...",
coverage_drops=500_000_000, # 500 XRP
period_days=90,
pool_address="rPoolXXX...",
)
assert result["ward_signed"] is False # invariant
# Validate a claim — 9 steps, all on-chain
validator = ClaimValidator(url="https://s.altnet.rippletest.net:51234/")
claim = await validator.validate_claim(
claimant_address="rClaimantXXX...",
nft_token_id="A" * 64,
defaulted_vault="rVaultXXX...",
loan_id="B" * 64,
pool_address="rPoolXXX...",
)
print(claim.approved) # True
print(claim.steps_passed) # 9
print(claim.claim_payout_drops) # min(vault_loss, policy_coverage)
SDK & API
pip install ward-protocol # Python SDK
npm install ward-protocol # TypeScript SDK
Hosted API: https://api.wardprotocol.org
GET /health— status checkPOST /keys/generate— API key (Developer tier, no auth required)POST /validate— 9-step claim validationPOST /purchase— unsigned coverage transaction
Full docs: wardprotocol.org/docs
Build guide: wardprotocol.org/build
Institutional readiness: docs/institutional-readiness.md
XLS Standards
| Standard | Role in Ward |
|---|---|
| XLS-66 | Lending vault + loan lifecycle — Ward resolves defaults |
| XLS-20 | Policy NFT (taxon 281, TF_BURNABLE, non-transferable) |
| XLS-70 | KYC/AML credential NFT (taxon 282) |
| XLS-80 | Domain verification for vault operators |
Multi-Chain Roadmap
| Chain | Status | Notes |
|---|---|---|
| XRPL | Live | Altnet E2E confirmed, mainnet at XLS-66 launch |
| Flare EVM | Phase 1.5 | FDC enables XRPL state verification from Flare |
| Hedera | Phase 2 | HCS + HTS + Solidity contracts |
| Solana | Phase 3 | Anchor + Metaplex pNFT (Anodos Finance call June 12) |
| Stellar | Phase 4 | Soroban + Horizon SSE + SEP-0010 |
| XDC | Evaluating | XDC Network — XLS-66 compatibility assessment |
Integration plans: docs/integration/
Running Tests
# Python (317 unit tests)
pip install -r requirements.txt
python -m pytest test_ward.py -m "not integration" -v
# Rust (40 tests)
cd ward && cargo test
# TypeScript (45 tests)
cd sdk/typescript && npm install && npm test
# Lint
ruff check ward/ --select=E,F,W,I --ignore=E501
Community
- Discord: discord.gg/cGm9m5pEGK
- XRPLF Discussion #474: github.com/XRPLF/XRPL-Standards/discussions/474
- Website: wardprotocol.org
- PyPI: pypi.org/project/ward-protocol
License
The Ward Protocol specification and SDK are MIT licensed.
The hosted API at api.wardprotocol.org is subject to commercial terms.
Ward Protocol is protocol software — not an insurance product, financial instrument, or regulated entity.
ward_signed = False — always.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ward_protocol-0.2.6.tar.gz.
File metadata
- Download URL: ward_protocol-0.2.6.tar.gz
- Upload date:
- Size: 58.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b812523e012df425ed1988b54fd7f911d243cba41f30a0257d24e5492453ad1
|
|
| MD5 |
acd0e4b606b078126f2eaebb924327e3
|
|
| BLAKE2b-256 |
a3ba37e824814f43006d219cf4c47f7444c8c7d0059c100c59f4842ef567d34a
|
File details
Details for the file ward_protocol-0.2.6-py3-none-any.whl.
File metadata
- Download URL: ward_protocol-0.2.6-py3-none-any.whl
- Upload date:
- Size: 78.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0872e4807d3baaf98ce4beefcd943f112d339ba39c343a9b44e774ebebda4fd4
|
|
| MD5 |
d5288fabfb94797ea59921af2686bd66
|
|
| BLAKE2b-256 |
67f02c710584d0e361f7ea6628ca8980a3253af7f64e20869714b8f57290e0e2
|