beignet 0.30.1 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +15 -10
  2. package/dist/cli/beignet-node.js +197 -171
  3. package/dist/cli/beignet-node.js.map +1 -1
  4. package/dist/cli/cli.js +18 -3
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/cli/config.js +8 -0
  7. package/dist/cli/config.js.map +1 -1
  8. package/dist/cli/daemon-options.js +3 -0
  9. package/dist/cli/daemon-options.js.map +1 -1
  10. package/dist/cli/daemon.js +85 -18
  11. package/dist/cli/daemon.js.map +1 -1
  12. package/dist/cli/direct-funding.js +0 -2
  13. package/dist/cli/direct-funding.js.map +1 -1
  14. package/dist/cli/electrum-tls-config.js +105 -0
  15. package/dist/cli/electrum-tls-config.js.map +1 -0
  16. package/dist/cli/offline-receive.js +16 -6
  17. package/dist/cli/offline-receive.js.map +1 -1
  18. package/dist/cli/onchain-sweep.js +4 -2
  19. package/dist/cli/onchain-sweep.js.map +1 -1
  20. package/dist/cli/openapi.js +1369 -63
  21. package/dist/cli/openapi.js.map +1 -1
  22. package/dist/electrum/index.js +172 -133
  23. package/dist/electrum/index.js.map +1 -1
  24. package/dist/lightning/chain/chain-monitor.js +46 -0
  25. package/dist/lightning/chain/chain-monitor.js.map +1 -1
  26. package/dist/lightning/chain/chain-watcher.js +50 -3
  27. package/dist/lightning/chain/chain-watcher.js.map +1 -1
  28. package/dist/lightning/channel/channel-manager.js +174 -17
  29. package/dist/lightning/channel/channel-manager.js.map +1 -1
  30. package/dist/lightning/channel/channel-state.js.map +1 -1
  31. package/dist/lightning/channel/channel.js +68 -18
  32. package/dist/lightning/channel/channel.js.map +1 -1
  33. package/dist/lightning/channel/dual-funding.js +2 -2
  34. package/dist/lightning/channel/dual-funding.js.map +1 -1
  35. package/dist/lightning/channel/htlc-snapshots.js +40 -0
  36. package/dist/lightning/channel/htlc-snapshots.js.map +1 -0
  37. package/dist/lightning/channel/splice.js +2 -2
  38. package/dist/lightning/channel/splice.js.map +1 -1
  39. package/dist/lightning/direct-funding/receiver/engine.js +143 -14
  40. package/dist/lightning/direct-funding/receiver/engine.js.map +1 -1
  41. package/dist/lightning/direct-funding/receiver/index.js +2 -1
  42. package/dist/lightning/direct-funding/receiver/index.js.map +1 -1
  43. package/dist/lightning/direct-funding/receiver/types.js +6 -1
  44. package/dist/lightning/direct-funding/receiver/types.js.map +1 -1
  45. package/dist/lightning/direct-funding/receiver/verify.js +23 -1
  46. package/dist/lightning/direct-funding/receiver/verify.js.map +1 -1
  47. package/dist/lightning/direct-funding/sender/engine.js +8 -4
  48. package/dist/lightning/direct-funding/sender/engine.js.map +1 -1
  49. package/dist/lightning/gossip/gossip-sync.js +14 -2
  50. package/dist/lightning/gossip/gossip-sync.js.map +1 -1
  51. package/dist/lightning/gossip/network-graph.js +50 -3
  52. package/dist/lightning/gossip/network-graph.js.map +1 -1
  53. package/dist/lightning/gossip/pathfinding.js +74 -179
  54. package/dist/lightning/gossip/pathfinding.js.map +1 -1
  55. package/dist/lightning/gossip/pay-all.js +4 -7
  56. package/dist/lightning/gossip/pay-all.js.map +1 -1
  57. package/dist/lightning/gossip/rapid-sync.js +13 -3
  58. package/dist/lightning/gossip/rapid-sync.js.map +1 -1
  59. package/dist/lightning/gossip/types.js.map +1 -1
  60. package/dist/lightning/interactive-tx/builder.js +19 -2
  61. package/dist/lightning/interactive-tx/builder.js.map +1 -1
  62. package/dist/lightning/interactive-tx/validation.js +2 -1
  63. package/dist/lightning/interactive-tx/validation.js.map +1 -1
  64. package/dist/lightning/message/splice.js +11 -36
  65. package/dist/lightning/message/splice.js.map +1 -1
  66. package/dist/lightning/node/lightning-node.js +387 -132
  67. package/dist/lightning/node/lightning-node.js.map +1 -1
  68. package/dist/lightning/node/types.js.map +1 -1
  69. package/dist/lightning/offer/merkle.js +3 -21
  70. package/dist/lightning/offer/merkle.js.map +1 -1
  71. package/dist/lightning/recovery/capsule.js +13 -0
  72. package/dist/lightning/recovery/capsule.js.map +1 -1
  73. package/dist/lightning/recovery/frame-codec.js +7 -5
  74. package/dist/lightning/recovery/frame-codec.js.map +1 -1
  75. package/dist/lightning/recovery/guardian-store.js +17 -1
  76. package/dist/lightning/recovery/guardian-store.js.map +1 -1
  77. package/dist/lightning/recovery/guardian.js +37 -1
  78. package/dist/lightning/recovery/guardian.js.map +1 -1
  79. package/dist/lightning/recovery/journal.js +43 -45
  80. package/dist/lightning/recovery/journal.js.map +1 -1
  81. package/dist/lightning/recovery/recovery-manager.js +22 -0
  82. package/dist/lightning/recovery/recovery-manager.js.map +1 -1
  83. package/dist/lightning/recovery/restore-driver.js +82 -26
  84. package/dist/lightning/recovery/restore-driver.js.map +1 -1
  85. package/dist/lightning/script/htlc-taproot.js +2 -17
  86. package/dist/lightning/script/htlc-taproot.js.map +1 -1
  87. package/dist/lightning/storage/durable-ledger.js +58 -15
  88. package/dist/lightning/storage/durable-ledger.js.map +1 -1
  89. package/dist/lightning/storage/serialization.js +34 -18
  90. package/dist/lightning/storage/serialization.js.map +1 -1
  91. package/dist/lightning/storage/sqlite-storage.js +377 -55
  92. package/dist/lightning/storage/sqlite-storage.js.map +1 -1
  93. package/dist/lightning/storage/types.js.map +1 -1
  94. package/dist/lightning/swaps/chain-resolver.js +49 -11
  95. package/dist/lightning/swaps/chain-resolver.js.map +1 -1
  96. package/dist/lightning/swaps/ledger.js +152 -10
  97. package/dist/lightning/swaps/ledger.js.map +1 -1
  98. package/dist/lightning/swaps/reverse-engine.js +108 -21
  99. package/dist/lightning/swaps/reverse-engine.js.map +1 -1
  100. package/dist/lightning/swaps/submarine-engine.js +42 -5
  101. package/dist/lightning/swaps/submarine-engine.js.map +1 -1
  102. package/dist/lightning/transport/peer-manager.js +20 -1
  103. package/dist/lightning/transport/peer-manager.js.map +1 -1
  104. package/dist/lightning/transport/peer.js +59 -8
  105. package/dist/lightning/transport/peer.js.map +1 -1
  106. package/dist/lightning/watchtower/watchtower-client.js +3 -1
  107. package/dist/lightning/watchtower/watchtower-client.js.map +1 -1
  108. package/dist/shapes/electrum.js +2 -1
  109. package/dist/shapes/electrum.js.map +1 -1
  110. package/dist/transaction/index.js +606 -221
  111. package/dist/transaction/index.js.map +1 -1
  112. package/dist/types/cli/beignet-node.d.ts +11 -14
  113. package/dist/types/cli/daemon.d.ts +5 -0
  114. package/dist/types/cli/electrum-tls-config.d.ts +12 -0
  115. package/dist/types/cli/types.d.ts +10 -1
  116. package/dist/types/electrum/index.d.ts +17 -4
  117. package/dist/types/lightning/chain/chain-monitor.d.ts +4 -0
  118. package/dist/types/lightning/chain/chain-watcher.d.ts +7 -0
  119. package/dist/types/lightning/channel/channel-manager.d.ts +12 -0
  120. package/dist/types/lightning/channel/channel-state.d.ts +1 -0
  121. package/dist/types/lightning/channel/channel.d.ts +6 -1
  122. package/dist/types/lightning/channel/dual-funding.d.ts +1 -1
  123. package/dist/types/lightning/channel/htlc-snapshots.d.ts +5 -0
  124. package/dist/types/lightning/channel/splice.d.ts +1 -1
  125. package/dist/types/lightning/direct-funding/receiver/engine.d.ts +5 -0
  126. package/dist/types/lightning/direct-funding/receiver/index.d.ts +2 -2
  127. package/dist/types/lightning/direct-funding/receiver/types.d.ts +10 -0
  128. package/dist/types/lightning/direct-funding/receiver/verify.d.ts +12 -0
  129. package/dist/types/lightning/gossip/gossip-sync.d.ts +1 -0
  130. package/dist/types/lightning/gossip/network-graph.d.ts +7 -1
  131. package/dist/types/lightning/gossip/pathfinding.d.ts +5 -4
  132. package/dist/types/lightning/gossip/rapid-sync.d.ts +2 -1
  133. package/dist/types/lightning/gossip/types.d.ts +6 -0
  134. package/dist/types/lightning/interactive-tx/builder.d.ts +3 -1
  135. package/dist/types/lightning/interactive-tx/validation.d.ts +1 -0
  136. package/dist/types/lightning/node/lightning-node.d.ts +25 -4
  137. package/dist/types/lightning/node/types.d.ts +2 -0
  138. package/dist/types/lightning/recovery/frame-codec.d.ts +1 -1
  139. package/dist/types/lightning/recovery/guardian-store.d.ts +2 -0
  140. package/dist/types/lightning/recovery/guardian.d.ts +1 -0
  141. package/dist/types/lightning/recovery/journal.d.ts +0 -3
  142. package/dist/types/lightning/recovery/recovery-manager.d.ts +1 -0
  143. package/dist/types/lightning/recovery/restore-driver.d.ts +3 -0
  144. package/dist/types/lightning/recovery/types.d.ts +1 -1
  145. package/dist/types/lightning/storage/durable-ledger.d.ts +12 -1
  146. package/dist/types/lightning/storage/serialization.d.ts +5 -1
  147. package/dist/types/lightning/storage/sqlite-storage.d.ts +38 -2
  148. package/dist/types/lightning/storage/types.d.ts +10 -0
  149. package/dist/types/lightning/swaps/chain-resolver.d.ts +3 -0
  150. package/dist/types/lightning/swaps/ledger.d.ts +13 -0
  151. package/dist/types/lightning/swaps/reverse-engine.d.ts +10 -1
  152. package/dist/types/lightning/swaps/submarine-engine.d.ts +6 -0
  153. package/dist/types/lightning/transport/peer-manager.d.ts +3 -0
  154. package/dist/types/lightning/transport/peer.d.ts +5 -0
  155. package/dist/types/transaction/index.d.ts +22 -11
  156. package/dist/types/transaction.js.map +1 -1
  157. package/dist/types/types/transaction.d.ts +2 -0
  158. package/dist/types/types/wallet.d.ts +24 -1
  159. package/dist/types/utils/boost.d.ts +4 -0
  160. package/dist/types/utils/derive-path-cached.d.ts +2 -0
  161. package/dist/types/utils/index.d.ts +1 -0
  162. package/dist/types/utils/multisig.d.ts +5 -0
  163. package/dist/types/utils/node-version.d.ts +3 -0
  164. package/dist/types/utils/tls-verification.d.ts +3 -1
  165. package/dist/types/utils/wallet.d.ts +5 -2
  166. package/dist/types/wallet/constants.d.ts +3 -0
  167. package/dist/types/wallet/index.d.ts +45 -15
  168. package/dist/types/wallet.js.map +1 -1
  169. package/dist/utils/boost.js +12 -0
  170. package/dist/utils/boost.js.map +1 -0
  171. package/dist/utils/derive-path-cached.js +31 -0
  172. package/dist/utils/derive-path-cached.js.map +1 -0
  173. package/dist/utils/index.js +1 -0
  174. package/dist/utils/index.js.map +1 -1
  175. package/dist/utils/multisig.js +16 -5
  176. package/dist/utils/multisig.js.map +1 -1
  177. package/dist/utils/node-version.js +40 -0
  178. package/dist/utils/node-version.js.map +1 -0
  179. package/dist/utils/tls-verification.js +12 -5
  180. package/dist/utils/tls-verification.js.map +1 -1
  181. package/dist/utils/transaction.js +9 -3
  182. package/dist/utils/transaction.js.map +1 -1
  183. package/dist/utils/wallet.js +18 -2
  184. package/dist/utils/wallet.js.map +1 -1
  185. package/dist/wallet/constants.js +5 -2
  186. package/dist/wallet/constants.js.map +1 -1
  187. package/dist/wallet/index.js +738 -320
  188. package/dist/wallet/index.js.map +1 -1
  189. package/docs/AI_AGENT_GUIDE.md +2 -0
  190. package/docs/RECOVERY-GUARDIAN-WIRE.md +5 -1
  191. package/docs/RECOVERY-PROTOCOL.md +2 -0
  192. package/docs/SPLICE-LOCK-DEPTH.md +12 -1
  193. package/package.json +5 -2
package/README.md CHANGED
@@ -7,7 +7,7 @@ Two layers, one mnemonic:
7
7
  - **On-chain wallet:** HD keys, address generation, UTXO tracking, transaction building, PSBT/hardware signing, multisig, watch-only, Electrum connectivity.
8
8
  - **Lightning:** channel lifecycle, onion-routed payments, BOLT 11 invoices, BOLT 12 offers, gossip and pathfinding, anchors, splicing, taproot channels, watchtower client. Interop-tested against LND, Core Lightning and Eclair on regtest.
9
9
 
10
- Requires **Node.js 18+**. MIT licensed.
10
+ Requires **Node.js 22.23.4+, 24.22.1+ or 26.12.1+**. Earlier releases on those lines, and all of Node.js 18 and 20, lack the October 21, 2026 Node.js security fixes; the daemon warns at startup when it runs on one. MIT licensed.
11
11
 
12
12
  **Jump to:** [Install](#install) · [Examples](#try-the-examples) · [On-chain wallet](#on-chain-wallet) · [Lightning](#lightning) · [Daemon & CLI](#http-daemon--cli) · [Protocol layer](#protocol-layer-advanced) · [Tests](#tests) · [Status & limitations](#status--limitations)
13
13
 
@@ -52,16 +52,16 @@ npm install
52
52
  npm run example
53
53
  ```
54
54
 
55
- Creates a mainnet wallet (a fresh mnemonic unless you pass one), syncs it against a public Electrum server, prints the balance and a receive address, then drops you at a `>` prompt with the wallet bound to `wallet`. Type `help()` for the command list.
55
+ Creates a regtest wallet (a fresh mnemonic unless you pass one), syncs it against a public Electrum server, prints the balance and a receive address, then drops you at a `>` prompt with the wallet bound to `wallet`. Type `help()` for the command list.
56
56
 
57
57
  ```js
58
58
  > wallet.getBalance()
59
59
  > await wallet.getAddress()
60
60
  > await wallet.refreshWallet()
61
- > await wallet.send({ address: 'bc1q...', amount: 10000, satsPerByte: 2 })
61
+ > await wallet.send({ address: 'bcrt1q...', amount: 10000, satsPerByte: 2 })
62
62
  ```
63
63
 
64
- State persists as JSON under `example/walletData/`. Pass a mnemonic as the first argument to reuse a wallet: `npm run example -- "abandon abandon ... about"`.
64
+ State persists as JSON under `example/walletData/`. Pass a mnemonic to reuse a wallet: `npm run example -- "abandon abandon ... about"`. Pass `testnet` or `mainnet` to change the network.
65
65
 
66
66
  ### 2. Lightning node REPL
67
67
 
@@ -69,7 +69,7 @@ State persists as JSON under `example/walletData/`. Pass a mnemonic as the first
69
69
  npm run example:lightning
70
70
  ```
71
71
 
72
- Boots a real Lightning node (`BeignetNode`) with an auto-created wallet, storage and funding provider, waits for it to become operational, prints info/balance/health, and drops you at a `beignet>` prompt with the node bound to `node`. Type `help()` for the command list. Top-level `await` works.
72
+ Boots a real regtest Lightning node (`BeignetNode`) with an auto-created wallet, storage and funding provider, waits for it to become operational, prints info/balance/health, and drops you at a `beignet>` prompt with the node bound to `node`. Type `help()` for the command list. Top-level `await` works.
73
73
 
74
74
  ```js
75
75
  beignet> await node.getNewAddress() // fund this on-chain, then:
@@ -83,7 +83,7 @@ The flags you will actually reach for (everything after `--`):
83
83
 
84
84
  | Flag | Effect |
85
85
  |------|--------|
86
- | `mainnet` \| `testnet` \| `regtest` | Network, as a bare positional arg (default `mainnet`) |
86
+ | `mainnet` \| `testnet` \| `regtest` | Network, as a bare positional arg (default `regtest`) |
87
87
  | `<12 or 24 words>` | Reuse a mnemonic, as bare positional args (default generates one) |
88
88
  | `--electrum-host <h>` `--electrum-port <p>` | Point at your own Electrum server |
89
89
  | `--alias <name>` | Node alias in `node_announcement` |
@@ -93,6 +93,8 @@ The flags you will actually reach for (everything after `--`):
93
93
  npm run example:lightning -- regtest --electrum-host 127.0.0.1 --electrum-port 60001 --alias mynode
94
94
  ```
95
95
 
96
+ Both examples print the network and the mnemonic before anything else. A generated mnemonic exists only in that output, so write it down before funding the wallet, and pass your own on mainnet.
97
+
96
98
  Tor, full-graph gossip, the low-level `LightningNode` variant and the non-interactive payment-API walkthrough have flags too: see [the flag reference](example/REPL_TESTING.md#repl-flags).
97
99
 
98
100
  Node state lives in a SQLite DB under `~/.beignet/data/<hash-of-mnemonic>/` (the `--low-level` example uses `example/lightningData/node.db`).
@@ -160,7 +162,7 @@ const res = await Wallet.create({
160
162
  ```
161
163
 
162
164
  - **Failover:** with multiple servers the wallet rotates through them in order on connect/reconnect failure, then through hardcoded fallback peers for the network, with a per-server cooldown so dead servers are not hammered. Inspect `wallet.electrum.currentServer` and `wallet.electrum.rotationCount`.
163
- - **Certificate verification:** by default a TLS Electrum connection is encrypted but the server certificate is not checked, because the client library dials with `rejectUnauthorized: false`. An on-path attacker can therefore stand in for the server. On Node, pass `tls: withTlsVerification(tls)` to accept only certificates that chain to a trusted CA and match the host, and add `{ fingerprints: ['AB:CD:…'] }` to also accept self-signed servers by SHA-256 fingerprint (`openssl x509 -noout -fingerprint -sha256`). The CLI/daemon and React Native do not verify yet.
165
+ - **Certificate verification:** by default a TLS Electrum connection is encrypted but the server certificate is not checked, because the client library dials with `rejectUnauthorized: false`. An on-path attacker can therefore stand in for the server. On Node, pass `tls: withTlsVerification(tls)` to accept only certificates that chain to a trusted CA and match the host, and add `{ fingerprints: ['AB:CD:…'] }` to also accept self-signed servers by SHA-256 fingerprint (`openssl x509 -noout -fingerprint -sha256`). A caller that resolves the host itself and dials the address passes `{ servernames: { [address]: hostName } }` so the check still uses the name. The client library keeps one connection per network for the whole process, shared by every wallet on that network, so wallets in one process should all pass the same `tls`. The daemon verifies when `BEIGNET_ELECTRUM_TLS_VERIFY=true` (see `src/cli/README.md`); it is off by default. React Native does not verify yet.
164
166
  - **Fee source:** `'electrum'` queries only the connected server via `blockchain.estimatefee`, so fee lookups never leak to mempool.space/blocktank over clearnet. `'auto'` prefers Electrum and falls back to HTTP. All remote rates are clamped to 5000 sat/vB.
165
167
  - **Networks:** mainnet, testnet, regtest and signet work end to end (wallet, Electrum, CLI/daemon `--network signet`, Lightning chain hash and `tbs` invoice prefix). Signet shares testnet address formats and coin type 1.
166
168
  - **BIP21:** `encodeBip21({ address, amountSats?, label?, message? })` builds a `bitcoin:` URI.
@@ -291,6 +293,8 @@ coordinator.exportDescriptors();
291
293
 
292
294
  The wallet persists through the host-injected `TStorage` interface (`storage: { getData, setData }`), and values are handed over as-is, so by default they are stored in plaintext. Persisted data is addresses, indexes, UTXOs, transactions, balance and fee estimates: no private keys and no mnemonic are ever written, so exposure is a privacy concern (full wallet history), not fund loss. The staged send (`transaction`) is written without signing keys, so a key pair handed to `sweepPrivateKey` or `addExternalInputs` never reaches storage, and `send`, `sendMany`, `sendMax`, `buildPsbt` and `sweepPrivateKey` reset the staged send when they return, so a restart never replays an earlier call's recipients.
293
295
 
296
+ `getData` must return `ok(undefined)` for a key it does not hold and `err` only when the read fails. `Wallet.create` returns an error on a failed read rather than start from defaults and save them over the data it could not read; pass `resetOnReadFailure: true` to start from defaults anyway.
297
+
294
298
  Wrap any `TStorage` with `createEncryptedStorage` to encrypt at rest with AES-256-GCM under an HKDF-derived key from the seed. Pre-existing plaintext values pass through unchanged and migrate lazily as they are rewritten.
295
299
 
296
300
  ```typescript
@@ -403,6 +407,7 @@ Automatic modes, opt-in via `BeignetNodeOptions` / `INodeConfig`:
403
407
  ```typescript
404
408
  const node = await BeignetNode.create({
405
409
  mnemonic,
410
+ network: 'mainnet',
406
411
  // Periodically executes the rebalance plan. Routing fees spent on rebalances
407
412
  // are capped per UTC day and the running spend is persisted, so restarts
408
413
  // never overspend the same day. Resets at midnight UTC.
@@ -428,6 +433,7 @@ Penalty enforcement normally needs this node's chain monitor to be online: if a
428
433
  ```typescript
429
434
  const node = await BeignetNode.create({
430
435
  mnemonic,
436
+ network: 'mainnet',
431
437
  watchtowers: ['03abc...@tower.example.com:9911'] // off when empty
432
438
  });
433
439
  ```
@@ -670,9 +676,8 @@ LightningNode High-level API (EventEmitter)
670
676
 
671
677
  ## Tests
672
678
 
673
- Use **Node.js 20 (20.19+)** for development and `npm ci` to install the locked tools.
674
- The linter and test runner have newer Node requirements than the library API.
675
- CI uses Node.js 20.
679
+ Use **Node.js 24 (24.22.1+)** for development and `npm ci` to install the locked tools.
680
+ CI uses Node.js 24.22.1.
676
681
 
677
682
  The lint configuration keeps the established CommonJS imports, enum aliases,
678
683
  unused catch bindings, `any` warnings and Chai assertion style. Rules removed