Closes gap 2 from coord log 2026-06-01T18:30Z. The LNbits withdraw extension's nostr-transport RPC now populates `link.lnurl` from `settings.lnbits_baseurl` (aiolabs/withdraw#1 / commit e9d911e), so the ATM no longer needs a separate HTTP URL on the wire to compose the LNURL-withdraw callback itself. What goes: - `VITE_LNBITS_HTTP_URL` env var (renderer + Electron main) - `lnbitsHttpUrl` field on `LightningConfig`, `RuntimeConfig`, and the Window mirror in `src/types/electron.d.ts` - The manual `${lnbitsHttpUrl}/withdraw/api/v1/lnurl/${unique_hash}` composition in `generateLnurlWithdraw` - The `encodeLnurl` bech32 helper in `lightning.ts` (LNbits returns bech32-encoded; we just `.toUpperCase()` to match BOLT/LNURL convention) - `@scure/base` dep from `apps/machine/package.json` (only used by the removed helper; clink still uses it directly) - The `lnbitsHttpUrl` option + `LNBITS_HTTP_URL=…` env var + boot echo in `deploy/nixos/bitspire-atm.nix` - Doc references in CLAUDE.md, README.md, deploy/nixos/README.md, docs/architecture-comparison.md, and the lightning-check skill What stays: - `link.lnurl` consumption, with an explicit error if LNbits returns null (which signals `LNBITS_BASEURL` is unset on the server side — better to fail clearly than silently) - The receiver-side bech32 uppercasing (LNbits returns lowercase per the standard library) Why this is a net win: - Removes a config-drift surface — if LNbits's external URL moved (DNS, port, reverse-proxy rewrite), every ATM in the field would stop issuing redeemable LNURL-withdraw QRs until reconfigured. Now LNbits derives its own URL from `settings.lnbits_baseurl`, one source of truth. - Removes an extra provisioning step. No more `LNBITS_HTTP_URL=…` before running `provision-atm.sh`; the relay + server pubkey suffice. - Removes the misleading boot echo that triggered the §`18:30Z` smoke triage confusion ("LNbits HTTP: <url>" read like ATM-→-LNbits connectivity, when it was only ever a URL embedded in customer QRs). Also adds a `# pragma: allowlist secret` marker above the `VITE_ATM_PRIVATE_KEY` doc block in `.env.example` so the global secret scanner stops false-positiving on the documentation prose. Workspace typecheck + 24/24 apps/machine tests still green. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
79 lines
2.3 KiB
JSON
79 lines
2.3 KiB
JSON
{
|
|
"name": "@bitSpire/machine",
|
|
"version": "0.1.0",
|
|
"description": "Electron ATM kiosk application with Vue 3 UI",
|
|
"author": {
|
|
"name": "AIO Labs",
|
|
"email": "dev@aiolabs.dev"
|
|
},
|
|
"homepage": "https://aiolabs.dev",
|
|
"license": "AGPL-3.0",
|
|
"type": "module",
|
|
"main": "dist-electron/main.js",
|
|
"scripts": {
|
|
"dev": "concurrently -n vite,electron \"vite\" \"pnpm run electron:dev\"",
|
|
"dev:vite": "vite",
|
|
"electron:dev": "tsc -p electron/tsconfig.json && tsc -p electron/tsconfig.preload.json && electron dist-electron/main.js",
|
|
"build": "vue-tsc --noEmit && vite build && tsc -p electron/tsconfig.json && tsc -p electron/tsconfig.preload.json && npx esbuild electron/fund-atm.ts --bundle --platform=node --format=cjs --outfile=dist-electron/fund-atm.bundle.cjs",
|
|
"build:electron": "pnpm build && electron-builder",
|
|
"preview": "vite preview",
|
|
"typecheck": "vue-tsc --noEmit",
|
|
"lint": "eslint src/",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest"
|
|
},
|
|
"dependencies": {
|
|
"@bitSpire/clink": "workspace:*",
|
|
"@bitSpire/hal": "workspace:*",
|
|
"@bitSpire/lnbits": "workspace:*",
|
|
"@bitSpire/nostr-client": "workspace:*",
|
|
"@bitSpire/state-machine": "workspace:*",
|
|
"@tanstack/vue-table": "^8.21.3",
|
|
"@vueuse/core": "^14.1.0",
|
|
"better-sqlite3": "^11.0.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"lucide-vue-next": "^0.563.0",
|
|
"marked": "^17.0.5",
|
|
"nostr-tools": "^2.10.0",
|
|
"pinia": "^2.2.0",
|
|
"qrcode.vue": "^3.6.0",
|
|
"reka-ui": "^2.7.0",
|
|
"tailwind-merge": "^3.4.0",
|
|
"vue": "^3.5.0",
|
|
"vue-router": "^4.4.0"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/vite": "^4.0.0",
|
|
"@types/better-sqlite3": "^7.0.0",
|
|
"@types/node": "^22.0.0",
|
|
"@vitejs/plugin-vue": "^5.2.0",
|
|
"concurrently": "^9.0.0",
|
|
"electron": "^33.0.0",
|
|
"electron-builder": "^25.0.0",
|
|
"esbuild": "^0.27.4",
|
|
"tailwindcss": "^4.0.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"typescript": "^5.7.0",
|
|
"vite": "^6.0.0",
|
|
"vitest": "^2.1.9",
|
|
"vue-tsc": "^2.1.0"
|
|
},
|
|
"build": {
|
|
"appId": "dev.bitSpire.atm",
|
|
"productName": "bitSpire",
|
|
"directories": {
|
|
"output": "release"
|
|
},
|
|
"files": [
|
|
"dist/**/*",
|
|
"dist-electron/**/*"
|
|
],
|
|
"linux": {
|
|
"target": [
|
|
"AppImage"
|
|
],
|
|
"category": "Finance"
|
|
}
|
|
}
|
|
}
|