@1sat/wallet-server 0.0.1 → 0.0.3

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 (51) hide show
  1. package/dist/accounts/index.d.ts +4 -7
  2. package/dist/accounts/index.d.ts.map +1 -1
  3. package/dist/accounts/index.js +3 -6
  4. package/dist/accounts/index.js.map +1 -1
  5. package/dist/accounts/middleware.d.ts +29 -30
  6. package/dist/accounts/middleware.d.ts.map +1 -1
  7. package/dist/accounts/middleware.js +303 -121
  8. package/dist/accounts/middleware.js.map +1 -1
  9. package/dist/accounts/pricing.d.ts +38 -11
  10. package/dist/accounts/pricing.d.ts.map +1 -1
  11. package/dist/accounts/pricing.js +40 -11
  12. package/dist/accounts/pricing.js.map +1 -1
  13. package/dist/accounts/queries.d.ts +42 -0
  14. package/dist/accounts/queries.d.ts.map +1 -0
  15. package/dist/accounts/queries.js +91 -0
  16. package/dist/accounts/queries.js.map +1 -0
  17. package/dist/accounts/types.d.ts +46 -29
  18. package/dist/accounts/types.d.ts.map +1 -1
  19. package/dist/client.d.ts +20 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +34 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/createWalletServer.d.ts +12 -3
  24. package/dist/createWalletServer.d.ts.map +1 -1
  25. package/dist/createWalletServer.js +84 -46
  26. package/dist/createWalletServer.js.map +1 -1
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/topUp.d.ts +28 -0
  32. package/dist/topUp.d.ts.map +1 -0
  33. package/dist/topUp.js +67 -0
  34. package/dist/topUp.js.map +1 -0
  35. package/package.json +57 -46
  36. package/dist/accounts/metering.d.ts +0 -15
  37. package/dist/accounts/metering.d.ts.map +0 -1
  38. package/dist/accounts/metering.js +0 -32
  39. package/dist/accounts/metering.js.map +0 -1
  40. package/dist/accounts/migrations.d.ts +0 -18
  41. package/dist/accounts/migrations.d.ts.map +0 -1
  42. package/dist/accounts/migrations.js +0 -46
  43. package/dist/accounts/migrations.js.map +0 -1
  44. package/dist/accounts/paymentValidation.d.ts +0 -59
  45. package/dist/accounts/paymentValidation.d.ts.map +0 -1
  46. package/dist/accounts/paymentValidation.js +0 -112
  47. package/dist/accounts/paymentValidation.js.map +0 -1
  48. package/dist/accounts/repo.d.ts +0 -17
  49. package/dist/accounts/repo.d.ts.map +0 -1
  50. package/dist/accounts/repo.js +0 -94
  51. package/dist/accounts/repo.js.map +0 -1
@@ -1,59 +0,0 @@
1
- import { type WalletInterface } from '@bsv/sdk';
2
- /**
3
- * BRC-0121 request-header names (lowercase for Headers API compatibility).
4
- */
5
- export declare const BRC0121_HEADERS: {
6
- readonly derivationPrefix: "x-bsv-payment-derivation-prefix";
7
- readonly derivationSuffix: "x-bsv-payment-derivation-suffix";
8
- readonly transaction: "x-bsv-payment-transaction";
9
- readonly orderID: "x-bsv-payment-order-id";
10
- readonly outputIndex: "x-bsv-payment-output-index";
11
- };
12
- export interface Brc0121PaymentHeaders {
13
- derivationPrefix: string;
14
- derivationSuffix: string;
15
- beefBase64: string;
16
- orderID?: string;
17
- outputIndex: number;
18
- }
19
- export declare function readBrc0121Headers(req: Request): Brc0121PaymentHeaders | null;
20
- export interface ValidatePaymentInput {
21
- wallet: WalletInterface;
22
- senderIdentityKey: string;
23
- headers: Brc0121PaymentHeaders;
24
- expectedSatoshis: number;
25
- }
26
- export interface ParsedPayment {
27
- txid: string;
28
- beef: number[];
29
- satoshisAtOutput: number;
30
- outputIndex: number;
31
- derivationPrefix: string;
32
- derivationSuffix: string;
33
- }
34
- export interface ValidatePaymentResult {
35
- txid: string;
36
- satoshisReceived: number;
37
- }
38
- /**
39
- * Parses the BRC-0121 payment headers into a usable shape. Performs the cheap
40
- * checks (BEEF decode, output exists, satoshis sufficient) but does NOT touch
41
- * the wallet — so callers can check duplicate-txid before internalizing.
42
- */
43
- export declare function parseBrc0121Payment(headers: Brc0121PaymentHeaders, expectedSatoshis: number): ParsedPayment;
44
- /**
45
- * Internalizes a previously-parsed BRC-29 payment into the server wallet.
46
- * The wallet SDK handles BEEF validation, script derivation, and UTXO
47
- * recording; failures throw `Brc0121PaymentError`.
48
- */
49
- export declare function internalizePayment(input: {
50
- wallet: WalletInterface;
51
- senderIdentityKey: string;
52
- parsed: ParsedPayment;
53
- }): Promise<ValidatePaymentResult>;
54
- /** @deprecated Use `parseBrc0121Payment` then `internalizePayment`. */
55
- export declare function validateBrc0121Payment(input: ValidatePaymentInput): Promise<ValidatePaymentResult>;
56
- export declare class Brc0121PaymentError extends Error {
57
- constructor(message: string);
58
- }
59
- //# sourceMappingURL=paymentValidation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paymentValidation.d.ts","sourceRoot":"","sources":["../../src/accounts/paymentValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAA;AAEV,MAAM,WAAW,qBAAqB;IACrC,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,GAAG,IAAI,CAmB7E;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,eAAe,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,qBAAqB,CAAA;IAC9B,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,qBAAqB,EAC9B,gBAAgB,EAAE,MAAM,GACtB,aAAa,CAyBf;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC/C,MAAM,EAAE,eAAe,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;CACrB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2BjC;AAED,uEAAuE;AACvE,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAOhC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI3B"}
@@ -1,112 +0,0 @@
1
- import { Transaction, Utils } from '@bsv/sdk';
2
- /**
3
- * BRC-0121 request-header names (lowercase for Headers API compatibility).
4
- */
5
- export const BRC0121_HEADERS = {
6
- derivationPrefix: 'x-bsv-payment-derivation-prefix',
7
- derivationSuffix: 'x-bsv-payment-derivation-suffix',
8
- transaction: 'x-bsv-payment-transaction',
9
- orderID: 'x-bsv-payment-order-id',
10
- outputIndex: 'x-bsv-payment-output-index',
11
- };
12
- export function readBrc0121Headers(req) {
13
- const derivationPrefix = req.headers.get(BRC0121_HEADERS.derivationPrefix);
14
- const derivationSuffix = req.headers.get(BRC0121_HEADERS.derivationSuffix);
15
- const beefBase64 = req.headers.get(BRC0121_HEADERS.transaction);
16
- if (!derivationPrefix || !derivationSuffix || !beefBase64)
17
- return null;
18
- const outIdxHeader = req.headers.get(BRC0121_HEADERS.outputIndex);
19
- const outputIndex = outIdxHeader ? Number.parseInt(outIdxHeader, 10) : 0;
20
- if (!Number.isInteger(outputIndex) || outputIndex < 0) {
21
- throw new Brc0121PaymentError(`invalid output index: ${outIdxHeader}`);
22
- }
23
- return {
24
- derivationPrefix,
25
- derivationSuffix,
26
- beefBase64,
27
- orderID: req.headers.get(BRC0121_HEADERS.orderID) ?? undefined,
28
- outputIndex,
29
- };
30
- }
31
- /**
32
- * Parses the BRC-0121 payment headers into a usable shape. Performs the cheap
33
- * checks (BEEF decode, output exists, satoshis sufficient) but does NOT touch
34
- * the wallet — so callers can check duplicate-txid before internalizing.
35
- */
36
- export function parseBrc0121Payment(headers, expectedSatoshis) {
37
- const beef = decodeBeefHeader(headers.beefBase64);
38
- const tx = Transaction.fromAtomicBEEF(beef);
39
- const txid = tx.id('hex');
40
- const targetOutput = tx.outputs[headers.outputIndex];
41
- if (!targetOutput) {
42
- throw new Brc0121PaymentError(`BEEF has no output at index ${headers.outputIndex}`);
43
- }
44
- const satoshis = targetOutput.satoshis ?? 0;
45
- if (satoshis < expectedSatoshis) {
46
- throw new Brc0121PaymentError(`payment output ${satoshis} sats below required ${expectedSatoshis}`);
47
- }
48
- return {
49
- txid,
50
- beef,
51
- satoshisAtOutput: satoshis,
52
- outputIndex: headers.outputIndex,
53
- derivationPrefix: headers.derivationPrefix,
54
- derivationSuffix: headers.derivationSuffix,
55
- };
56
- }
57
- /**
58
- * Internalizes a previously-parsed BRC-29 payment into the server wallet.
59
- * The wallet SDK handles BEEF validation, script derivation, and UTXO
60
- * recording; failures throw `Brc0121PaymentError`.
61
- */
62
- export async function internalizePayment(input) {
63
- try {
64
- await input.wallet.internalizeAction({
65
- tx: input.parsed.beef,
66
- outputs: [
67
- {
68
- paymentRemittance: {
69
- derivationPrefix: input.parsed.derivationPrefix,
70
- derivationSuffix: input.parsed.derivationSuffix,
71
- senderIdentityKey: input.senderIdentityKey,
72
- },
73
- outputIndex: input.parsed.outputIndex,
74
- protocol: 'wallet payment',
75
- },
76
- ],
77
- labels: ['wallet-server', 'brc-0121'],
78
- description: 'BRC-0121 storage capacity payment',
79
- });
80
- }
81
- catch (err) {
82
- throw new Brc0121PaymentError(`wallet.internalizeAction rejected payment: ${err instanceof Error ? err.message : String(err)}`);
83
- }
84
- return {
85
- txid: input.parsed.txid,
86
- satoshisReceived: input.parsed.satoshisAtOutput,
87
- };
88
- }
89
- /** @deprecated Use `parseBrc0121Payment` then `internalizePayment`. */
90
- export async function validateBrc0121Payment(input) {
91
- const parsed = parseBrc0121Payment(input.headers, input.expectedSatoshis);
92
- return internalizePayment({
93
- wallet: input.wallet,
94
- senderIdentityKey: input.senderIdentityKey,
95
- parsed,
96
- });
97
- }
98
- export class Brc0121PaymentError extends Error {
99
- constructor(message) {
100
- super(message);
101
- this.name = 'Brc0121PaymentError';
102
- }
103
- }
104
- function decodeBeefHeader(value) {
105
- try {
106
- return Utils.toArray(value, 'base64');
107
- }
108
- catch (err) {
109
- throw new Brc0121PaymentError(`cannot decode ${BRC0121_HEADERS.transaction} as base64: ${err instanceof Error ? err.message : String(err)}`);
110
- }
111
- }
112
- //# sourceMappingURL=paymentValidation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paymentValidation.js","sourceRoot":"","sources":["../../src/accounts/paymentValidation.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { Knex } from 'knex';
2
- import type { Account, IdentityKey, NewPayment, Payment } from './types';
3
- export declare class AccountsRepo {
4
- private readonly knex;
5
- constructor(knex: Knex);
6
- upsertAccount(identityKey: IdentityKey): Promise<Account>;
7
- getAccount(identityKey: IdentityKey): Promise<Account | undefined>;
8
- /**
9
- * Sum bytes_covered for all unexpired payments belonging to identityKey.
10
- * A payment is unexpired when paid_through_block >= currentBlock.
11
- */
12
- sumUnexpiredBytes(identityKey: IdentityKey, currentBlock: number): Promise<number>;
13
- recordPayment(input: NewPayment): Promise<Payment>;
14
- paymentExists(txid: string): Promise<boolean>;
15
- listPayments(identityKey: IdentityKey, limit?: number): Promise<Payment[]>;
16
- }
17
- //# sourceMappingURL=repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/accounts/repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEhC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAkBxE,qBAAa,YAAY;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI;IAEjC,aAAa,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBzD,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAOxE;;;OAGG;IACG,iBAAiB,CACtB,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAYZ,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAclD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO7C,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAO5E"}
@@ -1,94 +0,0 @@
1
- import { ACCOUNTS_TABLE, PAYMENTS_TABLE } from './migrations';
2
- export class AccountsRepo {
3
- knex;
4
- constructor(knex) {
5
- this.knex = knex;
6
- }
7
- async upsertAccount(identityKey) {
8
- const now = new Date();
9
- await this.knex(ACCOUNTS_TABLE)
10
- .insert({
11
- identity_key: identityKey,
12
- created_at: now,
13
- updated_at: now,
14
- })
15
- .onConflict('identity_key')
16
- .ignore();
17
- const row = await this.knex(ACCOUNTS_TABLE)
18
- .where({ identity_key: identityKey })
19
- .first();
20
- if (!row)
21
- throw new Error(`upsertAccount: no row after insert for ${identityKey}`);
22
- return toAccount(row);
23
- }
24
- async getAccount(identityKey) {
25
- const row = await this.knex(ACCOUNTS_TABLE)
26
- .where({ identity_key: identityKey })
27
- .first();
28
- return row ? toAccount(row) : undefined;
29
- }
30
- /**
31
- * Sum bytes_covered for all unexpired payments belonging to identityKey.
32
- * A payment is unexpired when paid_through_block >= currentBlock.
33
- */
34
- async sumUnexpiredBytes(identityKey, currentBlock) {
35
- const [row] = await this.knex(PAYMENTS_TABLE)
36
- .where({ identity_key: identityKey })
37
- .andWhere('paid_through_block', '>=', currentBlock)
38
- .sum({ total: 'bytes_covered' });
39
- const total = row?.total;
40
- if (total == null)
41
- return 0;
42
- return typeof total === 'string'
43
- ? Number.parseInt(total, 10)
44
- : Number(total);
45
- }
46
- async recordPayment(input) {
47
- const [row] = await this.knex(PAYMENTS_TABLE)
48
- .insert({
49
- identity_key: input.identityKey,
50
- txid: input.txid,
51
- bytes_covered: input.bytesCovered,
52
- sats_paid: input.satsPaid,
53
- paid_through_block: input.paidThroughBlock,
54
- applied_at: new Date(),
55
- })
56
- .returning('*');
57
- return toPayment(row);
58
- }
59
- async paymentExists(txid) {
60
- const row = await this.knex(PAYMENTS_TABLE)
61
- .where({ txid })
62
- .first('id');
63
- return !!row;
64
- }
65
- async listPayments(identityKey, limit = 50) {
66
- const rows = await this.knex(PAYMENTS_TABLE)
67
- .where({ identity_key: identityKey })
68
- .orderBy('applied_at', 'desc')
69
- .limit(limit);
70
- return rows.map(toPayment);
71
- }
72
- }
73
- function toAccount(row) {
74
- return {
75
- identityKey: row.identity_key,
76
- createdAt: toDate(row.created_at),
77
- updatedAt: toDate(row.updated_at),
78
- };
79
- }
80
- function toPayment(row) {
81
- return {
82
- id: row.id,
83
- identityKey: row.identity_key,
84
- txid: row.txid,
85
- bytesCovered: Number(row.bytes_covered),
86
- satsPaid: Number(row.sats_paid),
87
- paidThroughBlock: row.paid_through_block,
88
- appliedAt: toDate(row.applied_at),
89
- };
90
- }
91
- function toDate(v) {
92
- return v instanceof Date ? v : new Date(v);
93
- }
94
- //# sourceMappingURL=repo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/accounts/repo.ts"],"names":[],"mappings":"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"}