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 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":"AAOA,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;cAsCvB,OAAO,CAAC,IAAI,CAAC;EAahC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM;;;;;;;;;;oTA3HhB,CAAC;kBAAsB,CAAC;;;;;;GAsIzD"}
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"}
@@ -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', reject);
151
+ proc.on('error', (error) => {
152
+ clearTimeout(timeout);
153
+ reject(error);
154
+ });
145
155
  });
146
156
  }
147
157
  throw new Error(`Unsupported platform: ${platform}`);
@@ -1 +1 @@
1
- {"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/cli/account.ts"],"names":[],"mappings":"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"}
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 transaction hash replay protection.
92
+ * Store for charge replay protection.
93
93
  *
94
- * Use a shared store in multi-instance deployments so consumed hashes are
95
- * visible across all server instances.
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDA2OF;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;;;;;WAKG;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"}
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: sourceAddress,
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mppx",
3
3
  "type": "module",
4
- "version": "0.5.0",
4
+ "version": "0.5.1",
5
5
  "main": "./dist/index.js",
6
6
  "license": "MIT",
7
7
  "files": [
@@ -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', reject)
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<{ url: string; close: () => void }>((resolve) => {
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<{ url: string; close: () => void }>((resolve) => {
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<{ url: string; close: () => void }>((resolve) => {
15
+ return new Promise<Http.TestServer>((resolve) => {
15
16
  const server = serve({ fetch: app.fetch, port: 0 }, (info) => {
16
- resolve({
17
- url: `http://localhost:${info.port}`,
18
- close: () => server.close(),
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<{ url: string; close: () => void }>((resolve) => {
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: sourceAddress,
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 transaction hash replay protection.
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 are
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