mppx 0.5.0 → 0.5.1
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 +6 -0
- package/dist/cli/account.d.ts.map +1 -1
- package/dist/cli/account.js +12 -2
- package/dist/cli/account.js.map +1 -1
- package/dist/tempo/internal/proof.d.ts +6 -0
- package/dist/tempo/internal/proof.d.ts.map +1 -1
- package/dist/tempo/internal/proof.js +15 -0
- package/dist/tempo/internal/proof.js.map +1 -1
- package/dist/tempo/server/Charge.d.ts +8 -3
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +24 -2
- package/dist/tempo/server/Charge.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/account.ts +13 -2
- package/src/middlewares/elysia.test.ts +3 -5
- package/src/middlewares/express.test.ts +3 -5
- package/src/middlewares/hono.test.ts +8 -5
- package/src/middlewares/nextjs.test.ts +3 -5
- package/src/tempo/internal/proof.test.ts +47 -0
- package/src/tempo/internal/proof.ts +16 -0
- package/src/tempo/server/Charge.test.ts +298 -0
- package/src/tempo/server/Charge.ts +42 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# mppx
|
|
2
2
|
|
|
3
|
+
## 0.5.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- dd27cb1: Validate the `did:pkh:eip155` source DID on zero-dollar Tempo proof credentials. Servers now reject malformed proof source DIDs and chain ID mismatches between the source DID and the challenge signing domain.
|
|
8
|
+
|
|
3
9
|
## 0.5.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"AAaA,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAAC,CAMlE;AAED,wBAAgB,kBAAkB;WAOvB,MAAM;eAOF,MAAM,GAAG,IAAI;aAIf,IAAI;EAMhB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5D;AAGD,wBAAgB,cAAc,CAAC,OAAO,SAAS;YAG7B,OAAO,CAAC,MAAM,EAAE,CAAC;WA+BlB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;eAyBvB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cA2CvB,OAAO,CAAC,IAAI,CAAC;EAahC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM;;;;;;;;;;oTAvItC,CAAC;kBAAsB,CAAC;;;;;;GAkJnC"}
|
package/dist/cli/account.js
CHANGED
|
@@ -3,9 +3,14 @@ import * as fs from 'node:fs';
|
|
|
3
3
|
import * as os from 'node:os';
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
const SERVICE_NAME = 'mppx';
|
|
6
|
+
const defaultCommandTimeoutMs = 10_000;
|
|
7
|
+
function commandTimeoutMs() {
|
|
8
|
+
const value = Number.parseInt(process.env.MPPX_KEYCHAIN_COMMAND_TIMEOUT_MS ?? '', 10);
|
|
9
|
+
return Number.isFinite(value) && value > 0 ? value : defaultCommandTimeoutMs;
|
|
10
|
+
}
|
|
6
11
|
export function execCommand(command, args) {
|
|
7
12
|
return new Promise((resolve) => {
|
|
8
|
-
child.execFile(command, args, (error, stdout, stderr) => {
|
|
13
|
+
child.execFile(command, args, { timeout: commandTimeoutMs() }, (error, stdout, stderr) => {
|
|
9
14
|
resolve({ stdout: stdout.trim(), stderr: stderr.trim(), error });
|
|
10
15
|
});
|
|
11
16
|
});
|
|
@@ -132,16 +137,21 @@ export function createKeychain(account = 'main') {
|
|
|
132
137
|
'account',
|
|
133
138
|
account,
|
|
134
139
|
]);
|
|
140
|
+
const timeout = setTimeout(() => proc.kill(), commandTimeoutMs());
|
|
135
141
|
proc.stdin?.write(value);
|
|
136
142
|
proc.stdin?.end();
|
|
137
143
|
return new Promise((resolve, reject) => {
|
|
138
144
|
proc.on('close', (code) => {
|
|
145
|
+
clearTimeout(timeout);
|
|
139
146
|
if (code === 0)
|
|
140
147
|
resolve();
|
|
141
148
|
else
|
|
142
149
|
reject(new Error(`secret-tool exited with code ${code}`));
|
|
143
150
|
});
|
|
144
|
-
proc.on('error',
|
|
151
|
+
proc.on('error', (error) => {
|
|
152
|
+
clearTimeout(timeout);
|
|
153
|
+
reject(error);
|
|
154
|
+
});
|
|
145
155
|
});
|
|
146
156
|
}
|
|
147
157
|
throw new Error(`Unsupported platform: ${platform}`);
|
package/dist/cli/account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,MAAM,YAAY,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type Address } from 'viem';
|
|
1
2
|
/** EIP-712 typed data types for proof credentials. */
|
|
2
3
|
export declare const types: {
|
|
3
4
|
readonly Proof: readonly [{
|
|
@@ -20,4 +21,9 @@ export declare function proofSource(parameters: {
|
|
|
20
21
|
address: string;
|
|
21
22
|
chainId: number;
|
|
22
23
|
}): string;
|
|
24
|
+
/** Parses a proof credential `did:pkh:eip155` source DID. */
|
|
25
|
+
export declare function parseProofSource(source: string): {
|
|
26
|
+
address: Address;
|
|
27
|
+
chainId: number;
|
|
28
|
+
} | null;
|
|
23
29
|
//# sourceMappingURL=proof.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/tempo/internal/proof.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,eAAO,MAAM,KAAK;;;;;CAER,CAAA;AAEV,4DAA4D;AAC5D,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM;;;;EAErC;AAED,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM;;EAE1C;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,UAAU,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpF"}
|
|
1
|
+
{"version":3,"file":"proof.d.ts","sourceRoot":"","sources":["../../../src/tempo/internal/proof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9C,sDAAsD;AACtD,eAAO,MAAM,KAAK;;;;;CAER,CAAA;AAEV,4DAA4D;AAC5D,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM;;;;EAErC;AAED,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM;;EAE1C;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,UAAU,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpF;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW7F"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAddress } from 'viem';
|
|
1
2
|
/** EIP-712 typed data types for proof credentials. */
|
|
2
3
|
export const types = {
|
|
3
4
|
Proof: [{ name: 'challengeId', type: 'string' }],
|
|
@@ -14,4 +15,18 @@ export function message(challengeId) {
|
|
|
14
15
|
export function proofSource(parameters) {
|
|
15
16
|
return `did:pkh:eip155:${parameters.chainId}:${parameters.address}`;
|
|
16
17
|
}
|
|
18
|
+
/** Parses a proof credential `did:pkh:eip155` source DID. */
|
|
19
|
+
export function parseProofSource(source) {
|
|
20
|
+
const match = /^did:pkh:eip155:(0|[1-9]\d*):([^:]+)$/.exec(source);
|
|
21
|
+
if (!match)
|
|
22
|
+
return null;
|
|
23
|
+
const chainIdText = match[1];
|
|
24
|
+
const address = match[2];
|
|
25
|
+
const chainId = Number(chainIdText);
|
|
26
|
+
if (!Number.isSafeInteger(chainId))
|
|
27
|
+
return null;
|
|
28
|
+
if (!isAddress(address))
|
|
29
|
+
return null;
|
|
30
|
+
return { address: address, chainId };
|
|
31
|
+
}
|
|
17
32
|
//# sourceMappingURL=proof.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof.js","sourceRoot":"","sources":["../../../src/tempo/internal/proof.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;CACxC,CAAA;AAEV,4DAA4D;AAC5D,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAW,CAAA;AACxD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,OAAO,CAAC,WAAmB;IACzC,OAAO,EAAE,WAAW,EAAW,CAAA;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,UAAgD;IAC1E,OAAO,kBAAkB,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAA;AACrE,CAAC"}
|
|
1
|
+
{"version":3,"file":"proof.js","sourceRoot":"","sources":["../../../src/tempo/internal/proof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,MAAM,CAAA;AAE9C,sDAAsD;AACtD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;CACxC,CAAA;AAEV,4DAA4D;AAC5D,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAW,CAAA;AACxD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,OAAO,CAAC,WAAmB;IACzC,OAAO,EAAE,WAAW,EAAW,CAAA;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,UAAgD;IAC1E,OAAO,kBAAkB,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,CAAA;AACrE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,KAAK,GAAG,uCAAuC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;IACnC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAEpC,OAAO,EAAE,OAAO,EAAE,OAAkB,EAAE,OAAO,EAAE,CAAA;AACjD,CAAC"}
|
|
@@ -89,10 +89,15 @@ export declare namespace charge {
|
|
|
89
89
|
/** Testnet mode. */
|
|
90
90
|
testnet?: boolean | undefined;
|
|
91
91
|
/**
|
|
92
|
-
* Store for
|
|
92
|
+
* Store for charge replay protection.
|
|
93
93
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
94
|
+
* Non-zero charge flows default to an in-memory store if omitted. For
|
|
95
|
+
* zero-dollar proof auth, replay prevention is enabled only when a store
|
|
96
|
+
* is explicitly provided; otherwise proofs remain reusable until the
|
|
97
|
+
* challenge expires.
|
|
98
|
+
*
|
|
99
|
+
* Use a shared store in multi-instance deployments so consumed hashes and
|
|
100
|
+
* proofs are visible across all server instances.
|
|
96
101
|
*/
|
|
97
102
|
store?: Store.Store | undefined;
|
|
98
103
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Charge.d.ts","sourceRoot":"","sources":["../../../src/tempo/server/Charge.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AAOjD,OAAO,KAAK,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,UAAU,SAAS,MAAM,CAAC,UAAU,EAC/D,UAAU,GAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAGpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"Charge.d.ts","sourceRoot":"","sources":["../../../src/tempo/server/Charge.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AAOjD,OAAO,KAAK,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,KAAK,CAAC,UAAU,SAAS,MAAM,CAAC,UAAU,EAC/D,UAAU,GAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAGpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAqPF;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAK,YAAY,GAAG;QAAE,CAAC,GAAG,EAAE,eAAe,MAAM,EAAE,GAAG,MAAM,CAAA;KAAE,CAAA;IAE9D,KAAK,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC,CAAA;IAElG,KAAK,UAAU,GAAG;QAChB,oBAAoB;QACpB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QAC7B;;;;;;;;;;WAUG;QACH,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAA;QAC/B;;;;;;;;;;WAUG;QACH,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC1C,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,GAC/B,OAAO,CAAC,OAAO,CAAC,UAAU,GAC1B,QAAQ,CAAA;IAEV,KAAK,cAAc,CAAC,UAAU,SAAS,UAAU,IAAI,KAAK,CAAC,cAAc,CACvE,UAAU,EACV,QAAQ,CACT,GAAG;QACF,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;CACF"}
|
|
@@ -27,6 +27,7 @@ import * as Methods from '../Methods.js';
|
|
|
27
27
|
export function charge(parameters = {}) {
|
|
28
28
|
const { amount, currency = defaults.resolveCurrency(parameters), decimals = defaults.decimals, description, externalId, memo, waitForConfirmation = true, } = parameters;
|
|
29
29
|
const store = (parameters.store ?? Store.memory());
|
|
30
|
+
const proofStore = parameters.store;
|
|
30
31
|
const { recipient, feePayer, feePayerUrl } = Account.resolve(parameters);
|
|
31
32
|
const getClient = Client.getResolver({
|
|
32
33
|
chain: { ...tempo_chain, experimental_preconfirmationTime: 500 },
|
|
@@ -114,10 +115,13 @@ export function charge(parameters = {}) {
|
|
|
114
115
|
const expectedSource = credential.source;
|
|
115
116
|
if (!expectedSource)
|
|
116
117
|
throw new MismatchError('Proof credential must include a source.', {});
|
|
117
|
-
const sourceAddress = expectedSource.split(':').pop();
|
|
118
118
|
const resolvedChainId = challenge.request.methodDetails?.chainId ?? chainId;
|
|
119
|
+
const source = Proof.parseProofSource(expectedSource);
|
|
120
|
+
if (!source || source.chainId !== resolvedChainId) {
|
|
121
|
+
throw new MismatchError('Proof credential source is invalid.', {});
|
|
122
|
+
}
|
|
119
123
|
const valid = await verifyTypedData(client, {
|
|
120
|
-
address:
|
|
124
|
+
address: source.address,
|
|
121
125
|
domain: Proof.domain(resolvedChainId),
|
|
122
126
|
types: Proof.types,
|
|
123
127
|
primaryType: 'Proof',
|
|
@@ -126,6 +130,10 @@ export function charge(parameters = {}) {
|
|
|
126
130
|
});
|
|
127
131
|
if (!valid)
|
|
128
132
|
throw new MismatchError('Proof signature does not match source.', {});
|
|
133
|
+
if (proofStore) {
|
|
134
|
+
await assertProofUnused(proofStore, challenge.id);
|
|
135
|
+
await markProofUsed(proofStore, challenge.id);
|
|
136
|
+
}
|
|
129
137
|
return {
|
|
130
138
|
method: 'tempo',
|
|
131
139
|
status: 'success',
|
|
@@ -360,6 +368,10 @@ function getHashStoreKey(hash) {
|
|
|
360
368
|
return `mppx:charge:${hash.toLowerCase()}`;
|
|
361
369
|
}
|
|
362
370
|
/** @internal */
|
|
371
|
+
function getProofStoreKey(challengeId) {
|
|
372
|
+
return `mppx:charge:proof:${challengeId}`;
|
|
373
|
+
}
|
|
374
|
+
/** @internal */
|
|
363
375
|
async function assertHashUnused(store, hash) {
|
|
364
376
|
const seen = await store.get(getHashStoreKey(hash));
|
|
365
377
|
if (seen !== null)
|
|
@@ -370,6 +382,16 @@ async function markHashUsed(store, hash) {
|
|
|
370
382
|
await store.put(getHashStoreKey(hash), Date.now());
|
|
371
383
|
}
|
|
372
384
|
/** @internal */
|
|
385
|
+
async function assertProofUnused(store, challengeId) {
|
|
386
|
+
const seen = await store.get(getProofStoreKey(challengeId));
|
|
387
|
+
if (seen !== null)
|
|
388
|
+
throw new Error('Proof credential has already been used.');
|
|
389
|
+
}
|
|
390
|
+
/** @internal */
|
|
391
|
+
async function markProofUsed(store, challengeId) {
|
|
392
|
+
await store.put(getProofStoreKey(challengeId), Date.now());
|
|
393
|
+
}
|
|
394
|
+
/** @internal */
|
|
373
395
|
function toReceipt(receipt) {
|
|
374
396
|
const { status, transactionHash } = receipt;
|
|
375
397
|
if (status !== 'success') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Charge.js","sourceRoot":"","sources":["../../../src/tempo/server/Charge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Charge.js","sourceRoot":"","sources":["../../../src/tempo/server/Charge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/account.ts
CHANGED
|
@@ -4,13 +4,19 @@ import * as os from 'node:os'
|
|
|
4
4
|
import * as path from 'node:path'
|
|
5
5
|
|
|
6
6
|
const SERVICE_NAME = 'mppx'
|
|
7
|
+
const defaultCommandTimeoutMs = 10_000
|
|
8
|
+
|
|
9
|
+
function commandTimeoutMs() {
|
|
10
|
+
const value = Number.parseInt(process.env.MPPX_KEYCHAIN_COMMAND_TIMEOUT_MS ?? '', 10)
|
|
11
|
+
return Number.isFinite(value) && value > 0 ? value : defaultCommandTimeoutMs
|
|
12
|
+
}
|
|
7
13
|
|
|
8
14
|
export function execCommand(
|
|
9
15
|
command: string,
|
|
10
16
|
args: string[],
|
|
11
17
|
): Promise<{ stdout: string; stderr: string; error: Error | null }> {
|
|
12
18
|
return new Promise((resolve) => {
|
|
13
|
-
child.execFile(command, args, (error, stdout, stderr) => {
|
|
19
|
+
child.execFile(command, args, { timeout: commandTimeoutMs() }, (error, stdout, stderr) => {
|
|
14
20
|
resolve({ stdout: stdout.trim(), stderr: stderr.trim(), error })
|
|
15
21
|
})
|
|
16
22
|
})
|
|
@@ -134,14 +140,19 @@ export function createKeychain(account = 'main') {
|
|
|
134
140
|
'account',
|
|
135
141
|
account,
|
|
136
142
|
])
|
|
143
|
+
const timeout = setTimeout(() => proc.kill(), commandTimeoutMs())
|
|
137
144
|
proc.stdin?.write(value)
|
|
138
145
|
proc.stdin?.end()
|
|
139
146
|
return new Promise((resolve, reject) => {
|
|
140
147
|
proc.on('close', (code) => {
|
|
148
|
+
clearTimeout(timeout)
|
|
141
149
|
if (code === 0) resolve()
|
|
142
150
|
else reject(new Error(`secret-tool exited with code ${code}`))
|
|
143
151
|
})
|
|
144
|
-
proc.on('error',
|
|
152
|
+
proc.on('error', (error) => {
|
|
153
|
+
clearTimeout(timeout)
|
|
154
|
+
reject(error)
|
|
155
|
+
})
|
|
145
156
|
})
|
|
146
157
|
}
|
|
147
158
|
throw new Error(`Unsupported platform: ${platform}`)
|
|
@@ -8,11 +8,12 @@ import { tempo as tempo_server } from 'mppx/server'
|
|
|
8
8
|
import type { Address } from 'viem'
|
|
9
9
|
import { Addresses } from 'viem/tempo'
|
|
10
10
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
11
|
+
import * as TestHttp from '~test/Http.js'
|
|
11
12
|
import { deployEscrow } from '~test/tempo/session.js'
|
|
12
13
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
13
14
|
|
|
14
15
|
function createServer(app: Elysia<any, any, any, any, any, any, any>) {
|
|
15
|
-
return new Promise<
|
|
16
|
+
return new Promise<TestHttp.TestServer>((resolve) => {
|
|
16
17
|
const server = http.createServer(async (req, res) => {
|
|
17
18
|
const url = `http://localhost${req.url}`
|
|
18
19
|
const headers = new Headers()
|
|
@@ -27,10 +28,7 @@ function createServer(app: Elysia<any, any, any, any, any, any, any>) {
|
|
|
27
28
|
})
|
|
28
29
|
server.listen(0, () => {
|
|
29
30
|
const { port } = server.address() as { port: number }
|
|
30
|
-
resolve({
|
|
31
|
-
url: `http://localhost:${port}`,
|
|
32
|
-
close: () => server.close(),
|
|
33
|
-
})
|
|
31
|
+
resolve(TestHttp.wrapServer(server, { port, url: `http://localhost:${port}` }))
|
|
34
32
|
})
|
|
35
33
|
})
|
|
36
34
|
}
|
|
@@ -6,17 +6,15 @@ import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
|
|
|
6
6
|
import type { Address } from 'viem'
|
|
7
7
|
import { Addresses } from 'viem/tempo'
|
|
8
8
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
9
|
+
import * as Http from '~test/Http.js'
|
|
9
10
|
import { deployEscrow } from '~test/tempo/session.js'
|
|
10
11
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
11
12
|
|
|
12
13
|
function createServer(app: express.Express) {
|
|
13
|
-
return new Promise<
|
|
14
|
+
return new Promise<Http.TestServer>((resolve) => {
|
|
14
15
|
const server = app.listen(0, () => {
|
|
15
16
|
const { port } = server.address() as { port: number }
|
|
16
|
-
resolve({
|
|
17
|
-
url: `http://localhost:${port}`,
|
|
18
|
-
close: () => server.close(),
|
|
19
|
-
})
|
|
17
|
+
resolve(Http.wrapServer(server, { port, url: `http://localhost:${port}` }))
|
|
20
18
|
})
|
|
21
19
|
})
|
|
22
20
|
}
|
|
@@ -7,16 +7,19 @@ import { tempo as tempo_server } from 'mppx/server'
|
|
|
7
7
|
import type { Address } from 'viem'
|
|
8
8
|
import { Addresses } from 'viem/tempo'
|
|
9
9
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
10
|
+
import * as Http from '~test/Http.js'
|
|
10
11
|
import { deployEscrow } from '~test/tempo/session.js'
|
|
11
12
|
import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
|
|
12
13
|
|
|
13
14
|
function createServer(app: Hono) {
|
|
14
|
-
return new Promise<
|
|
15
|
+
return new Promise<Http.TestServer>((resolve) => {
|
|
15
16
|
const server = serve({ fetch: app.fetch, port: 0 }, (info) => {
|
|
16
|
-
resolve(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
resolve(
|
|
18
|
+
Http.wrapServer(server as unknown as import('node:http').Server, {
|
|
19
|
+
port: info.port,
|
|
20
|
+
url: `http://localhost:${info.port}`,
|
|
21
|
+
}),
|
|
22
|
+
)
|
|
20
23
|
})
|
|
21
24
|
})
|
|
22
25
|
}
|
|
@@ -7,11 +7,12 @@ import { tempo as tempo_server } from 'mppx/server'
|
|
|
7
7
|
import type { Address } from 'viem'
|
|
8
8
|
import { Addresses } from 'viem/tempo'
|
|
9
9
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
10
|
+
import * as TestHttp from '~test/Http.js'
|
|
10
11
|
import { deployEscrow } from '~test/tempo/session.js'
|
|
11
12
|
import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
|
|
12
13
|
|
|
13
14
|
function createServer(handler: (request: Request) => Promise<Response> | Response) {
|
|
14
|
-
return new Promise<
|
|
15
|
+
return new Promise<TestHttp.TestServer>((resolve) => {
|
|
15
16
|
const server = http.createServer(async (req, res) => {
|
|
16
17
|
const url = `http://localhost${req.url}`
|
|
17
18
|
const headers = new Headers()
|
|
@@ -26,10 +27,7 @@ function createServer(handler: (request: Request) => Promise<Response> | Respons
|
|
|
26
27
|
})
|
|
27
28
|
server.listen(0, () => {
|
|
28
29
|
const { port } = server.address() as { port: number }
|
|
29
|
-
resolve({
|
|
30
|
-
url: `http://localhost:${port}`,
|
|
31
|
-
close: () => server.close(),
|
|
32
|
-
})
|
|
30
|
+
resolve(TestHttp.wrapServer(server, { port, url: `http://localhost:${port}` }))
|
|
33
31
|
})
|
|
34
32
|
})
|
|
35
33
|
}
|
|
@@ -2,6 +2,47 @@ import { describe, expect, test } from 'vp/test'
|
|
|
2
2
|
|
|
3
3
|
import * as Proof from './proof.js'
|
|
4
4
|
|
|
5
|
+
const parseProofSourceCases = [
|
|
6
|
+
{
|
|
7
|
+
expected: {
|
|
8
|
+
address: '0xa5cc3c03994db5b0d9ba5e4f6d2efbd9f213b141',
|
|
9
|
+
chainId: 42431,
|
|
10
|
+
},
|
|
11
|
+
name: 'parses a valid did:pkh:eip155 source',
|
|
12
|
+
source: 'did:pkh:eip155:42431:0xa5cc3c03994db5b0d9ba5e4f6d2efbd9f213b141',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
expected: null,
|
|
16
|
+
name: 'rejects non-numeric chain ids',
|
|
17
|
+
source: 'did:pkh:eip155:not-a-number:0x1234',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
expected: null,
|
|
21
|
+
name: 'rejects leading-zero chain ids',
|
|
22
|
+
source: 'did:pkh:eip155:01:0xa5cc3c03994db5b0d9ba5e4f6d2efbd9f213b141',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
expected: null,
|
|
26
|
+
name: 'rejects unsafe integer chain ids',
|
|
27
|
+
source: 'did:pkh:eip155:9007199254740992:0xa5cc3c03994db5b0d9ba5e4f6d2efbd9f213b141',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
expected: null,
|
|
31
|
+
name: 'rejects invalid addresses',
|
|
32
|
+
source: 'did:pkh:eip155:42431:not-an-address',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
expected: null,
|
|
36
|
+
name: 'rejects extra path segments',
|
|
37
|
+
source: 'did:pkh:eip155:42431:0xAbCdEf1234567890AbCdEf1234567890AbCdEf12:extra',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
expected: null,
|
|
41
|
+
name: 'rejects unsupported namespaces',
|
|
42
|
+
source: 'did:pkh:solana:42431:0xa5cc3c03994db5b0d9ba5e4f6d2efbd9f213b141',
|
|
43
|
+
},
|
|
44
|
+
] as const
|
|
45
|
+
|
|
5
46
|
describe('Proof', () => {
|
|
6
47
|
test('types has Proof with challengeId field', () => {
|
|
7
48
|
expect(Proof.types).toEqual({
|
|
@@ -33,4 +74,10 @@ describe('Proof', () => {
|
|
|
33
74
|
const address = '0xAbCdEf1234567890AbCdEf1234567890AbCdEf12'
|
|
34
75
|
expect(Proof.proofSource({ address, chainId: 1 })).toBe(`did:pkh:eip155:1:${address}`)
|
|
35
76
|
})
|
|
77
|
+
|
|
78
|
+
for (const { expected, name, source } of parseProofSourceCases) {
|
|
79
|
+
test(`parseProofSource ${name}`, () => {
|
|
80
|
+
expect(Proof.parseProofSource(source)).toEqual(expected)
|
|
81
|
+
})
|
|
82
|
+
}
|
|
36
83
|
})
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isAddress, type Address } from 'viem'
|
|
2
|
+
|
|
1
3
|
/** EIP-712 typed data types for proof credentials. */
|
|
2
4
|
export const types = {
|
|
3
5
|
Proof: [{ name: 'challengeId', type: 'string' }],
|
|
@@ -17,3 +19,17 @@ export function message(challengeId: string) {
|
|
|
17
19
|
export function proofSource(parameters: { address: string; chainId: number }): string {
|
|
18
20
|
return `did:pkh:eip155:${parameters.chainId}:${parameters.address}`
|
|
19
21
|
}
|
|
22
|
+
|
|
23
|
+
/** Parses a proof credential `did:pkh:eip155` source DID. */
|
|
24
|
+
export function parseProofSource(source: string): { address: Address; chainId: number } | null {
|
|
25
|
+
const match = /^did:pkh:eip155:(0|[1-9]\d*):([^:]+)$/.exec(source)
|
|
26
|
+
if (!match) return null
|
|
27
|
+
|
|
28
|
+
const chainIdText = match[1]!
|
|
29
|
+
const address = match[2]!
|
|
30
|
+
const chainId = Number(chainIdText)
|
|
31
|
+
if (!Number.isSafeInteger(chainId)) return null
|
|
32
|
+
if (!isAddress(address)) return null
|
|
33
|
+
|
|
34
|
+
return { address: address as Address, chainId }
|
|
35
|
+
}
|
|
@@ -1995,6 +1995,268 @@ describe('tempo', () => {
|
|
|
1995
1995
|
httpServer.close()
|
|
1996
1996
|
})
|
|
1997
1997
|
|
|
1998
|
+
test('behavior: proof credential remains reusable until expiry without store', async () => {
|
|
1999
|
+
const httpServer = await Http.createServer(async (req, res) => {
|
|
2000
|
+
const result = await Mppx_server.toNodeListener(
|
|
2001
|
+
server.charge({ amount: '0', decimals: 6 }),
|
|
2002
|
+
)(req, res)
|
|
2003
|
+
if (result.status === 402) return
|
|
2004
|
+
res.end('OK')
|
|
2005
|
+
})
|
|
2006
|
+
|
|
2007
|
+
const response1 = await fetch(httpServer.url)
|
|
2008
|
+
expect(response1.status).toBe(402)
|
|
2009
|
+
|
|
2010
|
+
const challenge = Challenge.fromResponse(response1, {
|
|
2011
|
+
methods: [tempo_client.charge()],
|
|
2012
|
+
})
|
|
2013
|
+
|
|
2014
|
+
const signature = await signTypedData(client, {
|
|
2015
|
+
account: accounts[1],
|
|
2016
|
+
domain: Proof.domain(chain.id),
|
|
2017
|
+
types: Proof.types,
|
|
2018
|
+
primaryType: 'Proof',
|
|
2019
|
+
message: Proof.message(challenge.id),
|
|
2020
|
+
})
|
|
2021
|
+
|
|
2022
|
+
const credential = Credential.from({
|
|
2023
|
+
challenge,
|
|
2024
|
+
payload: { signature, type: 'proof' as const },
|
|
2025
|
+
source: `did:pkh:eip155:${chain.id}:${accounts[1].address}`,
|
|
2026
|
+
})
|
|
2027
|
+
|
|
2028
|
+
const response2 = await fetch(httpServer.url, {
|
|
2029
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2030
|
+
})
|
|
2031
|
+
expect(response2.status).toBe(200)
|
|
2032
|
+
|
|
2033
|
+
const replayResponse = await fetch(httpServer.url, {
|
|
2034
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2035
|
+
})
|
|
2036
|
+
expect(replayResponse.status).toBe(200)
|
|
2037
|
+
|
|
2038
|
+
httpServer.close()
|
|
2039
|
+
})
|
|
2040
|
+
|
|
2041
|
+
test('behavior: rejects replayed proof credential when store is configured', async () => {
|
|
2042
|
+
const replayStore = Store.memory()
|
|
2043
|
+
const server_ = Mppx_server.create({
|
|
2044
|
+
methods: [
|
|
2045
|
+
tempo_server.charge({
|
|
2046
|
+
getClient() {
|
|
2047
|
+
return client
|
|
2048
|
+
},
|
|
2049
|
+
currency: asset,
|
|
2050
|
+
account: accounts[0],
|
|
2051
|
+
store: replayStore,
|
|
2052
|
+
}),
|
|
2053
|
+
],
|
|
2054
|
+
realm,
|
|
2055
|
+
secretKey,
|
|
2056
|
+
})
|
|
2057
|
+
|
|
2058
|
+
const httpServer = await Http.createServer(async (req, res) => {
|
|
2059
|
+
const result = await Mppx_server.toNodeListener(
|
|
2060
|
+
server_.charge({ amount: '0', decimals: 6 }),
|
|
2061
|
+
)(req, res)
|
|
2062
|
+
if (result.status === 402) return
|
|
2063
|
+
res.end('OK')
|
|
2064
|
+
})
|
|
2065
|
+
|
|
2066
|
+
const response1 = await fetch(httpServer.url)
|
|
2067
|
+
expect(response1.status).toBe(402)
|
|
2068
|
+
|
|
2069
|
+
const challenge = Challenge.fromResponse(response1, {
|
|
2070
|
+
methods: [tempo_client.charge()],
|
|
2071
|
+
})
|
|
2072
|
+
|
|
2073
|
+
const signature = await signTypedData(client, {
|
|
2074
|
+
account: accounts[1],
|
|
2075
|
+
domain: Proof.domain(chain.id),
|
|
2076
|
+
types: Proof.types,
|
|
2077
|
+
primaryType: 'Proof',
|
|
2078
|
+
message: Proof.message(challenge.id),
|
|
2079
|
+
})
|
|
2080
|
+
|
|
2081
|
+
const credential = Credential.from({
|
|
2082
|
+
challenge,
|
|
2083
|
+
payload: { signature, type: 'proof' as const },
|
|
2084
|
+
source: `did:pkh:eip155:${chain.id}:${accounts[1].address}`,
|
|
2085
|
+
})
|
|
2086
|
+
|
|
2087
|
+
const response2 = await fetch(httpServer.url, {
|
|
2088
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2089
|
+
})
|
|
2090
|
+
expect(response2.status).toBe(200)
|
|
2091
|
+
|
|
2092
|
+
const replayResponse = await fetch(httpServer.url, {
|
|
2093
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2094
|
+
})
|
|
2095
|
+
expect(replayResponse.status).toBe(402)
|
|
2096
|
+
const replayBody = (await replayResponse.json()) as { detail: string }
|
|
2097
|
+
expect(replayBody.detail).toContain('Proof credential has already been used.')
|
|
2098
|
+
|
|
2099
|
+
httpServer.close()
|
|
2100
|
+
})
|
|
2101
|
+
|
|
2102
|
+
test('behavior: shared store rejects proof replay across server instances', async () => {
|
|
2103
|
+
const replayStore = Store.memory()
|
|
2104
|
+
const serverA = Mppx_server.create({
|
|
2105
|
+
methods: [
|
|
2106
|
+
tempo_server.charge({
|
|
2107
|
+
getClient() {
|
|
2108
|
+
return client
|
|
2109
|
+
},
|
|
2110
|
+
currency: asset,
|
|
2111
|
+
account: accounts[0],
|
|
2112
|
+
store: replayStore,
|
|
2113
|
+
}),
|
|
2114
|
+
],
|
|
2115
|
+
realm,
|
|
2116
|
+
secretKey,
|
|
2117
|
+
})
|
|
2118
|
+
const serverB = Mppx_server.create({
|
|
2119
|
+
methods: [
|
|
2120
|
+
tempo_server.charge({
|
|
2121
|
+
getClient() {
|
|
2122
|
+
return client
|
|
2123
|
+
},
|
|
2124
|
+
currency: asset,
|
|
2125
|
+
account: accounts[0],
|
|
2126
|
+
store: replayStore,
|
|
2127
|
+
}),
|
|
2128
|
+
],
|
|
2129
|
+
realm,
|
|
2130
|
+
secretKey,
|
|
2131
|
+
})
|
|
2132
|
+
|
|
2133
|
+
const httpServer = await Http.createServer(async (req, res) => {
|
|
2134
|
+
const route = new URL(req.url!, 'https://example.com').pathname
|
|
2135
|
+
const handler = route === '/a' ? serverA : serverB
|
|
2136
|
+
const result = await Mppx_server.toNodeListener(
|
|
2137
|
+
handler.charge({ amount: '0', decimals: 6 }),
|
|
2138
|
+
)(req, res)
|
|
2139
|
+
if (result.status === 402) return
|
|
2140
|
+
res.end('OK')
|
|
2141
|
+
})
|
|
2142
|
+
|
|
2143
|
+
const response1 = await fetch(`${httpServer.url}/a`)
|
|
2144
|
+
expect(response1.status).toBe(402)
|
|
2145
|
+
|
|
2146
|
+
const challenge = Challenge.fromResponse(response1, {
|
|
2147
|
+
methods: [tempo_client.charge()],
|
|
2148
|
+
})
|
|
2149
|
+
|
|
2150
|
+
const signature = await signTypedData(client, {
|
|
2151
|
+
account: accounts[1],
|
|
2152
|
+
domain: Proof.domain(chain.id),
|
|
2153
|
+
types: Proof.types,
|
|
2154
|
+
primaryType: 'Proof',
|
|
2155
|
+
message: Proof.message(challenge.id),
|
|
2156
|
+
})
|
|
2157
|
+
|
|
2158
|
+
const credential = Credential.from({
|
|
2159
|
+
challenge,
|
|
2160
|
+
payload: { signature, type: 'proof' as const },
|
|
2161
|
+
source: `did:pkh:eip155:${chain.id}:${accounts[1].address}`,
|
|
2162
|
+
})
|
|
2163
|
+
|
|
2164
|
+
const response2 = await fetch(`${httpServer.url}/a`, {
|
|
2165
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2166
|
+
})
|
|
2167
|
+
expect(response2.status).toBe(200)
|
|
2168
|
+
|
|
2169
|
+
const replayResponse = await fetch(`${httpServer.url}/b`, {
|
|
2170
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2171
|
+
})
|
|
2172
|
+
expect(replayResponse.status).toBe(402)
|
|
2173
|
+
const replayBody = (await replayResponse.json()) as { detail: string }
|
|
2174
|
+
expect(replayBody.detail).toContain('Proof credential has already been used.')
|
|
2175
|
+
|
|
2176
|
+
httpServer.close()
|
|
2177
|
+
})
|
|
2178
|
+
|
|
2179
|
+
test('behavior: store keys proof replay protection by challenge ID', async () => {
|
|
2180
|
+
const replayStore = Store.memory()
|
|
2181
|
+
const server_ = Mppx_server.create({
|
|
2182
|
+
methods: [
|
|
2183
|
+
tempo_server.charge({
|
|
2184
|
+
getClient() {
|
|
2185
|
+
return client
|
|
2186
|
+
},
|
|
2187
|
+
currency: asset,
|
|
2188
|
+
account: accounts[0],
|
|
2189
|
+
store: replayStore,
|
|
2190
|
+
}),
|
|
2191
|
+
],
|
|
2192
|
+
realm,
|
|
2193
|
+
secretKey,
|
|
2194
|
+
})
|
|
2195
|
+
|
|
2196
|
+
const httpServer = await Http.createServer(async (req, res) => {
|
|
2197
|
+
const result = await Mppx_server.toNodeListener(
|
|
2198
|
+
server_.charge({ amount: '0', decimals: 6 }),
|
|
2199
|
+
)(req, res)
|
|
2200
|
+
if (result.status === 402) return
|
|
2201
|
+
res.end('OK')
|
|
2202
|
+
})
|
|
2203
|
+
|
|
2204
|
+
const response1 = await fetch(httpServer.url)
|
|
2205
|
+
expect(response1.status).toBe(402)
|
|
2206
|
+
|
|
2207
|
+
const challenge1 = Challenge.fromResponse(response1, {
|
|
2208
|
+
methods: [tempo_client.charge()],
|
|
2209
|
+
})
|
|
2210
|
+
|
|
2211
|
+
const signature1 = await signTypedData(client, {
|
|
2212
|
+
account: accounts[1],
|
|
2213
|
+
domain: Proof.domain(chain.id),
|
|
2214
|
+
types: Proof.types,
|
|
2215
|
+
primaryType: 'Proof',
|
|
2216
|
+
message: Proof.message(challenge1.id),
|
|
2217
|
+
})
|
|
2218
|
+
|
|
2219
|
+
const credential1 = Credential.from({
|
|
2220
|
+
challenge: challenge1,
|
|
2221
|
+
payload: { signature: signature1, type: 'proof' as const },
|
|
2222
|
+
source: `did:pkh:eip155:${chain.id}:${accounts[1].address}`,
|
|
2223
|
+
})
|
|
2224
|
+
|
|
2225
|
+
const response2 = await fetch(httpServer.url, {
|
|
2226
|
+
headers: { Authorization: Credential.serialize(credential1) },
|
|
2227
|
+
})
|
|
2228
|
+
expect(response2.status).toBe(200)
|
|
2229
|
+
|
|
2230
|
+
const response3 = await fetch(httpServer.url)
|
|
2231
|
+
expect(response3.status).toBe(402)
|
|
2232
|
+
|
|
2233
|
+
const challenge2 = Challenge.fromResponse(response3, {
|
|
2234
|
+
methods: [tempo_client.charge()],
|
|
2235
|
+
})
|
|
2236
|
+
expect(challenge2.id).not.toBe(challenge1.id)
|
|
2237
|
+
|
|
2238
|
+
const signature2 = await signTypedData(client, {
|
|
2239
|
+
account: accounts[1],
|
|
2240
|
+
domain: Proof.domain(chain.id),
|
|
2241
|
+
types: Proof.types,
|
|
2242
|
+
primaryType: 'Proof',
|
|
2243
|
+
message: Proof.message(challenge2.id),
|
|
2244
|
+
})
|
|
2245
|
+
|
|
2246
|
+
const credential2 = Credential.from({
|
|
2247
|
+
challenge: challenge2,
|
|
2248
|
+
payload: { signature: signature2, type: 'proof' as const },
|
|
2249
|
+
source: `did:pkh:eip155:${chain.id}:${accounts[1].address}`,
|
|
2250
|
+
})
|
|
2251
|
+
|
|
2252
|
+
const response4 = await fetch(httpServer.url, {
|
|
2253
|
+
headers: { Authorization: Credential.serialize(credential2) },
|
|
2254
|
+
})
|
|
2255
|
+
expect(response4.status).toBe(200)
|
|
2256
|
+
|
|
2257
|
+
httpServer.close()
|
|
2258
|
+
})
|
|
2259
|
+
|
|
1998
2260
|
test('behavior: rejects proof with wrong signer', async () => {
|
|
1999
2261
|
const httpServer = await Http.createServer(async (req, res) => {
|
|
2000
2262
|
const result = await Mppx_server.toNodeListener(
|
|
@@ -2244,6 +2506,42 @@ describe('tempo', () => {
|
|
|
2244
2506
|
httpServer.close()
|
|
2245
2507
|
})
|
|
2246
2508
|
|
|
2509
|
+
test('behavior: rejects proof with mismatched source DID chainId', async () => {
|
|
2510
|
+
const httpServer = await Http.createServer(async (req, res) => {
|
|
2511
|
+
const result = await Mppx_server.toNodeListener(
|
|
2512
|
+
server.charge({ amount: '0', decimals: 6 }),
|
|
2513
|
+
)(req, res)
|
|
2514
|
+
if (result.status === 402) return
|
|
2515
|
+
res.end('OK')
|
|
2516
|
+
})
|
|
2517
|
+
|
|
2518
|
+
const response1 = await fetch(httpServer.url)
|
|
2519
|
+
const challenge = Challenge.fromResponse(response1, {
|
|
2520
|
+
methods: [tempo_client.charge()],
|
|
2521
|
+
})
|
|
2522
|
+
|
|
2523
|
+
const signature = await signTypedData(client, {
|
|
2524
|
+
account: accounts[1],
|
|
2525
|
+
domain: Proof.domain(chain.id),
|
|
2526
|
+
types: Proof.types,
|
|
2527
|
+
primaryType: 'Proof',
|
|
2528
|
+
message: Proof.message(challenge.id),
|
|
2529
|
+
})
|
|
2530
|
+
|
|
2531
|
+
const credential = Credential.from({
|
|
2532
|
+
challenge,
|
|
2533
|
+
payload: { signature, type: 'proof' as const },
|
|
2534
|
+
source: `did:pkh:eip155:1:${accounts[1].address}`,
|
|
2535
|
+
})
|
|
2536
|
+
|
|
2537
|
+
const response2 = await fetch(httpServer.url, {
|
|
2538
|
+
headers: { Authorization: Credential.serialize(credential) },
|
|
2539
|
+
})
|
|
2540
|
+
expect(response2.status).toBe(402)
|
|
2541
|
+
|
|
2542
|
+
httpServer.close()
|
|
2543
|
+
})
|
|
2544
|
+
|
|
2247
2545
|
test('behavior: rejects proof with malformed source DID', async () => {
|
|
2248
2546
|
const httpServer = await Http.createServer(async (req, res) => {
|
|
2249
2547
|
const result = await Mppx_server.toNodeListener(
|
|
@@ -51,6 +51,7 @@ export function charge<const parameters extends charge.Parameters>(
|
|
|
51
51
|
waitForConfirmation = true,
|
|
52
52
|
} = parameters
|
|
53
53
|
const store = (parameters.store ?? Store.memory()) as Store.Store<charge.StoreItemMap>
|
|
54
|
+
const proofStore = parameters.store as Store.Store<charge.StoreItemMap> | undefined
|
|
54
55
|
|
|
55
56
|
const { recipient, feePayer, feePayerUrl } = Account.resolve(parameters)
|
|
56
57
|
|
|
@@ -159,11 +160,15 @@ export function charge<const parameters extends charge.Parameters>(
|
|
|
159
160
|
if (!expectedSource)
|
|
160
161
|
throw new MismatchError('Proof credential must include a source.', {})
|
|
161
162
|
|
|
162
|
-
const sourceAddress = expectedSource.split(':').pop() as `0x${string}`
|
|
163
163
|
const resolvedChainId = challenge.request.methodDetails?.chainId ?? chainId!
|
|
164
|
+
const source = Proof.parseProofSource(expectedSource)
|
|
165
|
+
|
|
166
|
+
if (!source || source.chainId !== resolvedChainId) {
|
|
167
|
+
throw new MismatchError('Proof credential source is invalid.', {})
|
|
168
|
+
}
|
|
164
169
|
|
|
165
170
|
const valid = await verifyTypedData(client, {
|
|
166
|
-
address:
|
|
171
|
+
address: source.address,
|
|
167
172
|
domain: Proof.domain(resolvedChainId),
|
|
168
173
|
types: Proof.types,
|
|
169
174
|
primaryType: 'Proof',
|
|
@@ -172,6 +177,11 @@ export function charge<const parameters extends charge.Parameters>(
|
|
|
172
177
|
})
|
|
173
178
|
if (!valid) throw new MismatchError('Proof signature does not match source.', {})
|
|
174
179
|
|
|
180
|
+
if (proofStore) {
|
|
181
|
+
await assertProofUnused(proofStore, challenge.id)
|
|
182
|
+
await markProofUsed(proofStore, challenge.id)
|
|
183
|
+
}
|
|
184
|
+
|
|
175
185
|
return {
|
|
176
186
|
method: 'tempo',
|
|
177
187
|
status: 'success',
|
|
@@ -285,10 +295,15 @@ export declare namespace charge {
|
|
|
285
295
|
/** Testnet mode. */
|
|
286
296
|
testnet?: boolean | undefined
|
|
287
297
|
/**
|
|
288
|
-
* Store for
|
|
298
|
+
* Store for charge replay protection.
|
|
299
|
+
*
|
|
300
|
+
* Non-zero charge flows default to an in-memory store if omitted. For
|
|
301
|
+
* zero-dollar proof auth, replay prevention is enabled only when a store
|
|
302
|
+
* is explicitly provided; otherwise proofs remain reusable until the
|
|
303
|
+
* challenge expires.
|
|
289
304
|
*
|
|
290
|
-
* Use a shared store in multi-instance deployments so consumed hashes
|
|
291
|
-
* visible across all server instances.
|
|
305
|
+
* Use a shared store in multi-instance deployments so consumed hashes and
|
|
306
|
+
* proofs are visible across all server instances.
|
|
292
307
|
*/
|
|
293
308
|
store?: Store.Store | undefined
|
|
294
309
|
/**
|
|
@@ -504,6 +519,11 @@ function getHashStoreKey(hash: `0x${string}`): `mppx:charge:${string}` {
|
|
|
504
519
|
return `mppx:charge:${hash.toLowerCase()}`
|
|
505
520
|
}
|
|
506
521
|
|
|
522
|
+
/** @internal */
|
|
523
|
+
function getProofStoreKey(challengeId: string): `mppx:charge:${string}` {
|
|
524
|
+
return `mppx:charge:proof:${challengeId}`
|
|
525
|
+
}
|
|
526
|
+
|
|
507
527
|
/** @internal */
|
|
508
528
|
async function assertHashUnused(
|
|
509
529
|
store: Store.Store<charge.StoreItemMap>,
|
|
@@ -521,6 +541,23 @@ async function markHashUsed(
|
|
|
521
541
|
await store.put(getHashStoreKey(hash), Date.now())
|
|
522
542
|
}
|
|
523
543
|
|
|
544
|
+
/** @internal */
|
|
545
|
+
async function assertProofUnused(
|
|
546
|
+
store: Store.Store<charge.StoreItemMap>,
|
|
547
|
+
challengeId: string,
|
|
548
|
+
): Promise<void> {
|
|
549
|
+
const seen = await store.get(getProofStoreKey(challengeId))
|
|
550
|
+
if (seen !== null) throw new Error('Proof credential has already been used.')
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/** @internal */
|
|
554
|
+
async function markProofUsed(
|
|
555
|
+
store: Store.Store<charge.StoreItemMap>,
|
|
556
|
+
challengeId: string,
|
|
557
|
+
): Promise<void> {
|
|
558
|
+
await store.put(getProofStoreKey(challengeId), Date.now())
|
|
559
|
+
}
|
|
560
|
+
|
|
524
561
|
/** @internal */
|
|
525
562
|
function toReceipt(receipt: TransactionReceipt) {
|
|
526
563
|
const { status, transactionHash } = receipt
|