@openzeppelin/miden-multisig-client 0.12.7 → 0.13.0

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 (201) hide show
  1. package/README.md +42 -4
  2. package/dist/account/builder.d.ts +1 -1
  3. package/dist/account/builder.d.ts.map +1 -1
  4. package/dist/account/builder.js +7 -5
  5. package/dist/account/builder.js.map +1 -1
  6. package/dist/account/masm.d.ts +3 -3
  7. package/dist/account/masm.d.ts.map +1 -1
  8. package/dist/account/masm.js +101 -98
  9. package/dist/account/masm.js.map +1 -1
  10. package/dist/account/storage.d.ts +1 -1
  11. package/dist/account/storage.d.ts.map +1 -1
  12. package/dist/account/storage.js +17 -7
  13. package/dist/account/storage.js.map +1 -1
  14. package/dist/client.d.ts +1 -1
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +2 -2
  17. package/dist/client.js.map +1 -1
  18. package/dist/client.test.js +4 -4
  19. package/dist/client.test.js.map +1 -1
  20. package/dist/index.d.ts +8 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +6 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/inspector.d.ts +1 -1
  25. package/dist/inspector.d.ts.map +1 -1
  26. package/dist/inspector.js +16 -10
  27. package/dist/inspector.js.map +1 -1
  28. package/dist/inspector.test.js +33 -22
  29. package/dist/inspector.test.js.map +1 -1
  30. package/dist/multisig/helpers.d.ts +1 -1
  31. package/dist/multisig/helpers.d.ts.map +1 -1
  32. package/dist/multisig/helpers.js +1 -1
  33. package/dist/multisig/helpers.js.map +1 -1
  34. package/dist/multisig/helpers.test.js +2 -2
  35. package/dist/multisig/helpers.test.js.map +1 -1
  36. package/dist/multisig/proposal/execution.d.ts +18 -0
  37. package/dist/multisig/proposal/execution.d.ts.map +1 -0
  38. package/dist/multisig/proposal/execution.js +147 -0
  39. package/dist/multisig/proposal/execution.js.map +1 -0
  40. package/dist/multisig/proposal/parser.d.ts +17 -0
  41. package/dist/multisig/proposal/parser.d.ts.map +1 -0
  42. package/dist/multisig/proposal/parser.js +147 -0
  43. package/dist/multisig/proposal/parser.js.map +1 -0
  44. package/dist/multisig/signing.d.ts +5 -0
  45. package/dist/multisig/signing.d.ts.map +1 -0
  46. package/dist/multisig/signing.js +14 -0
  47. package/dist/multisig/signing.js.map +1 -0
  48. package/dist/multisig.d.ts +9 -13
  49. package/dist/multisig.d.ts.map +1 -1
  50. package/dist/multisig.js +109 -337
  51. package/dist/multisig.js.map +1 -1
  52. package/dist/multisig.test.js +8 -4
  53. package/dist/multisig.test.js.map +1 -1
  54. package/dist/signer.d.ts +2 -20
  55. package/dist/signer.d.ts.map +1 -1
  56. package/dist/signer.js +2 -82
  57. package/dist/signer.js.map +1 -1
  58. package/dist/signer.test.js +24 -24
  59. package/dist/signer.test.js.map +1 -1
  60. package/dist/signers/ecdsa.d.ts +12 -0
  61. package/dist/signers/ecdsa.d.ts.map +1 -0
  62. package/dist/signers/ecdsa.js +30 -0
  63. package/dist/signers/ecdsa.js.map +1 -0
  64. package/dist/signers/falcon.d.ts +12 -0
  65. package/dist/signers/falcon.d.ts.map +1 -0
  66. package/dist/signers/falcon.js +31 -0
  67. package/dist/signers/falcon.js.map +1 -0
  68. package/dist/signers/falcon.test.d.ts +2 -0
  69. package/dist/signers/falcon.test.d.ts.map +1 -0
  70. package/dist/signers/falcon.test.js +113 -0
  71. package/dist/signers/falcon.test.js.map +1 -0
  72. package/dist/signers/index.d.ts +5 -0
  73. package/dist/signers/index.d.ts.map +1 -0
  74. package/dist/signers/index.js +5 -0
  75. package/dist/signers/index.js.map +1 -0
  76. package/dist/signers/miden-wallet.d.ts +16 -0
  77. package/dist/signers/miden-wallet.d.ts.map +1 -0
  78. package/dist/signers/miden-wallet.js +35 -0
  79. package/dist/signers/miden-wallet.js.map +1 -0
  80. package/dist/signers/miden-wallet.test.d.ts +2 -0
  81. package/dist/signers/miden-wallet.test.d.ts.map +1 -0
  82. package/dist/signers/miden-wallet.test.js +107 -0
  83. package/dist/signers/miden-wallet.test.js.map +1 -0
  84. package/dist/signers/para.d.ts +21 -0
  85. package/dist/signers/para.d.ts.map +1 -0
  86. package/dist/signers/para.js +43 -0
  87. package/dist/signers/para.js.map +1 -0
  88. package/dist/signers/para.test.d.ts +2 -0
  89. package/dist/signers/para.test.d.ts.map +1 -0
  90. package/dist/signers/para.test.js +88 -0
  91. package/dist/signers/para.test.js.map +1 -0
  92. package/dist/transaction/consumeNotes.d.ts +3 -3
  93. package/dist/transaction/consumeNotes.d.ts.map +1 -1
  94. package/dist/transaction/consumeNotes.js +11 -7
  95. package/dist/transaction/consumeNotes.js.map +1 -1
  96. package/dist/transaction/options.d.ts +2 -2
  97. package/dist/transaction/options.d.ts.map +1 -1
  98. package/dist/transaction/p2id.d.ts +1 -1
  99. package/dist/transaction/p2id.d.ts.map +1 -1
  100. package/dist/transaction/p2id.js +5 -5
  101. package/dist/transaction/p2id.js.map +1 -1
  102. package/dist/transaction/summary.d.ts +1 -1
  103. package/dist/transaction/summary.d.ts.map +1 -1
  104. package/dist/transaction/summary.js +1 -1
  105. package/dist/transaction/summary.js.map +1 -1
  106. package/dist/transaction/updatePsm.d.ts +1 -1
  107. package/dist/transaction/updatePsm.d.ts.map +1 -1
  108. package/dist/transaction/updatePsm.js +5 -5
  109. package/dist/transaction/updatePsm.js.map +1 -1
  110. package/dist/transaction/updateSigners.d.ts +1 -1
  111. package/dist/transaction/updateSigners.d.ts.map +1 -1
  112. package/dist/transaction/updateSigners.js +5 -5
  113. package/dist/transaction/updateSigners.js.map +1 -1
  114. package/dist/transaction.test.js +1 -1
  115. package/dist/transaction.test.js.map +1 -1
  116. package/dist/types.d.ts +1 -1
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/utils/digest.d.ts +6 -0
  119. package/dist/utils/digest.d.ts.map +1 -0
  120. package/dist/utils/digest.js +22 -0
  121. package/dist/utils/digest.js.map +1 -0
  122. package/dist/utils/ecdsa.d.ts +8 -0
  123. package/dist/utils/ecdsa.d.ts.map +1 -0
  124. package/dist/utils/ecdsa.js +60 -0
  125. package/dist/utils/ecdsa.js.map +1 -0
  126. package/dist/utils/ecdsa.test.d.ts +2 -0
  127. package/dist/utils/ecdsa.test.d.ts.map +1 -0
  128. package/dist/utils/ecdsa.test.js +85 -0
  129. package/dist/utils/ecdsa.test.js.map +1 -0
  130. package/dist/utils/index.d.ts +1 -0
  131. package/dist/utils/index.d.ts.map +1 -1
  132. package/dist/utils/index.js +1 -0
  133. package/dist/utils/index.js.map +1 -1
  134. package/dist/utils/key.d.ts +10 -0
  135. package/dist/utils/key.d.ts.map +1 -0
  136. package/dist/utils/key.js +38 -0
  137. package/dist/utils/key.js.map +1 -0
  138. package/dist/utils/key.test.d.ts +2 -0
  139. package/dist/utils/key.test.d.ts.map +1 -0
  140. package/dist/utils/key.test.js +80 -0
  141. package/dist/utils/key.test.js.map +1 -0
  142. package/dist/utils/random.d.ts +1 -1
  143. package/dist/utils/random.d.ts.map +1 -1
  144. package/dist/utils/random.js +1 -1
  145. package/dist/utils/random.js.map +1 -1
  146. package/dist/utils/signature.d.ts +2 -1
  147. package/dist/utils/signature.d.ts.map +1 -1
  148. package/dist/utils/signature.js +6 -3
  149. package/dist/utils/signature.js.map +1 -1
  150. package/dist/utils/signature.test.js +11 -11
  151. package/dist/utils/signature.test.js.map +1 -1
  152. package/dist/utils/word.d.ts +6 -1
  153. package/dist/utils/word.d.ts.map +1 -1
  154. package/dist/utils/word.js +11 -0
  155. package/dist/utils/word.js.map +1 -1
  156. package/dist/utils/word.test.js +54 -3
  157. package/dist/utils/word.test.js.map +1 -1
  158. package/package.json +4 -5
  159. package/src/account/builder.ts +7 -5
  160. package/src/account/masm.ts +103 -99
  161. package/src/account/storage.ts +19 -7
  162. package/src/client.test.ts +4 -4
  163. package/src/client.ts +3 -3
  164. package/src/index.ts +8 -1
  165. package/src/inspector.test.ts +38 -25
  166. package/src/inspector.ts +18 -10
  167. package/src/multisig/helpers.test.ts +2 -2
  168. package/src/multisig/helpers.ts +2 -1
  169. package/src/multisig/proposal/execution.ts +320 -0
  170. package/src/multisig/proposal/parser.ts +191 -0
  171. package/src/multisig/signing.ts +24 -0
  172. package/src/multisig.test.ts +8 -4
  173. package/src/multisig.ts +153 -434
  174. package/src/signer.ts +2 -95
  175. package/src/signers/ecdsa.ts +35 -0
  176. package/src/{signer.test.ts → signers/falcon.test.ts} +29 -33
  177. package/src/signers/falcon.ts +36 -0
  178. package/src/signers/index.ts +4 -0
  179. package/src/signers/miden-wallet.test.ts +119 -0
  180. package/src/signers/miden-wallet.ts +49 -0
  181. package/src/signers/para.test.ts +103 -0
  182. package/src/signers/para.ts +60 -0
  183. package/src/transaction/consumeNotes.ts +14 -10
  184. package/src/transaction/options.ts +2 -2
  185. package/src/transaction/p2id.ts +3 -8
  186. package/src/transaction/summary.ts +2 -2
  187. package/src/transaction/updatePsm.ts +5 -6
  188. package/src/transaction/updateSigners.ts +5 -6
  189. package/src/transaction.test.ts +1 -1
  190. package/src/types.ts +1 -1
  191. package/src/utils/digest.ts +25 -0
  192. package/src/utils/ecdsa.test.ts +104 -0
  193. package/src/utils/ecdsa.ts +77 -0
  194. package/src/utils/index.ts +1 -0
  195. package/src/utils/key.test.ts +89 -0
  196. package/src/utils/key.ts +49 -0
  197. package/src/utils/random.ts +1 -1
  198. package/src/utils/signature.test.ts +11 -11
  199. package/src/utils/signature.ts +10 -3
  200. package/src/utils/word.test.ts +57 -3
  201. package/src/utils/word.ts +13 -1
@@ -0,0 +1,191 @@
1
+ import type {
2
+ DeltaObject,
3
+ DeltaStatus,
4
+ ProposalMetadata as PsmProposalMetadata,
5
+ } from '@openzeppelin/psm-client';
6
+ import type {
7
+ ProposalMetadata,
8
+ ProposalType,
9
+ TransactionProposal,
10
+ TransactionProposalSignature,
11
+ TransactionProposalStatus,
12
+ } from '../../types.js';
13
+
14
+ export function buildPsmMetadata(metadata: ProposalMetadata): PsmProposalMetadata {
15
+ const base: PsmProposalMetadata = {
16
+ proposalType: metadata.proposalType,
17
+ description: metadata.description,
18
+ salt: metadata.saltHex,
19
+ };
20
+
21
+ switch (metadata.proposalType) {
22
+ case 'consume_notes':
23
+ return {
24
+ ...base,
25
+ noteIds: metadata.noteIds,
26
+ };
27
+ case 'p2id':
28
+ return {
29
+ ...base,
30
+ recipientId: metadata.recipientId,
31
+ faucetId: metadata.faucetId,
32
+ amount: metadata.amount,
33
+ };
34
+ case 'switch_psm':
35
+ return {
36
+ ...base,
37
+ targetThreshold: metadata.targetThreshold,
38
+ signerCommitments: metadata.targetSignerCommitments,
39
+ newPsmPubkey: metadata.newPsmPubkey,
40
+ newPsmEndpoint: metadata.newPsmEndpoint,
41
+ };
42
+ case 'add_signer':
43
+ case 'remove_signer':
44
+ case 'change_threshold':
45
+ return {
46
+ ...base,
47
+ targetThreshold: metadata.targetThreshold,
48
+ signerCommitments: metadata.targetSignerCommitments,
49
+ };
50
+ case 'unknown':
51
+ return base;
52
+ default:
53
+ return base;
54
+ }
55
+ }
56
+
57
+ export function fromPsmMetadata(psm: PsmProposalMetadata): ProposalMetadata | undefined {
58
+ if (!psm.proposalType) return undefined;
59
+
60
+ const base = {
61
+ description: psm.description ?? '',
62
+ saltHex: psm.salt,
63
+ };
64
+
65
+ switch (psm.proposalType) {
66
+ case 'p2id':
67
+ return {
68
+ ...base,
69
+ proposalType: 'p2id',
70
+ recipientId: psm.recipientId ?? '',
71
+ faucetId: psm.faucetId ?? '',
72
+ amount: psm.amount ?? '0',
73
+ };
74
+ case 'consume_notes':
75
+ return {
76
+ ...base,
77
+ proposalType: 'consume_notes',
78
+ noteIds: psm.noteIds ?? [],
79
+ };
80
+ case 'switch_psm':
81
+ return {
82
+ ...base,
83
+ proposalType: 'switch_psm',
84
+ newPsmPubkey: psm.newPsmPubkey ?? '',
85
+ newPsmEndpoint: psm.newPsmEndpoint,
86
+ targetThreshold: psm.targetThreshold,
87
+ targetSignerCommitments: psm.signerCommitments,
88
+ };
89
+ case 'add_signer':
90
+ case 'remove_signer':
91
+ case 'change_threshold':
92
+ return {
93
+ ...base,
94
+ proposalType: psm.proposalType,
95
+ targetThreshold: psm.targetThreshold ?? 0,
96
+ targetSignerCommitments: psm.signerCommitments ?? [],
97
+ };
98
+ default:
99
+ return undefined;
100
+ }
101
+ }
102
+
103
+ export function deltaStatusToProposalStatus(
104
+ status: DeltaStatus,
105
+ signaturesRequired: number,
106
+ ): TransactionProposalStatus {
107
+ switch (status.status) {
108
+ case 'pending': {
109
+ const signaturesCollected = status.cosignerSigs.length;
110
+ if (signaturesCollected >= signaturesRequired) {
111
+ return { type: 'ready' };
112
+ }
113
+ return {
114
+ type: 'pending',
115
+ signaturesCollected,
116
+ signaturesRequired,
117
+ signers: status.cosignerSigs.map((s) => s.signerId),
118
+ };
119
+ }
120
+ case 'candidate':
121
+ return { type: 'ready' };
122
+ case 'canonical':
123
+ case 'discarded':
124
+ return { type: 'finalized' };
125
+ }
126
+ }
127
+
128
+ interface DeltaToProposalParams {
129
+ delta: DeltaObject;
130
+ proposalId: string;
131
+ metadata: ProposalMetadata;
132
+ signaturesRequired: number;
133
+ existingSignatures?: TransactionProposalSignature[];
134
+ }
135
+
136
+ export function deltaToProposal({
137
+ delta,
138
+ proposalId,
139
+ metadata,
140
+ signaturesRequired,
141
+ existingSignatures,
142
+ }: DeltaToProposalParams): TransactionProposal {
143
+ const status = deltaStatusToProposalStatus(delta.status, signaturesRequired);
144
+
145
+ const signaturesFromStatus =
146
+ delta.status.status === 'pending'
147
+ ? delta.status.cosignerSigs.map((s) => ({
148
+ signerId: s.signerId,
149
+ signature: s.signature,
150
+ timestamp: s.timestamp,
151
+ }))
152
+ : [];
153
+
154
+ const signaturesMap = new Map<string, TransactionProposalSignature>();
155
+ for (const sig of existingSignatures ?? []) {
156
+ signaturesMap.set(sig.signerId, sig);
157
+ }
158
+ for (const sig of signaturesFromStatus) {
159
+ signaturesMap.set(sig.signerId, sig);
160
+ }
161
+ const signatures = Array.from(signaturesMap.values());
162
+
163
+ return {
164
+ id: proposalId,
165
+ commitment: proposalId,
166
+ accountId: delta.accountId,
167
+ nonce: delta.nonce,
168
+ status,
169
+ txSummary: delta.deltaPayload.txSummary.data,
170
+ signatures,
171
+ metadata,
172
+ };
173
+ }
174
+
175
+ export function resolveMetadata(
176
+ delta: DeltaObject,
177
+ existingMetadata?: ProposalMetadata,
178
+ ): ProposalMetadata | undefined {
179
+ if (existingMetadata) return existingMetadata;
180
+ if (!delta.deltaPayload.metadata) return undefined;
181
+ return fromPsmMetadata(delta.deltaPayload.metadata);
182
+ }
183
+
184
+ export function signatureRequirementForProposal(
185
+ metadata: ProposalMetadata,
186
+ defaultThreshold: number,
187
+ getEffectiveThreshold: (proposalType: ProposalType) => number,
188
+ ): number {
189
+ if (metadata.proposalType === 'unknown') return defaultThreshold;
190
+ return getEffectiveThreshold(metadata.proposalType);
191
+ }
@@ -0,0 +1,24 @@
1
+ import type { ProposalSignature, Signer } from '@openzeppelin/psm-client';
2
+ import type { SignatureScheme } from '../types.js';
3
+
4
+ export function toPsmSignature(
5
+ scheme: SignatureScheme,
6
+ signatureHex: string,
7
+ publicKey?: string,
8
+ ): ProposalSignature {
9
+ if (scheme === 'ecdsa') {
10
+ if (!publicKey) {
11
+ throw new Error('ECDSA signature requires publicKey');
12
+ }
13
+ return { scheme: 'ecdsa', signature: signatureHex, publicKey };
14
+ }
15
+ return { scheme: 'falcon', signature: signatureHex };
16
+ }
17
+
18
+ export async function buildPsmSignatureFromSigner(
19
+ signer: Signer,
20
+ commitment: string,
21
+ ): Promise<ProposalSignature> {
22
+ const signatureHex = await signer.signCommitment(commitment);
23
+ return toPsmSignature(signer.scheme, signatureHex, signer.publicKey);
24
+ }
@@ -3,7 +3,7 @@ import { Multisig } from './multisig.js';
3
3
  import { PsmHttpClient, type Signer } from '@openzeppelin/psm-client';
4
4
 
5
5
  // Mock the Miden SDK
6
- vi.mock('@demox-labs/miden-sdk', () => ({
6
+ vi.mock('@miden-sdk/miden-sdk', () => ({
7
7
  AccountId: {
8
8
  fromHex: vi.fn((hex: string) => ({ toString: () => hex })),
9
9
  },
@@ -73,8 +73,12 @@ vi.mock('./utils/signature.js', () => ({
73
73
  vi.mock('./utils/encoding.js', async () => {
74
74
  const actual = await vi.importActual<typeof import('./utils/encoding.js')>('./utils/encoding.js');
75
75
  return {
76
- ...actual,
76
+ ensureHexPrefix: actual.ensureHexPrefix,
77
77
  normalizeHexWord: vi.fn((hex: string) => '0x' + hex.replace(/^0x/i, '').padStart(64, '0')),
78
+ bytesToHex: actual.bytesToHex,
79
+ hexToBytes: actual.hexToBytes,
80
+ uint8ArrayToBase64: actual.uint8ArrayToBase64,
81
+ base64ToUint8Array: actual.base64ToUint8Array,
78
82
  };
79
83
  });
80
84
 
@@ -97,8 +101,8 @@ describe('Multisig', () => {
97
101
  scheme: 'falcon',
98
102
  commitment: '0x' + '1'.repeat(64),
99
103
  publicKey: '0x' + '2'.repeat(64),
100
- signAccountIdWithTimestamp: vi.fn().mockReturnValue('0x' + 'a'.repeat(128)),
101
- signCommitment: vi.fn().mockReturnValue('0x' + 'b'.repeat(128)),
104
+ signAccountIdWithTimestamp: vi.fn().mockResolvedValue('0x' + 'a'.repeat(128)),
105
+ signCommitment: vi.fn().mockResolvedValue('0x' + 'b'.repeat(128)),
102
106
  };
103
107
 
104
108
  psm.setSigner(mockSigner);