Ward Protocol — Interactive
Demo & Checklist
Verify your integration satisfies all 9 Ward Protocol claim validation steps. All state must be sourced from the XRPL ledger — no off-chain inputs trusted.
9-Step Claim Validation
All state sourced from XRPL ledger — no off-chain inputs trusted.
1
NFT Existence & Taxon
Policy NFT in claimant wallet with taxon = 281 (WARD_POLICY_TAXON)
2
Policy Expiry
Expiry checked against XRPL ledger close_time — not server clock
3
Vault Address Binding
NFT metadata vault address matches reported defaulted_vault
4
On-Chain Default Flag
LedgerEntry carries LSF_LOAN_DEFAULT (0x00010000)
5
Positive Vault Loss
TotalValueOutstanding from defaulted loan > 0 drops
6
Pool Coverage Breach
Usable pool balance = balance − XRPL reserve ≥ 0
7
Replay Protection
NFT still live on-chain; burn-on-settlement prevents replays
8
Claimant Holds NFT
NFT found in claimant_address wallet via AccountNFTs
9
Pool Solvency & Rate Limit
Usable ≥ payout, ratio ≥ 1.5×, ≤ 3 claims/NFT per 300 s
0/ 9
Not Started
NOT CONFORMANT
Core Invariants
- ward_signed = False — Ward never holds signing keys
- Events are hints — Ledger is always truth
- 3-ledger confirmation — Required before VerifiedDefault
- TF_BURNABLE only — TF_TRANSFERABLE deliberately absent
- No off-chain trust — Zero oracle dependence
Python SDK — v0.2.4
Integration Flow Examples
Five flows from vault registration to escrow settlement. ward_signed = False throughout.
F·01 — Vault Registration
Register an XLS-66 vault. Ward returns an unsigned NFTokenMint; institution signs.
from ward import WardClient
from xrpl.wallet import Wallet
client = WardClient()
wallet = Wallet.from_seed(seed) # institution holds key
# Ward builds unsigned tx — ward_signed = False
unsigned_tx = await client.register_vault(
institution_address=wallet.classic_address,
collateral_currency="XRP",
min_collateral_ratio=1.5,
)
assert "TxnSignature" not in unsigned_tx
# Institution signs and submits
result = await submit_and_wait(unsigned_tx, xrpl_client, wallet)