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.
- package/README.md +15 -10
- package/dist/cli/beignet-node.js +197 -171
- package/dist/cli/beignet-node.js.map +1 -1
- package/dist/cli/cli.js +18 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/config.js +8 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/daemon-options.js +3 -0
- package/dist/cli/daemon-options.js.map +1 -1
- package/dist/cli/daemon.js +85 -18
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/direct-funding.js +0 -2
- package/dist/cli/direct-funding.js.map +1 -1
- package/dist/cli/electrum-tls-config.js +105 -0
- package/dist/cli/electrum-tls-config.js.map +1 -0
- package/dist/cli/offline-receive.js +16 -6
- package/dist/cli/offline-receive.js.map +1 -1
- package/dist/cli/onchain-sweep.js +4 -2
- package/dist/cli/onchain-sweep.js.map +1 -1
- package/dist/cli/openapi.js +1369 -63
- package/dist/cli/openapi.js.map +1 -1
- package/dist/electrum/index.js +172 -133
- package/dist/electrum/index.js.map +1 -1
- package/dist/lightning/chain/chain-monitor.js +46 -0
- package/dist/lightning/chain/chain-monitor.js.map +1 -1
- package/dist/lightning/chain/chain-watcher.js +50 -3
- package/dist/lightning/chain/chain-watcher.js.map +1 -1
- package/dist/lightning/channel/channel-manager.js +174 -17
- package/dist/lightning/channel/channel-manager.js.map +1 -1
- package/dist/lightning/channel/channel-state.js.map +1 -1
- package/dist/lightning/channel/channel.js +68 -18
- package/dist/lightning/channel/channel.js.map +1 -1
- package/dist/lightning/channel/dual-funding.js +2 -2
- package/dist/lightning/channel/dual-funding.js.map +1 -1
- package/dist/lightning/channel/htlc-snapshots.js +40 -0
- package/dist/lightning/channel/htlc-snapshots.js.map +1 -0
- package/dist/lightning/channel/splice.js +2 -2
- package/dist/lightning/channel/splice.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/engine.js +143 -14
- package/dist/lightning/direct-funding/receiver/engine.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/index.js +2 -1
- package/dist/lightning/direct-funding/receiver/index.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/types.js +6 -1
- package/dist/lightning/direct-funding/receiver/types.js.map +1 -1
- package/dist/lightning/direct-funding/receiver/verify.js +23 -1
- package/dist/lightning/direct-funding/receiver/verify.js.map +1 -1
- package/dist/lightning/direct-funding/sender/engine.js +8 -4
- package/dist/lightning/direct-funding/sender/engine.js.map +1 -1
- package/dist/lightning/gossip/gossip-sync.js +14 -2
- package/dist/lightning/gossip/gossip-sync.js.map +1 -1
- package/dist/lightning/gossip/network-graph.js +50 -3
- package/dist/lightning/gossip/network-graph.js.map +1 -1
- package/dist/lightning/gossip/pathfinding.js +74 -179
- package/dist/lightning/gossip/pathfinding.js.map +1 -1
- package/dist/lightning/gossip/pay-all.js +4 -7
- package/dist/lightning/gossip/pay-all.js.map +1 -1
- package/dist/lightning/gossip/rapid-sync.js +13 -3
- package/dist/lightning/gossip/rapid-sync.js.map +1 -1
- package/dist/lightning/gossip/types.js.map +1 -1
- package/dist/lightning/interactive-tx/builder.js +19 -2
- package/dist/lightning/interactive-tx/builder.js.map +1 -1
- package/dist/lightning/interactive-tx/validation.js +2 -1
- package/dist/lightning/interactive-tx/validation.js.map +1 -1
- package/dist/lightning/message/splice.js +11 -36
- package/dist/lightning/message/splice.js.map +1 -1
- package/dist/lightning/node/lightning-node.js +387 -132
- package/dist/lightning/node/lightning-node.js.map +1 -1
- package/dist/lightning/node/types.js.map +1 -1
- package/dist/lightning/offer/merkle.js +3 -21
- package/dist/lightning/offer/merkle.js.map +1 -1
- package/dist/lightning/recovery/capsule.js +13 -0
- package/dist/lightning/recovery/capsule.js.map +1 -1
- package/dist/lightning/recovery/frame-codec.js +7 -5
- package/dist/lightning/recovery/frame-codec.js.map +1 -1
- package/dist/lightning/recovery/guardian-store.js +17 -1
- package/dist/lightning/recovery/guardian-store.js.map +1 -1
- package/dist/lightning/recovery/guardian.js +37 -1
- package/dist/lightning/recovery/guardian.js.map +1 -1
- package/dist/lightning/recovery/journal.js +43 -45
- package/dist/lightning/recovery/journal.js.map +1 -1
- package/dist/lightning/recovery/recovery-manager.js +22 -0
- package/dist/lightning/recovery/recovery-manager.js.map +1 -1
- package/dist/lightning/recovery/restore-driver.js +82 -26
- package/dist/lightning/recovery/restore-driver.js.map +1 -1
- package/dist/lightning/script/htlc-taproot.js +2 -17
- package/dist/lightning/script/htlc-taproot.js.map +1 -1
- package/dist/lightning/storage/durable-ledger.js +58 -15
- package/dist/lightning/storage/durable-ledger.js.map +1 -1
- package/dist/lightning/storage/serialization.js +34 -18
- package/dist/lightning/storage/serialization.js.map +1 -1
- package/dist/lightning/storage/sqlite-storage.js +377 -55
- package/dist/lightning/storage/sqlite-storage.js.map +1 -1
- package/dist/lightning/storage/types.js.map +1 -1
- package/dist/lightning/swaps/chain-resolver.js +49 -11
- package/dist/lightning/swaps/chain-resolver.js.map +1 -1
- package/dist/lightning/swaps/ledger.js +152 -10
- package/dist/lightning/swaps/ledger.js.map +1 -1
- package/dist/lightning/swaps/reverse-engine.js +108 -21
- package/dist/lightning/swaps/reverse-engine.js.map +1 -1
- package/dist/lightning/swaps/submarine-engine.js +42 -5
- package/dist/lightning/swaps/submarine-engine.js.map +1 -1
- package/dist/lightning/transport/peer-manager.js +20 -1
- package/dist/lightning/transport/peer-manager.js.map +1 -1
- package/dist/lightning/transport/peer.js +59 -8
- package/dist/lightning/transport/peer.js.map +1 -1
- package/dist/lightning/watchtower/watchtower-client.js +3 -1
- package/dist/lightning/watchtower/watchtower-client.js.map +1 -1
- package/dist/shapes/electrum.js +2 -1
- package/dist/shapes/electrum.js.map +1 -1
- package/dist/transaction/index.js +606 -221
- package/dist/transaction/index.js.map +1 -1
- package/dist/types/cli/beignet-node.d.ts +11 -14
- package/dist/types/cli/daemon.d.ts +5 -0
- package/dist/types/cli/electrum-tls-config.d.ts +12 -0
- package/dist/types/cli/types.d.ts +10 -1
- package/dist/types/electrum/index.d.ts +17 -4
- package/dist/types/lightning/chain/chain-monitor.d.ts +4 -0
- package/dist/types/lightning/chain/chain-watcher.d.ts +7 -0
- package/dist/types/lightning/channel/channel-manager.d.ts +12 -0
- package/dist/types/lightning/channel/channel-state.d.ts +1 -0
- package/dist/types/lightning/channel/channel.d.ts +6 -1
- package/dist/types/lightning/channel/dual-funding.d.ts +1 -1
- package/dist/types/lightning/channel/htlc-snapshots.d.ts +5 -0
- package/dist/types/lightning/channel/splice.d.ts +1 -1
- package/dist/types/lightning/direct-funding/receiver/engine.d.ts +5 -0
- package/dist/types/lightning/direct-funding/receiver/index.d.ts +2 -2
- package/dist/types/lightning/direct-funding/receiver/types.d.ts +10 -0
- package/dist/types/lightning/direct-funding/receiver/verify.d.ts +12 -0
- package/dist/types/lightning/gossip/gossip-sync.d.ts +1 -0
- package/dist/types/lightning/gossip/network-graph.d.ts +7 -1
- package/dist/types/lightning/gossip/pathfinding.d.ts +5 -4
- package/dist/types/lightning/gossip/rapid-sync.d.ts +2 -1
- package/dist/types/lightning/gossip/types.d.ts +6 -0
- package/dist/types/lightning/interactive-tx/builder.d.ts +3 -1
- package/dist/types/lightning/interactive-tx/validation.d.ts +1 -0
- package/dist/types/lightning/node/lightning-node.d.ts +25 -4
- package/dist/types/lightning/node/types.d.ts +2 -0
- package/dist/types/lightning/recovery/frame-codec.d.ts +1 -1
- package/dist/types/lightning/recovery/guardian-store.d.ts +2 -0
- package/dist/types/lightning/recovery/guardian.d.ts +1 -0
- package/dist/types/lightning/recovery/journal.d.ts +0 -3
- package/dist/types/lightning/recovery/recovery-manager.d.ts +1 -0
- package/dist/types/lightning/recovery/restore-driver.d.ts +3 -0
- package/dist/types/lightning/recovery/types.d.ts +1 -1
- package/dist/types/lightning/storage/durable-ledger.d.ts +12 -1
- package/dist/types/lightning/storage/serialization.d.ts +5 -1
- package/dist/types/lightning/storage/sqlite-storage.d.ts +38 -2
- package/dist/types/lightning/storage/types.d.ts +10 -0
- package/dist/types/lightning/swaps/chain-resolver.d.ts +3 -0
- package/dist/types/lightning/swaps/ledger.d.ts +13 -0
- package/dist/types/lightning/swaps/reverse-engine.d.ts +10 -1
- package/dist/types/lightning/swaps/submarine-engine.d.ts +6 -0
- package/dist/types/lightning/transport/peer-manager.d.ts +3 -0
- package/dist/types/lightning/transport/peer.d.ts +5 -0
- package/dist/types/transaction/index.d.ts +22 -11
- package/dist/types/transaction.js.map +1 -1
- package/dist/types/types/transaction.d.ts +2 -0
- package/dist/types/types/wallet.d.ts +24 -1
- package/dist/types/utils/boost.d.ts +4 -0
- package/dist/types/utils/derive-path-cached.d.ts +2 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/multisig.d.ts +5 -0
- package/dist/types/utils/node-version.d.ts +3 -0
- package/dist/types/utils/tls-verification.d.ts +3 -1
- package/dist/types/utils/wallet.d.ts +5 -2
- package/dist/types/wallet/constants.d.ts +3 -0
- package/dist/types/wallet/index.d.ts +45 -15
- package/dist/types/wallet.js.map +1 -1
- package/dist/utils/boost.js +12 -0
- package/dist/utils/boost.js.map +1 -0
- package/dist/utils/derive-path-cached.js +31 -0
- package/dist/utils/derive-path-cached.js.map +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/multisig.js +16 -5
- package/dist/utils/multisig.js.map +1 -1
- package/dist/utils/node-version.js +40 -0
- package/dist/utils/node-version.js.map +1 -0
- package/dist/utils/tls-verification.js +12 -5
- package/dist/utils/tls-verification.js.map +1 -1
- package/dist/utils/transaction.js +9 -3
- package/dist/utils/transaction.js.map +1 -1
- package/dist/utils/wallet.js +18 -2
- package/dist/utils/wallet.js.map +1 -1
- package/dist/wallet/constants.js +5 -2
- package/dist/wallet/constants.js.map +1 -1
- package/dist/wallet/index.js +738 -320
- package/dist/wallet/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +2 -0
- package/docs/RECOVERY-GUARDIAN-WIRE.md +5 -1
- package/docs/RECOVERY-PROTOCOL.md +2 -0
- package/docs/SPLICE-LOCK-DEPTH.md +12 -1
- 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
|
|
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
|
|
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: '
|
|
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
|
|
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 `
|
|
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
|
|
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
|
|
674
|
-
|
|
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
|