@routstr/cocod 0.0.19 → 0.0.21

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 CHANGED
@@ -110,7 +110,7 @@ Defaults:
110
110
 
111
111
  Logging defaults:
112
112
 
113
- - Structured JSON logs are written to `~/.cocod/daemon.log`
113
+ - Structured JSON logs are written to `<base>/daemon.log`
114
114
  - Rotation keeps 5 files at 5 MiB each by default
115
115
  - Override with `COCOD_LOG_LEVEL`, `COCOD_LOG_MAX_BYTES`, and `COCOD_LOG_MAX_FILES`
116
116
 
package/V1UPGRADE.md ADDED
@@ -0,0 +1,228 @@
1
+ # Coco v1.0.0 Upgrade Notes
2
+
3
+ This document captures the research/spike for upgrading `cocod` from the legacy Coco RC packages to Coco `v1.0.0`, so a future agent can continue quickly.
4
+
5
+ ## Current project state
6
+
7
+ `package.json` currently uses legacy/unscoped Coco packages:
8
+
9
+ ```json
10
+ "coco-cashu-core": "1.1.2-rc.50",
11
+ "coco-cashu-sqlite-bun": "1.1.2-rc.50",
12
+ "coco-cashu-plugin-npc": "2.4.1"
13
+ ```
14
+
15
+ Coco `v1.0.0` published stable packages under the `@cashu` scope:
16
+
17
+ ```json
18
+ "@cashu/coco-core": "1.0.0",
19
+ "@cashu/coco-sqlite-bun": "1.0.0"
20
+ ```
21
+
22
+ Release page: <https://github.com/cashubtc/coco/releases/tag/v1.0.0>
23
+
24
+ Relevant upstream source at tag `v1.0.0`:
25
+
26
+ - `@cashu/coco-core` package metadata: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/package.json#L2-L45>
27
+ - `@cashu/coco-sqlite-bun` package metadata: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/sqlite-bun/package.json#L2-L36>
28
+ - `initializeCoco` still exists and has compatible-looking config shape: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/Manager.ts#L68-L188>
29
+ - `SqliteRepositories` still exists and takes the same style `{ database }` options: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/sqlite-bun/src/index.ts#L33-L70>
30
+ - `Logger` interface is compatible with our `StructuredLogger`: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/logging/Logger.ts#L1-L10>
31
+
32
+ ## Quick spike already performed
33
+
34
+ A throwaway spike was run in `/tmp/cocod-coco-v1-spike` by:
35
+
36
+ 1. Copying this repo there, excluding `.git` and `node_modules`.
37
+ 2. Replacing dependencies:
38
+ - remove `coco-cashu-core`
39
+ - remove `coco-cashu-sqlite-bun`
40
+ - add `@cashu/coco-core@1.0.0`
41
+ - add `@cashu/coco-sqlite-bun@1.0.0`
42
+ - keep `coco-cashu-plugin-npc@2.4.1` for first pass
43
+ 3. Replacing imports:
44
+ - `"coco-cashu-core"` -> `"@cashu/coco-core"`
45
+ - `"coco-cashu-sqlite-bun"` -> `"@cashu/coco-sqlite-bun"`
46
+ 4. Running:
47
+
48
+ ```sh
49
+ bun install
50
+ bun run lint
51
+ ```
52
+
53
+ Typecheck failed with these errors:
54
+
55
+ ```txt
56
+ src/routes.ts(179,48): error TS2339: Property 'npc' does not exist on type 'PluginExtensions'.
57
+ src/routes.ts(202,49): error TS2339: Property 'npc' does not exist on type 'PluginExtensions'.
58
+ src/routes.ts(211,49): error TS2339: Property 'npc' does not exist on type 'PluginExtensions'.
59
+ src/routes.ts(235,54): error TS2551: Property 'getBalances' does not exist on type 'WalletApi'. Did you mean 'balances'?
60
+ src/utils/wallet.ts(60,12): error TS2345: Argument of type 'NPCPlugin' is not assignable to parameter of type 'Plugin<readonly (keyof ServiceMap)[]>'.
61
+ ... duplicate old/new Coco core types ...
62
+ ```
63
+
64
+ Interpretation:
65
+
66
+ - Core/sqlite migration is mostly straightforward.
67
+ - The only direct Coco API break found in our code is the balance API.
68
+ - The major blocker is `coco-cashu-plugin-npc`, because it still peers against legacy `coco-cashu-core`, not `@cashu/coco-core`.
69
+
70
+ ## Required code changes
71
+
72
+ ### 1. Change dependencies/imports
73
+
74
+ Update `package.json`:
75
+
76
+ ```json
77
+ "@cashu/coco-core": "1.0.0",
78
+ "@cashu/coco-sqlite-bun": "1.0.0"
79
+ ```
80
+
81
+ Remove:
82
+
83
+ ```json
84
+ "coco-cashu-core": "1.1.2-rc.50",
85
+ "coco-cashu-sqlite-bun": "1.1.2-rc.50"
86
+ ```
87
+
88
+ Update imports in these files/tests:
89
+
90
+ - `src/utils/wallet.ts`
91
+ - `src/routes.ts`
92
+ - `src/utils/logger.ts`
93
+ - `src/utils/state.ts`
94
+ - `src/routes.test.ts`
95
+ - `src/utils/state.test.ts`
96
+
97
+ Use:
98
+
99
+ ```ts
100
+ import { initializeCoco, ConsoleLogger, type Logger, type Manager } from "@cashu/coco-core";
101
+ import { SqliteRepositories } from "@cashu/coco-sqlite-bun";
102
+ ```
103
+
104
+ ### 2. Update `/balance`
105
+
106
+ Current code uses removed API:
107
+
108
+ ```ts
109
+ const balance = await state.manager.wallet.getBalances();
110
+ ```
111
+
112
+ Coco v1 uses structured balances only:
113
+
114
+ - Upstream changelog says `getBalances` and related scalar helpers were removed: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/CHANGELOG.md#L45-L55>
115
+ - New API is `manager.wallet.balances.byMint(scope?)`: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/api/WalletBalancesApi.ts#L4-L17>
116
+ - At tag `v1.0.0`, `BalanceSnapshot` values are still `number`s, not `Amount` objects: <https://github.com/cashubtc/coco/blob/8f06364ad15187b02e7d53b6b6a00f389be2fa60/packages/core/types.ts#L7-L13>
117
+
118
+ A minimal compatibility-preserving route change is likely:
119
+
120
+ ```ts
121
+ const balances = await state.manager.wallet.balances.byMint();
122
+ const augmentedBalance: Record<string, { [unit: string]: number }> = {};
123
+ for (const [url, balance] of Object.entries(balances)) {
124
+ augmentedBalance[url] = { sats: balance.total };
125
+ }
126
+ return Response.json({ output: augmentedBalance });
127
+ ```
128
+
129
+ If we want spendable-only CLI output instead of total, use `balance.spendable`; current old `getBalances()` summed ready proofs, so `spendable` may be the closest semantic match, while `total` includes reserved proofs. Decide before finalizing.
130
+
131
+ ### 3. NPC plugin blocker
132
+
133
+ Current plugin package metadata:
134
+
135
+ ```sh
136
+ npm view coco-cashu-plugin-npc@2.4.1 peerDependencies dependencies version --json
137
+ ```
138
+
139
+ Returned:
140
+
141
+ ```json
142
+ {
143
+ "peerDependencies": {
144
+ "typescript": "^5.0.0",
145
+ "coco-cashu-core": "^1.1.2-rc.50"
146
+ },
147
+ "dependencies": {
148
+ "npubcash-sdk": "^0.3.2"
149
+ },
150
+ "version": "2.4.1"
151
+ }
152
+ ```
153
+
154
+ Even latest prerelease checked still peers old core:
155
+
156
+ ```sh
157
+ npm view coco-cashu-plugin-npc@3.0.0-rc.20260430.2.1.sha.731759e peerDependencies --json
158
+ ```
159
+
160
+ Returned peer dependency on `coco-cashu-core`, not `@cashu/coco-core`.
161
+
162
+ This causes duplicate type universes:
163
+
164
+ - `@cashu/coco-core` Manager/plugin types in app
165
+ - `coco-cashu-core` Manager/plugin types inside NPC plugin
166
+
167
+ Symptoms:
168
+
169
+ - `coco.use(npcPlugin)` type error in `src/utils/wallet.ts`
170
+ - `state.manager.ext.npc` is missing from `PluginExtensions` in `src/routes.ts`
171
+
172
+ Possible paths:
173
+
174
+ 1. **Best path:** get or publish an NPC plugin version built against `@cashu/coco-core@1.0.0`.
175
+ 2. **Temporary path:** disable/remove NPC integration for the Coco v1 upgrade.
176
+ - Affected routes: `/npc/address`, `/npc/username`
177
+ - Affected wallet init: `NPCPlugin` creation and `coco.use(npcPlugin)`
178
+ 3. **Risky path:** local type casts/module augmentation to force old plugin into new core.
179
+ - Not recommended: runtime may still fail if plugin internals depend on old private service shapes.
180
+
181
+ ## How to continue efficiently
182
+
183
+ Recommended next session workflow:
184
+
185
+ ```sh
186
+ # from repo root
187
+ bun install
188
+
189
+ # make a branch/worktree if implementing; per repo policy, use .worktrees/ if creating worktrees
190
+ # then edit package.json/imports/balance route
191
+ bun install
192
+ bun run lint
193
+ bun test
194
+ ```
195
+
196
+ If doing another throwaway spike without changing this checkout:
197
+
198
+ ```sh
199
+ rm -rf /tmp/cocod-coco-v1-spike
200
+ mkdir -p /tmp/cocod-coco-v1-spike
201
+ tar --exclude='./node_modules' --exclude='./.git' -cf - . | tar -C /tmp/cocod-coco-v1-spike -xf -
202
+ cd /tmp/cocod-coco-v1-spike
203
+ # edit package.json/imports, then:
204
+ bun install
205
+ bun run lint
206
+ ```
207
+
208
+ Search commands that were useful:
209
+
210
+ ```sh
211
+ grep -R "coco-cashu-core\|coco-cashu-sqlite-bun\|wallet.getBalances\|wallet.balances" -n README.md docs src package.json
212
+ npm view @cashu/coco-core@1.0.0 peerDependencies dependencies version --json
213
+ npm view @cashu/coco-sqlite-bun@1.0.0 peerDependencies dependencies version --json
214
+ npm view coco-cashu-plugin-npc@latest peerDependencies dependencies version --json
215
+ npm view coco-cashu-plugin-npc versions --json
216
+ ```
217
+
218
+ ## Current estimate
219
+
220
+ - **Without NPC plugin:** easy/small change, likely same-day. Main changes are deps/imports and balance route.
221
+ - **With NPC plugin retained:** blocked until compatible NPC plugin exists, or we fork/patch it to use `@cashu/coco-core`.
222
+
223
+ ## Notes / gotchas
224
+
225
+ - The old version number `1.1.2-rc.50` looks newer than `1.0.0`, but it is from the legacy unscoped package line. Coco stable v1 is under the `@cashu` scope.
226
+ - `initializeCoco()` already calls `repo.init()` upstream, but our existing pattern of constructing `SqliteRepositories` and passing it to `initializeCoco` remains compatible.
227
+ - `@cashu/coco-sqlite-bun@1.0.0` has a peer dependency on exactly `@cashu/coco-core@1.0.0`, so pin both exactly for now.
228
+ - Upstream `main` after v1 appears to have moved some amounts to `Amount` objects; tag `v1.0.0` still has numeric `BalanceSnapshot`s. Pinning matters.
@@ -3,8 +3,10 @@
3
3
  "version": "0.0.12",
4
4
  "transport": {
5
5
  "protocol": "http",
6
+ "baseDirEnv": "COCOD_DIR",
7
+ "defaultBaseDir": "~/.cocod",
6
8
  "unixSocketEnv": "COCOD_SOCKET",
7
- "defaultUnixSocket": "~/.cocod/cocod.sock"
9
+ "defaultUnixSocket": "<COCOD_DIR>/cocod.sock"
8
10
  },
9
11
  "responseContract": {
10
12
  "success": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routstr/cocod",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "module": "src/index.ts",
5
5
  "type": "module",
6
6
  "private": false,
@@ -8,6 +8,7 @@
8
8
  "cocod": "./src/index.ts"
9
9
  },
10
10
  "scripts": {
11
+ "postinstall": "bash scripts/patch-coco-cashu-core.sh",
11
12
  "start": "bun src/index.ts",
12
13
  "daemon": "bun src/index.ts daemon",
13
14
  "lint": "tsc --noEmit",
@@ -16,6 +17,7 @@
16
17
  },
17
18
  "devDependencies": {
18
19
  "@types/bun": "latest",
20
+ "patch-package": "^8.0.1",
19
21
  "prettier": "^3.8.1"
20
22
  },
21
23
  "peerDependencies": {
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env bash
2
+ # Patch coco-cashu-core: mark irrecoverable receive ops as rolled_back
3
+ # instead of leaving them stuck in "executing" forever.
4
+ set -euo pipefail
5
+
6
+ FILE="node_modules/coco-cashu-core/dist/index.js"
7
+
8
+ if ! grep -q '"Receive outputs not persisted after recovery attempt"' "$FILE"; then
9
+ echo "patch-coco-cashu-core: target string not found, skipping" >&2
10
+ exit 0
11
+ fi
12
+
13
+ if grep -q '"Recovered: 0 proofs restored from output data"' "$FILE"; then
14
+ echo "patch-coco-cashu-core: already patched, skipping" >&2
15
+ exit 0
16
+ fi
17
+
18
+ python3 -c "
19
+ p = '$FILE'
20
+ with open(p) as f:
21
+ src = f.read()
22
+
23
+ old = '''\t\t\t\tthis.logger?.warn(\"Receive outputs not persisted after recovery attempt\", {
24
+ \t\t\t\t\toperationId: executing.id,
25
+ \t\t\t\t\tmintUrl: executing.mintUrl,
26
+ \t\t\t\t\trecoveredCount: recovered.length
27
+ \t\t\t\t});'''
28
+
29
+ new = '''\t\t\t\tthis.logger?.warn(\"Receive outputs not persisted after recovery attempt\", {
30
+ \t\t\t\t\toperationId: executing.id,
31
+ \t\t\t\t\tmintUrl: executing.mintUrl,
32
+ \t\t\t\t\trecoveredCount: recovered.length
33
+ \t\t\t\t});
34
+ \t\t\t\tawait this.markAsRolledBack(executing, \"Recovered: 0 proofs restored from output data\");
35
+ \t\t\t\treturn;'''
36
+
37
+ if old not in src:
38
+ print('ERROR: exact match not found')
39
+ exit(1)
40
+
41
+ src = src.replace(old, new, 1)
42
+ with open(p, 'w') as f:
43
+ f.write(src)
44
+ print('patch-coco-cashu-core: applied')
45
+ "
package/src/cli-shared.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { program } from "commander";
2
2
 
3
- const CONFIG_DIR = `${process.env.HOME || process.env.USERPROFILE}/.cocod`;
4
- const SOCKET_PATH = process.env.COCOD_SOCKET || `${CONFIG_DIR}/cocod.sock`;
3
+ import { LOG_FILE, SOCKET_PATH } from "./utils/config";
5
4
 
6
5
  export interface CommandResponse {
7
6
  output?: unknown;
@@ -124,7 +123,9 @@ export async function startDaemonProcess(): Promise<void> {
124
123
  if (!warningShown.value && elapsedMs >= DAEMON_SLOW_START_WARNING_MS) {
125
124
  warningShown.value = true;
126
125
  console.log("Daemon is taking longer than expected, please wait...");
127
- console.log(`Tip: run 'cocod logs --follow' or 'tail -n ${DAEMON_START_LOG_LINES} ~/.cocod/daemon.log' in another terminal.`);
126
+ console.log(
127
+ `Tip: run 'cocod logs --follow' or 'tail -n ${DAEMON_START_LOG_LINES} ${LOG_FILE}' in another terminal.`,
128
+ );
128
129
  }
129
130
 
130
131
  if (elapsedMs >= DAEMON_START_TIMEOUT_MS) {
@@ -1,5 +1,7 @@
1
1
  import type { Manager } from "coco-cashu-core";
2
2
 
3
+ import { CONFIG_FILE } from "./config";
4
+
3
5
  export interface UninitializedState {
4
6
  status: "UNINITIALIZED";
5
7
  }
@@ -97,7 +99,7 @@ export class DaemonStateManager {
97
99
  if (state.status !== "UNINITIALIZED") {
98
100
  return Response.json(
99
101
  {
100
- error: "Wallet already initialized. Delete ~/.cocod/config.json to reset.",
102
+ error: `Wallet already initialized. Delete ${CONFIG_FILE} to reset.`,
101
103
  },
102
104
  { status: 409 },
103
105
  );
package/bun.lock DELETED
@@ -1,75 +0,0 @@
1
- {
2
- "lockfileVersion": 0,
3
- "workspaces": {
4
- "": {
5
- "dependencies": {
6
- "@scure/bip39": "^2.0.1",
7
- "coco-cashu-core": "1.1.2-rc.50",
8
- "coco-cashu-plugin-npc": "2.4.1",
9
- "coco-cashu-sqlite-bun": "1.1.2-rc.50",
10
- "commander": "^14.0.2",
11
- "nostr-tools": "^2.22.1",
12
- },
13
- "devDependencies": {
14
- "@types/bun": "latest",
15
- "prettier": "^3.8.1",
16
- },
17
- "peerDependencies": {
18
- "typescript": "^5",
19
- },
20
- },
21
- },
22
- "packages": {
23
- "@cashu/cashu-ts": ["@cashu/cashu-ts@3.6.4", "", { "dependencies": { "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@scure/base": "^2.0.0", "@scure/bip32": "^2.0.1" } }, "sha512-a6Asqk+wPEk9a6BQmdLMeegngj0KHKicABUEtr1cUMLTAUYHVHfdfEuHDlU+bNUqXXyaTssG7yo/ZhfHrgbSkQ=="],
24
-
25
- "@noble/ciphers": ["@noble/ciphers@2.1.1", "", {}, "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw=="],
26
-
27
- "@noble/curves": ["@noble/curves@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0" } }, "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ=="],
28
-
29
- "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="],
30
-
31
- "@scure/base": ["@scure/base@2.2.0", "", {}, "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg=="],
32
-
33
- "@scure/bip32": ["@scure/bip32@2.2.0", "", { "dependencies": { "@noble/curves": "2.2.0", "@noble/hashes": "2.2.0", "@scure/base": "2.2.0" } }, "sha512-zFr7t2F+a9+5tB7QbarF2HQNYrgjCNaoLAupZdKkrFMYMozJf5zqH2WJCQibMzm1qQ0QogrxVGO3qXfQDYMaQg=="],
34
-
35
- "@scure/bip39": ["@scure/bip39@2.2.0", "", { "dependencies": { "@noble/hashes": "2.2.0", "@scure/base": "2.2.0" } }, "sha512-T/Bj/YvYMNkIPq6EENO6/rcs2e7qTNuyoUXf0KBFDmp0ZDu0H2X4Lq6yC3i0c8PcWkov5EbW+yQZZbdMmk154A=="],
36
-
37
- "@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
38
-
39
- "@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
40
-
41
- "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="],
42
-
43
- "coco-cashu-core": ["coco-cashu-core@1.1.2-rc.50", "", { "dependencies": { "@cashu/cashu-ts": "^3.5.0", "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@scure/bip32": "^2.0.1" }, "peerDependencies": { "typescript": "^5" } }, "sha512-eK5YuwvCWpeCwF/GEkMo90FCyek2mS+smQ51wKjkjTKzpkVVlNln52l2h1Wwce4VMnW6GSeL2IgT8IksM8Umuw=="],
44
-
45
- "coco-cashu-plugin-npc": ["coco-cashu-plugin-npc@2.4.1", "", { "dependencies": { "npubcash-sdk": "^0.3.2" }, "peerDependencies": { "coco-cashu-core": "^1.1.2-rc.50", "typescript": "^5.0.0" } }, "sha512-0OhqXXRLBq/2VkeuyqHrTINCEQYEk9+dCD9Vq7+M94CDf7kLKQZmoDL6leTuHJ45pIVnALcOFnjIcRoJwV7iiA=="],
46
-
47
- "coco-cashu-sqlite-bun": ["coco-cashu-sqlite-bun@1.1.2-rc.50", "", { "peerDependencies": { "coco-cashu-core": "1.1.2-rc.50", "typescript": "^5" } }, "sha512-wYAZjGmk3Xd75rq7y6AGLji4z5/3v5rWj6xgQoa3Qq+37zKnuCeLqVt+A3x/3EcNRLmNoW/u7vQJTJP4APHhIw=="],
48
-
49
- "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
50
-
51
- "nostr-tools": ["nostr-tools@2.23.3", "", { "dependencies": { "@noble/ciphers": "2.1.1", "@noble/curves": "2.0.1", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0", "@scure/bip32": "2.0.1", "@scure/bip39": "2.0.1", "nostr-wasm": "0.1.0" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-AALyt9k8xPdF4UV2mlLJ2mgCn4kpTB0DZ8t2r6wjdUh6anfx2cTVBsHUlo9U0EY/cKC5wcNyiMAmRJV5OVEalA=="],
52
-
53
- "nostr-wasm": ["nostr-wasm@0.1.0", "", {}, "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA=="],
54
-
55
- "npubcash-sdk": ["npubcash-sdk@0.3.2", "", { "dependencies": { "@cashu/cashu-ts": "^3.2.2", "nostr-tools": "^2.19.4", "npubcash-types": "^0.1.1" } }, "sha512-mJwvWW6rAq04b/AHbd76T4gTeUqP2uprc01Y0ToU9ZK5co3n1PmBKWLBLbPN+VgpHhE0LubzjLq/qm70YWUugA=="],
56
-
57
- "npubcash-types": ["npubcash-types@0.1.1", "", {}, "sha512-/HGfes2cvQpkrWOuUrdemJJhJUQu+xiXl4x+AxQtKUMGCB8uEhfrXJfAQ0n+DgtkIX1YVLOh0a/e6E5LX+fUew=="],
58
-
59
- "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
60
-
61
- "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
62
-
63
- "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
64
-
65
- "nostr-tools/@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="],
66
-
67
- "nostr-tools/@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
68
-
69
- "nostr-tools/@scure/base": ["@scure/base@2.0.0", "", {}, "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w=="],
70
-
71
- "nostr-tools/@scure/bip32": ["@scure/bip32@2.0.1", "", { "dependencies": { "@noble/curves": "2.0.1", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0" } }, "sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA=="],
72
-
73
- "nostr-tools/@scure/bip39": ["@scure/bip39@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1", "@scure/base": "2.0.0" } }, "sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg=="],
74
- }
75
- }