@1sat/wallet-server 0.0.29 → 0.0.31

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 (49) hide show
  1. package/dist/createHostServer.d.ts +44 -0
  2. package/dist/createHostServer.d.ts.map +1 -0
  3. package/dist/createHostServer.js +187 -0
  4. package/dist/createHostServer.js.map +1 -0
  5. package/dist/createWalletServer.d.ts +15 -1
  6. package/dist/createWalletServer.d.ts.map +1 -1
  7. package/dist/createWalletServer.js +28 -6
  8. package/dist/createWalletServer.js.map +1 -1
  9. package/dist/hosting/client.d.ts +31 -0
  10. package/dist/hosting/client.d.ts.map +1 -0
  11. package/dist/hosting/client.js +45 -0
  12. package/dist/hosting/client.js.map +1 -0
  13. package/dist/hosting/routes.d.ts +25 -0
  14. package/dist/hosting/routes.d.ts.map +1 -0
  15. package/dist/hosting/routes.js +238 -0
  16. package/dist/hosting/routes.js.map +1 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/paymail/destination.d.ts +14 -0
  22. package/dist/paymail/destination.d.ts.map +1 -0
  23. package/dist/paymail/destination.js +48 -0
  24. package/dist/paymail/destination.js.map +1 -0
  25. package/dist/paymail/entitlement.d.ts +15 -0
  26. package/dist/paymail/entitlement.d.ts.map +1 -0
  27. package/dist/paymail/entitlement.js +30 -0
  28. package/dist/paymail/entitlement.js.map +1 -0
  29. package/dist/paymail/messagebox.d.ts +25 -0
  30. package/dist/paymail/messagebox.d.ts.map +1 -0
  31. package/dist/paymail/messagebox.js +55 -0
  32. package/dist/paymail/messagebox.js.map +1 -0
  33. package/dist/paymail/pending.d.ts +19 -0
  34. package/dist/paymail/pending.d.ts.map +1 -0
  35. package/dist/paymail/pending.js +90 -0
  36. package/dist/paymail/pending.js.map +1 -0
  37. package/dist/paymail/resolve.d.ts +12 -0
  38. package/dist/paymail/resolve.d.ts.map +1 -0
  39. package/dist/paymail/resolve.js +72 -0
  40. package/dist/paymail/resolve.js.map +1 -0
  41. package/dist/paymail/routes.d.ts +8 -0
  42. package/dist/paymail/routes.d.ts.map +1 -0
  43. package/dist/paymail/routes.js +152 -0
  44. package/dist/paymail/routes.js.map +1 -0
  45. package/dist/paymail/types.d.ts +48 -0
  46. package/dist/paymail/types.d.ts.map +1 -0
  47. package/dist/paymail/types.js +2 -0
  48. package/dist/paymail/types.js.map +1 -0
  49. package/package.json +61 -57
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Hosting subscription routes on the wallet server.
3
+ *
4
+ * GET /hosting/price — public (mounted before global auth when possible)
5
+ * GET /hosting/status — BRC-100 auth
6
+ * POST /hosting/subscribe — BRC-100 auth + 402 → spend prior receipt(s), mint one new
7
+ *
8
+ * Receipt: 1-sat to host, basket HOSTING_BASKET, wallet-local tags only
9
+ * (payer:{id}, exp:{unix}). No customer identity on-chain.
10
+ * At most one live receipt set per identity: renew spends all prior.
11
+ */
12
+ import { HOSTING_BASKET, P1SAT_PROTOCOL, hostingExpTag, hostingPayerTag, readHostingExp, } from '@1sat/types';
13
+ import { Hash, P2PKH, PublicKey, Transaction, TransactionSignature, UnlockingScript, Utils, } from '@bsv/sdk';
14
+ import { createAccountsPaymentMiddleware } from '../accounts/paymentMiddleware';
15
+ export function mountHostingRoutes(app, basePath, deps) {
16
+ const root = basePath === '/' ? '' : basePath.replace(/\/$/, '');
17
+ // GET /hosting/price is mounted in createWalletServer *before* auth.
18
+ app.get(`${root}/hosting/status`, deps.authMiddleware, async (req, res) => {
19
+ const cfg = deps.getConfig();
20
+ const identityKey = req.auth?.identityKey;
21
+ if (!identityKey || identityKey === 'unknown') {
22
+ return res.status(401).json({ error: 'unauthenticated' });
23
+ }
24
+ if (!cfg.enabled) {
25
+ return res.json({
26
+ enabled: false,
27
+ identityKey,
28
+ active: false,
29
+ });
30
+ }
31
+ const status = await hostingStatus(deps.wallet, identityKey);
32
+ return res.json({
33
+ enabled: true,
34
+ identityKey,
35
+ ...status,
36
+ priceSats: cfg.priceSats,
37
+ periodSeconds: cfg.periodSeconds,
38
+ });
39
+ });
40
+ const paymentMw = createAccountsPaymentMiddleware({
41
+ wallet: deps.wallet,
42
+ calculateRequestPrice: async () => {
43
+ const cfg = deps.getConfig();
44
+ return cfg.enabled ? cfg.priceSats : 0;
45
+ },
46
+ onPaymentInternalize: (_req, defaults) => ({
47
+ ...defaults,
48
+ description: 'Hosted paymail subscription',
49
+ labels: ['hosting-payment'],
50
+ }),
51
+ });
52
+ app.post(`${root}/hosting/subscribe`, deps.authMiddleware, paymentMw, async (req, res) => {
53
+ const cfg = deps.getConfig();
54
+ const identityKey = req.auth?.identityKey;
55
+ if (!identityKey || identityKey === 'unknown') {
56
+ return res.status(401).json({ error: 'unauthenticated' });
57
+ }
58
+ if (!cfg.enabled) {
59
+ return res.status(404).json({ error: 'hosting disabled' });
60
+ }
61
+ try {
62
+ const result = await mintOrReplaceReceipt(deps.wallet, identityKey, cfg.periodSeconds);
63
+ return res.json({
64
+ status: 'ok',
65
+ identityKey,
66
+ expiresAt: result.expiresAt,
67
+ txid: result.txid,
68
+ });
69
+ }
70
+ catch (err) {
71
+ console.error('[hosting] mint receipt failed', err);
72
+ return res.status(500).json({
73
+ error: err instanceof Error ? err.message : 'mint failed',
74
+ });
75
+ }
76
+ });
77
+ }
78
+ async function listReceipts(wallet, identityKey, withBeef) {
79
+ const result = await wallet.listOutputs({
80
+ basket: HOSTING_BASKET,
81
+ tags: [hostingPayerTag(identityKey)],
82
+ tagQueryMode: 'all',
83
+ includeTags: true,
84
+ includeCustomInstructions: true,
85
+ ...(withBeef ? { include: 'entire transactions' } : {}),
86
+ limit: 100,
87
+ });
88
+ return {
89
+ outputs: result.outputs,
90
+ BEEF: result.BEEF ? Array.from(result.BEEF) : undefined,
91
+ };
92
+ }
93
+ async function hostingStatus(wallet, identityKey) {
94
+ const { outputs } = await listReceipts(wallet, identityKey, false);
95
+ const now = Math.floor(Date.now() / 1000);
96
+ // After correct mint, at most one — still take max if legacy junk exists.
97
+ let maxExp = 0;
98
+ for (const o of outputs) {
99
+ const exp = readHostingExp(o.tags);
100
+ if (exp !== undefined && exp > maxExp)
101
+ maxExp = exp;
102
+ }
103
+ return {
104
+ active: maxExp > now,
105
+ expiresAt: maxExp > 0 ? maxExp : undefined,
106
+ };
107
+ }
108
+ /**
109
+ * Spend all existing receipts for identity, create exactly one new receipt
110
+ * with exp = max(now, priorExp) + periodSeconds.
111
+ */
112
+ async function mintOrReplaceReceipt(wallet, identityKey, periodSeconds) {
113
+ const now = Math.floor(Date.now() / 1000);
114
+ const { outputs: existing, BEEF } = await listReceipts(wallet, identityKey, true);
115
+ let priorExp = now;
116
+ for (const o of existing) {
117
+ const exp = readHostingExp(o.tags);
118
+ if (exp !== undefined && exp > priorExp)
119
+ priorExp = exp;
120
+ }
121
+ const expiresAt = priorExp + periodSeconds;
122
+ const keyID = `hosting-${expiresAt}-${identityKey.slice(0, 8)}`;
123
+ const { publicKey } = await wallet.getPublicKey({
124
+ protocolID: P1SAT_PROTOCOL,
125
+ keyID,
126
+ counterparty: 'self',
127
+ forSelf: true,
128
+ });
129
+ const lockingScript = new P2PKH()
130
+ .lock(PublicKey.fromString(publicKey).toAddress())
131
+ .toHex();
132
+ const inputs = existing.map((o) => ({
133
+ outpoint: o.outpoint,
134
+ inputDescription: 'Replace hosting receipt',
135
+ unlockingScriptLength: 108,
136
+ }));
137
+ const created = await wallet.createAction({
138
+ description: 'Hosting subscription receipt',
139
+ ...(inputs.length > 0 && {
140
+ inputs,
141
+ inputBEEF: BEEF,
142
+ }),
143
+ outputs: [
144
+ {
145
+ lockingScript,
146
+ satoshis: 1,
147
+ outputDescription: 'Hosting receipt',
148
+ basket: HOSTING_BASKET,
149
+ tags: [hostingPayerTag(identityKey), hostingExpTag(expiresAt)],
150
+ customInstructions: JSON.stringify({
151
+ protocolID: P1SAT_PROTOCOL,
152
+ keyID,
153
+ counterparty: 'self',
154
+ }),
155
+ },
156
+ ],
157
+ options: { randomizeOutputs: false },
158
+ });
159
+ if (!created.txid && !created.signableTransaction) {
160
+ throw new Error('createAction returned no txid');
161
+ }
162
+ if (created.signableTransaction && existing.length > 0) {
163
+ const tx = Transaction.fromAtomicBEEF(created.signableTransaction.tx);
164
+ const spends = {};
165
+ for (let i = 0; i < existing.length; i++) {
166
+ const o = existing[i];
167
+ if (!o.customInstructions) {
168
+ throw new Error(`missing customInstructions on ${o.outpoint}`);
169
+ }
170
+ const ci = JSON.parse(o.customInstructions);
171
+ const unlocking = await signP2PKH(wallet, tx, i, ci.protocolID, ci.keyID, ci.counterparty ?? 'self');
172
+ spends[i] = { unlockingScript: unlocking };
173
+ }
174
+ const signed = await wallet.signAction({
175
+ reference: created.signableTransaction.reference,
176
+ spends,
177
+ });
178
+ if (!signed.txid)
179
+ throw new Error('signAction returned no txid');
180
+ return { expiresAt, txid: signed.txid };
181
+ }
182
+ if (!created.txid)
183
+ throw new Error('createAction returned no txid');
184
+ return { expiresAt, txid: created.txid };
185
+ }
186
+ async function signP2PKH(wallet, tx, inputIndex, protocolID, keyID, counterparty) {
187
+ const txInput = tx.inputs[inputIndex];
188
+ const sourceLockingScript = txInput.sourceTransaction?.outputs[txInput.sourceOutputIndex]?.lockingScript;
189
+ if (!sourceLockingScript) {
190
+ throw new Error(`missing source locking script for input ${inputIndex}`);
191
+ }
192
+ const sourceTXID = txInput.sourceTXID ?? txInput.sourceTransaction?.id('hex');
193
+ if (!sourceTXID)
194
+ throw new Error(`missing source txid for input ${inputIndex}`);
195
+ const sourceSatoshis = txInput.sourceTransaction?.outputs[txInput.sourceOutputIndex]?.satoshis ?? 1;
196
+ const preimage = TransactionSignature.format({
197
+ sourceTXID,
198
+ sourceOutputIndex: txInput.sourceOutputIndex,
199
+ sourceSatoshis,
200
+ transactionVersion: tx.version,
201
+ otherInputs: tx.inputs
202
+ .filter((_, idx) => idx !== inputIndex)
203
+ .map((inp) => ({
204
+ sourceTXID: inp.sourceTXID ?? inp.sourceTransaction?.id('hex') ?? '',
205
+ sourceOutputIndex: inp.sourceOutputIndex,
206
+ sequence: inp.sequence ?? 0xffffffff,
207
+ })),
208
+ inputIndex,
209
+ outputs: tx.outputs,
210
+ inputSequence: txInput.sequence ?? 0xffffffff,
211
+ subscript: sourceLockingScript,
212
+ lockTime: tx.lockTime,
213
+ scope: TransactionSignature.SIGHASH_ALL | TransactionSignature.SIGHASH_FORKID,
214
+ });
215
+ const sighash = Hash.sha256(Hash.sha256(preimage));
216
+ const { signature } = await wallet.createSignature({
217
+ protocolID,
218
+ keyID,
219
+ counterparty,
220
+ data: Array.from(preimage),
221
+ hashToDirectlySign: Array.from(sighash),
222
+ });
223
+ const { publicKey } = await wallet.getPublicKey({
224
+ protocolID,
225
+ keyID,
226
+ counterparty,
227
+ forSelf: true,
228
+ });
229
+ const sigWithHashtype = [
230
+ ...signature,
231
+ TransactionSignature.SIGHASH_ALL | TransactionSignature.SIGHASH_FORKID,
232
+ ];
233
+ return new UnlockingScript()
234
+ .writeBin(sigWithHashtype)
235
+ .writeBin(Utils.toArray(publicKey, 'hex'))
236
+ .toHex();
237
+ }
238
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/hosting/routes.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,4 +15,12 @@ export * from './resolvers';
15
15
  export * from './accounts';
16
16
  export type { IdentityResolver, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseErr, JsonRpcResponseOk, PreDispatchContext, PreDispatchHook, PreDispatchResult, ResolvedIdentity, WalletRpcHandlerConfig, WalletStorageProvider, } from './types';
17
17
  export type { WalletServerAccounts } from './createWalletServer';
18
+ export { createHostServer } from './createHostServer';
19
+ export type { HostServerConfig, HostServerHandle, HostServerMessageboxConfig, } from './createHostServer';
20
+ export { mountPaymailRoutes } from './paymail/routes';
21
+ export { KnexPendingStore, DEFAULT_TTL_MS } from './paymail/pending';
22
+ export { checkHostingEntitlement } from './paymail/entitlement';
23
+ export type { PaymailDeps, PendingPayment, PendingStore, ResolvedBind, } from './paymail/types';
24
+ export { mountHostingRoutes, type HostingConfig, type HostingConfigProvider, } from './hosting/routes';
25
+ export { HostingClient, type HostingPrice, type HostingStatus, type HostingSubscribeResult, } from './hosting/client';
18
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EACX,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,YAAY,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EACX,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,YAAY,EACX,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACzE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAE1B,YAAY,EACX,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,SAAS,CAAA;AAEhB,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,YAAY,EACX,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,GAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,YAAY,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,GACZ,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACN,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,sBAAsB,GAC3B,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -7,4 +7,10 @@ export { createWalletMonitor } from './createWalletMonitor';
7
7
  export { BILLABLE_METHODS, dispatch, isBillableMethod } from './dispatch';
8
8
  export * from './resolvers';
9
9
  export * from './accounts';
10
+ export { createHostServer } from './createHostServer';
11
+ export { mountPaymailRoutes } from './paymail/routes';
12
+ export { KnexPendingStore, DEFAULT_TTL_MS } from './paymail/pending';
13
+ export { checkHostingEntitlement } from './paymail/entitlement';
14
+ export { mountHostingRoutes, } from './hosting/routes';
15
+ export { HostingClient, } from './hosting/client';
10
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAM3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGzE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAMzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAM3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGzE,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAiB1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAMrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAO/D,OAAO,EACN,kBAAkB,GAGlB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,aAAa,GAIb,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BRC-29 payment destination for a bound identity (anyone-deriver path).
3
+ * Port of Go DerivePaymentDestination.
4
+ */
5
+ import type { PendingPayment, PendingStore } from './types';
6
+ export declare function createPaymentDestination(store: PendingStore, opts: {
7
+ alias: string;
8
+ domain: string;
9
+ identityPubKey: string;
10
+ satoshis: number;
11
+ ttlMs?: number;
12
+ }): Promise<PendingPayment>;
13
+ export declare function verifyPaymentOutputs(outputScriptsHex: string[], satoshis: number[], pending: PendingPayment): number;
14
+ //# sourceMappingURL=destination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../src/paymail/destination.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAQ3D,wBAAsB,wBAAwB,CAC7C,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IACL,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,GACC,OAAO,CAAC,cAAc,CAAC,CA+BzB;AAED,wBAAgB,oBAAoB,CACnC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,cAAc,GACrB,MAAM,CAQR"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * BRC-29 payment destination for a bound identity (anyone-deriver path).
3
+ * Port of Go DerivePaymentDestination.
4
+ */
5
+ import { BRC29_PROTOCOL_ID } from '@1sat/types';
6
+ import { KeyDeriver, P2PKH, PrivateKey, PublicKey, Utils } from '@bsv/sdk';
7
+ import { DEFAULT_TTL_MS, generateReference } from './pending';
8
+ function randomB64(n) {
9
+ const b = new Uint8Array(n);
10
+ crypto.getRandomValues(b);
11
+ return Utils.toBase64(Array.from(b));
12
+ }
13
+ export async function createPaymentDestination(store, opts) {
14
+ const derivationPrefix = randomB64(16);
15
+ const derivationSuffix = randomB64(16);
16
+ const keyID = `${derivationPrefix} ${derivationSuffix}`;
17
+ // Anyone-key derives the payment pub the recipient can spend (BRC-29).
18
+ const anyone = new KeyDeriver(new PrivateKey(1));
19
+ const paymentPub = anyone.derivePublicKey(BRC29_PROTOCOL_ID, keyID, PublicKey.fromString(opts.identityPubKey), false);
20
+ const outputScript = new P2PKH().lock(paymentPub.toAddress()).toHex();
21
+ const now = new Date();
22
+ const ttl = opts.ttlMs ?? DEFAULT_TTL_MS;
23
+ const pending = {
24
+ reference: generateReference(),
25
+ alias: opts.alias,
26
+ domain: opts.domain,
27
+ identityPubKey: opts.identityPubKey,
28
+ derivationPrefix,
29
+ derivationSuffix,
30
+ satoshis: opts.satoshis,
31
+ outputScript,
32
+ createdAt: now,
33
+ expiresAt: new Date(now.getTime() + ttl),
34
+ };
35
+ await store.create(pending);
36
+ return pending;
37
+ }
38
+ export function verifyPaymentOutputs(outputScriptsHex, satoshis, pending) {
39
+ for (let i = 0; i < outputScriptsHex.length; i++) {
40
+ if (outputScriptsHex[i] !== pending.outputScript)
41
+ continue;
42
+ if (pending.satoshis === 0 || satoshis[i] === pending.satoshis) {
43
+ return i;
44
+ }
45
+ }
46
+ throw new Error('no output matches the expected payment destination');
47
+ }
48
+ //# sourceMappingURL=destination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destination.js","sourceRoot":"","sources":["../../src/paymail/destination.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7D,SAAS,SAAS,CAAC,CAAS;IAC3B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACzB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,KAAmB,EACnB,IAMC;IAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,gBAAgB,GAAG,SAAS,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,KAAK,GAAG,GAAG,gBAAgB,IAAI,gBAAgB,EAAE,CAAA;IAEvD,uEAAuE;IACvE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CACxC,iBAAiB,EACjB,KAAK,EACL,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EACzC,KAAK,CACL,CAAA;IACD,MAAM,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAA;IAErE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,CAAA;IACxC,MAAM,OAAO,GAAmB;QAC/B,SAAS,EAAE,iBAAiB,EAAE;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,gBAAgB;QAChB,gBAAgB;QAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY;QACZ,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;KACxC,CAAA;IACD,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3B,OAAO,OAAO,CAAA;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,gBAA0B,EAC1B,QAAkB,EAClB,OAAuB;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,IAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY;YAAE,SAAQ;QAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChE,OAAO,CAAC,CAAA;QACT,CAAC;IACF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;AACtE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Host subscription check — wallet-local receipts in HOSTING_BASKET.
3
+ * Identity is only in tags (not on-chain script).
4
+ */
5
+ import type { WalletInterface } from '@bsv/sdk';
6
+ export interface EntitlementStatus {
7
+ active: boolean;
8
+ expiresAt?: number;
9
+ }
10
+ /**
11
+ * True if host wallet has an unspent receipt for identity with exp > now.
12
+ * Uses max exp if multiple receipts exist.
13
+ */
14
+ export declare function checkHostingEntitlement(wallet: WalletInterface, identityKeyHex: string, nowUnix?: number): Promise<EntitlementStatus>;
15
+ //# sourceMappingURL=entitlement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement.d.ts","sourceRoot":"","sources":["../../src/paymail/entitlement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC5C,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,SAAgC,GACrC,OAAO,CAAC,iBAAiB,CAAC,CAoB5B"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Host subscription check — wallet-local receipts in HOSTING_BASKET.
3
+ * Identity is only in tags (not on-chain script).
4
+ */
5
+ import { HOSTING_BASKET, hostingPayerTag, readHostingExp, } from '@1sat/types';
6
+ /**
7
+ * True if host wallet has an unspent receipt for identity with exp > now.
8
+ * Uses max exp if multiple receipts exist.
9
+ */
10
+ export async function checkHostingEntitlement(wallet, identityKeyHex, nowUnix = Math.floor(Date.now() / 1000)) {
11
+ const { outputs } = await wallet.listOutputs({
12
+ basket: HOSTING_BASKET,
13
+ tags: [hostingPayerTag(identityKeyHex)],
14
+ tagQueryMode: 'all',
15
+ includeTags: true,
16
+ limit: 100,
17
+ });
18
+ // Correct subscribe path leaves a single receipt; if more exist, use latest exp.
19
+ let maxExp = 0;
20
+ for (const o of outputs) {
21
+ const exp = readHostingExp(o.tags);
22
+ if (exp !== undefined && exp > maxExp)
23
+ maxExp = exp;
24
+ }
25
+ if (maxExp > nowUnix) {
26
+ return { active: true, expiresAt: maxExp };
27
+ }
28
+ return { active: false, expiresAt: maxExp > 0 ? maxExp : undefined };
29
+ }
30
+ //# sourceMappingURL=entitlement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../src/paymail/entitlement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,cAAc,EACd,eAAe,EACf,cAAc,GACd,MAAM,aAAa,CAAA;AAQpB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,MAAuB,EACvB,cAAsB,EACtB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAEvC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QAC5C,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACvC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,GAAG;KACV,CAAC,CAAA;IAEF,iFAAiF;IACjF,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,MAAM;YAAE,MAAM,GAAG,GAAG,CAAA;IACpD,CAAC;IAED,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;IAC3C,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;AACrE,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Authenticated send to messagebox — port of Go MessageBoxClient.
3
+ */
4
+ import { PrivateKey, type WalletInterface } from '@bsv/sdk';
5
+ import type { PendingPayment } from './types';
6
+ export interface PaymailMessageBody {
7
+ beef: string;
8
+ outputIndex: number;
9
+ derivationPrefix: string;
10
+ derivationSuffix: string;
11
+ senderIdentityKey: string;
12
+ satoshis: number;
13
+ alias: string;
14
+ }
15
+ /** BRC-29 anyone root identity (matches Go AnyoneDeriverIdentityKey). */
16
+ export declare function anyoneIdentityKeyHex(): string;
17
+ export declare class MessageBoxClient {
18
+ private authFetch;
19
+ private baseUrl;
20
+ constructor(baseUrl: string, wallet: WalletInterface);
21
+ static fromPrivateKey(baseUrl: string, privateKey: PrivateKey): MessageBoxClient;
22
+ sendMessage(recipient: string, messageBox: string, messageId: string, body: unknown): Promise<void>;
23
+ deliverPayment(beefHex: string, outputIndex: number, pending: PendingPayment): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=messagebox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messagebox.d.ts","sourceRoot":"","sources":["../../src/paymail/messagebox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmC,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACb;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;IAKpD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,gBAAgB;IAI1E,WAAW,CAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;IAmBV,cAAc,CACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;CA0BhB"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Authenticated send to messagebox — port of Go MessageBoxClient.
3
+ */
4
+ import { AuthFetch, CompletedProtoWallet, PrivateKey } from '@bsv/sdk';
5
+ /** BRC-29 anyone root identity (matches Go AnyoneDeriverIdentityKey). */
6
+ export function anyoneIdentityKeyHex() {
7
+ return new PrivateKey(1).toPublicKey().toString();
8
+ }
9
+ export class MessageBoxClient {
10
+ authFetch;
11
+ baseUrl;
12
+ constructor(baseUrl, wallet) {
13
+ this.baseUrl = baseUrl.replace(/\/$/, '');
14
+ this.authFetch = new AuthFetch(wallet);
15
+ }
16
+ static fromPrivateKey(baseUrl, privateKey) {
17
+ return new MessageBoxClient(baseUrl, new CompletedProtoWallet(privateKey));
18
+ }
19
+ async sendMessage(recipient, messageBox, messageId, body) {
20
+ const res = await this.authFetch.fetch(`${this.baseUrl}/sendMessage`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify({
24
+ message: {
25
+ recipient,
26
+ messageBox,
27
+ messageId,
28
+ body,
29
+ },
30
+ }),
31
+ });
32
+ if (!res.ok) {
33
+ const text = await res.text();
34
+ throw new Error(`sendMessage ${res.status}: ${text}`);
35
+ }
36
+ }
37
+ async deliverPayment(beefHex, outputIndex, pending) {
38
+ if (!pending.identityPubKey)
39
+ return;
40
+ const msgIdBytes = new Uint8Array(16);
41
+ crypto.getRandomValues(msgIdBytes);
42
+ const messageId = Array.from(msgIdBytes, (x) => x.toString(16).padStart(2, '0')).join('');
43
+ const body = {
44
+ beef: beefHex,
45
+ outputIndex,
46
+ derivationPrefix: pending.derivationPrefix,
47
+ derivationSuffix: pending.derivationSuffix,
48
+ senderIdentityKey: anyoneIdentityKeyHex(),
49
+ satoshis: pending.satoshis,
50
+ alias: pending.alias,
51
+ };
52
+ await this.sendMessage(pending.identityPubKey, 'payment_inbox', messageId, body);
53
+ }
54
+ }
55
+ //# sourceMappingURL=messagebox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messagebox.js","sourceRoot":"","sources":["../../src/paymail/messagebox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,UAAU,EAAwB,MAAM,UAAU,CAAA;AAa5F,yEAAyE;AACzE,MAAM,UAAU,oBAAoB;IACnC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,OAAO,gBAAgB;IACpB,SAAS,CAAW;IACpB,OAAO,CAAQ;IAEvB,YAAY,OAAe,EAAE,MAAuB;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAe,EAAE,UAAsB;QAC5D,OAAO,IAAI,gBAAgB,CAAC,OAAO,EAAE,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAA;IAC3E,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,SAAiB,EACjB,UAAkB,EAClB,SAAiB,EACjB,IAAa;QAEb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE;oBACR,SAAS;oBACT,UAAU;oBACV,SAAS;oBACT,IAAI;iBACJ;aACD,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC;IACF,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,OAAe,EACf,WAAmB,EACnB,OAAuB;QAEvB,IAAI,CAAC,OAAO,CAAC,cAAc;YAAE,OAAM;QAEnC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9C,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAC/B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEV,MAAM,IAAI,GAAuB;YAChC,IAAI,EAAE,OAAO;YACb,WAAW;YACX,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,iBAAiB,EAAE,oBAAoB,EAAE;YACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACpB,CAAA;QAED,MAAM,IAAI,CAAC,WAAW,CACrB,OAAO,CAAC,cAAc,EACtB,eAAe,EACf,SAAS,EACT,IAAI,CACJ,CAAA;IACF,CAAC;CACD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * In-flight P2P payment refs — port of 1sat-stack/pkg/paymail store (15m TTL).
3
+ * Knex-backed so it shares the host's DB (sqlite or pg) like messagebox.
4
+ */
5
+ import type { Knex } from 'knex';
6
+ import type { PendingPayment, PendingStore } from './types';
7
+ export declare const DEFAULT_TTL_MS: number;
8
+ export declare function generateReference(): string;
9
+ export declare class KnexPendingStore implements PendingStore {
10
+ private db;
11
+ constructor(db: Knex);
12
+ init(): Promise<void>;
13
+ create(p: PendingPayment): Promise<void>;
14
+ get(reference: string): Promise<PendingPayment | null>;
15
+ update(p: PendingPayment): Promise<void>;
16
+ delete(reference: string): Promise<void>;
17
+ purgeExpired(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=pending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.d.ts","sourceRoot":"","sources":["../../src/paymail/pending.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3D,eAAO,MAAM,cAAc,QAAiB,CAAA;AAE5C,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACxC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,IAAI;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,MAAM,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAyBtD,MAAM,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAMnC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * In-flight P2P payment refs — port of 1sat-stack/pkg/paymail store (15m TTL).
3
+ * Knex-backed so it shares the host's DB (sqlite or pg) like messagebox.
4
+ */
5
+ export const DEFAULT_TTL_MS = 15 * 60 * 1000;
6
+ export function generateReference() {
7
+ const b = new Uint8Array(16);
8
+ crypto.getRandomValues(b);
9
+ return Array.from(b, (x) => x.toString(16).padStart(2, '0')).join('');
10
+ }
11
+ export class KnexPendingStore {
12
+ db;
13
+ constructor(db) {
14
+ this.db = db;
15
+ }
16
+ async init() {
17
+ const has = await this.db.schema.hasTable('paymail_pending');
18
+ if (!has) {
19
+ await this.db.schema.createTable('paymail_pending', (t) => {
20
+ t.string('reference').primary();
21
+ t.string('alias').notNullable();
22
+ t.string('domain').notNullable();
23
+ t.string('identity_pub_key').notNullable();
24
+ t.string('derivation_prefix').notNullable();
25
+ t.string('derivation_suffix').notNullable();
26
+ t.bigInteger('satoshis').notNullable();
27
+ t.text('output_script').notNullable();
28
+ t.string('txid').nullable();
29
+ t.string('created_at').notNullable();
30
+ t.string('expires_at').notNullable();
31
+ t.index('expires_at', 'idx_paymail_pending_expires');
32
+ });
33
+ }
34
+ }
35
+ async create(p) {
36
+ await this.db('paymail_pending').insert({
37
+ reference: p.reference,
38
+ alias: p.alias,
39
+ domain: p.domain,
40
+ identity_pub_key: p.identityPubKey,
41
+ derivation_prefix: p.derivationPrefix,
42
+ derivation_suffix: p.derivationSuffix,
43
+ satoshis: p.satoshis,
44
+ output_script: p.outputScript,
45
+ txid: p.txid ?? null,
46
+ created_at: p.createdAt.toISOString(),
47
+ expires_at: p.expiresAt.toISOString(),
48
+ });
49
+ }
50
+ async get(reference) {
51
+ const row = await this.db('paymail_pending')
52
+ .where({ reference })
53
+ .first();
54
+ if (!row)
55
+ return null;
56
+ const expiresAt = new Date(row.expires_at);
57
+ if (expiresAt.getTime() < Date.now() && !row.txid) {
58
+ await this.delete(reference);
59
+ return null;
60
+ }
61
+ return {
62
+ reference: row.reference,
63
+ alias: row.alias,
64
+ domain: row.domain,
65
+ identityPubKey: row.identity_pub_key,
66
+ derivationPrefix: row.derivation_prefix,
67
+ derivationSuffix: row.derivation_suffix,
68
+ satoshis: Number(row.satoshis),
69
+ outputScript: row.output_script,
70
+ txid: row.txid ?? undefined,
71
+ createdAt: new Date(row.created_at),
72
+ expiresAt,
73
+ };
74
+ }
75
+ async update(p) {
76
+ await this.db('paymail_pending').where({ reference: p.reference }).update({
77
+ txid: p.txid ?? null,
78
+ });
79
+ }
80
+ async delete(reference) {
81
+ await this.db('paymail_pending').where({ reference }).delete();
82
+ }
83
+ async purgeExpired() {
84
+ await this.db('paymail_pending')
85
+ .where('expires_at', '<', new Date().toISOString())
86
+ .whereNull('txid')
87
+ .delete();
88
+ }
89
+ }
90
+ //# sourceMappingURL=pending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.js","sourceRoot":"","sources":["../../src/paymail/pending.ts"],"names":[],"mappings":"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"}