@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 +1 -1
- package/V1UPGRADE.md +228 -0
- package/docs/daemon-api.json +3 -1
- package/package.json +3 -1
- package/scripts/patch-coco-cashu-core.sh +45 -0
- package/src/cli-shared.ts +4 -3
- package/src/utils/state.ts +3 -1
- package/bun.lock +0 -75
package/README.md
CHANGED
|
@@ -110,7 +110,7 @@ Defaults:
|
|
|
110
110
|
|
|
111
111
|
Logging defaults:
|
|
112
112
|
|
|
113
|
-
- Structured JSON logs are written to
|
|
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.
|
package/docs/daemon-api.json
CHANGED
|
@@ -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": "
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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) {
|
package/src/utils/state.ts
CHANGED
|
@@ -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:
|
|
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
|
-
}
|