mppx 0.6.25 → 0.6.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/Method.d.ts +6 -4
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +2 -1
- package/dist/Method.js.map +1 -1
- package/dist/middlewares/internal/mppx.d.ts +3 -2
- package/dist/middlewares/internal/mppx.d.ts.map +1 -1
- package/dist/middlewares/internal/mppx.js +1 -0
- package/dist/middlewares/internal/mppx.js.map +1 -1
- package/dist/server/Mppx.d.ts +8 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +4 -1
- package/dist/server/Mppx.js.map +1 -1
- package/dist/stripe/server/Charge.d.ts +1 -1
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Methods.d.ts +1 -1
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.d.ts +3 -2
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +13 -4
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/client/Subscription.d.ts +3 -2
- package/dist/tempo/client/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Charge.d.ts +1 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Methods.d.ts +2 -2
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Session.d.ts +1 -1
- package/dist/tempo/server/Session.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +28 -12
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js +82 -30
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +3 -14
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.js +11 -20
- package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
- package/dist/tempo/subscription/Types.d.ts +2 -2
- package/dist/tempo/subscription/Types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Method.ts +21 -5
- package/src/middlewares/internal/mppx.test.ts +24 -0
- package/src/middlewares/internal/mppx.ts +6 -2
- package/src/server/Mppx.ts +17 -4
- package/src/tempo/Methods.test.ts +17 -0
- package/src/tempo/Methods.ts +12 -4
- package/src/tempo/client/Subscription.test.ts +5 -7
- package/src/tempo/server/Subscription.test.ts +1 -4
- package/src/tempo/server/Subscription.ts +156 -67
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/subscription/KeyAuthorization.test.ts +13 -4
- package/src/tempo/subscription/KeyAuthorization.ts +11 -20
- package/src/tempo/subscription/Types.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.gen.js","sourceRoot":"","sources":["../../../../src/tempo/server/internal/html.gen.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"html.gen.js","sourceRoot":"","sources":["../../../../src/tempo/server/internal/html.gen.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,o+lfAAo+lf,CAAA"}
|
|
@@ -4,7 +4,7 @@ import type * as Methods from '../Methods.js';
|
|
|
4
4
|
import type { SubscriptionAccessKey, SubscriptionCredentialPayload, SubscriptionPeriodUnit } from './Types.js';
|
|
5
5
|
/** 4-byte selector for TIP-20 `transfer(address,uint256)`. */
|
|
6
6
|
export declare const transferSelector = "0xa9059cbb";
|
|
7
|
-
/** 4-byte selector for TIP-20 `transferWithMemo(address,uint256,
|
|
7
|
+
/** 4-byte selector for TIP-20 `transferWithMemo(address,uint256,bytes32)`. */
|
|
8
8
|
export declare const transferWithMemoSelector = "0x95777d59";
|
|
9
9
|
type SubscriptionRequest = ReturnType<typeof Methods.subscription.schema.request.parse>;
|
|
10
10
|
/**
|
|
@@ -30,10 +30,6 @@ export declare function assertSubscriptionTiming(parameters: {
|
|
|
30
30
|
}): void;
|
|
31
31
|
/** Builds the Tempo access-key call scopes required for a subscription payment. */
|
|
32
32
|
export declare function getSubscriptionScopes(request: Pick<SubscriptionRequest, 'currency' | 'recipient'>): readonly [{
|
|
33
|
-
readonly address: `0x${string}`;
|
|
34
|
-
readonly selector: "0xa9059cbb";
|
|
35
|
-
readonly recipients: readonly [`0x${string}`];
|
|
36
|
-
}, {
|
|
37
33
|
readonly address: `0x${string}`;
|
|
38
34
|
readonly selector: "0x95777d59";
|
|
39
35
|
readonly recipients: readonly [`0x${string}`];
|
|
@@ -42,9 +38,6 @@ export declare function getSubscriptionScopes(request: Pick<SubscriptionRequest,
|
|
|
42
38
|
export declare function getSubscriptionRpcAllowedCalls(request: Pick<SubscriptionRequest, 'currency' | 'recipient'>): readonly [{
|
|
43
39
|
readonly target: `0x${string}`;
|
|
44
40
|
readonly selectorRules: readonly [{
|
|
45
|
-
readonly selector: "0xa9059cbb";
|
|
46
|
-
readonly recipients: readonly [`0x${string}`];
|
|
47
|
-
}, {
|
|
48
41
|
readonly selector: "0x95777d59";
|
|
49
42
|
readonly recipients: readonly [`0x${string}`];
|
|
50
43
|
}];
|
|
@@ -71,15 +64,11 @@ export declare function signSubscriptionKeyAuthorization(parameters: {
|
|
|
71
64
|
readonly limit: bigint;
|
|
72
65
|
readonly period: number;
|
|
73
66
|
}[];
|
|
74
|
-
readonly scopes: readonly
|
|
75
|
-
readonly address: `0x${string}`;
|
|
76
|
-
readonly selector: "0xa9059cbb";
|
|
77
|
-
readonly recipients: readonly `0x${string}`[];
|
|
78
|
-
} | {
|
|
67
|
+
readonly scopes: readonly {
|
|
79
68
|
readonly address: `0x${string}`;
|
|
80
69
|
readonly selector: "0x95777d59";
|
|
81
70
|
readonly recipients: readonly `0x${string}`[];
|
|
82
|
-
}
|
|
71
|
+
}[];
|
|
83
72
|
readonly type: "secp256k1" | "p256" | "webAuthn";
|
|
84
73
|
signature: {
|
|
85
74
|
signature: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyAuthorization.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9D,OAAO,KAAK,KAAK,OAAO,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C,
|
|
1
|
+
{"version":3,"file":"KeyAuthorization.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAA6B,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9D,OAAO,KAAK,KAAK,OAAO,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,eAAe,CAAA;AASpD,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAIvF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjF;AAED,wBAAgB,2BAA2B,CAAC,mBAAmB,EAAE,IAAI,GAAG,MAAM,CAmB7E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,sBAAsB,CAAA;CACnC,GAAG,MAAM,CAsBT;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE;IACnD,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,YAAY,GAAG,qBAAqB,CAAC,CAAA;CACzF,QAeA;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,CAAC;;;;GAW7D;AAED,mFAAmF;AACnF,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,WAAW,CAAC;;;;;;GAc7D;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE;IACjE,SAAS,EAAE,qBAAqB,CAAA;IAChC,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE;YAAE,IAAI,EAAE,KAAK,MAAM,EAAE,CAAA;SAAE,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAA;KACrF,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,IAAI,CACX,mBAAmB,EACnB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,qBAAqB,CAC3F,CAAA;CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAeA;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,UAAU,EAAE;IAC7D,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,6BAA6B,CAAA;IACtC,OAAO,EAAE,mBAAmB,CAAA;CAC7B;;;iBAsBwB,OAAO;;;EAI/B"}
|
|
@@ -3,11 +3,14 @@ import { isAddress, isAddressEqual } from 'viem';
|
|
|
3
3
|
import { VerificationFailedError } from '../../Errors.js';
|
|
4
4
|
/** 4-byte selector for TIP-20 `transfer(address,uint256)`. */
|
|
5
5
|
export const transferSelector = '0xa9059cbb';
|
|
6
|
-
/** 4-byte selector for TIP-20 `transferWithMemo(address,uint256,
|
|
6
|
+
/** 4-byte selector for TIP-20 `transferWithMemo(address,uint256,bytes32)`. */
|
|
7
7
|
export const transferWithMemoSelector = '0x95777d59';
|
|
8
8
|
const uint64Max = (1n << 64n) - 1n;
|
|
9
|
-
const
|
|
10
|
-
|
|
9
|
+
const subscriptionPeriodUnitSeconds = {
|
|
10
|
+
dev_second: 1n,
|
|
11
|
+
day: 86400n,
|
|
12
|
+
week: 604800n,
|
|
13
|
+
};
|
|
11
14
|
/**
|
|
12
15
|
* Converts a subscription expiry timestamp into the Unix seconds value required by Tempo key
|
|
13
16
|
* authorizations.
|
|
@@ -41,10 +44,10 @@ export function toSubscriptionPeriodSeconds(request) {
|
|
|
41
44
|
if (!/^[1-9]\d*$/.test(request.periodCount)) {
|
|
42
45
|
throw new VerificationFailedError({ reason: 'periodCount is invalid' });
|
|
43
46
|
}
|
|
44
|
-
|
|
47
|
+
const unitSeconds = subscriptionPeriodUnitSeconds[request.periodUnit];
|
|
48
|
+
if (unitSeconds === undefined) {
|
|
45
49
|
throw new VerificationFailedError({ reason: 'periodUnit is invalid' });
|
|
46
50
|
}
|
|
47
|
-
const unitSeconds = request.periodUnit === 'day' ? secondsPerDay : secondsPerWeek;
|
|
48
51
|
const value = BigInt(request.periodCount) * unitSeconds;
|
|
49
52
|
if (value > uint64Max) {
|
|
50
53
|
throw new VerificationFailedError({
|
|
@@ -79,11 +82,6 @@ export function getSubscriptionScopes(request) {
|
|
|
79
82
|
const currency = normalizeAddress(request.currency, 'currency');
|
|
80
83
|
const recipient = normalizeAddress(request.recipient, 'recipient');
|
|
81
84
|
return [
|
|
82
|
-
{
|
|
83
|
-
address: currency,
|
|
84
|
-
selector: transferSelector,
|
|
85
|
-
recipients: [recipient],
|
|
86
|
-
},
|
|
87
85
|
{
|
|
88
86
|
address: currency,
|
|
89
87
|
selector: transferWithMemoSelector,
|
|
@@ -93,15 +91,11 @@ export function getSubscriptionScopes(request) {
|
|
|
93
91
|
}
|
|
94
92
|
/** Builds the RPC `allowedCalls` payload passed to `wallet_authorizeAccessKey`. */
|
|
95
93
|
export function getSubscriptionRpcAllowedCalls(request) {
|
|
96
|
-
const [
|
|
94
|
+
const [transferWithMemo] = getSubscriptionScopes(request);
|
|
97
95
|
return [
|
|
98
96
|
{
|
|
99
97
|
target: normalizeAddress(request.currency, 'currency'),
|
|
100
98
|
selectorRules: [
|
|
101
|
-
{
|
|
102
|
-
selector: transfer.selector,
|
|
103
|
-
recipients: transfer.recipients,
|
|
104
|
-
},
|
|
105
99
|
{
|
|
106
100
|
selector: transferWithMemo.selector,
|
|
107
101
|
recipients: transferWithMemo.recipients,
|
|
@@ -234,9 +228,9 @@ function assertAuthorizationLimit(limit, request) {
|
|
|
234
228
|
}
|
|
235
229
|
}
|
|
236
230
|
function assertAuthorizationScopes(scopes, request) {
|
|
237
|
-
if (!scopes || scopes.length
|
|
231
|
+
if (!scopes || scopes.length !== 1) {
|
|
238
232
|
throw new VerificationFailedError({
|
|
239
|
-
reason: 'keyAuthorization must contain recipient-scoped
|
|
233
|
+
reason: 'keyAuthorization must contain a recipient-scoped transferWithMemo call',
|
|
240
234
|
});
|
|
241
235
|
}
|
|
242
236
|
const currency = normalizeAddress(request.currency, 'currency');
|
|
@@ -258,9 +252,6 @@ function assertAuthorizationScopes(scopes, request) {
|
|
|
258
252
|
throw new VerificationFailedError({ reason: 'keyAuthorization recipient mismatch' });
|
|
259
253
|
}
|
|
260
254
|
}
|
|
261
|
-
if (!seen.has(transferSelector)) {
|
|
262
|
-
throw new VerificationFailedError({ reason: 'keyAuthorization must allow transfer' });
|
|
263
|
-
}
|
|
264
255
|
if (!seen.has(transferWithMemoSelector)) {
|
|
265
256
|
throw new VerificationFailedError({ reason: 'keyAuthorization must allow transferWithMemo' });
|
|
266
257
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyAuthorization.js","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAgB,MAAM,MAAM,CAAA;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAQzD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAE5C,
|
|
1
|
+
{"version":3,"file":"KeyAuthorization.js","sourceRoot":"","sources":["../../../src/tempo/subscription/KeyAuthorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Address } from 'viem';
|
|
2
|
-
/** Tempo-supported subscription period units.
|
|
3
|
-
export type SubscriptionPeriodUnit = 'day' | 'week';
|
|
2
|
+
/** Tempo-supported subscription period units. Use `day` or `week` in production; `dev_*` units are for development and tests. */
|
|
3
|
+
export type SubscriptionPeriodUnit = 'dev_second' | 'day' | 'week';
|
|
4
4
|
/** Access key information used to authorize recurring Tempo payments. */
|
|
5
5
|
export type SubscriptionAccessKey = {
|
|
6
6
|
accessKeyAddress: Address;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,
|
|
1
|
+
{"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/tempo/subscription/Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,iIAAiI;AACjI,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,CAAA;AAElE,yEAAyE;AACzE,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,OAAO,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;CAC3C,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,GAAG;IAChE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,oDAAoD;AACpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAA;IAC7C,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,uFAAuF;IACvF,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5C,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,sBAAsB,CAAA;IAClC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B,CAAA;AAED,8DAA8D;AAC9D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;IACxB,IAAI,EAAE,kBAAkB,CAAA;CACzB,CAAA;AAED,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAChC,CAAA"}
|
package/package.json
CHANGED
package/src/Method.ts
CHANGED
|
@@ -129,9 +129,11 @@ export type Server<
|
|
|
129
129
|
method extends Method = Method,
|
|
130
130
|
defaults extends ExactPartial<z.input<method['schema']['request']>> = {},
|
|
131
131
|
transportOverride = undefined,
|
|
132
|
+
extensions extends object = {},
|
|
132
133
|
> = method & {
|
|
133
134
|
authorize?: AuthorizeFn<method> | undefined
|
|
134
135
|
defaults?: defaults | undefined
|
|
136
|
+
extensions?: extensions | undefined
|
|
135
137
|
html?: Html.Options | undefined
|
|
136
138
|
request?: RequestFn<method> | undefined
|
|
137
139
|
respond?: RespondFn<method> | undefined
|
|
@@ -139,7 +141,7 @@ export type Server<
|
|
|
139
141
|
transport?: transportOverride | undefined
|
|
140
142
|
verify: VerifyFn<method>
|
|
141
143
|
}
|
|
142
|
-
export type AnyServer = Server<any, any, any>
|
|
144
|
+
export type AnyServer = Server<any, any, any, any>
|
|
143
145
|
|
|
144
146
|
/** Credential creation function for a single method. */
|
|
145
147
|
export type CreateCredentialFn<method extends Method, context = unknown> = (
|
|
@@ -288,22 +290,34 @@ export function toServer<
|
|
|
288
290
|
const method extends Method,
|
|
289
291
|
const defaults extends RequestDefaults<method> = {},
|
|
290
292
|
const transportOverride extends Transport.AnyTransport | undefined = undefined,
|
|
293
|
+
const extensions extends object = {},
|
|
291
294
|
>(
|
|
292
295
|
method: method,
|
|
293
|
-
options: toServer.Options<method, defaults, transportOverride>,
|
|
294
|
-
): Server<method, defaults, transportOverride> {
|
|
295
|
-
const {
|
|
296
|
+
options: toServer.Options<method, defaults, transportOverride, extensions>,
|
|
297
|
+
): Server<method, defaults, transportOverride, extensions> {
|
|
298
|
+
const {
|
|
299
|
+
authorize,
|
|
300
|
+
defaults,
|
|
301
|
+
extensions,
|
|
302
|
+
html,
|
|
303
|
+
request,
|
|
304
|
+
respond,
|
|
305
|
+
stableBinding,
|
|
306
|
+
transport,
|
|
307
|
+
verify,
|
|
308
|
+
} = options
|
|
296
309
|
return {
|
|
297
310
|
...method,
|
|
298
311
|
authorize,
|
|
299
312
|
defaults,
|
|
313
|
+
extensions,
|
|
300
314
|
html,
|
|
301
315
|
request,
|
|
302
316
|
respond,
|
|
303
317
|
stableBinding,
|
|
304
318
|
transport,
|
|
305
319
|
verify,
|
|
306
|
-
} as Server<method, defaults, transportOverride>
|
|
320
|
+
} as Server<method, defaults, transportOverride, extensions>
|
|
307
321
|
}
|
|
308
322
|
|
|
309
323
|
export declare namespace toServer {
|
|
@@ -311,9 +325,11 @@ export declare namespace toServer {
|
|
|
311
325
|
method extends Method,
|
|
312
326
|
defaults extends RequestDefaults<method> = {},
|
|
313
327
|
transportOverride extends Transport.AnyTransport | undefined = undefined,
|
|
328
|
+
extensions extends object = {},
|
|
314
329
|
> = {
|
|
315
330
|
authorize?: AuthorizeFn<method> | undefined
|
|
316
331
|
defaults?: defaults | undefined
|
|
332
|
+
extensions?: extensions | undefined
|
|
317
333
|
html?: Html.Options | undefined
|
|
318
334
|
request?: RequestFn<method> | undefined
|
|
319
335
|
respond?: RespondFn<method> | undefined
|
|
@@ -60,6 +60,20 @@ const betaMethod = Method.toServer(mockChargeB, {
|
|
|
60
60
|
},
|
|
61
61
|
})
|
|
62
62
|
|
|
63
|
+
const alphaMethodWithExtension = Method.toServer<
|
|
64
|
+
typeof mockChargeA,
|
|
65
|
+
{},
|
|
66
|
+
undefined,
|
|
67
|
+
{ renew: () => string }
|
|
68
|
+
>(mockChargeA, {
|
|
69
|
+
extensions: {
|
|
70
|
+
renew: () => 'renewed',
|
|
71
|
+
},
|
|
72
|
+
async verify() {
|
|
73
|
+
return mockReceipt('alpha')
|
|
74
|
+
},
|
|
75
|
+
})
|
|
76
|
+
|
|
63
77
|
const challengeOpts = {
|
|
64
78
|
amount: '1000',
|
|
65
79
|
currency: '0x0000000000000000000000000000000000000001',
|
|
@@ -150,4 +164,14 @@ describe('wrap: nested handlers', () => {
|
|
|
150
164
|
expect(wrapped.realm).toBe(realm)
|
|
151
165
|
expect(wrapped.transport).toBe(mppx.transport)
|
|
152
166
|
})
|
|
167
|
+
|
|
168
|
+
test('method extensions are copied to wrapped handlers', () => {
|
|
169
|
+
const mppx = Mppx.create({ methods: [alphaMethodWithExtension], realm, secretKey }) as any
|
|
170
|
+
|
|
171
|
+
const wrapped = wrap(mppx, (_methodFn, _options) => 'wrapped') as any
|
|
172
|
+
|
|
173
|
+
expect(wrapped.charge.renew()).toBe('renewed')
|
|
174
|
+
expect(wrapped.alpha.charge.renew()).toBe('renewed')
|
|
175
|
+
expect(wrapped['alpha/charge'].renew()).toBe('renewed')
|
|
176
|
+
})
|
|
153
177
|
})
|
|
@@ -11,10 +11,13 @@ type DiscoveryMeta = Pick<DiscoveryHandler, '_internal'>
|
|
|
11
11
|
/** Recursively wraps nested handler objects one level deep. */
|
|
12
12
|
type WrapNested<obj, handler> = {
|
|
13
13
|
[key in keyof obj]: obj[key] extends (options: infer options) => any
|
|
14
|
-
?
|
|
14
|
+
? WrappedMethod<obj[key], options, handler>
|
|
15
15
|
: obj[key]
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
type WrappedMethod<method, options, handler> = ((o: options) => handler & DiscoveryMeta) &
|
|
19
|
+
Omit<method, keyof Function>
|
|
20
|
+
|
|
18
21
|
export type Wrap<mppx, handler> = {
|
|
19
22
|
// `compose` is omitted — it returns a raw HTTP handler, not a
|
|
20
23
|
// middleware-shaped result. Use `Mppx.compose()` static instead.
|
|
@@ -22,7 +25,7 @@ export type Wrap<mppx, handler> = {
|
|
|
22
25
|
[key in keyof mppx as key extends 'compose' ? never : key]: key extends Mppx.ReservedKey
|
|
23
26
|
? mppx[key]
|
|
24
27
|
: mppx[key] extends (options: infer options) => any
|
|
25
|
-
?
|
|
28
|
+
? WrappedMethod<mppx[key], options, handler>
|
|
26
29
|
: mppx[key] extends Record<string, (options: any) => any>
|
|
27
30
|
? WrapNested<mppx[key], handler>
|
|
28
31
|
: mppx[key]
|
|
@@ -50,6 +53,7 @@ export function wrap<mppx extends Mppx.Mppx<any, any>, handler>(
|
|
|
50
53
|
if (configured._internal) handler._internal = configured._internal
|
|
51
54
|
return handler
|
|
52
55
|
}
|
|
56
|
+
Object.assign(wrapWithMeta, methodFn)
|
|
53
57
|
result[key] = wrapWithMeta
|
|
54
58
|
// Also set shorthand intent key if Mppx registered it (no collision)
|
|
55
59
|
if (!reservedMppxKeys.has(mi.intent) && (mppx as any)[mi.intent])
|
package/src/server/Mppx.ts
CHANGED
|
@@ -319,7 +319,8 @@ type UniqueIntentHandlers<
|
|
|
319
319
|
Extract<methods[number], { intent: method_name }>,
|
|
320
320
|
EffectiveTransportOf<Extract<methods[number], { intent: method_name }>, transport>,
|
|
321
321
|
NonNullable<Extract<methods[number], { intent: method_name }>['defaults']>
|
|
322
|
-
>
|
|
322
|
+
> &
|
|
323
|
+
MethodExtensions<Extract<methods[number], { intent: method_name }>>
|
|
323
324
|
}
|
|
324
325
|
|
|
325
326
|
/** Nested handlers: `mppx.tempo.charge(...)`, grouped by method name then intent. */
|
|
@@ -332,7 +333,8 @@ type NestedHandlers<
|
|
|
332
333
|
mi,
|
|
333
334
|
EffectiveTransportOf<mi, transport>,
|
|
334
335
|
NonNullable<mi['defaults']>
|
|
335
|
-
> &
|
|
336
|
+
> &
|
|
337
|
+
MethodExtensions<mi> & { _method: mi }
|
|
336
338
|
}
|
|
337
339
|
}
|
|
338
340
|
|
|
@@ -344,10 +346,19 @@ type Handlers<
|
|
|
344
346
|
mi,
|
|
345
347
|
EffectiveTransportOf<mi, transport>,
|
|
346
348
|
NonNullable<mi['defaults']>
|
|
347
|
-
>
|
|
349
|
+
> &
|
|
350
|
+
MethodExtensions<mi>
|
|
348
351
|
} & UniqueIntentHandlers<methods, transport> &
|
|
349
352
|
NestedHandlers<methods, transport>
|
|
350
353
|
|
|
354
|
+
type MethodExtensions<method extends Method.AnyServer> = method extends {
|
|
355
|
+
extensions?: (infer extensions) | undefined
|
|
356
|
+
}
|
|
357
|
+
? NonNullable<extensions> extends object
|
|
358
|
+
? NonNullable<extensions>
|
|
359
|
+
: {}
|
|
360
|
+
: {}
|
|
361
|
+
|
|
351
362
|
/** Nested challenge generators: `mppx.challenge.tempo.charge(...)`. */
|
|
352
363
|
type ChallengeHandlers<methods extends readonly Method.AnyServer[]> = {
|
|
353
364
|
[name in methods[number]['name']]: {
|
|
@@ -407,7 +418,7 @@ export function create<
|
|
|
407
418
|
assertNoReservedMppxKeys(methods as readonly Method.AnyServer[])
|
|
408
419
|
|
|
409
420
|
for (const mi of methods) {
|
|
410
|
-
|
|
421
|
+
const fn = createMethodFn({
|
|
411
422
|
authorize: mi.authorize as never,
|
|
412
423
|
defaults: mi.defaults,
|
|
413
424
|
method: mi,
|
|
@@ -420,6 +431,8 @@ export function create<
|
|
|
420
431
|
transport: (mi.transport ?? transport) as never,
|
|
421
432
|
verify: mi.verify as never,
|
|
422
433
|
})
|
|
434
|
+
if (mi.extensions) Object.assign(fn, mi.extensions)
|
|
435
|
+
handlers[`${mi.name}/${mi.intent}`] = fn
|
|
423
436
|
}
|
|
424
437
|
|
|
425
438
|
// Also set shorthand intent key when there's no collision
|
|
@@ -313,6 +313,23 @@ describe('subscription', () => {
|
|
|
313
313
|
expect(request.periodCount).toBe(expected)
|
|
314
314
|
})
|
|
315
315
|
|
|
316
|
+
test.each(['dev_second'] as const)(
|
|
317
|
+
'schema: accepts %s subscription periods for development and tests',
|
|
318
|
+
(periodUnit) => {
|
|
319
|
+
const request = Methods.subscription.schema.request.parse({
|
|
320
|
+
amount: '10',
|
|
321
|
+
currency: '0x20c0000000000000000000000000000000000001',
|
|
322
|
+
decimals: 6,
|
|
323
|
+
periodCount: '5',
|
|
324
|
+
periodUnit,
|
|
325
|
+
recipient: '0x1234567890abcdef1234567890abcdef12345678',
|
|
326
|
+
subscriptionExpires: '2026-01-01T00:00:00Z',
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
expect(request.periodUnit).toBe(periodUnit)
|
|
330
|
+
},
|
|
331
|
+
)
|
|
332
|
+
|
|
316
333
|
test('schema: rejects non-numeric periodCount', () => {
|
|
317
334
|
const result = Methods.subscription.schema.request.safeParse({
|
|
318
335
|
amount: '10',
|
package/src/tempo/Methods.ts
CHANGED
|
@@ -19,8 +19,11 @@ const split = z.object({
|
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
const uint64Max = (1n << 64n) - 1n
|
|
22
|
-
const
|
|
23
|
-
|
|
22
|
+
const subscriptionPeriodUnitSeconds = {
|
|
23
|
+
dev_second: 1n,
|
|
24
|
+
day: 86_400n,
|
|
25
|
+
week: 604_800n,
|
|
26
|
+
} satisfies Record<SubscriptionPeriodUnit, bigint>
|
|
24
27
|
|
|
25
28
|
const normalizedAddress = z.pipe(
|
|
26
29
|
z.address(),
|
|
@@ -46,7 +49,11 @@ const subscriptionExpires = z
|
|
|
46
49
|
),
|
|
47
50
|
)
|
|
48
51
|
|
|
49
|
-
const subscriptionPeriodUnits = [
|
|
52
|
+
const subscriptionPeriodUnits = [
|
|
53
|
+
'dev_second',
|
|
54
|
+
'day',
|
|
55
|
+
'week',
|
|
56
|
+
] as const satisfies readonly SubscriptionPeriodUnit[]
|
|
50
57
|
const subscriptionPeriodUnit = z.enum(subscriptionPeriodUnits)
|
|
51
58
|
|
|
52
59
|
const uint64String = z
|
|
@@ -82,7 +89,8 @@ function subscriptionPeriodFitsUint64(value: unknown) {
|
|
|
82
89
|
periodUnit: SubscriptionPeriodUnit
|
|
83
90
|
}
|
|
84
91
|
try {
|
|
85
|
-
const unitSeconds = periodUnit
|
|
92
|
+
const unitSeconds = subscriptionPeriodUnitSeconds[periodUnit]
|
|
93
|
+
if (unitSeconds === undefined) return false
|
|
86
94
|
return BigInt(periodCount) * unitSeconds <= uint64Max
|
|
87
95
|
} catch {
|
|
88
96
|
return false
|
|
@@ -4,7 +4,10 @@ import { privateKeyToAccount } from 'viem/accounts'
|
|
|
4
4
|
import { describe, expect, test } from 'vp/test'
|
|
5
5
|
|
|
6
6
|
import * as Methods from '../Methods.js'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
signSubscriptionKeyAuthorization,
|
|
9
|
+
transferWithMemoSelector,
|
|
10
|
+
} from '../subscription/KeyAuthorization.js'
|
|
8
11
|
import type { SubscriptionAccessKey } from '../subscription/Types.js'
|
|
9
12
|
import { subscription } from './Subscription.js'
|
|
10
13
|
|
|
@@ -142,12 +145,7 @@ describe('tempo.subscription client', () => {
|
|
|
142
145
|
scopes: [
|
|
143
146
|
{
|
|
144
147
|
address: expect.stringMatching(/^0x[0-9a-fA-F]{40}$/),
|
|
145
|
-
selector:
|
|
146
|
-
recipients: expect.any(Array),
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
address: expect.stringMatching(/^0x[0-9a-fA-F]{40}$/),
|
|
150
|
-
selector: expect.stringMatching(/^0x/),
|
|
148
|
+
selector: transferWithMemoSelector,
|
|
151
149
|
recipients: expect.any(Array),
|
|
152
150
|
},
|
|
153
151
|
],
|
|
@@ -1395,11 +1395,8 @@ describe('tempo.subscription', () => {
|
|
|
1395
1395
|
reference: hashStale,
|
|
1396
1396
|
})
|
|
1397
1397
|
|
|
1398
|
-
const result = await renew({
|
|
1399
|
-
getClient: async () => client,
|
|
1400
|
-
store,
|
|
1398
|
+
const result = await mppx.tempo.subscription.renew({
|
|
1401
1399
|
subscriptionId: record.subscriptionId,
|
|
1402
|
-
waitForConfirmation: false,
|
|
1403
1400
|
})
|
|
1404
1401
|
|
|
1405
1402
|
expect(result?.receipt.reference).toBe(hashBackground)
|