From ec074e78de95136af3566deeb23da4211faa7e0b Mon Sep 17 00:00:00 2001 From: Chrisland058 Date: Thu, 27 Aug 2026 23:23:44 +0000 Subject: [PATCH 1/2] feat: add @wraith-protocol/sdk-solid companion package Closes #183. Adds Solid.js companion package with fine-grained reactive primitives ported from sdk-react: - createStealthKeys: derive Stellar stealth keys, generate/check addresses, scan announcements, encode/decode meta-address - createScanner: fetch + match announcements via fetchAnnouncementsStream - createMetaAddress: encode/decode EVM, Stellar, and Solana meta-addresses - createActivity: Wraith agent lifecycle (create, chat, balance) All reactive values returned as Solid signal accessor functions. 43 tests, all passing. Package tree-shakes to only imported primitives. Also adds examples/stellar-solid-receive: Vite + Solid.js app that demonstrates key derivation, meta-address encoding, and canned-fixture payment scanning. --- examples/stellar-solid-receive/.env.example | 2 + examples/stellar-solid-receive/index.html | 12 + examples/stellar-solid-receive/package.json | 21 ++ examples/stellar-solid-receive/src/App.tsx | 208 +++++++++++++ examples/stellar-solid-receive/src/main.tsx | 4 + .../stellar-solid-receive/src/vite-env.d.ts | 1 + examples/stellar-solid-receive/tsconfig.json | 15 + examples/stellar-solid-receive/vite.config.ts | 6 + packages/sdk-solid/package.json | 40 +++ packages/sdk-solid/src/index.ts | 5 + .../src/primitives/createActivity.ts | 163 ++++++++++ .../src/primitives/createMetaAddress.ts | 136 +++++++++ .../sdk-solid/src/primitives/createScanner.ts | 99 ++++++ .../src/primitives/createStealthKeys.ts | 193 ++++++++++++ .../sdk-solid/test/createActivity.test.ts | 174 +++++++++++ .../sdk-solid/test/createMetaAddress.test.ts | 129 ++++++++ packages/sdk-solid/test/createScanner.test.ts | 102 +++++++ .../sdk-solid/test/createStealthKeys.test.ts | 150 ++++++++++ packages/sdk-solid/tsconfig.json | 20 ++ packages/sdk-solid/tsup.config.ts | 13 + packages/sdk-solid/vitest.config.ts | 20 ++ pnpm-lock.yaml | 282 ++++++++++++++++-- 22 files changed, 1762 insertions(+), 33 deletions(-) create mode 100644 examples/stellar-solid-receive/.env.example create mode 100644 examples/stellar-solid-receive/index.html create mode 100644 examples/stellar-solid-receive/package.json create mode 100644 examples/stellar-solid-receive/src/App.tsx create mode 100644 examples/stellar-solid-receive/src/main.tsx create mode 100644 examples/stellar-solid-receive/src/vite-env.d.ts create mode 100644 examples/stellar-solid-receive/tsconfig.json create mode 100644 examples/stellar-solid-receive/vite.config.ts create mode 100644 packages/sdk-solid/package.json create mode 100644 packages/sdk-solid/src/index.ts create mode 100644 packages/sdk-solid/src/primitives/createActivity.ts create mode 100644 packages/sdk-solid/src/primitives/createMetaAddress.ts create mode 100644 packages/sdk-solid/src/primitives/createScanner.ts create mode 100644 packages/sdk-solid/src/primitives/createStealthKeys.ts create mode 100644 packages/sdk-solid/test/createActivity.test.ts create mode 100644 packages/sdk-solid/test/createMetaAddress.test.ts create mode 100644 packages/sdk-solid/test/createScanner.test.ts create mode 100644 packages/sdk-solid/test/createStealthKeys.test.ts create mode 100644 packages/sdk-solid/tsconfig.json create mode 100644 packages/sdk-solid/tsup.config.ts create mode 100644 packages/sdk-solid/vitest.config.ts diff --git a/examples/stellar-solid-receive/.env.example b/examples/stellar-solid-receive/.env.example new file mode 100644 index 0000000..d89572f --- /dev/null +++ b/examples/stellar-solid-receive/.env.example @@ -0,0 +1,2 @@ +# Optional: pre-fill the secret key input (128 hex chars / 64 bytes). +# VITE_STELLAR_SECRET_KEY=aabbcc... diff --git a/examples/stellar-solid-receive/index.html b/examples/stellar-solid-receive/index.html new file mode 100644 index 0000000..bcfc26a --- /dev/null +++ b/examples/stellar-solid-receive/index.html @@ -0,0 +1,12 @@ + + + + + + Wraith Stellar — Solid.js Receive + + +
+ + + diff --git a/examples/stellar-solid-receive/package.json b/examples/stellar-solid-receive/package.json new file mode 100644 index 0000000..9bd9b1c --- /dev/null +++ b/examples/stellar-solid-receive/package.json @@ -0,0 +1,21 @@ +{ + "name": "@wraith-protocol/example-stellar-solid-receive", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@wraith-protocol/sdk": "workspace:*", + "@wraith-protocol/sdk-solid": "workspace:*", + "solid-js": "^1.9.0" + }, + "devDependencies": { + "typescript": "^5.7.0", + "vite": "^6.1.0", + "vite-plugin-solid": "^2.11.0" + } +} diff --git a/examples/stellar-solid-receive/src/App.tsx b/examples/stellar-solid-receive/src/App.tsx new file mode 100644 index 0000000..f1a83cf --- /dev/null +++ b/examples/stellar-solid-receive/src/App.tsx @@ -0,0 +1,208 @@ +import { createSignal, createMemo, Show, For } from 'solid-js'; +import { createStealthKeys, createScanner } from '@wraith-protocol/sdk-solid'; +import { + bytesToHex, + scanAnnouncements as stellarScanAnnouncements, + type Announcement, +} from '@wraith-protocol/sdk/chains/stellar'; + +// Canned announcement fixture — used in dev/demo without a live Horizon node. +const CANNED_ANNOUNCEMENTS: Announcement[] = []; + +function parseHex(hex: string): Uint8Array | null { + const clean = hex.replace(/^0x/i, '').trim(); + if (!/^[0-9a-fA-F]+$/.test(clean) || clean.length % 2 !== 0) return null; + return new Uint8Array(clean.match(/.{1,2}/g)!.map((b) => parseInt(b, 16))); +} + +export default function App() { + const [input, setInput] = createSignal((import.meta as any).env?.VITE_STELLAR_SECRET_KEY ?? ''); + + // Primitives + const stealthKeys = createStealthKeys(); + const scanner = createScanner(); + + const metaAddress = createMemo(() => stealthKeys.metaAddress()); + + function handleDerive() { + const bytes = parseHex(input()); + if (!bytes) return; + if (bytes.length !== 64) return; + + const k = stealthKeys.deriveKeys(bytes); + stealthKeys.encodeMetaAddress(k.spendingPubKey, k.viewingPubKey); + } + + function handleScan() { + const k = stealthKeys.keys(); + if (!k) return; + + // Scan the canned fixture (in a real app, call scanner.scan({ chain: 'testnet' })) + scanner.match(CANNED_ANNOUNCEMENTS, k.viewingKey, k.spendingPubKey, k.spendingScalar); + } + + return ( +
+

Wraith Stellar — Receive Stealth Payments (Solid.js)

+

+ Enter your 64-byte hex secret key to derive your stealth keys and meta-address. Share the + meta-address with senders. +

+ +
+ +