@openzeppelin/miden-multisig-client 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +176 -23
  2. package/dist/client.d.ts +41 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +79 -2
  5. package/dist/client.js.map +1 -1
  6. package/dist/index.d.ts +7 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +7 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/lookupAuth.d.ts.map +1 -1
  11. package/dist/lookupAuth.js +2 -20
  12. package/dist/lookupAuth.js.map +1 -1
  13. package/dist/multisig/authArgErrors.d.ts +27 -1
  14. package/dist/multisig/authArgErrors.d.ts.map +1 -1
  15. package/dist/multisig/authArgErrors.js +33 -0
  16. package/dist/multisig/authArgErrors.js.map +1 -1
  17. package/dist/multisig.d.ts +77 -11
  18. package/dist/multisig.d.ts.map +1 -1
  19. package/dist/multisig.js +247 -181
  20. package/dist/multisig.js.map +1 -1
  21. package/dist/proposal/metadata.d.ts.map +1 -1
  22. package/dist/proposal/metadata.js +2 -0
  23. package/dist/proposal/metadata.js.map +1 -1
  24. package/dist/recovery/transportDrain.d.ts +38 -30
  25. package/dist/recovery/transportDrain.d.ts.map +1 -1
  26. package/dist/recovery/transportDrain.js +113 -113
  27. package/dist/recovery/transportDrain.js.map +1 -1
  28. package/dist/session/grant.d.ts +40 -0
  29. package/dist/session/grant.d.ts.map +1 -0
  30. package/dist/session/grant.js +125 -0
  31. package/dist/session/grant.js.map +1 -0
  32. package/dist/session/key.d.ts +103 -0
  33. package/dist/session/key.d.ts.map +1 -0
  34. package/dist/session/key.js +160 -0
  35. package/dist/session/key.js.map +1 -0
  36. package/dist/session/manager.d.ts +76 -0
  37. package/dist/session/manager.d.ts.map +1 -0
  38. package/dist/session/manager.js +187 -0
  39. package/dist/session/manager.js.map +1 -0
  40. package/dist/signers/ecdsa.d.ts +5 -1
  41. package/dist/signers/ecdsa.d.ts.map +1 -1
  42. package/dist/signers/ecdsa.js +9 -0
  43. package/dist/signers/ecdsa.js.map +1 -1
  44. package/dist/signers/falcon.d.ts +5 -1
  45. package/dist/signers/falcon.d.ts.map +1 -1
  46. package/dist/signers/falcon.js +9 -0
  47. package/dist/signers/falcon.js.map +1 -1
  48. package/dist/signers/ledger.d.ts +9 -1
  49. package/dist/signers/ledger.d.ts.map +1 -1
  50. package/dist/signers/ledger.js +13 -1
  51. package/dist/signers/ledger.js.map +1 -1
  52. package/dist/signers/miden-wallet.d.ts +13 -1
  53. package/dist/signers/miden-wallet.d.ts.map +1 -1
  54. package/dist/signers/miden-wallet.js +25 -0
  55. package/dist/signers/miden-wallet.js.map +1 -1
  56. package/dist/signers/para.d.ts +5 -1
  57. package/dist/signers/para.d.ts.map +1 -1
  58. package/dist/signers/para.js +9 -0
  59. package/dist/signers/para.js.map +1 -1
  60. package/dist/transaction/authArgs.d.ts +2 -2
  61. package/dist/transaction/authArgs.js +2 -2
  62. package/dist/transaction/options.d.ts +2 -2
  63. package/dist/transaction/summary.d.ts +17 -61
  64. package/dist/transaction/summary.d.ts.map +1 -1
  65. package/dist/transaction/summary.js +49 -95
  66. package/dist/transaction/summary.js.map +1 -1
  67. package/dist/transaction.d.ts +1 -1
  68. package/dist/transaction.d.ts.map +1 -1
  69. package/dist/transaction.js +1 -1
  70. package/dist/transaction.js.map +1 -1
  71. package/dist/types/proposal.d.ts +11 -5
  72. package/dist/types/proposal.d.ts.map +1 -1
  73. package/dist/types/proposal.js.map +1 -1
  74. package/dist/utils/eip712.d.ts +26 -69
  75. package/dist/utils/eip712.d.ts.map +1 -1
  76. package/dist/utils/eip712.js +101 -8
  77. package/dist/utils/eip712.js.map +1 -1
  78. package/dist/utils/felt.d.ts +7 -1
  79. package/dist/utils/felt.d.ts.map +1 -1
  80. package/dist/utils/felt.js +18 -1
  81. package/dist/utils/felt.js.map +1 -1
  82. package/package.json +4 -4
  83. package/src/client.ts +97 -2
  84. package/src/index.ts +29 -8
  85. package/src/lookupAuth.ts +3 -22
  86. package/src/multisig/authArgErrors.ts +42 -1
  87. package/src/multisig.ts +318 -207
  88. package/src/proposal/metadata.ts +2 -0
  89. package/src/recovery/transportDrain.ts +118 -124
  90. package/src/session/grant.ts +143 -0
  91. package/src/session/key.ts +215 -0
  92. package/src/session/manager.ts +273 -0
  93. package/src/signers/ecdsa.ts +12 -1
  94. package/src/signers/falcon.ts +12 -1
  95. package/src/signers/ledger.ts +19 -2
  96. package/src/signers/miden-wallet.ts +29 -1
  97. package/src/signers/para.ts +12 -1
  98. package/src/transaction/authArgs.ts +2 -2
  99. package/src/transaction/options.ts +2 -2
  100. package/src/transaction/summary.ts +62 -110
  101. package/src/transaction.ts +1 -6
  102. package/src/types/proposal.ts +11 -5
  103. package/src/utils/eip712.ts +130 -10
  104. package/src/utils/felt.ts +19 -1
@@ -30,11 +30,17 @@ interface BaseProposalMetadata {
30
30
  saltHex?: string;
31
31
  requiredSignatures?: number;
32
32
  /**
33
- * Base64-serialized Miden `ChainAnchor` at the block the proposal's
34
- * transaction summary binds, the proposer's sync height when it built the
35
- * request. Required, and checked against the summary's block commitment: a
36
- * rebuild binds the block it names. The proposal executes at the chain tip,
37
- * not at the anchor; 0.18.0-rc.1 clients still re-execute at it.
33
+ * The block the proposal's transaction summary binds: the proposer's sync
34
+ * height when it built the request, or the block a custom producer's request
35
+ * names. Not signed: this SDK reads the block from the summary and refuses a
36
+ * proposal whose value disagrees (`BoundBlockMismatchError`), as the Rust SDK
37
+ * does. Every proposal this SDK creates writes it.
38
+ */
39
+ boundBlockNum?: number;
40
+ /**
41
+ * Legacy: the base64 Miden `ChainAnchor` 0.18 clients wrote instead of
42
+ * `boundBlockNum`. This SDK never sets or reads it; the codec passes it
43
+ * through so an old proposal exports and imports unchanged.
38
44
  */
39
45
  chainAnchor?: string;
40
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AAqEA,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAU,CAAC;AAE5D,iEAAiE;AACjE,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,GAAG,IAAI,CAAC;AAW3D,MAAM,UAAU,gBAAgB,CAAC,EAAgC;IAC/D,OAAO,EAAE,CAAC,eAAe,KAAK,iCAAiC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAgC;IAC/D,OAAO,EAAE,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,CAAC,eAAe,KAAK,CAAC,CAAC;AACtE,CAAC;AAKD,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAyC,EACzC,KAAyB;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,sBAAsB,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,eAAe,KAAK,KAAK,KAAK,wCAAwC,sBAAsB,EAAE,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAiED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AA2EA,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAU,CAAC;AAE5D,iEAAiE;AACjE,MAAM,CAAC,MAAM,gCAAgC,GAAG,GAAG,GAAG,IAAI,CAAC;AAW3D,MAAM,UAAU,gBAAgB,CAAC,EAAgC;IAC/D,OAAO,EAAE,CAAC,eAAe,KAAK,iCAAiC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAgC;IAC/D,OAAO,EAAE,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,CAAC,eAAe,KAAK,CAAC,CAAC;AACtE,CAAC;AAKD,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAyC,EACzC,KAAyB;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,sBAAsB,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,eAAe,KAAK,KAAK,KAAK,wCAAwC,sBAAsB,EAAE,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAiED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC;AACpF,CAAC"}
@@ -1,80 +1,37 @@
1
+ import type { SessionGrantFields } from '@openzeppelin/guardian-client';
1
2
  type TypedField = {
2
3
  name: string;
3
4
  type: string;
4
5
  };
5
- declare function typedData(name: string, primaryType: string, fieldName: string, value: string): {
6
- types: {
7
- [primaryType]: {
8
- name: string;
9
- type: string;
10
- }[];
11
- EIP712Domain: TypedField[];
12
- };
13
- primaryType: string;
14
- domain: {
15
- name: string;
16
- version: string;
17
- };
18
- message: {
19
- [fieldName]: string;
20
- };
21
- };
22
- export declare function guardianRequestTypedData(requestHash: Uint8Array): {
23
- types: {
24
- [x: string]: TypedField[];
25
- EIP712Domain: TypedField[];
26
- };
6
+ /**
7
+ * EIP-712 typed data over `string`, `bytes`, `bytes32` and `uint64` fields,
8
+ * as Guardian signs it. Integers are decimal strings, as wallets accept them.
9
+ */
10
+ export interface GuardianTypedData {
11
+ types: Record<string, TypedField[]>;
27
12
  primaryType: string;
28
13
  domain: {
29
14
  name: string;
30
15
  version: string;
31
16
  };
32
- message: {
33
- [x: string]: string;
34
- };
35
- };
36
- export declare function guardianLookupTypedData(lookupHash: Uint8Array): {
37
- types: {
38
- [x: string]: TypedField[];
39
- EIP712Domain: TypedField[];
40
- };
41
- primaryType: string;
42
- domain: {
43
- name: string;
44
- version: string;
45
- };
46
- message: {
47
- [x: string]: string;
48
- };
49
- };
50
- export declare function midenTransactionTypedData(txSummaryHash: Uint8Array): {
51
- types: {
52
- [x: string]: TypedField[];
53
- EIP712Domain: TypedField[];
54
- };
55
- primaryType: string;
56
- domain: {
57
- name: string;
58
- version: string;
59
- };
60
- message: {
61
- [x: string]: string;
62
- };
63
- };
64
- export declare function guardianKeyDiscoveryTypedData(challenge: Uint8Array): {
65
- types: {
66
- [x: string]: TypedField[];
67
- EIP712Domain: TypedField[];
68
- };
69
- primaryType: string;
70
- domain: {
71
- name: string;
72
- version: string;
73
- };
74
- message: {
75
- [x: string]: string;
76
- };
77
- };
78
- export declare function typedDataDigest(data: ReturnType<typeof typedData>): Uint8Array;
17
+ message: Record<string, string>;
18
+ }
19
+ export declare function guardianRequestTypedData(requestHash: Uint8Array): GuardianTypedData;
20
+ export declare function guardianLookupTypedData(lookupHash: Uint8Array): GuardianTypedData;
21
+ export declare function midenTransactionTypedData(txSummaryHash: Uint8Array): GuardianTypedData;
22
+ export declare function guardianKeyDiscoveryTypedData(challenge: Uint8Array): GuardianTypedData;
23
+ /**
24
+ * Readable session grant: every value Guardian binds is a top-level member,
25
+ * so the wallet displays the signer, the delegated key, the website, the
26
+ * lifetime (with a readable expiry), the scope, the Guardian key and the
27
+ * network instead of a hash.
28
+ */
29
+ export declare function guardianSessionTypedData(grant: SessionGrantFields): GuardianTypedData;
30
+ /**
31
+ * Readable revoke-all: the signer whose sessions end and the request
32
+ * timestamp in milliseconds.
33
+ */
34
+ export declare function guardianSessionRevokeAllTypedData(signerCommitment: string, timestampMs: number): GuardianTypedData;
35
+ export declare function typedDataDigest(data: GuardianTypedData): Uint8Array;
79
36
  export {};
80
37
  //# sourceMappingURL=eip712.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eip712.d.ts","sourceRoot":"","sources":["../../src/utils/eip712.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAUjD,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;QAIhF,CAAC,WAAW,CAAC;;;YAAwC;;;;;;;;;QAI5C,CAAC,SAAS,CAAC,SAAO;;EAEhC;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,UAAU;;;;;;;;;;;;;EAE/D;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU;;;;;;;;;;;;;EAE7D;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,UAAU;;;;;;;;;;;;;EAElE;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,UAAU;;;;;;;;;;;;;EAElE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,GAAG,UAAU,CAe9E"}
1
+ {"version":3,"file":"eip712.d.ts","sourceRoot":"","sources":["../../src/utils/eip712.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AA8BD,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,UAAU,qBAE/D;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,qBAE7D;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,UAAU,qBAElE;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,UAAU,qBAElE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,CA8BrF;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,iBAAiB,CAgBnB;AAgCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAqBnE"}
@@ -1,8 +1,11 @@
1
1
  import { keccak_256 } from '@noble/hashes/sha3.js';
2
2
  import { bytesToHex, hexToBytes } from './encoding.js';
3
+ import { SESSION_GRANT_SCOPE, formatUtcSeconds } from '../session/grant.js';
3
4
  const EIP191_PREFIX = 0x19;
4
5
  const EIP712_VERSION = 0x01;
5
6
  const DOMAIN_VERSION = '1';
7
+ const SESSION_DOMAIN_NAME = 'Guardian Session';
8
+ const UINT64_MAX = 0xffffffffffffffffn;
6
9
  const domainFields = [
7
10
  { name: 'name', type: 'string' },
8
11
  { name: 'version', type: 'string' },
@@ -30,16 +33,106 @@ export function midenTransactionTypedData(txSummaryHash) {
30
33
  export function guardianKeyDiscoveryTypedData(challenge) {
31
34
  return typedData('Guardian Key Discovery', 'GuardianKeyDiscovery', 'challenge', bytesToHex(challenge));
32
35
  }
36
+ /**
37
+ * Readable session grant: every value Guardian binds is a top-level member,
38
+ * so the wallet displays the signer, the delegated key, the website, the
39
+ * lifetime (with a readable expiry), the scope, the Guardian key and the
40
+ * network instead of a hash.
41
+ */
42
+ export function guardianSessionTypedData(grant) {
43
+ return {
44
+ types: {
45
+ EIP712Domain: domainFields,
46
+ GuardianSession: [
47
+ { name: 'signer', type: 'bytes32' },
48
+ { name: 'sessionKey', type: 'bytes' },
49
+ { name: 'origin', type: 'string' },
50
+ { name: 'issuedAt', type: 'uint64' },
51
+ { name: 'expiresAt', type: 'uint64' },
52
+ { name: 'expires', type: 'string' },
53
+ { name: 'scope', type: 'string' },
54
+ { name: 'guardianKey', type: 'bytes32' },
55
+ { name: 'network', type: 'string' },
56
+ ],
57
+ },
58
+ primaryType: 'GuardianSession',
59
+ domain: { name: SESSION_DOMAIN_NAME, version: DOMAIN_VERSION },
60
+ message: {
61
+ signer: grant.signerCommitment,
62
+ sessionKey: grant.sessionPublicKey,
63
+ origin: grant.origin,
64
+ issuedAt: String(grant.issuedAt),
65
+ expiresAt: String(grant.expiresAt),
66
+ expires: formatUtcSeconds(grant.expiresAt),
67
+ scope: SESSION_GRANT_SCOPE,
68
+ guardianKey: grant.guardianCommitment,
69
+ network: grant.network,
70
+ },
71
+ };
72
+ }
73
+ /**
74
+ * Readable revoke-all: the signer whose sessions end and the request
75
+ * timestamp in milliseconds.
76
+ */
77
+ export function guardianSessionRevokeAllTypedData(signerCommitment, timestampMs) {
78
+ if (!Number.isInteger(timestampMs) || timestampMs < 0) {
79
+ throw new Error('Revoke-all timestamp must be a non-negative integer');
80
+ }
81
+ return {
82
+ types: {
83
+ EIP712Domain: domainFields,
84
+ GuardianSessionRevokeAll: [
85
+ { name: 'signer', type: 'bytes32' },
86
+ { name: 'timestamp', type: 'uint64' },
87
+ ],
88
+ },
89
+ primaryType: 'GuardianSessionRevokeAll',
90
+ domain: { name: SESSION_DOMAIN_NAME, version: DOMAIN_VERSION },
91
+ message: { signer: signerCommitment, timestamp: String(timestampMs) },
92
+ };
93
+ }
94
+ function encodeField(field, value) {
95
+ switch (field.type) {
96
+ case 'string':
97
+ return keccak_256(new TextEncoder().encode(value));
98
+ case 'bytes':
99
+ return keccak_256(hexToBytes(value));
100
+ case 'bytes32': {
101
+ const bytes = hexToBytes(value);
102
+ if (bytes.length !== 32) {
103
+ throw new Error(`EIP-712 field ${field.name} must be 32 bytes`);
104
+ }
105
+ return bytes;
106
+ }
107
+ case 'uint64': {
108
+ let remaining = BigInt(value);
109
+ if (remaining < 0n || remaining > UINT64_MAX) {
110
+ throw new Error(`EIP-712 field ${field.name} must fit in uint64`);
111
+ }
112
+ const bytes = new Uint8Array(32);
113
+ for (let i = 31; i >= 24; i -= 1) {
114
+ bytes[i] = Number(remaining & 0xffn);
115
+ remaining >>= 8n;
116
+ }
117
+ return bytes;
118
+ }
119
+ default:
120
+ throw new Error(`Unsupported EIP-712 field type: ${field.type}`);
121
+ }
122
+ }
33
123
  export function typedDataDigest(data) {
34
- const domainType = new TextEncoder().encode('EIP712Domain(string name,string version)');
35
- const primaryType = new TextEncoder().encode(`${data.primaryType}(bytes32 ${Object.keys(data.message)[0]})`);
124
+ const encoder = new TextEncoder();
125
+ const fields = data.types[data.primaryType];
126
+ const typeString = `${data.primaryType}(${fields.map((f) => `${f.type} ${f.name}`).join(',')})`;
36
127
  const domain = new Uint8Array(96);
37
- domain.set(keccak_256(domainType));
38
- domain.set(keccak_256(new TextEncoder().encode(data.domain.name)), 32);
39
- domain.set(keccak_256(new TextEncoder().encode(data.domain.version)), 64);
40
- const struct = new Uint8Array(64);
41
- struct.set(keccak_256(primaryType));
42
- struct.set(hexToBytes(Object.values(data.message)[0]), 32);
128
+ domain.set(keccak_256(encoder.encode('EIP712Domain(string name,string version)')));
129
+ domain.set(keccak_256(encoder.encode(data.domain.name)), 32);
130
+ domain.set(keccak_256(encoder.encode(data.domain.version)), 64);
131
+ const struct = new Uint8Array(32 * (fields.length + 1));
132
+ struct.set(keccak_256(encoder.encode(typeString)));
133
+ fields.forEach((field, index) => {
134
+ struct.set(encodeField(field, data.message[field.name]), 32 * (index + 1));
135
+ });
43
136
  const preimage = new Uint8Array(66);
44
137
  preimage.set([EIP191_PREFIX, EIP712_VERSION]);
45
138
  preimage.set(keccak_256(domain), 2);
@@ -1 +1 @@
1
- {"version":3,"file":"eip712.js","sourceRoot":"","sources":["../../src/utils/eip712.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eip712.js","sourceRoot":"","sources":["../../src/utils/eip712.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Felt } from '@miden-sdk/miden-sdk';
1
+ import { Felt, type Word } from '@miden-sdk/miden-sdk';
2
2
  /**
3
3
  * Maps an arbitrary `u64` onto a canonical field element by reducing modulo the
4
4
  * field order, mirroring `guardian_shared::felt::felt_from_u64_reduced`.
@@ -9,4 +9,10 @@ import { Felt } from '@miden-sdk/miden-sdk';
9
9
  * construction infallible, and stays byte-identical to server-side signing.
10
10
  */
11
11
  export declare function feltFromU64Reduced(value: bigint): Felt;
12
+ /**
13
+ * RPO hash of `bytes` packed as 8-byte little-endian chunks (the last one
14
+ * zero-padded), mirroring `guardian_shared::felt::domain_tag_word`. The
15
+ * convention every Guardian message domain tag uses.
16
+ */
17
+ export declare function domainTagWord(bytes: Uint8Array): Word;
12
18
  //# sourceMappingURL=felt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"felt.d.ts","sourceRoot":"","sources":["../../src/utils/felt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAQ5C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtD"}
1
+ {"version":3,"file":"felt.d.ts","sourceRoot":"","sources":["../../src/utils/felt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAqB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAQ1E;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAWrD"}
@@ -1,4 +1,4 @@
1
- import { Felt } from '@miden-sdk/miden-sdk';
1
+ import { Felt, FeltArray, Rpo256 } from '@miden-sdk/miden-sdk';
2
2
  /**
3
3
  * Goldilocks field order (`2^64 - 2^32 + 1`), matching `Felt::ORDER` in
4
4
  * `miden-protocol`.
@@ -16,4 +16,21 @@ const FELT_ORDER = 18446744069414584321n;
16
16
  export function feltFromU64Reduced(value) {
17
17
  return new Felt(BigInt.asUintN(64, value) % FELT_ORDER);
18
18
  }
19
+ /**
20
+ * RPO hash of `bytes` packed as 8-byte little-endian chunks (the last one
21
+ * zero-padded), mirroring `guardian_shared::felt::domain_tag_word`. The
22
+ * convention every Guardian message domain tag uses.
23
+ */
24
+ export function domainTagWord(bytes) {
25
+ const felts = [];
26
+ for (let offset = 0; offset < bytes.length; offset += 8) {
27
+ let value = 0n;
28
+ for (let i = 0; i < 8; i += 1) {
29
+ const byte = offset + i < bytes.length ? bytes[offset + i] : 0;
30
+ value |= BigInt(byte) << BigInt(8 * i);
31
+ }
32
+ felts.push(feltFromU64Reduced(value));
33
+ }
34
+ return Rpo256.hashElements(new FeltArray(felts));
35
+ }
19
36
  //# sourceMappingURL=felt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"felt.js","sourceRoot":"","sources":["../../src/utils/felt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"felt.js","sourceRoot":"","sources":["../../src/utils/felt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAa,MAAM,sBAAsB,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/miden-multisig-client",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "description": "TypeScript SDK for Miden multisig accounts with GUARDIAN integration",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,13 +42,13 @@
42
42
  "test:qualification": "vitest run --config vitest.qualification.config.ts"
43
43
  },
44
44
  "dependencies": {
45
- "@miden-sdk/miden-sdk": "0.17.0",
45
+ "@miden-sdk/miden-sdk": "0.17.3",
46
46
  "@noble/curves": "^1.9.7",
47
47
  "@noble/hashes": "^2.0.1",
48
- "@openzeppelin/guardian-client": "^0.18.0"
48
+ "@openzeppelin/guardian-client": "^0.18.2"
49
49
  },
50
50
  "devDependencies": {
51
- "@openzeppelin/guardian-operator-client": "^0.18.0",
51
+ "@openzeppelin/guardian-operator-client": "^0.18.2",
52
52
  "@playwright/test": "^1.60.0",
53
53
  "@types/node": "^24.13.5",
54
54
  "fake-indexeddb": "^6.2.5",
package/src/client.ts CHANGED
@@ -15,6 +15,14 @@ import { requireConfigValue, requireMidenRpcEndpoint } from './config.js';
15
15
  import type { MultisigConfig, Signer } from './types.js';
16
16
  import { isSafeToAdoptGuardianState, readOnChainCommitment } from './state/adopt.js';
17
17
  import { normalizeHexWord } from './utils/encoding.js';
18
+ import type { GuardianSession, SessionKeyStore } from './session/key.js';
19
+ import {
20
+ type StartSessionOptions,
21
+ endGuardianSession,
22
+ resumeGuardianSession,
23
+ revokeAllGuardianSessions,
24
+ startGuardianSession,
25
+ } from './session/manager.js';
18
26
  import {
19
27
  resolveProverConfig,
20
28
  type ProverConfig,
@@ -99,8 +107,8 @@ export interface RecoveredAccount {
99
107
  * },
100
108
  * });
101
109
  *
102
- * // Get GUARDIAN pubkey for config
103
- * const guardianCommitment = await client.guardianClient.getPubkey();
110
+ * // Get GUARDIAN's ACK commitment for the account's signature scheme
111
+ * const { commitment: guardianCommitment } = await client.guardianClient.getPubkey(signer.scheme);
104
112
  *
105
113
  * // Create multisig
106
114
  * const config = { threshold: 2, signerCommitments: [...], guardianCommitment };
@@ -113,6 +121,7 @@ export class MultisigClient {
113
121
  private readonly proverConfig: ResolvedProverConfig;
114
122
  private readonly rpcConfig: ResolvedRpcConfig;
115
123
  private _guardianClient: GuardianHttpClient;
124
+ private guardianSession: GuardianSession | null = null;
116
125
 
117
126
  constructor(midenClient: MidenClient, config: MultisigClientConfig) {
118
127
  this.midenClient = midenClient;
@@ -133,6 +142,7 @@ export class MultisigClient {
133
142
  this._guardianClient = new GuardianHttpClient(
134
143
  requireConfigValue('guardianEndpoint', endpoint),
135
144
  );
145
+ this.guardianSession = null;
136
146
  }
137
147
 
138
148
  /**
@@ -142,6 +152,91 @@ export class MultisigClient {
142
152
  return this._guardianClient;
143
153
  }
144
154
 
155
+ /**
156
+ * Start a Guardian session: `signer` signs one grant, then a non-extractable
157
+ * browser key (the delegated signer) signs this client's session-eligible
158
+ * Guardian requests (state and delta reads, proposal list/get/create/sign)
159
+ * until the session ends. Account configuration, lookup, delta pushes,
160
+ * candidate abandons and transaction approvals keep using `signer`. Pass
161
+ * `options.store` to survive page reloads via `resumeSession`, and
162
+ * `options.onEnded` to learn when requests fall back to the wallet.
163
+ *
164
+ * A session this client already holds is logged out once the new one is
165
+ * registered. A Guardian endpoint change (`setGuardianEndpoint`) drops the
166
+ * session.
167
+ */
168
+ async startSession(signer: Signer, options: StartSessionOptions = {}): Promise<GuardianSession> {
169
+ const previous = this.guardianSession;
170
+ const session = await startGuardianSession(this._guardianClient, signer, {
171
+ ...options,
172
+ onEnded: this.trackSessionEnd(options.onEnded),
173
+ });
174
+ this.guardianSession = session;
175
+ if (previous) {
176
+ await endGuardianSession(this._guardianClient, previous, options.store).catch(() => false);
177
+ }
178
+ return session;
179
+ }
180
+
181
+ /**
182
+ * Reuse a session key stored by `startSession` without a wallet prompt.
183
+ * Returns `null` when there is none or it is about to expire.
184
+ */
185
+ async resumeSession(
186
+ signer: Signer,
187
+ store: SessionKeyStore,
188
+ options: Pick<StartSessionOptions, 'onEnded'> = {},
189
+ ): Promise<GuardianSession | null> {
190
+ const session = await resumeGuardianSession(this._guardianClient, signer, store, {
191
+ onEnded: this.trackSessionEnd(options.onEnded),
192
+ });
193
+ if (session) {
194
+ this.guardianSession = session;
195
+ }
196
+ return session;
197
+ }
198
+
199
+ /**
200
+ * Revoke the current session, fall back to wallet signatures, and forget its
201
+ * stored key. Returns whether Guardian still had the session active. On
202
+ * error the session stays in use.
203
+ */
204
+ async endSession(store?: SessionKeyStore): Promise<boolean> {
205
+ const session = this.guardianSession;
206
+ if (!session) {
207
+ return false;
208
+ }
209
+ const revoked = await endGuardianSession(this._guardianClient, session, store);
210
+ if (this.guardianSession === session) {
211
+ this.guardianSession = null;
212
+ }
213
+ return revoked;
214
+ }
215
+
216
+ /**
217
+ * Revoke every session of `signer` on the Guardian with a wallet signature,
218
+ * including sessions started in other tabs or devices; stop using the
219
+ * current one and forget its stored key. Use it when a session key may be
220
+ * compromised, and run it again 10 minutes later: it ends only sessions
221
+ * already registered, and a page can register a grant it got signed for up
222
+ * to about 10 minutes. Returns how many sessions Guardian revoked.
223
+ */
224
+ async revokeAllSessions(signer: Signer, store?: SessionKeyStore): Promise<number> {
225
+ return revokeAllGuardianSessions(this._guardianClient, signer, store);
226
+ }
227
+
228
+ /** Forgets the session this client holds once Guardian stops using it. */
229
+ private trackSessionEnd(
230
+ onEnded: StartSessionOptions['onEnded'],
231
+ ): NonNullable<StartSessionOptions['onEnded']> {
232
+ return (reason, session) => {
233
+ if (this.guardianSession === session) {
234
+ this.guardianSession = null;
235
+ }
236
+ onEnded?.(reason, session);
237
+ };
238
+ }
239
+
145
240
  /**
146
241
  * Recover the set of accounts a given signer authorizes by querying
147
242
  * Guardian's `/state/lookup` endpoint and fetching state for each match.
package/src/index.ts CHANGED
@@ -31,8 +31,8 @@
31
31
  * },
32
32
  * });
33
33
  *
34
- * // Get GUARDIAN pubkey for config
35
- * const guardianCommitment = await client.guardianClient.getPubkey();
34
+ * // Get GUARDIAN's ACK commitment for the account's signature scheme
35
+ * const { commitment: guardianCommitment } = await client.guardianClient.getPubkey(signer.scheme);
36
36
  *
37
37
  * // Create multisig account
38
38
  * const config = { threshold: 2, signerCommitments: [signer.commitment, ...], guardianCommitment };
@@ -56,6 +56,30 @@ export type {
56
56
  export type { ProverConfig, ProverRetryPolicy } from './prover/config.js';
57
57
  export type { RpcConfig, RpcRetryPolicy } from './rpc/config.js';
58
58
  export { lookupAuthDigest } from './lookupAuth.js';
59
+ export {
60
+ SESSION_GRANT_SCOPE,
61
+ describeSessionGrant,
62
+ sessionGrantDigest,
63
+ sessionLogoutDigest,
64
+ sessionRevokeAllDigest,
65
+ } from './session/grant.js';
66
+ export {
67
+ GuardianSession,
68
+ IndexedDbSessionKeyStore,
69
+ type GuardianSessionOptions,
70
+ WebCryptoSessionKey,
71
+ type SessionKeyStore,
72
+ type StoredSessionKey,
73
+ } from './session/key.js';
74
+ export {
75
+ GuardianSessionsUnsupportedError,
76
+ SessionGrantDeclinedError,
77
+ endGuardianSession,
78
+ resumeGuardianSession,
79
+ revokeAllGuardianSessions,
80
+ startGuardianSession,
81
+ type StartSessionOptions,
82
+ } from './session/manager.js';
59
83
  export {
60
84
  Multisig,
61
85
  type AccountState,
@@ -67,15 +91,10 @@ export {
67
91
  export { AccountInspector, type DetectedMultisigConfig, type VaultBalance } from './inspector.js';
68
92
  export {
69
93
  ChainBehindBoundBlockError,
70
- chainAnchorFromBase64,
71
- chainAnchorToBase64,
72
- chainAnchorBlockNum,
73
- executeForSummary,
74
- executeForSummaryAt,
75
94
  executeForSummaryAtTip,
76
95
  summaryApprovalExpirationBlockNum,
96
+ summaryBoundBlockNum,
77
97
  summarySalt,
78
- SummaryAnchorMismatchError,
79
98
  buildUpdateSignersTransactionRequest,
80
99
  buildUpdateProcedureThresholdTransactionRequest,
81
100
  buildUpdateGuardianTransactionRequest,
@@ -196,9 +215,11 @@ export {
196
215
 
197
216
  export {
198
217
  type AuthArgErrorCode,
218
+ BoundBlockMismatchError,
199
219
  BoundBlockNotDeclaredError,
200
220
  MultisigAuthArgsMissingError,
201
221
  ProposalSaltMalformedError,
222
+ TransactionSummaryLayoutError,
202
223
  } from './multisig/authArgErrors.js';
203
224
 
204
225
  export {
package/src/lookupAuth.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Felt, FeltArray, Rpo256, Word } from '@miden-sdk/miden-sdk';
2
- import { feltFromU64Reduced } from './utils/felt.js';
1
+ import { FeltArray, Rpo256, Word } from '@miden-sdk/miden-sdk';
2
+ import { domainTagWord, feltFromU64Reduced } from './utils/felt.js';
3
3
 
4
4
  /**
5
5
  * Lookup-bound message format used to sign requests against the Guardian
@@ -12,32 +12,13 @@ const DOMAIN_TAG_BYTES = new TextEncoder().encode('guardian.lookup.v1');
12
12
 
13
13
  let cachedDomainTag: Word | null = null;
14
14
 
15
- /**
16
- * Convert a byte array to a sequence of Goldilocks-field felts using the same
17
- * 8-byte little-endian chunking convention as
18
- * `guardian_shared::auth_request_payload::AuthRequestPayload::from_bytes`. The
19
- * final chunk is zero-padded if `bytes.length` is not a multiple of 8.
20
- */
21
- function bytesToFelts(bytes: Uint8Array): Felt[] {
22
- const felts: Felt[] = [];
23
- for (let offset = 0; offset < bytes.length; offset += 8) {
24
- let value = 0n;
25
- for (let i = 0; i < 8; i += 1) {
26
- const byte = offset + i < bytes.length ? bytes[offset + i] : 0;
27
- value |= BigInt(byte) << BigInt(8 * i);
28
- }
29
- felts.push(feltFromU64Reduced(value));
30
- }
31
- return felts;
32
- }
33
-
34
15
  /**
35
16
  * The 4-felt RPO domain tag prepended to every lookup digest, computed once
36
17
  * from `DOMAIN_TAG_BYTES`. Cached on first call.
37
18
  */
38
19
  function lookupDomainTag(): Word {
39
20
  if (cachedDomainTag === null) {
40
- cachedDomainTag = Rpo256.hashElements(new FeltArray(bytesToFelts(DOMAIN_TAG_BYTES)));
21
+ cachedDomainTag = domainTagWord(DOMAIN_TAG_BYTES);
41
22
  }
42
23
  return cachedDomainTag;
43
24
  }