@1sat/wallet-server 0.0.46 → 0.0.47

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 (103) hide show
  1. package/dist/accounts/client.d.ts +31 -0
  2. package/dist/accounts/client.d.ts.map +1 -0
  3. package/dist/accounts/client.js +45 -0
  4. package/dist/accounts/client.js.map +1 -0
  5. package/dist/accounts/index.d.ts +8 -5
  6. package/dist/accounts/index.d.ts.map +1 -1
  7. package/dist/accounts/index.js +7 -4
  8. package/dist/accounts/index.js.map +1 -1
  9. package/dist/accounts/middleware.d.ts +2 -2
  10. package/dist/accounts/middleware.d.ts.map +1 -1
  11. package/dist/accounts/middleware.js +3 -3
  12. package/dist/accounts/middleware.js.map +1 -1
  13. package/dist/accounts/paymentRoute.d.ts +4 -1
  14. package/dist/accounts/paymentRoute.d.ts.map +1 -1
  15. package/dist/accounts/paymentRoute.js +8 -4
  16. package/dist/accounts/paymentRoute.js.map +1 -1
  17. package/dist/accounts/pricing.d.ts +1 -1
  18. package/dist/accounts/pricing.d.ts.map +1 -1
  19. package/dist/accounts/queries.d.ts +1 -1
  20. package/dist/accounts/queries.d.ts.map +1 -1
  21. package/dist/accounts/registrationRoutes.d.ts +29 -0
  22. package/dist/accounts/registrationRoutes.d.ts.map +1 -0
  23. package/dist/accounts/registrationRoutes.js +104 -0
  24. package/dist/accounts/registrationRoutes.js.map +1 -0
  25. package/dist/accounts/store.d.ts +70 -0
  26. package/dist/accounts/store.d.ts.map +1 -0
  27. package/dist/accounts/store.js +174 -0
  28. package/dist/accounts/store.js.map +1 -0
  29. package/dist/accounts/types.d.ts +17 -3
  30. package/dist/accounts/types.d.ts.map +1 -1
  31. package/dist/client.d.ts +1 -1
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/createBearerServer.d.ts +7 -3
  34. package/dist/createBearerServer.d.ts.map +1 -1
  35. package/dist/createBearerServer.js +60 -9
  36. package/dist/createBearerServer.js.map +1 -1
  37. package/dist/createHostServer.d.ts +14 -9
  38. package/dist/createHostServer.d.ts.map +1 -1
  39. package/dist/createHostServer.js +24 -42
  40. package/dist/createHostServer.js.map +1 -1
  41. package/dist/createWalletRpcHandler.d.ts +1 -1
  42. package/dist/createWalletRpcHandler.d.ts.map +1 -1
  43. package/dist/createWalletRpcHandler.js +1 -1
  44. package/dist/createWalletRpcHandler.js.map +1 -1
  45. package/dist/createWalletServer.d.ts +8 -7
  46. package/dist/createWalletServer.d.ts.map +1 -1
  47. package/dist/createWalletServer.js +16 -28
  48. package/dist/createWalletServer.js.map +1 -1
  49. package/dist/dispatch.d.ts +1 -1
  50. package/dist/dispatch.d.ts.map +1 -1
  51. package/dist/index.d.ts +25 -27
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +14 -16
  54. package/dist/index.js.map +1 -1
  55. package/dist/openapi/fragments.d.ts +1 -1
  56. package/dist/openapi/fragments.d.ts.map +1 -1
  57. package/dist/openapi/fragments.js +85 -72
  58. package/dist/openapi/fragments.js.map +1 -1
  59. package/dist/openapi/index.d.ts +2 -2
  60. package/dist/openapi/index.d.ts.map +1 -1
  61. package/dist/openapi/index.js +4 -5
  62. package/dist/openapi/index.js.map +1 -1
  63. package/dist/paymail/destination.d.ts +1 -1
  64. package/dist/paymail/destination.d.ts.map +1 -1
  65. package/dist/paymail/destination.js +1 -1
  66. package/dist/paymail/destination.js.map +1 -1
  67. package/dist/paymail/messagebox.d.ts +1 -1
  68. package/dist/paymail/messagebox.d.ts.map +1 -1
  69. package/dist/paymail/pending.d.ts +1 -1
  70. package/dist/paymail/pending.d.ts.map +1 -1
  71. package/dist/paymail/resolve.d.ts +1 -1
  72. package/dist/paymail/resolve.d.ts.map +1 -1
  73. package/dist/paymail/resolvers.d.ts +10 -0
  74. package/dist/paymail/resolvers.d.ts.map +1 -0
  75. package/dist/paymail/resolvers.js +22 -0
  76. package/dist/paymail/resolvers.js.map +1 -0
  77. package/dist/paymail/routes.d.ts +1 -1
  78. package/dist/paymail/routes.d.ts.map +1 -1
  79. package/dist/paymail/routes.js +139 -82
  80. package/dist/paymail/routes.js.map +1 -1
  81. package/dist/paymail/types.d.ts +18 -6
  82. package/dist/paymail/types.d.ts.map +1 -1
  83. package/dist/resolvers/bearer.d.ts +1 -1
  84. package/dist/resolvers/bearer.d.ts.map +1 -1
  85. package/dist/resolvers/index.d.ts +2 -2
  86. package/dist/resolvers/index.d.ts.map +1 -1
  87. package/dist/resolvers/index.js +1 -1
  88. package/dist/resolvers/index.js.map +1 -1
  89. package/dist/topUp.d.ts +1 -1
  90. package/dist/topUp.d.ts.map +1 -1
  91. package/package.json +5 -5
  92. package/dist/hosting/client.d.ts +0 -33
  93. package/dist/hosting/client.d.ts.map +0 -1
  94. package/dist/hosting/client.js +0 -45
  95. package/dist/hosting/client.js.map +0 -1
  96. package/dist/hosting/routes.d.ts +0 -27
  97. package/dist/hosting/routes.d.ts.map +0 -1
  98. package/dist/hosting/routes.js +0 -239
  99. package/dist/hosting/routes.js.map +0 -1
  100. package/dist/paymail/entitlement.d.ts +0 -15
  101. package/dist/paymail/entitlement.d.ts.map +0 -1
  102. package/dist/paymail/entitlement.js +0 -30
  103. package/dist/paymail/entitlement.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bearer.d.ts","sourceRoot":"","sources":["../../src/resolvers/bearer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,MAAM,WAAW,oBAAoB;IACpC,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,CA4B7E;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI3B"}
1
+ {"version":3,"file":"bearer.d.ts","sourceRoot":"","sources":["../../src/resolvers/bearer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACpC,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,gBAAgB,CA4B7E;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI3B"}
@@ -1,3 +1,3 @@
1
- export { bearerResolver, BearerAuthError } from './bearer';
2
- export type { BearerResolverConfig } from './bearer';
1
+ export { bearerResolver, BearerAuthError } from './bearer.js';
2
+ export type { BearerResolverConfig } from './bearer.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
@@ -1,2 +1,2 @@
1
- export { bearerResolver, BearerAuthError } from './bearer';
1
+ export { bearerResolver, BearerAuthError } from './bearer.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
package/dist/topUp.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  * test harness for the payment endpoint independently of the sync path.
12
12
  */
13
13
  import type { WalletInterface } from '@bsv/sdk';
14
- import type { AccountStatusResponse } from './accounts/types';
14
+ import type { AccountStatusResponse } from './accounts/types.js';
15
15
  export interface TopUpResult {
16
16
  /** Sats paid — reported by the server's `x-bsv-payment-satoshis-paid` header. */
17
17
  satsPaid: number;
@@ -1 +1 @@
1
- {"version":3,"file":"topUp.d.ts","sourceRoot":"","sources":["../src/topUp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D,MAAM,WAAW,WAAW;IAC3B,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,MAAM,EAAE,qBAAqB,CAAA;CAC7B;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAiCtB"}
1
+ {"version":3,"file":"topUp.d.ts","sourceRoot":"","sources":["../src/topUp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,WAAW,WAAW;IAC3B,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,MAAM,EAAE,qBAAqB,CAAA;CAC7B;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAiCtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1sat/wallet-server",
3
- "version": "0.0.46",
3
+ "version": "0.0.47",
4
4
  "description": "BRC-100 wallet storage RPC server for 1Sat Ordinals SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -31,10 +31,10 @@
31
31
  ],
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@1sat/client": "0.0.50",
35
- "@1sat/templates": "0.0.31",
36
- "@1sat/types": "0.0.40",
37
- "@1sat/wallet": "0.0.104",
34
+ "@1sat/client": "0.0.51",
35
+ "@1sat/templates": "0.0.33",
36
+ "@1sat/types": "0.0.41",
37
+ "@1sat/wallet": "0.0.105",
38
38
  "@bopen-io/messagebox-server": "^1.3.2",
39
39
  "@bsv/auth-express-middleware": "npm:@bopen-io/auth-express-middleware@2.1.3",
40
40
  "evlog": "^2.13.0",
@@ -1,33 +0,0 @@
1
- /**
2
- * Browser/CLI client for host-pack routes on wallet serve.
3
- */
4
- import type { WalletInterface } from '@bsv/sdk';
5
- export interface HostingPrice {
6
- priceSats: number;
7
- priceUsd?: number;
8
- periodSeconds: number;
9
- }
10
- export interface HostingStatus {
11
- enabled: boolean;
12
- identityKey: string;
13
- active: boolean;
14
- expiresAt?: number;
15
- priceSats?: number;
16
- priceUsd?: number;
17
- periodSeconds?: number;
18
- }
19
- export interface HostingSubscribeResult {
20
- status: string;
21
- identityKey: string;
22
- expiresAt: number;
23
- txid: string;
24
- }
25
- export declare class HostingClient {
26
- private baseUrl;
27
- private wallet?;
28
- constructor(baseUrl: string, wallet?: WalletInterface | undefined);
29
- getPrice(): Promise<HostingPrice>;
30
- getStatus(): Promise<HostingStatus>;
31
- subscribe(): Promise<HostingSubscribeResult>;
32
- }
33
- //# sourceMappingURL=client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/hosting/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,aAAa;IAExB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM,CAAC;gBADP,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,eAAe,YAAA;IAK3B,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAMjC,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAQnC,SAAS,IAAI,OAAO,CAAC,sBAAsB,CAAC;CAelD"}
@@ -1,45 +0,0 @@
1
- /**
2
- * Browser/CLI client for host-pack routes on wallet serve.
3
- */
4
- import { AuthFetch } from '@bsv/sdk';
5
- export class HostingClient {
6
- baseUrl;
7
- wallet;
8
- constructor(baseUrl, wallet) {
9
- this.baseUrl = baseUrl;
10
- this.wallet = wallet;
11
- this.baseUrl = baseUrl.replace(/\/$/, '');
12
- }
13
- async getPrice() {
14
- const res = await fetch(`${this.baseUrl}/hosting/price`);
15
- if (!res.ok)
16
- throw new Error(`hosting/price ${res.status}`);
17
- return res.json();
18
- }
19
- async getStatus() {
20
- if (!this.wallet)
21
- throw new Error('wallet required for status');
22
- const auth = new AuthFetch(this.wallet);
23
- const res = await auth.fetch(`${this.baseUrl}/hosting/status`);
24
- if (!res.ok)
25
- throw new Error(`hosting/status ${res.status}`);
26
- return res.json();
27
- }
28
- async subscribe() {
29
- if (!this.wallet)
30
- throw new Error('wallet required for subscribe');
31
- const auth = new AuthFetch(this.wallet);
32
- // AuthFetch retries 402 with payment when wallet can pay.
33
- const res = await auth.fetch(`${this.baseUrl}/hosting/subscribe`, {
34
- method: 'POST',
35
- headers: { 'Content-Type': 'application/json' },
36
- body: '{}',
37
- });
38
- if (!res.ok) {
39
- const text = await res.text();
40
- throw new Error(`hosting/subscribe ${res.status}: ${text}`);
41
- }
42
- return res.json();
43
- }
44
- }
45
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/hosting/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAyBpC,MAAM,OAAO,aAAa;IAEhB;IACA;IAFT,YACS,OAAe,EACf,MAAwB;QADxB,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAkB;QAEhC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAA;QACxD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3D,OAAO,GAAG,CAAC,IAAI,EAA2B,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC/D,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAA;QAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;QAC5D,OAAO,GAAG,CAAC,IAAI,EAA4B,CAAA;IAC5C,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,0DAA0D;QAC1D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI;SACV,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,qBAAqB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAqC,CAAA;IACrD,CAAC;CACD"}
@@ -1,27 +0,0 @@
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 { type WalletInterface } from '@bsv/sdk';
13
- import type { Express, NextFunction, Request, Response } from 'express';
14
- export interface HostingConfig {
15
- enabled: boolean;
16
- priceSats: number;
17
- /** Operator's USD target price, surfaced verbatim on the pricing API. */
18
- priceUsd?: number;
19
- periodSeconds: number;
20
- }
21
- export type HostingConfigProvider = () => HostingConfig;
22
- export declare function mountHostingRoutes(app: Express, basePath: string, deps: {
23
- wallet: WalletInterface;
24
- getConfig: HostingConfigProvider;
25
- authMiddleware: (req: Request, res: Response, next: NextFunction) => unknown;
26
- }): void;
27
- //# sourceMappingURL=routes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/hosting/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAQN,KAAK,eAAe,EAGpB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvE,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,aAAa,CAAA;AAIvD,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IACL,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,qBAAqB,CAAA;IAChC,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAA;CAC5E,GACC,IAAI,CA+EN"}
@@ -1,239 +0,0 @@
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
- ...(cfg.priceUsd !== undefined && { priceUsd: cfg.priceUsd }),
38
- periodSeconds: cfg.periodSeconds,
39
- });
40
- });
41
- const paymentMw = createAccountsPaymentMiddleware({
42
- wallet: deps.wallet,
43
- calculateRequestPrice: async () => {
44
- const cfg = deps.getConfig();
45
- return cfg.enabled ? cfg.priceSats : 0;
46
- },
47
- onPaymentInternalize: (_req, defaults) => ({
48
- ...defaults,
49
- description: 'Hosted paymail subscription',
50
- labels: ['hosting-payment'],
51
- }),
52
- });
53
- app.post(`${root}/hosting/subscribe`, deps.authMiddleware, paymentMw, async (req, res) => {
54
- const cfg = deps.getConfig();
55
- const identityKey = req.auth?.identityKey;
56
- if (!identityKey || identityKey === 'unknown') {
57
- return res.status(401).json({ error: 'unauthenticated' });
58
- }
59
- if (!cfg.enabled) {
60
- return res.status(404).json({ error: 'hosting disabled' });
61
- }
62
- try {
63
- const result = await mintOrReplaceReceipt(deps.wallet, identityKey, cfg.periodSeconds);
64
- return res.json({
65
- status: 'ok',
66
- identityKey,
67
- expiresAt: result.expiresAt,
68
- txid: result.txid,
69
- });
70
- }
71
- catch (err) {
72
- console.error('[hosting] mint receipt failed', err);
73
- return res.status(500).json({
74
- error: err instanceof Error ? err.message : 'mint failed',
75
- });
76
- }
77
- });
78
- }
79
- async function listReceipts(wallet, identityKey, withBeef) {
80
- const result = await wallet.listOutputs({
81
- basket: HOSTING_BASKET,
82
- tags: [hostingPayerTag(identityKey)],
83
- tagQueryMode: 'all',
84
- includeTags: true,
85
- includeCustomInstructions: true,
86
- ...(withBeef ? { include: 'entire transactions' } : {}),
87
- limit: 100,
88
- });
89
- return {
90
- outputs: result.outputs,
91
- BEEF: result.BEEF ? Array.from(result.BEEF) : undefined,
92
- };
93
- }
94
- async function hostingStatus(wallet, identityKey) {
95
- const { outputs } = await listReceipts(wallet, identityKey, false);
96
- const now = Math.floor(Date.now() / 1000);
97
- // After correct mint, at most one — still take max if legacy junk exists.
98
- let maxExp = 0;
99
- for (const o of outputs) {
100
- const exp = readHostingExp(o.tags);
101
- if (exp !== undefined && exp > maxExp)
102
- maxExp = exp;
103
- }
104
- return {
105
- active: maxExp > now,
106
- expiresAt: maxExp > 0 ? maxExp : undefined,
107
- };
108
- }
109
- /**
110
- * Spend all existing receipts for identity, create exactly one new receipt
111
- * with exp = max(now, priorExp) + periodSeconds.
112
- */
113
- async function mintOrReplaceReceipt(wallet, identityKey, periodSeconds) {
114
- const now = Math.floor(Date.now() / 1000);
115
- const { outputs: existing, BEEF } = await listReceipts(wallet, identityKey, true);
116
- let priorExp = now;
117
- for (const o of existing) {
118
- const exp = readHostingExp(o.tags);
119
- if (exp !== undefined && exp > priorExp)
120
- priorExp = exp;
121
- }
122
- const expiresAt = priorExp + periodSeconds;
123
- const keyID = `hosting-${expiresAt}-${identityKey.slice(0, 8)}`;
124
- const { publicKey } = await wallet.getPublicKey({
125
- protocolID: P1SAT_PROTOCOL,
126
- keyID,
127
- counterparty: 'self',
128
- forSelf: true,
129
- });
130
- const lockingScript = new P2PKH()
131
- .lock(PublicKey.fromString(publicKey).toAddress())
132
- .toHex();
133
- const inputs = existing.map((o) => ({
134
- outpoint: o.outpoint,
135
- inputDescription: 'Replace hosting receipt',
136
- unlockingScriptLength: 108,
137
- }));
138
- const created = await wallet.createAction({
139
- description: 'Hosting subscription receipt',
140
- ...(inputs.length > 0 && {
141
- inputs,
142
- inputBEEF: BEEF,
143
- }),
144
- outputs: [
145
- {
146
- lockingScript,
147
- satoshis: 1,
148
- outputDescription: 'Hosting receipt',
149
- basket: HOSTING_BASKET,
150
- tags: [hostingPayerTag(identityKey), hostingExpTag(expiresAt)],
151
- customInstructions: JSON.stringify({
152
- protocolID: P1SAT_PROTOCOL,
153
- keyID,
154
- counterparty: 'self',
155
- }),
156
- },
157
- ],
158
- options: { randomizeOutputs: false },
159
- });
160
- if (!created.txid && !created.signableTransaction) {
161
- throw new Error('createAction returned no txid');
162
- }
163
- if (created.signableTransaction && existing.length > 0) {
164
- const tx = Transaction.fromAtomicBEEF(created.signableTransaction.tx);
165
- const spends = {};
166
- for (let i = 0; i < existing.length; i++) {
167
- const o = existing[i];
168
- if (!o.customInstructions) {
169
- throw new Error(`missing customInstructions on ${o.outpoint}`);
170
- }
171
- const ci = JSON.parse(o.customInstructions);
172
- const unlocking = await signP2PKH(wallet, tx, i, ci.protocolID, ci.keyID, ci.counterparty ?? 'self');
173
- spends[i] = { unlockingScript: unlocking };
174
- }
175
- const signed = await wallet.signAction({
176
- reference: created.signableTransaction.reference,
177
- spends,
178
- });
179
- if (!signed.txid)
180
- throw new Error('signAction returned no txid');
181
- return { expiresAt, txid: signed.txid };
182
- }
183
- if (!created.txid)
184
- throw new Error('createAction returned no txid');
185
- return { expiresAt, txid: created.txid };
186
- }
187
- async function signP2PKH(wallet, tx, inputIndex, protocolID, keyID, counterparty) {
188
- const txInput = tx.inputs[inputIndex];
189
- const sourceLockingScript = txInput.sourceTransaction?.outputs[txInput.sourceOutputIndex]?.lockingScript;
190
- if (!sourceLockingScript) {
191
- throw new Error(`missing source locking script for input ${inputIndex}`);
192
- }
193
- const sourceTXID = txInput.sourceTXID ?? txInput.sourceTransaction?.id('hex');
194
- if (!sourceTXID)
195
- throw new Error(`missing source txid for input ${inputIndex}`);
196
- const sourceSatoshis = txInput.sourceTransaction?.outputs[txInput.sourceOutputIndex]?.satoshis ?? 1;
197
- const preimage = TransactionSignature.format({
198
- sourceTXID,
199
- sourceOutputIndex: txInput.sourceOutputIndex,
200
- sourceSatoshis,
201
- transactionVersion: tx.version,
202
- otherInputs: tx.inputs
203
- .filter((_, idx) => idx !== inputIndex)
204
- .map((inp) => ({
205
- sourceTXID: inp.sourceTXID ?? inp.sourceTransaction?.id('hex') ?? '',
206
- sourceOutputIndex: inp.sourceOutputIndex,
207
- sequence: inp.sequence ?? 0xffffffff,
208
- })),
209
- inputIndex,
210
- outputs: tx.outputs,
211
- inputSequence: txInput.sequence ?? 0xffffffff,
212
- subscript: sourceLockingScript,
213
- lockTime: tx.lockTime,
214
- scope: TransactionSignature.SIGHASH_ALL | TransactionSignature.SIGHASH_FORKID,
215
- });
216
- const sighash = Hash.sha256(Hash.sha256(preimage));
217
- const { signature } = await wallet.createSignature({
218
- protocolID,
219
- keyID,
220
- counterparty,
221
- data: Array.from(preimage),
222
- hashToDirectlySign: Array.from(sighash),
223
- });
224
- const { publicKey } = await wallet.getPublicKey({
225
- protocolID,
226
- keyID,
227
- counterparty,
228
- forSelf: true,
229
- });
230
- const sigWithHashtype = [
231
- ...signature,
232
- TransactionSignature.SIGHASH_ALL | TransactionSignature.SIGHASH_FORKID,
233
- ];
234
- return new UnlockingScript()
235
- .writeBin(sigWithHashtype)
236
- .writeBin(Utils.toArray(publicKey, 'hex'))
237
- .toHex();
238
- }
239
- //# sourceMappingURL=routes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/hosting/routes.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"entitlement.d.ts","sourceRoot":"","sources":["../../src/paymail/entitlement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,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"}
@@ -1,30 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"entitlement.js","sourceRoot":"","sources":["../../src/paymail/entitlement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAQ7E;;;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"}