mppx 0.6.19 → 0.6.20

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 (148) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/Challenge.d.ts +2 -2
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +1 -1
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Method.d.ts +34 -0
  7. package/dist/Method.d.ts.map +1 -1
  8. package/dist/Method.js +3 -1
  9. package/dist/Method.js.map +1 -1
  10. package/dist/Receipt.d.ts +1 -0
  11. package/dist/Receipt.d.ts.map +1 -1
  12. package/dist/Receipt.js +2 -0
  13. package/dist/Receipt.js.map +1 -1
  14. package/dist/client/Methods.d.ts +1 -0
  15. package/dist/client/Methods.d.ts.map +1 -1
  16. package/dist/client/Methods.js +1 -0
  17. package/dist/client/Methods.js.map +1 -1
  18. package/dist/middlewares/elysia.d.ts.map +1 -1
  19. package/dist/middlewares/elysia.js +14 -0
  20. package/dist/middlewares/elysia.js.map +1 -1
  21. package/dist/middlewares/express.d.ts.map +1 -1
  22. package/dist/middlewares/express.js +1 -2
  23. package/dist/middlewares/express.js.map +1 -1
  24. package/dist/middlewares/hono.d.ts.map +1 -1
  25. package/dist/middlewares/hono.js +14 -0
  26. package/dist/middlewares/hono.js.map +1 -1
  27. package/dist/middlewares/nextjs.d.ts.map +1 -1
  28. package/dist/middlewares/nextjs.js +14 -0
  29. package/dist/middlewares/nextjs.js.map +1 -1
  30. package/dist/proxy/Proxy.d.ts.map +1 -1
  31. package/dist/proxy/Proxy.js +2 -2
  32. package/dist/proxy/Proxy.js.map +1 -1
  33. package/dist/proxy/Service.d.ts.map +1 -1
  34. package/dist/proxy/Service.js +1 -1
  35. package/dist/proxy/Service.js.map +1 -1
  36. package/dist/server/Mppx.d.ts +15 -3
  37. package/dist/server/Mppx.d.ts.map +1 -1
  38. package/dist/server/Mppx.js +190 -40
  39. package/dist/server/Mppx.js.map +1 -1
  40. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  41. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  42. package/dist/stripe/server/internal/html.gen.js +1 -1
  43. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  44. package/dist/tempo/Methods.d.ts +96 -0
  45. package/dist/tempo/Methods.d.ts.map +1 -1
  46. package/dist/tempo/Methods.js +97 -0
  47. package/dist/tempo/Methods.js.map +1 -1
  48. package/dist/tempo/client/Methods.d.ts +3 -0
  49. package/dist/tempo/client/Methods.d.ts.map +1 -1
  50. package/dist/tempo/client/Methods.js +3 -0
  51. package/dist/tempo/client/Methods.js.map +1 -1
  52. package/dist/tempo/client/Subscription.d.ts +114 -0
  53. package/dist/tempo/client/Subscription.d.ts.map +1 -0
  54. package/dist/tempo/client/Subscription.js +100 -0
  55. package/dist/tempo/client/Subscription.js.map +1 -0
  56. package/dist/tempo/client/index.d.ts +1 -0
  57. package/dist/tempo/client/index.d.ts.map +1 -1
  58. package/dist/tempo/client/index.js +1 -0
  59. package/dist/tempo/client/index.js.map +1 -1
  60. package/dist/tempo/index.d.ts +1 -0
  61. package/dist/tempo/index.d.ts.map +1 -1
  62. package/dist/tempo/index.js +1 -0
  63. package/dist/tempo/index.js.map +1 -1
  64. package/dist/tempo/server/Methods.d.ts +5 -0
  65. package/dist/tempo/server/Methods.d.ts.map +1 -1
  66. package/dist/tempo/server/Methods.js +5 -0
  67. package/dist/tempo/server/Methods.js.map +1 -1
  68. package/dist/tempo/server/Subscription.d.ts +221 -0
  69. package/dist/tempo/server/Subscription.d.ts.map +1 -0
  70. package/dist/tempo/server/Subscription.js +637 -0
  71. package/dist/tempo/server/Subscription.js.map +1 -0
  72. package/dist/tempo/server/index.d.ts +1 -0
  73. package/dist/tempo/server/index.d.ts.map +1 -1
  74. package/dist/tempo/server/index.js +1 -0
  75. package/dist/tempo/server/index.js.map +1 -1
  76. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  77. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  78. package/dist/tempo/server/internal/html.gen.js +1 -1
  79. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  80. package/dist/tempo/subscription/KeyAuthorization.d.ts +282 -0
  81. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -0
  82. package/dist/tempo/subscription/KeyAuthorization.js +297 -0
  83. package/dist/tempo/subscription/KeyAuthorization.js.map +1 -0
  84. package/dist/tempo/subscription/Receipt.d.ts +10 -0
  85. package/dist/tempo/subscription/Receipt.d.ts.map +1 -0
  86. package/dist/tempo/subscription/Receipt.js +16 -0
  87. package/dist/tempo/subscription/Receipt.js.map +1 -0
  88. package/dist/tempo/subscription/Store.d.ts +99 -0
  89. package/dist/tempo/subscription/Store.d.ts.map +1 -0
  90. package/dist/tempo/subscription/Store.js +292 -0
  91. package/dist/tempo/subscription/Store.js.map +1 -0
  92. package/dist/tempo/subscription/Types.d.ts +65 -0
  93. package/dist/tempo/subscription/Types.d.ts.map +1 -0
  94. package/dist/tempo/subscription/Types.js +2 -0
  95. package/dist/tempo/subscription/Types.js.map +1 -0
  96. package/dist/tempo/subscription/index.d.ts +6 -0
  97. package/dist/tempo/subscription/index.d.ts.map +1 -0
  98. package/dist/tempo/subscription/index.js +4 -0
  99. package/dist/tempo/subscription/index.js.map +1 -0
  100. package/dist/zod.d.ts +7 -0
  101. package/dist/zod.d.ts.map +1 -1
  102. package/dist/zod.js +18 -0
  103. package/dist/zod.js.map +1 -1
  104. package/package.json +3 -3
  105. package/src/Challenge.test.ts +13 -0
  106. package/src/Challenge.ts +3 -3
  107. package/src/Method.ts +46 -1
  108. package/src/Receipt.ts +2 -0
  109. package/src/client/Methods.ts +1 -0
  110. package/src/middlewares/elysia.test.ts +31 -1
  111. package/src/middlewares/elysia.ts +13 -0
  112. package/src/middlewares/express.ts +1 -5
  113. package/src/middlewares/hono.test.ts +30 -1
  114. package/src/middlewares/hono.ts +13 -0
  115. package/src/middlewares/nextjs.test.ts +28 -1
  116. package/src/middlewares/nextjs.ts +13 -0
  117. package/src/proxy/Proxy.ts +2 -5
  118. package/src/proxy/Service.test.ts +34 -0
  119. package/src/proxy/Service.ts +7 -0
  120. package/src/server/Mppx.authorize.test.ts +210 -0
  121. package/src/server/Mppx.test-d.ts +23 -1
  122. package/src/server/Mppx.test.ts +73 -3
  123. package/src/server/Mppx.ts +291 -58
  124. package/src/stripe/server/internal/html/package.json +1 -1
  125. package/src/stripe/server/internal/html.gen.ts +1 -1
  126. package/src/tempo/Methods.test.ts +131 -0
  127. package/src/tempo/Methods.ts +136 -0
  128. package/src/tempo/Subscription.integration.test.ts +591 -0
  129. package/src/tempo/client/Methods.ts +3 -0
  130. package/src/tempo/client/Subscription.test.ts +131 -0
  131. package/src/tempo/client/Subscription.ts +155 -0
  132. package/src/tempo/client/index.ts +1 -0
  133. package/src/tempo/index.ts +1 -0
  134. package/src/tempo/server/Methods.ts +5 -0
  135. package/src/tempo/server/Subscription.test.ts +1410 -0
  136. package/src/tempo/server/Subscription.ts +1014 -0
  137. package/src/tempo/server/index.ts +1 -0
  138. package/src/tempo/server/internal/html/package.json +1 -1
  139. package/src/tempo/server/internal/html.gen.ts +1 -1
  140. package/src/tempo/subscription/KeyAuthorization.test.ts +204 -0
  141. package/src/tempo/subscription/KeyAuthorization.ts +394 -0
  142. package/src/tempo/subscription/Receipt.ts +28 -0
  143. package/src/tempo/subscription/Store.test.ts +554 -0
  144. package/src/tempo/subscription/Store.ts +431 -0
  145. package/src/tempo/subscription/Types.ts +68 -0
  146. package/src/tempo/subscription/index.ts +23 -0
  147. package/src/zod.test.ts +23 -1
  148. package/src/zod.ts +24 -0
@@ -1,6 +1,7 @@
1
1
  import { charge as charge_ } from './Charge.js';
2
2
  import { session as sessionIntent_ } from './Session.js';
3
3
  import { sessionManager as session_ } from './SessionManager.js';
4
+ import { subscription as subscription_ } from './Subscription.js';
4
5
  /**
5
6
  * Creates both Tempo `charge` and `session` client methods from shared parameters.
6
7
  *
@@ -183,5 +184,7 @@ export declare namespace tempo {
183
184
  const charge: typeof charge_;
184
185
  /** Creates a client-side streaming session for managing payment channels. */
185
186
  const session: typeof session_;
187
+ /** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
188
+ const subscription: typeof subscription_;
186
189
  }
187
190
  //# sourceMappingURL=Methods.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../../src/tempo/client/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEhE;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,UAAU,GAAE,KAAK,CAAC,UAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAEtD;AAED,yBAAiB,KAAK,CAAC;IACrB,KAAY,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAA;IAEvE,kFAAkF;IAC3E,MAAM,MAAM,gBAAU,CAAA;IAC7B,6EAA6E;IACtE,MAAM,OAAO,iBAAW,CAAA;CAChC"}
1
+ {"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../../src/tempo/client/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjE;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,UAAU,GAAE,KAAK,CAAC,UAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAEtD;AAED,yBAAiB,KAAK,CAAC;IACrB,KAAY,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,CAAA;IAEvE,kFAAkF;IAC3E,MAAM,MAAM,gBAAU,CAAA;IAC7B,6EAA6E;IACtE,MAAM,OAAO,iBAAW,CAAA;IAC/B,kFAAkF;IAC3E,MAAM,YAAY,sBAAgB,CAAA;CAC1C"}
@@ -1,6 +1,7 @@
1
1
  import { charge as charge_ } from './Charge.js';
2
2
  import { session as sessionIntent_ } from './Session.js';
3
3
  import { sessionManager as session_ } from './SessionManager.js';
4
+ import { subscription as subscription_ } from './Subscription.js';
4
5
  /**
5
6
  * Creates both Tempo `charge` and `session` client methods from shared parameters.
6
7
  *
@@ -21,5 +22,7 @@ export function tempo(parameters = {}) {
21
22
  tempo.charge = charge_;
22
23
  /** Creates a client-side streaming session for managing payment channels. */
23
24
  tempo.session = session_;
25
+ /** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
26
+ tempo.subscription = subscription_;
24
27
  })(tempo || (tempo = {}));
25
28
  //# sourceMappingURL=Methods.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../../src/tempo/client/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEhE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,aAA+B,EAAE;IACrD,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAU,CAAA;AACnE,CAAC;AAED,WAAiB,KAAK;IAGpB,kFAAkF;IACrE,YAAM,GAAG,OAAO,CAAA;IAC7B,6EAA6E;IAChE,aAAO,GAAG,QAAQ,CAAA;AACjC,CAAC,EAPgB,KAAK,KAAL,KAAK,QAOrB"}
1
+ {"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../../src/tempo/client/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAAC,aAA+B,EAAE;IACrD,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAU,CAAA;AACnE,CAAC;AAED,WAAiB,KAAK;IAGpB,kFAAkF;IACrE,YAAM,GAAG,OAAO,CAAA;IAC7B,6EAA6E;IAChE,aAAO,GAAG,QAAQ,CAAA;IAC/B,kFAAkF;IACrE,kBAAY,GAAG,aAAa,CAAA;AAC3C,CAAC,EATgB,KAAK,KAAL,KAAK,QASrB"}
@@ -0,0 +1,114 @@
1
+ import type { MaybePromise } from '../../internal/types.js';
2
+ import * as Method from '../../Method.js';
3
+ import * as Account from '../../viem/Account.js';
4
+ import * as Client from '../../viem/Client.js';
5
+ import * as z from '../../zod.js';
6
+ import * as Methods from '../Methods.js';
7
+ import type { SubscriptionAccessKey } from '../subscription/Types.js';
8
+ /** Context accepted by the Tempo subscription client method. */
9
+ export declare const subscriptionContextSchema: z.ZodMiniObject<{
10
+ accessKey: z.ZodMiniOptional<z.ZodMiniCustom<SubscriptionAccessKey, SubscriptionAccessKey>>;
11
+ account: z.ZodMiniOptional<z.ZodMiniCustom<`0x${string}` | Account.Account | undefined, `0x${string}` | Account.Account | undefined>>;
12
+ }, z.core.$strip>;
13
+ /** Runtime context for creating a Tempo subscription credential. */
14
+ export type SubscriptionContext = z.infer<typeof subscriptionContextSchema>;
15
+ /** Creates a Tempo subscription client method. */
16
+ export declare function subscription(parameters?: subscription.Parameters): Method.Client<{
17
+ readonly name: "tempo";
18
+ readonly intent: "subscription";
19
+ readonly schema: {
20
+ readonly credential: {
21
+ readonly payload: z.ZodMiniObject<{
22
+ signature: z.ZodMiniString<string>;
23
+ type: z.ZodMiniLiteral<"keyAuthorization">;
24
+ }, z.core.$strip>;
25
+ };
26
+ readonly request: z.ZodMiniPipe<z.ZodMiniObject<{
27
+ amount: z.ZodMiniString<string>;
28
+ accessKey: z.ZodMiniOptional<z.ZodMiniObject<{
29
+ accessKeyAddress: z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<`0x${string}`, string>>;
30
+ keyType: z.ZodMiniEnum<{
31
+ secp256k1: "secp256k1";
32
+ p256: "p256";
33
+ webAuthn: "webAuthn";
34
+ }>;
35
+ }, z.core.$strip>>;
36
+ chainId: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
37
+ currency: z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<`0x${string}`, string>>;
38
+ decimals: z.ZodMiniNumber<number>;
39
+ description: z.ZodMiniOptional<z.ZodMiniString<string>>;
40
+ externalId: z.ZodMiniOptional<z.ZodMiniString<string>>;
41
+ methodDetails: z.ZodMiniOptional<z.ZodMiniObject<{
42
+ accessKey: z.ZodMiniOptional<z.ZodMiniObject<{
43
+ accessKeyAddress: z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<`0x${string}`, string>>;
44
+ keyType: z.ZodMiniEnum<{
45
+ secp256k1: "secp256k1";
46
+ p256: "p256";
47
+ webAuthn: "webAuthn";
48
+ }>;
49
+ }, z.core.$strip>>;
50
+ chainId: z.ZodMiniOptional<z.ZodMiniNumber<number>>;
51
+ }, z.core.$strip>>;
52
+ periodCount: z.ZodMiniPipe<z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniBigInt<bigint>, z.ZodMiniCustom<number, number>]>, z.ZodMiniTransform<string, string | number | bigint>>;
53
+ periodUnit: z.ZodMiniEnum<{
54
+ day: "day";
55
+ week: "week";
56
+ }>;
57
+ recipient: z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<`0x${string}`, string>>;
58
+ subscriptionExpires: z.ZodMiniPipe<z.ZodMiniUnion<readonly [z.ZodMiniString<string>, z.ZodMiniCustom<Date, Date>]>, z.ZodMiniTransform<Date, z.DatetimeInput>>;
59
+ }, z.core.$strip>, z.ZodMiniTransform<{
60
+ methodDetails?: {
61
+ accessKey?: z.infer<z.ZodMiniObject<{
62
+ accessKeyAddress: z.ZodMiniPipe<z.ZodMiniString<string>, z.ZodMiniTransform<`0x${string}`, string>>;
63
+ keyType: z.ZodMiniEnum<{
64
+ secp256k1: "secp256k1";
65
+ p256: "p256";
66
+ webAuthn: "webAuthn";
67
+ }>;
68
+ }, z.core.$strip>> | undefined;
69
+ chainId?: number | undefined;
70
+ } | undefined;
71
+ amount: string;
72
+ subscriptionExpires: string;
73
+ currency: `0x${string}`;
74
+ periodCount: string;
75
+ periodUnit: "day" | "week";
76
+ recipient: `0x${string}`;
77
+ description?: string | undefined;
78
+ externalId?: string | undefined;
79
+ }, {
80
+ amount: string;
81
+ currency: `0x${string}`;
82
+ decimals: number;
83
+ periodCount: string;
84
+ periodUnit: "day" | "week";
85
+ recipient: `0x${string}`;
86
+ subscriptionExpires: Date;
87
+ accessKey?: {
88
+ accessKeyAddress: `0x${string}`;
89
+ keyType: "secp256k1" | "p256" | "webAuthn";
90
+ } | undefined;
91
+ chainId?: number | undefined;
92
+ description?: string | undefined;
93
+ externalId?: string | undefined;
94
+ methodDetails?: {
95
+ accessKey?: {
96
+ accessKeyAddress: `0x${string}`;
97
+ keyType: "secp256k1" | "p256" | "webAuthn";
98
+ } | undefined;
99
+ chainId?: number | undefined;
100
+ } | undefined;
101
+ }>>;
102
+ };
103
+ }, z.ZodMiniObject<{
104
+ accessKey: z.ZodMiniOptional<z.ZodMiniCustom<SubscriptionAccessKey, SubscriptionAccessKey>>;
105
+ account: z.ZodMiniOptional<z.ZodMiniCustom<`0x${string}` | Account.Account | undefined, `0x${string}` | Account.Account | undefined>>;
106
+ }, z.core.$strip>>;
107
+ export declare namespace subscription {
108
+ /** Parameters for creating a Tempo subscription credential. */
109
+ type Parameters = Account.getResolver.Parameters & Client.getResolver.Parameters & {
110
+ accessKey?: SubscriptionAccessKey | undefined;
111
+ validateRequest?: ((request: ReturnType<typeof Methods.subscription.schema.request.parse>) => MaybePromise<void>) | undefined;
112
+ };
113
+ }
114
+ //# sourceMappingURL=Subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../../../src/tempo/client/Subscription.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AASxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAIrE,gEAAgE;AAChE,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAA;AAEF,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,UAAU,GAAE,YAAY,CAAC,UAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAwDpE;AAqDD,MAAM,CAAC,OAAO,WAAW,YAAY,CAAC;IACpC,+DAA+D;IAC/D,KAAK,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,GAC9C,MAAM,CAAC,WAAW,CAAC,UAAU,GAAG;QAC9B,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;QAC7C,eAAe,CAAC,EACZ,CAAC,CACC,OAAO,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAClE,YAAY,CAAC,IAAI,CAAC,CAAC,GACxB,SAAS,CAAA;KACd,CAAA;CACJ"}
@@ -0,0 +1,100 @@
1
+ import { KeyAuthorization } from 'ox/tempo';
2
+ import { isAddressEqual } from 'viem';
3
+ import { tempo as tempo_chain } from 'viem/chains';
4
+ import * as Credential from '../../Credential.js';
5
+ import * as Method from '../../Method.js';
6
+ import * as Account from '../../viem/Account.js';
7
+ import * as Client from '../../viem/Client.js';
8
+ import * as z from '../../zod.js';
9
+ import * as defaults from '../internal/defaults.js';
10
+ import * as Methods from '../Methods.js';
11
+ import { getSubscriptionRpcAllowedCalls, signSubscriptionKeyAuthorization, toSubscriptionExpiryDate, toSubscriptionExpirySeconds, toSubscriptionPeriodSeconds, verifySubscriptionKeyAuthorization, } from '../subscription/KeyAuthorization.js';
12
+ /** Context accepted by the Tempo subscription client method. */
13
+ export const subscriptionContextSchema = z.object({
14
+ accessKey: z.optional(z.custom()),
15
+ account: z.optional(z.custom()),
16
+ });
17
+ /** Creates a Tempo subscription client method. */
18
+ export function subscription(parameters = {}) {
19
+ const getClient = Client.getResolver({
20
+ chain: tempo_chain,
21
+ getClient: parameters.getClient,
22
+ rpcUrl: defaults.rpcUrl,
23
+ });
24
+ const getAccount = Account.getResolver({ account: parameters.account });
25
+ return Method.toClient(Methods.subscription, {
26
+ context: subscriptionContextSchema,
27
+ async createCredential({ challenge, context }) {
28
+ const chainId = challenge.request.methodDetails?.chainId ?? defaults.chainId.testnet;
29
+ const client = await getClient({ chainId });
30
+ const account = getAccount(client, context);
31
+ const accessKey = context?.accessKey ?? parameters.accessKey ?? challenge.request.methodDetails?.accessKey;
32
+ if (!accessKey) {
33
+ throw new Error('No `accessKey` provided. The subscription challenge must include `accessKey`, or the client must pass one to parameters/context.');
34
+ }
35
+ assertSubscriptionRequestRepresentable(challenge.request);
36
+ await parameters.validateRequest?.(challenge.request);
37
+ const keyAuthorization = await authorizeAccessKey(client, {
38
+ accessKey,
39
+ account,
40
+ chainId,
41
+ request: challenge.request,
42
+ });
43
+ const verified = verifySubscriptionKeyAuthorization({
44
+ accessKey,
45
+ chainId,
46
+ payload: {
47
+ signature: KeyAuthorization.serialize(keyAuthorization),
48
+ type: 'keyAuthorization',
49
+ },
50
+ request: challenge.request,
51
+ });
52
+ if (!isAddressEqual(verified.source.address, account.address)) {
53
+ throw new Error('keyAuthorization signer does not match the selected account');
54
+ }
55
+ return Credential.serialize({
56
+ challenge,
57
+ payload: {
58
+ signature: KeyAuthorization.serialize(keyAuthorization),
59
+ type: 'keyAuthorization',
60
+ },
61
+ source: `did:pkh:eip155:${chainId}:${account.address.toLowerCase()}`,
62
+ });
63
+ },
64
+ });
65
+ }
66
+ async function authorizeAccessKey(client, parameters) {
67
+ const { accessKey, account, chainId, request } = parameters;
68
+ const local = await signSubscriptionKeyAuthorization({
69
+ accessKey,
70
+ account,
71
+ chainId,
72
+ request,
73
+ });
74
+ if (local)
75
+ return local;
76
+ const result = (await client.request({
77
+ method: 'wallet_authorizeAccessKey',
78
+ params: [
79
+ {
80
+ address: accessKey.accessKeyAddress,
81
+ allowedCalls: getSubscriptionRpcAllowedCalls(request),
82
+ expiry: toSubscriptionExpirySeconds(toSubscriptionExpiryDate(request.subscriptionExpires)),
83
+ keyType: accessKey.keyType,
84
+ limits: [
85
+ {
86
+ token: request.currency,
87
+ limit: BigInt(request.amount),
88
+ period: toSubscriptionPeriodSeconds(request),
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ }));
94
+ return KeyAuthorization.fromRpc(result.keyAuthorization);
95
+ }
96
+ function assertSubscriptionRequestRepresentable(request) {
97
+ toSubscriptionPeriodSeconds(request);
98
+ toSubscriptionExpirySeconds(toSubscriptionExpiryDate(request.subscriptionExpires));
99
+ }
100
+ //# sourceMappingURL=Subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Subscription.js","sourceRoot":"","sources":["../../../src/tempo/client/Subscription.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export { charge } from './Charge.js';
2
2
  export { tempo } from './Methods.js';
3
3
  export { session } from './Session.js';
4
+ export { subscription } from './Subscription.js';
4
5
  export type { PaymentResponse, SessionManager } from './SessionManager.js';
5
6
  export { sessionManager } from './SessionManager.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tempo/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tempo/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  export { charge } from './Charge.js';
2
2
  export { tempo } from './Methods.js';
3
3
  export { session } from './Session.js';
4
+ export { subscription } from './Subscription.js';
4
5
  export { sessionManager } from './SessionManager.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tempo/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tempo/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export * as Proof from './Proof.js';
2
2
  export * as Methods from './Methods.js';
3
3
  export * as Session from './session/index.js';
4
+ export * as Subscription from './subscription/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tempo/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tempo/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export * as Proof from './Proof.js';
2
2
  export * as Methods from './Methods.js';
3
3
  export * as Session from './session/index.js';
4
+ export * as Subscription from './subscription/index.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tempo/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tempo/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import * as Ws_ from '../session/Ws.js';
2
2
  import { charge as charge_ } from './Charge.js';
3
3
  import { session as session_, settle as settle_ } from './Session.js';
4
+ import { renew as renewSubscription_, subscription as subscription_ } from './Subscription.js';
4
5
  /**
5
6
  * Creates both Tempo `charge` and `session` methods from shared parameters.
6
7
  *
@@ -160,6 +161,10 @@ export declare namespace tempo {
160
161
  const charge: typeof charge_;
161
162
  /** Creates a Tempo `session` method for session-based TIP-20 token payments. */
162
163
  const session: typeof session_;
164
+ /** Creates a Tempo `subscription` method for recurring TIP-20 token payments. */
165
+ const subscription: typeof subscription_;
166
+ /** Renews an overdue Tempo subscription outside of the HTTP request path. */
167
+ const renewSubscription: typeof renewSubscription_;
163
168
  /** One-shot settle: reads highest voucher from storage and submits on-chain. */
164
169
  const settle: typeof settle_;
165
170
  /** Experimental websocket helpers for Tempo sessions. */
@@ -1 +1 @@
1
- {"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../../src/tempo/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,cAAc,CAAA;AAErE;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAKvF;AAED,yBAAiB,KAAK,CAAC;IACrB,KAAY,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IAEjE,2EAA2E;IACpE,MAAM,MAAM,gBAAU,CAAA;IAC7B,gFAAgF;IACzE,MAAM,OAAO,iBAAW,CAAA;IAC/B,gFAAgF;IACzE,MAAM,MAAM,gBAAU,CAAA;IAC7B,yDAAyD;IAClD,MAAM,EAAE,YAAM,CAAA;CACtB"}
1
+ {"version":3,"file":"Methods.d.ts","sourceRoot":"","sources":["../../../src/tempo/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,KAAK,IAAI,kBAAkB,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE9F;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAKvF;AAED,yBAAiB,KAAK,CAAC;IACrB,KAAY,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;IAEjE,2EAA2E;IACpE,MAAM,MAAM,gBAAU,CAAA;IAC7B,gFAAgF;IACzE,MAAM,OAAO,iBAAW,CAAA;IAC/B,iFAAiF;IAC1E,MAAM,YAAY,sBAAgB,CAAA;IACzC,6EAA6E;IACtE,MAAM,iBAAiB,2BAAqB,CAAA;IACnD,gFAAgF;IACzE,MAAM,MAAM,gBAAU,CAAA;IAC7B,yDAAyD;IAClD,MAAM,EAAE,YAAM,CAAA;CACtB"}
@@ -1,6 +1,7 @@
1
1
  import * as Ws_ from '../session/Ws.js';
2
2
  import { charge as charge_ } from './Charge.js';
3
3
  import { session as session_, settle as settle_ } from './Session.js';
4
+ import { renew as renewSubscription_, subscription as subscription_ } from './Subscription.js';
4
5
  /**
5
6
  * Creates both Tempo `charge` and `session` methods from shared parameters.
6
7
  *
@@ -24,6 +25,10 @@ export function tempo(parameters) {
24
25
  tempo.charge = charge_;
25
26
  /** Creates a Tempo `session` method for session-based TIP-20 token payments. */
26
27
  tempo.session = session_;
28
+ /** Creates a Tempo `subscription` method for recurring TIP-20 token payments. */
29
+ tempo.subscription = subscription_;
30
+ /** Renews an overdue Tempo subscription outside of the HTTP request path. */
31
+ tempo.renewSubscription = renewSubscription_;
27
32
  /** One-shot settle: reads highest voucher from storage and submits on-chain. */
28
33
  tempo.settle = settle_;
29
34
  /** Experimental websocket helpers for Tempo sessions. */
@@ -1 +1 @@
1
- {"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../../src/tempo/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,cAAc,CAAA;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAA4C,UAAuB;IACtF,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,UAAyC,CAAC;QACvD,KAAK,CAAC,OAAO,CAAC,UAA0C,CAAC;KACjD,CAAA;AACZ,CAAC;AAED,WAAiB,KAAK;IAGpB,2EAA2E;IAC9D,YAAM,GAAG,OAAO,CAAA;IAC7B,gFAAgF;IACnE,aAAO,GAAG,QAAQ,CAAA;IAC/B,gFAAgF;IACnE,YAAM,GAAG,OAAO,CAAA;IAC7B,yDAAyD;IAC5C,QAAE,GAAG,GAAG,CAAA;AACvB,CAAC,EAXgB,KAAK,KAAL,KAAK,QAWrB"}
1
+ {"version":3,"file":"Methods.js","sourceRoot":"","sources":["../../../src/tempo/server/Methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,KAAK,IAAI,kBAAkB,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE9F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,KAAK,CAA4C,UAAuB;IACtF,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,UAAyC,CAAC;QACvD,KAAK,CAAC,OAAO,CAAC,UAA0C,CAAC;KACjD,CAAA;AACZ,CAAC;AAED,WAAiB,KAAK;IAGpB,2EAA2E;IAC9D,YAAM,GAAG,OAAO,CAAA;IAC7B,gFAAgF;IACnE,aAAO,GAAG,QAAQ,CAAA;IAC/B,iFAAiF;IACpE,kBAAY,GAAG,aAAa,CAAA;IACzC,6EAA6E;IAChE,uBAAiB,GAAG,kBAAkB,CAAA;IACnD,gFAAgF;IACnE,YAAM,GAAG,OAAO,CAAA;IAC7B,yDAAyD;IAC5C,QAAE,GAAG,GAAG,CAAA;AACvB,CAAC,EAfgB,KAAK,KAAL,KAAK,QAerB"}
@@ -0,0 +1,221 @@
1
+ import { type Address } from 'viem';
2
+ import type { LooseOmit, MaybePromise, NoExtraKeys } from '../../internal/types.js';
3
+ import * as Method from '../../Method.js';
4
+ import * as Store from '../../Store.js';
5
+ import type * as Client from '../../viem/Client.js';
6
+ import * as Account from '../internal/account.js';
7
+ import type * as types from '../internal/types.js';
8
+ import * as Methods from '../Methods.js';
9
+ import type { SubscriptionAccessKey, SubscriptionCredentialPayload, SubscriptionLookup, SubscriptionPeriodUnit, SubscriptionRecord, SubscriptionReceipt as SubscriptionReceiptValue } from '../subscription/Types.js';
10
+ type SubscriptionRequest = ReturnType<typeof Methods.subscription.schema.request.parse>;
11
+ /**
12
+ * Creates a Tempo subscription method for recurring TIP-20 token payments.
13
+ *
14
+ * The method handles activation, request-path reuse, and optional lazy renewals.
15
+ */
16
+ export declare function subscription<const parameters extends subscription.Parameters>(p: NoExtraKeys<parameters, subscription.Parameters>): Method.Server<{
17
+ readonly name: "tempo";
18
+ readonly intent: "subscription";
19
+ readonly schema: {
20
+ readonly credential: {
21
+ readonly payload: import("zod/mini").ZodMiniObject<{
22
+ signature: import("zod/mini").ZodMiniString<string>;
23
+ type: import("zod/mini").ZodMiniLiteral<"keyAuthorization">;
24
+ }, import("zod/v4/core").$strip>;
25
+ };
26
+ readonly request: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniObject<{
27
+ amount: import("zod/mini").ZodMiniString<string>;
28
+ accessKey: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniObject<{
29
+ accessKeyAddress: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<`0x${string}`, string>>;
30
+ keyType: import("zod/mini").ZodMiniEnum<{
31
+ secp256k1: "secp256k1";
32
+ p256: "p256";
33
+ webAuthn: "webAuthn";
34
+ }>;
35
+ }, import("zod/v4/core").$strip>>;
36
+ chainId: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNumber<number>>;
37
+ currency: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<`0x${string}`, string>>;
38
+ decimals: import("zod/mini").ZodMiniNumber<number>;
39
+ description: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
40
+ externalId: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
41
+ methodDetails: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniObject<{
42
+ accessKey: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniObject<{
43
+ accessKeyAddress: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<`0x${string}`, string>>;
44
+ keyType: import("zod/mini").ZodMiniEnum<{
45
+ secp256k1: "secp256k1";
46
+ p256: "p256";
47
+ webAuthn: "webAuthn";
48
+ }>;
49
+ }, import("zod/v4/core").$strip>>;
50
+ chainId: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniNumber<number>>;
51
+ }, import("zod/v4/core").$strip>>;
52
+ periodCount: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniBigInt<bigint>, import("zod/mini").ZodMiniCustom<number, number>]>, import("zod/mini").ZodMiniTransform<string, string | number | bigint>>;
53
+ periodUnit: import("zod/mini").ZodMiniEnum<{
54
+ day: "day";
55
+ week: "week";
56
+ }>;
57
+ recipient: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<`0x${string}`, string>>;
58
+ subscriptionExpires: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniCustom<Date, Date>]>, import("zod/mini").ZodMiniTransform<Date, import("../../zod.js").DatetimeInput>>;
59
+ }, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniTransform<{
60
+ methodDetails?: {
61
+ accessKey?: import("zod").infer<import("zod/mini").ZodMiniObject<{
62
+ accessKeyAddress: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<`0x${string}`, string>>;
63
+ keyType: import("zod/mini").ZodMiniEnum<{
64
+ secp256k1: "secp256k1";
65
+ p256: "p256";
66
+ webAuthn: "webAuthn";
67
+ }>;
68
+ }, import("zod/v4/core").$strip>> | undefined;
69
+ chainId?: number | undefined;
70
+ } | undefined;
71
+ amount: string;
72
+ subscriptionExpires: string;
73
+ currency: `0x${string}`;
74
+ periodCount: string;
75
+ periodUnit: "day" | "week";
76
+ recipient: `0x${string}`;
77
+ description?: string | undefined;
78
+ externalId?: string | undefined;
79
+ }, {
80
+ amount: string;
81
+ currency: `0x${string}`;
82
+ decimals: number;
83
+ periodCount: string;
84
+ periodUnit: "day" | "week";
85
+ recipient: `0x${string}`;
86
+ subscriptionExpires: Date;
87
+ accessKey?: {
88
+ accessKeyAddress: `0x${string}`;
89
+ keyType: "secp256k1" | "p256" | "webAuthn";
90
+ } | undefined;
91
+ chainId?: number | undefined;
92
+ description?: string | undefined;
93
+ externalId?: string | undefined;
94
+ methodDetails?: {
95
+ accessKey?: {
96
+ accessKeyAddress: `0x${string}`;
97
+ keyType: "secp256k1" | "p256" | "webAuthn";
98
+ } | undefined;
99
+ chainId?: number | undefined;
100
+ } | undefined;
101
+ }>>;
102
+ };
103
+ }, subscription.DeriveDefaults<parameters>, undefined>;
104
+ /**
105
+ * Renews an overdue subscription outside of the HTTP request path.
106
+ * Intended for cron jobs or background workers that bill subscriptions on a schedule.
107
+ *
108
+ * Returns the renewal result if the subscription was overdue, or `null` if already current.
109
+ */
110
+ export declare function renew(parameters: renew.Parameters): Promise<renew.Result | null>;
111
+ export declare namespace renew {
112
+ /** Parameters for renewing an overdue subscription outside the request path. */
113
+ type Parameters = {
114
+ /** The subscription to renew. */
115
+ subscriptionId: string;
116
+ /** Billing callback — same signature as the `renew` hook on {@link subscription}. */
117
+ renew?: ((parameters: {
118
+ /** Stable idempotency/reconciliation reference persisted before the renewal hook runs. */
119
+ inFlightReference: string;
120
+ periodIndex: number;
121
+ subscription: SubscriptionRecord;
122
+ }) => Promise<subscription.RenewalResult>) | undefined;
123
+ /** Store containing subscription records. */
124
+ store: Store.AtomicStore<Record<string, unknown>>;
125
+ /**
126
+ * Milliseconds before an in-flight renewal lock can be replaced.
127
+ * Keeps concurrent renewal safe while allowing recovery from abandoned attempts.
128
+ */
129
+ renewalTimeoutMs?: number | undefined;
130
+ waitForConfirmation?: boolean | undefined;
131
+ } & Client.getResolver.Parameters;
132
+ /** Renewal result returned by {@link renew}. */
133
+ type Result = subscription.RenewalResult;
134
+ }
135
+ export declare namespace subscription {
136
+ /** Request-scoped lookup key used to find the active subscription. */
137
+ type ResolvedSubscription = SubscriptionLookup;
138
+ /** Activation result returned after the initial credential is verified. */
139
+ type ActivationResult = {
140
+ receipt: SubscriptionReceiptValue;
141
+ subscription: SubscriptionRecord;
142
+ };
143
+ /** Renewal result returned when an overdue subscription is charged. */
144
+ type RenewalResult = {
145
+ receipt: SubscriptionReceiptValue;
146
+ subscription: SubscriptionRecord;
147
+ };
148
+ /** Request defaults supported by the subscription method. */
149
+ type Defaults = LooseOmit<Method.RequestDefaults<typeof Methods.subscription>, 'accessKey' | 'recipient'>;
150
+ /** Parameters for configuring a Tempo subscription method. */
151
+ type Parameters = Account.resolve.Parameters & Client.getResolver.Parameters & {
152
+ accessKey?: ((parameters: {
153
+ input: Request;
154
+ request: SubscriptionRequest;
155
+ resolved: ResolvedSubscription;
156
+ }) => MaybePromise<SubscriptionAccessKey>) | undefined;
157
+ /**
158
+ * Milliseconds before an in-flight activation lock can be replaced.
159
+ * Keeps concurrent activation safe while allowing recovery from abandoned attempts.
160
+ */
161
+ activationTimeoutMs?: number | undefined;
162
+ /**
163
+ * Milliseconds before an in-flight renewal lock can be replaced.
164
+ * Keeps concurrent renewal safe while allowing recovery from abandoned attempts.
165
+ */
166
+ renewalTimeoutMs?: number | undefined;
167
+ activate?: ((parameters: {
168
+ /** Custom activation must verify this access key matches the resolved subscription. */
169
+ accessKey: SubscriptionAccessKey;
170
+ credential: {
171
+ payload: SubscriptionCredentialPayload;
172
+ source?: string | undefined;
173
+ };
174
+ input: Request;
175
+ request: SubscriptionRequest;
176
+ resolved: ResolvedSubscription;
177
+ source: {
178
+ address: Address;
179
+ chainId: number;
180
+ } | null;
181
+ }) => Promise<ActivationResult>) | undefined;
182
+ hooks?: {
183
+ activated?: ((parameters: {
184
+ receipt: SubscriptionReceiptValue;
185
+ subscription: SubscriptionRecord;
186
+ }) => MaybePromise<void>) | undefined;
187
+ renewed?: ((parameters: {
188
+ periodIndex: number;
189
+ receipt: SubscriptionReceiptValue;
190
+ subscription: SubscriptionRecord;
191
+ }) => MaybePromise<void>) | undefined;
192
+ } | undefined;
193
+ periodCount?: Methods.SubscriptionPeriodCountInput | undefined;
194
+ periodUnit?: SubscriptionPeriodUnit | undefined;
195
+ /**
196
+ * Resolves the request identity. This callback must authenticate and
197
+ * authorize the caller before returning a key; automatic mode may create
198
+ * a server-owned access key for that key while issuing a challenge.
199
+ */
200
+ resolve: (parameters: {
201
+ input: Request;
202
+ request: SubscriptionRequest;
203
+ }) => MaybePromise<ResolvedSubscription | null>;
204
+ renew?: (parameters: {
205
+ /** Stable idempotency/reconciliation reference persisted before the renewal hook runs. */
206
+ inFlightReference: string;
207
+ periodIndex: number;
208
+ /** Custom renewal hooks must preserve amount, currency, recipient, period, expiry, and lookup key. */
209
+ subscription: SubscriptionRecord;
210
+ }) => Promise<RenewalResult>;
211
+ store?: Store.AtomicStore<Record<string, unknown>> | undefined;
212
+ testnet?: boolean | undefined;
213
+ waitForConfirmation?: boolean | undefined;
214
+ } & Defaults;
215
+ /** Derived defaults after account and chain configuration are applied. */
216
+ type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<parameters, Defaults> & {
217
+ decimals: number;
218
+ };
219
+ }
220
+ export {};
221
+ //# sourceMappingURL=Subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../../../src/tempo/server/Subscription.ts"],"names":[],"mappings":"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"}