@openzeppelin/miden-multisig-client 0.17.0-rc.2 → 0.17.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 (278) hide show
  1. package/README.md +172 -47
  2. package/dist/account/builder.d.ts +2 -2
  3. package/dist/account/builder.d.ts.map +1 -1
  4. package/dist/account/builder.js +49 -24
  5. package/dist/account/builder.js.map +1 -1
  6. package/dist/connectivity.d.ts +2 -0
  7. package/dist/connectivity.d.ts.map +1 -1
  8. package/dist/connectivity.js +7 -4
  9. package/dist/connectivity.js.map +1 -1
  10. package/dist/index.d.ts +8 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +7 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/multisig/authArgErrors.d.ts +59 -0
  15. package/dist/multisig/authArgErrors.d.ts.map +1 -0
  16. package/dist/multisig/authArgErrors.js +115 -0
  17. package/dist/multisig/authArgErrors.js.map +1 -0
  18. package/dist/multisig/helpers.d.ts +5 -0
  19. package/dist/multisig/helpers.d.ts.map +1 -1
  20. package/dist/multisig/helpers.js +7 -2
  21. package/dist/multisig/helpers.js.map +1 -1
  22. package/dist/multisig.d.ts +140 -0
  23. package/dist/multisig.d.ts.map +1 -1
  24. package/dist/multisig.js +419 -12
  25. package/dist/multisig.js.map +1 -1
  26. package/dist/procedures.d.ts +1 -1
  27. package/dist/procedures.js +1 -1
  28. package/dist/recovery/proposalNoteImport.d.ts +173 -0
  29. package/dist/recovery/proposalNoteImport.d.ts.map +1 -0
  30. package/dist/recovery/proposalNoteImport.js +411 -0
  31. package/dist/recovery/proposalNoteImport.js.map +1 -0
  32. package/dist/recovery/publicNoteBackfill.d.ts +168 -0
  33. package/dist/recovery/publicNoteBackfill.d.ts.map +1 -0
  34. package/dist/recovery/publicNoteBackfill.js +368 -0
  35. package/dist/recovery/publicNoteBackfill.js.map +1 -0
  36. package/dist/recovery/recoverNotes.d.ts +147 -0
  37. package/dist/recovery/recoverNotes.d.ts.map +1 -0
  38. package/dist/recovery/recoverNotes.js +163 -0
  39. package/dist/recovery/recoverNotes.js.map +1 -0
  40. package/dist/recovery/transportDrain.d.ts +124 -0
  41. package/dist/recovery/transportDrain.d.ts.map +1 -0
  42. package/dist/recovery/transportDrain.js +262 -0
  43. package/dist/recovery/transportDrain.js.map +1 -0
  44. package/dist/transaction/consumeNotes.d.ts.map +1 -1
  45. package/dist/transaction/consumeNotes.js +4 -1
  46. package/dist/transaction/consumeNotes.js.map +1 -1
  47. package/dist/transaction/p2id.d.ts.map +1 -1
  48. package/dist/transaction/p2id.js +4 -1
  49. package/dist/transaction/p2id.js.map +1 -1
  50. package/dist/transaction/summary.d.ts +10 -4
  51. package/dist/transaction/summary.d.ts.map +1 -1
  52. package/dist/transaction/summary.js +13 -7
  53. package/dist/transaction/summary.js.map +1 -1
  54. package/dist/transaction/updateGuardian.js +4 -1
  55. package/dist/transaction/updateGuardian.js.map +1 -1
  56. package/dist/transaction/updateProcedureThreshold.js +4 -1
  57. package/dist/transaction/updateProcedureThreshold.js.map +1 -1
  58. package/dist/transaction/updateSigners.js +4 -1
  59. package/dist/transaction/updateSigners.js.map +1 -1
  60. package/dist/transaction.d.ts +1 -1
  61. package/dist/transaction.d.ts.map +1 -1
  62. package/dist/transaction.js +1 -1
  63. package/dist/transaction.js.map +1 -1
  64. package/package.json +14 -10
  65. package/src/account/builder.ts +87 -35
  66. package/src/connectivity.ts +9 -4
  67. package/src/index.ts +34 -1
  68. package/src/multisig/authArgErrors.ts +138 -0
  69. package/src/multisig/helpers.ts +7 -2
  70. package/src/multisig.ts +513 -20
  71. package/src/procedures.ts +1 -1
  72. package/src/recovery/proposalNoteImport.ts +548 -0
  73. package/src/recovery/publicNoteBackfill.ts +502 -0
  74. package/src/recovery/recoverNotes.ts +288 -0
  75. package/src/recovery/transportDrain.ts +330 -0
  76. package/src/transaction/consumeNotes.ts +4 -1
  77. package/src/transaction/p2id.ts +4 -1
  78. package/src/transaction/summary.ts +13 -7
  79. package/src/transaction/updateGuardian.ts +4 -1
  80. package/src/transaction/updateProcedureThreshold.ts +4 -1
  81. package/src/transaction/updateSigners.ts +4 -1
  82. package/src/transaction.ts +1 -1
  83. package/dist/account/builder.test.d.ts +0 -2
  84. package/dist/account/builder.test.d.ts.map +0 -1
  85. package/dist/account/builder.test.js +0 -166
  86. package/dist/account/builder.test.js.map +0 -1
  87. package/dist/account/masm/account-components/auth.d.ts +0 -2
  88. package/dist/account/masm/account-components/auth.d.ts.map +0 -1
  89. package/dist/account/masm/account-components/auth.js +0 -46
  90. package/dist/account/masm/account-components/auth.js.map +0 -1
  91. package/dist/account/masm/index.d.ts +0 -2
  92. package/dist/account/masm/index.d.ts.map +0 -1
  93. package/dist/account/masm/index.js +0 -4
  94. package/dist/account/masm/index.js.map +0 -1
  95. package/dist/account/masm.d.ts +0 -2
  96. package/dist/account/masm.d.ts.map +0 -1
  97. package/dist/account/masm.js +0 -4
  98. package/dist/account/masm.js.map +0 -1
  99. package/dist/account/storage.test.d.ts +0 -2
  100. package/dist/account/storage.test.d.ts.map +0 -1
  101. package/dist/account/storage.test.js +0 -73
  102. package/dist/account/storage.test.js.map +0 -1
  103. package/dist/client.test.d.ts +0 -2
  104. package/dist/client.test.d.ts.map +0 -1
  105. package/dist/client.test.js +0 -380
  106. package/dist/client.test.js.map +0 -1
  107. package/dist/connectivity.test.d.ts +0 -2
  108. package/dist/connectivity.test.d.ts.map +0 -1
  109. package/dist/connectivity.test.js +0 -61
  110. package/dist/connectivity.test.js.map +0 -1
  111. package/dist/inspector.test.d.ts +0 -2
  112. package/dist/inspector.test.d.ts.map +0 -1
  113. package/dist/inspector.test.js +0 -425
  114. package/dist/inspector.test.js.map +0 -1
  115. package/dist/lookupAuth.test.d.ts +0 -2
  116. package/dist/lookupAuth.test.d.ts.map +0 -1
  117. package/dist/lookupAuth.test.js +0 -138
  118. package/dist/lookupAuth.test.js.map +0 -1
  119. package/dist/multisig/consumeNotesErrors.test.d.ts +0 -2
  120. package/dist/multisig/consumeNotesErrors.test.d.ts.map +0 -1
  121. package/dist/multisig/consumeNotesErrors.test.js +0 -28
  122. package/dist/multisig/consumeNotesErrors.test.js.map +0 -1
  123. package/dist/multisig/helpers.test.d.ts +0 -2
  124. package/dist/multisig/helpers.test.d.ts.map +0 -1
  125. package/dist/multisig/helpers.test.js +0 -94
  126. package/dist/multisig/helpers.test.js.map +0 -1
  127. package/dist/multisig.test.d.ts +0 -2
  128. package/dist/multisig.test.d.ts.map +0 -1
  129. package/dist/multisig.test.js +0 -4112
  130. package/dist/multisig.test.js.map +0 -1
  131. package/dist/proposal/factory.test.d.ts +0 -2
  132. package/dist/proposal/factory.test.d.ts.map +0 -1
  133. package/dist/proposal/factory.test.js +0 -32
  134. package/dist/proposal/factory.test.js.map +0 -1
  135. package/dist/proposal/metadata.test.d.ts +0 -2
  136. package/dist/proposal/metadata.test.d.ts.map +0 -1
  137. package/dist/proposal/metadata.test.js +0 -193
  138. package/dist/proposal/metadata.test.js.map +0 -1
  139. package/dist/prover/config.test.d.ts +0 -2
  140. package/dist/prover/config.test.d.ts.map +0 -1
  141. package/dist/prover/config.test.js +0 -54
  142. package/dist/prover/config.test.js.map +0 -1
  143. package/dist/prover/errors.test.d.ts +0 -2
  144. package/dist/prover/errors.test.d.ts.map +0 -1
  145. package/dist/prover/errors.test.js +0 -29
  146. package/dist/prover/errors.test.js.map +0 -1
  147. package/dist/prover/retry.test.d.ts +0 -2
  148. package/dist/prover/retry.test.d.ts.map +0 -1
  149. package/dist/prover/retry.test.js +0 -20
  150. package/dist/prover/retry.test.js.map +0 -1
  151. package/dist/prover/workflow.test.d.ts +0 -2
  152. package/dist/prover/workflow.test.d.ts.map +0 -1
  153. package/dist/prover/workflow.test.js +0 -105
  154. package/dist/prover/workflow.test.js.map +0 -1
  155. package/dist/raw-client.test.d.ts +0 -2
  156. package/dist/raw-client.test.d.ts.map +0 -1
  157. package/dist/raw-client.test.js +0 -111
  158. package/dist/raw-client.test.js.map +0 -1
  159. package/dist/rpc/config.test.d.ts +0 -2
  160. package/dist/rpc/config.test.d.ts.map +0 -1
  161. package/dist/rpc/config.test.js +0 -24
  162. package/dist/rpc/config.test.js.map +0 -1
  163. package/dist/rpc/errors.test.d.ts +0 -2
  164. package/dist/rpc/errors.test.d.ts.map +0 -1
  165. package/dist/rpc/errors.test.js +0 -34
  166. package/dist/rpc/errors.test.js.map +0 -1
  167. package/dist/rpc/retry.test.d.ts +0 -2
  168. package/dist/rpc/retry.test.d.ts.map +0 -1
  169. package/dist/rpc/retry.test.js +0 -98
  170. package/dist/rpc/retry.test.js.map +0 -1
  171. package/dist/signers/ecdsa.test.d.ts +0 -2
  172. package/dist/signers/ecdsa.test.d.ts.map +0 -1
  173. package/dist/signers/ecdsa.test.js +0 -88
  174. package/dist/signers/ecdsa.test.js.map +0 -1
  175. package/dist/signers/falcon.test.d.ts +0 -2
  176. package/dist/signers/falcon.test.d.ts.map +0 -1
  177. package/dist/signers/falcon.test.js +0 -161
  178. package/dist/signers/falcon.test.js.map +0 -1
  179. package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts +0 -2
  180. package/dist/signers/miden-wallet.ecdsa-recovery.test.d.ts.map +0 -1
  181. package/dist/signers/miden-wallet.ecdsa-recovery.test.js +0 -148
  182. package/dist/signers/miden-wallet.ecdsa-recovery.test.js.map +0 -1
  183. package/dist/signers/miden-wallet.test.d.ts +0 -2
  184. package/dist/signers/miden-wallet.test.d.ts.map +0 -1
  185. package/dist/signers/miden-wallet.test.js +0 -164
  186. package/dist/signers/miden-wallet.test.js.map +0 -1
  187. package/dist/signers/para.test.d.ts +0 -2
  188. package/dist/signers/para.test.d.ts.map +0 -1
  189. package/dist/signers/para.test.js +0 -146
  190. package/dist/signers/para.test.js.map +0 -1
  191. package/dist/transaction/index.d.ts +0 -8
  192. package/dist/transaction/index.d.ts.map +0 -1
  193. package/dist/transaction/index.js +0 -7
  194. package/dist/transaction/index.js.map +0 -1
  195. package/dist/transaction/p2id.test.d.ts +0 -2
  196. package/dist/transaction/p2id.test.d.ts.map +0 -1
  197. package/dist/transaction/p2id.test.js +0 -246
  198. package/dist/transaction/p2id.test.js.map +0 -1
  199. package/dist/transaction/rpoRandomCoin.test.d.ts +0 -2
  200. package/dist/transaction/rpoRandomCoin.test.d.ts.map +0 -1
  201. package/dist/transaction/rpoRandomCoin.test.js +0 -52
  202. package/dist/transaction/rpoRandomCoin.test.js.map +0 -1
  203. package/dist/transaction/summary.test.d.ts +0 -2
  204. package/dist/transaction/summary.test.d.ts.map +0 -1
  205. package/dist/transaction/summary.test.js +0 -26
  206. package/dist/transaction/summary.test.js.map +0 -1
  207. package/dist/transaction.test.d.ts +0 -2
  208. package/dist/transaction.test.d.ts.map +0 -1
  209. package/dist/transaction.test.js +0 -122
  210. package/dist/transaction.test.js.map +0 -1
  211. package/dist/types/proposal.test.d.ts +0 -2
  212. package/dist/types/proposal.test.d.ts.map +0 -1
  213. package/dist/types/proposal.test.js +0 -56
  214. package/dist/types/proposal.test.js.map +0 -1
  215. package/dist/utils/digest.test.d.ts +0 -2
  216. package/dist/utils/digest.test.d.ts.map +0 -1
  217. package/dist/utils/digest.test.js +0 -48
  218. package/dist/utils/digest.test.js.map +0 -1
  219. package/dist/utils/ecdsa.test.d.ts +0 -2
  220. package/dist/utils/ecdsa.test.d.ts.map +0 -1
  221. package/dist/utils/ecdsa.test.js +0 -131
  222. package/dist/utils/ecdsa.test.js.map +0 -1
  223. package/dist/utils/encoding.test.d.ts +0 -2
  224. package/dist/utils/encoding.test.d.ts.map +0 -1
  225. package/dist/utils/encoding.test.js +0 -185
  226. package/dist/utils/encoding.test.js.map +0 -1
  227. package/dist/utils/key.test.d.ts +0 -2
  228. package/dist/utils/key.test.d.ts.map +0 -1
  229. package/dist/utils/key.test.js +0 -82
  230. package/dist/utils/key.test.js.map +0 -1
  231. package/dist/utils/signature.test.d.ts +0 -2
  232. package/dist/utils/signature.test.d.ts.map +0 -1
  233. package/dist/utils/signature.test.js +0 -164
  234. package/dist/utils/signature.test.js.map +0 -1
  235. package/dist/utils/word.test.d.ts +0 -2
  236. package/dist/utils/word.test.d.ts.map +0 -1
  237. package/dist/utils/word.test.js +0 -54
  238. package/dist/utils/word.test.js.map +0 -1
  239. package/masm/account_components/auth/guarded_multisig.masm +0 -42
  240. package/src/account/builder.test.ts +0 -238
  241. package/src/account/masm/account-components/auth.ts +0 -46
  242. package/src/account/masm/index.ts +0 -4
  243. package/src/account/masm.ts +0 -4
  244. package/src/account/storage.test.ts +0 -90
  245. package/src/client.test.ts +0 -473
  246. package/src/connectivity.test.ts +0 -67
  247. package/src/inspector.test.ts +0 -542
  248. package/src/lookupAuth.test.ts +0 -185
  249. package/src/multisig/consumeNotesErrors.test.ts +0 -43
  250. package/src/multisig/helpers.test.ts +0 -114
  251. package/src/multisig.test.ts +0 -5008
  252. package/src/proposal/factory.test.ts +0 -40
  253. package/src/proposal/metadata.test.ts +0 -235
  254. package/src/prover/config.test.ts +0 -90
  255. package/src/prover/errors.test.ts +0 -61
  256. package/src/prover/retry.test.ts +0 -38
  257. package/src/prover/workflow.test.ts +0 -145
  258. package/src/raw-client.test.ts +0 -171
  259. package/src/rpc/config.test.ts +0 -45
  260. package/src/rpc/errors.test.ts +0 -69
  261. package/src/rpc/retry.test.ts +0 -144
  262. package/src/signers/ecdsa.test.ts +0 -111
  263. package/src/signers/falcon.test.ts +0 -197
  264. package/src/signers/miden-wallet.ecdsa-recovery.test.ts +0 -201
  265. package/src/signers/miden-wallet.test.ts +0 -206
  266. package/src/signers/para.test.ts +0 -186
  267. package/src/transaction/index.ts +0 -13
  268. package/src/transaction/p2id.test.ts +0 -371
  269. package/src/transaction/rpoRandomCoin.test.ts +0 -64
  270. package/src/transaction/summary.test.ts +0 -32
  271. package/src/transaction.test.ts +0 -142
  272. package/src/types/proposal.test.ts +0 -68
  273. package/src/utils/digest.test.ts +0 -55
  274. package/src/utils/ecdsa.test.ts +0 -164
  275. package/src/utils/encoding.test.ts +0 -233
  276. package/src/utils/key.test.ts +0 -91
  277. package/src/utils/signature.test.ts +0 -210
  278. package/src/utils/word.test.ts +0 -64
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.test.d.ts","sourceRoot":"","sources":["../../src/utils/key.test.ts"],"names":[],"mappings":""}
@@ -1,82 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { PublicKeyFormat } from './key.js';
3
- vi.mock('@miden-sdk/miden-sdk', () => ({
4
- Word: class {
5
- u64s;
6
- constructor(u64s) {
7
- this.u64s = u64s;
8
- }
9
- toHex() {
10
- const h3 = this.u64s[3].toString(16).padStart(16, '0');
11
- const h2 = this.u64s[2].toString(16).padStart(16, '0');
12
- const h1 = this.u64s[1].toString(16).padStart(16, '0');
13
- const h0 = this.u64s[0].toString(16).padStart(16, '0');
14
- return '0x' + h3 + h2 + h1 + h0;
15
- }
16
- },
17
- }));
18
- vi.mock('./signature.js', () => ({
19
- ECDSA_AUTH_SCHEME_ID: 1,
20
- FALCON_AUTH_SCHEME_ID: 2,
21
- tryComputeCommitmentHex: vi.fn((_hex, _scheme) => '0x' + 'cc'.repeat(32)),
22
- }));
23
- describe('PublicKeyFormat', () => {
24
- describe('parse', () => {
25
- it('should treat 32-byte input as Word commitment with falcon scheme', () => {
26
- const bytes = new Uint8Array(32);
27
- bytes[0] = 0x42;
28
- const result = PublicKeyFormat.parse(bytes);
29
- expect(result.scheme).toBe('falcon');
30
- expect(result.commitment).toBe(result.publicKeyHex);
31
- expect(result.publicKeyHex).toMatch(/^0x[a-f0-9]{64}$/);
32
- });
33
- it('should detect 0x02-prefixed key as falcon', () => {
34
- const bytes = new Uint8Array(200);
35
- bytes[0] = 0x02;
36
- bytes[1] = 0xab;
37
- const result = PublicKeyFormat.parse(bytes);
38
- expect(result.scheme).toBe('falcon');
39
- expect(result.commitment).toBe('0x' + 'cc'.repeat(32));
40
- });
41
- it('should detect 0x01-prefixed 34-byte key as ecdsa', () => {
42
- const bytes = new Uint8Array(34);
43
- bytes[0] = 0x01;
44
- bytes[1] = 0x02;
45
- const result = PublicKeyFormat.parse(bytes);
46
- expect(result.scheme).toBe('ecdsa');
47
- expect(result.commitment).toBe('0x' + 'cc'.repeat(32));
48
- });
49
- it('should detect 33-byte input as ecdsa', () => {
50
- const bytes = new Uint8Array(33);
51
- bytes[0] = 0x02;
52
- const result = PublicKeyFormat.parse(bytes);
53
- expect(result.scheme).toBe('ecdsa');
54
- });
55
- it('should detect 65-byte input as ecdsa', () => {
56
- const bytes = new Uint8Array(65);
57
- bytes[0] = 0x04;
58
- const result = PublicKeyFormat.parse(bytes);
59
- expect(result.scheme).toBe('ecdsa');
60
- });
61
- it('should default to falcon for unknown lengths', () => {
62
- const bytes = new Uint8Array(500);
63
- const result = PublicKeyFormat.parse(bytes);
64
- expect(result.scheme).toBe('falcon');
65
- });
66
- });
67
- describe('wordBytesToHex', () => {
68
- it('should convert 32 zero bytes to a valid hex string', () => {
69
- const bytes = new Uint8Array(32);
70
- const result = PublicKeyFormat.wordBytesToHex(bytes);
71
- expect(result).toMatch(/^0x[a-f0-9]{64}$/);
72
- });
73
- it('should produce consistent output for same input', () => {
74
- const bytes = new Uint8Array(32);
75
- bytes[0] = 0xff;
76
- const a = PublicKeyFormat.wordBytesToHex(bytes);
77
- const b = PublicKeyFormat.wordBytesToHex(bytes);
78
- expect(a).toBe(b);
79
- });
80
- });
81
- });
82
- //# sourceMappingURL=key.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key.test.js","sourceRoot":"","sources":["../../src/utils/key.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=signature.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signature.test.d.ts","sourceRoot":"","sources":["../../src/utils/signature.test.ts"],"names":[],"mappings":""}
@@ -1,164 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { signatureHexToBytes, buildSignatureAdviceEntry, mergeSignatureAdviceMaps, toWord, tryComputeEcdsaCommitmentHex, } from './signature.js';
3
- // Mock the Miden SDK
4
- vi.mock('@miden-sdk/miden-sdk', () => ({
5
- AdviceMap: vi.fn().mockImplementation(() => ({
6
- insert: vi.fn(),
7
- })),
8
- Felt: vi.fn().mockImplementation((v) => ({ value: v })),
9
- FeltArray: vi.fn().mockImplementation((arr) => arr),
10
- Poseidon2: {
11
- hashElements: vi.fn().mockReturnValue({
12
- toHex: () => '0x' + 'h'.repeat(64),
13
- }),
14
- },
15
- Signature: {
16
- deserialize: vi.fn().mockReturnValue({
17
- toPreparedSignature: vi.fn().mockReturnValue([1, 2, 3, 4]),
18
- }),
19
- },
20
- Word: {
21
- fromHex: vi.fn((hex) => ({
22
- toHex: () => hex,
23
- toFelts: () => [
24
- { value: 1n },
25
- { value: 2n },
26
- { value: 3n },
27
- { value: 4n },
28
- ],
29
- })),
30
- },
31
- PublicKey: {
32
- deserialize: vi.fn().mockReturnValue({
33
- toCommitment: () => ({ toHex: () => '0x' + 'c'.repeat(64) }),
34
- }),
35
- },
36
- }));
37
- describe('signature utilities', () => {
38
- beforeEach(() => {
39
- vi.clearAllMocks();
40
- });
41
- describe('signatureHexToBytes', () => {
42
- it('prepends auth scheme byte (2 = Falcon Poseidon2)', () => {
43
- const result = signatureHexToBytes('deadbeef');
44
- expect(result[0]).toBe(2);
45
- });
46
- it('prepends auth scheme byte (1 = ECDSA)', () => {
47
- const result = signatureHexToBytes('deadbeef', 'ecdsa');
48
- expect(result[0]).toBe(1);
49
- });
50
- it('converts hex to bytes after prefix', () => {
51
- const result = signatureHexToBytes('deadbeef');
52
- expect(result.slice(1)).toEqual(new Uint8Array([0xde, 0xad, 0xbe, 0xef]));
53
- });
54
- it('handles 0x prefix', () => {
55
- const result = signatureHexToBytes('0xaabbccdd');
56
- expect(result[0]).toBe(2);
57
- expect(result.slice(1)).toEqual(new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
58
- });
59
- it('returns correct length (input bytes + 1)', () => {
60
- const sigHex = 'a'.repeat(128); // 64 bytes
61
- const result = signatureHexToBytes(sigHex);
62
- expect(result.length).toBe(65); // 64 bytes + 1 prefix byte
63
- });
64
- it('handles empty signature', () => {
65
- const result = signatureHexToBytes('');
66
- expect(result).toEqual(new Uint8Array([2]));
67
- });
68
- it('handles empty with 0x prefix', () => {
69
- const result = signatureHexToBytes('0x');
70
- expect(result).toEqual(new Uint8Array([2]));
71
- });
72
- });
73
- describe('buildSignatureAdviceEntry', () => {
74
- it('returns key and values', async () => {
75
- const { Word, Signature } = await import('@miden-sdk/miden-sdk');
76
- const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
77
- const message = Word.fromHex('0x' + 'b'.repeat(64));
78
- const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
79
- const { key, values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
80
- expect(key).toBeDefined();
81
- expect(values).toBeDefined();
82
- });
83
- it('hashes pubkey commitment and message to produce key', async () => {
84
- const { Word, Signature, Poseidon2 } = await import('@miden-sdk/miden-sdk');
85
- const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
86
- const message = Word.fromHex('0x' + 'b'.repeat(64));
87
- const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
88
- buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
89
- expect(Poseidon2.hashElements).toHaveBeenCalled();
90
- });
91
- it('uses toPreparedSignature to get values', async () => {
92
- const { Word, Signature } = await import('@miden-sdk/miden-sdk');
93
- const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
94
- const message = Word.fromHex('0x' + 'b'.repeat(64));
95
- const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
96
- const { values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
97
- expect(signature.toPreparedSignature).toHaveBeenCalledWith(message);
98
- expect(values).toEqual([1, 2, 3, 4]);
99
- });
100
- });
101
- describe('mergeSignatureAdviceMaps', () => {
102
- it('inserts all entries into advice map', async () => {
103
- const { AdviceMap, Word, Signature } = await import('@miden-sdk/miden-sdk');
104
- const advice = new AdviceMap();
105
- const entries = [
106
- {
107
- key: Word.fromHex('0x' + 'a'.repeat(64)),
108
- values: [{ value: 1n }, { value: 2n }],
109
- },
110
- {
111
- key: Word.fromHex('0x' + 'b'.repeat(64)),
112
- values: [{ value: 3n }, { value: 4n }],
113
- },
114
- ];
115
- const result = mergeSignatureAdviceMaps(advice, entries);
116
- expect(advice.insert).toHaveBeenCalledTimes(2);
117
- expect(result).toBe(advice);
118
- });
119
- it('returns the same advice map', async () => {
120
- const { AdviceMap } = await import('@miden-sdk/miden-sdk');
121
- const advice = new AdviceMap();
122
- const result = mergeSignatureAdviceMaps(advice, []);
123
- expect(result).toBe(advice);
124
- });
125
- it('handles empty entries array', async () => {
126
- const { AdviceMap } = await import('@miden-sdk/miden-sdk');
127
- const advice = new AdviceMap();
128
- mergeSignatureAdviceMaps(advice, []);
129
- expect(advice.insert).not.toHaveBeenCalled();
130
- });
131
- });
132
- describe('toWord', () => {
133
- it('creates Word from hex string', async () => {
134
- const { Word } = await import('@miden-sdk/miden-sdk');
135
- const word = toWord('abc123');
136
- expect(Word.fromHex).toHaveBeenCalled();
137
- expect(word).toBeDefined();
138
- });
139
- it('normalizes hex before creating Word', async () => {
140
- const { Word } = await import('@miden-sdk/miden-sdk');
141
- toWord('abc');
142
- // Should be called with normalized hex (0x + padded to 64 chars)
143
- expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'abc');
144
- });
145
- it('handles 0x prefix', async () => {
146
- const { Word } = await import('@miden-sdk/miden-sdk');
147
- toWord('0xdef');
148
- expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'def');
149
- });
150
- it('handles full 64-char hex', async () => {
151
- const { Word } = await import('@miden-sdk/miden-sdk');
152
- const fullHex = 'f'.repeat(64);
153
- toWord(fullHex);
154
- expect(Word.fromHex).toHaveBeenCalledWith('0x' + fullHex);
155
- });
156
- });
157
- describe('tryComputeEcdsaCommitmentHex', () => {
158
- it('returns normalized commitment when SDK supports ECDSA public keys', () => {
159
- const commitment = tryComputeEcdsaCommitmentHex('0x' + 'aa'.repeat(33));
160
- expect(commitment).toBe('0x' + 'c'.repeat(64));
161
- });
162
- });
163
- });
164
- //# sourceMappingURL=signature.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signature.test.js","sourceRoot":"","sources":["../../src/utils/signature.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=word.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"word.test.d.ts","sourceRoot":"","sources":["../../src/utils/word.test.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { wordElementToBigInt, wordToHex } from './word.js';
3
- import { Word } from '@miden-sdk/miden-sdk';
4
- // Mock the Miden SDK Word class
5
- vi.mock('@miden-sdk/miden-sdk', () => ({
6
- Word: {
7
- fromHex: (hex) => {
8
- // Parse hex string (remove 0x prefix if present)
9
- const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
10
- if (cleanHex.length !== 64) {
11
- throw new Error('Hex string must be 64 characters');
12
- }
13
- // Parse as big-endian: [e3_bytes][e2_bytes][e1_bytes][e0_bytes]
14
- const e3 = BigInt('0x' + cleanHex.slice(0, 16));
15
- const e2 = BigInt('0x' + cleanHex.slice(16, 32));
16
- const e1 = BigInt('0x' + cleanHex.slice(32, 48));
17
- const e0 = BigInt('0x' + cleanHex.slice(48, 64));
18
- const elements = new BigUint64Array([e0, e1, e2, e3]);
19
- return {
20
- toU64s: () => elements,
21
- toHex: () => {
22
- const h3 = elements[3].toString(16).padStart(16, '0');
23
- const h2 = elements[2].toString(16).padStart(16, '0');
24
- const h1 = elements[1].toString(16).padStart(16, '0');
25
- const h0 = elements[0].toString(16).padStart(16, '0');
26
- return '0x' + h3 + h2 + h1 + h0;
27
- },
28
- };
29
- },
30
- },
31
- }));
32
- describe('word utilities', () => {
33
- describe('wordElementToBigInt', () => {
34
- it('should return element at valid index', () => {
35
- const word = Word.fromHex('0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f');
36
- expect(wordElementToBigInt(word, 0)).toBe(BigInt('0xedd7134bdcdb4b6f'));
37
- expect(wordElementToBigInt(word, 3)).toBe(BigInt('0x016ab79593165e5b'));
38
- });
39
- it('should return 0n for invalid index', () => {
40
- const word = Word.fromHex('0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f');
41
- expect(wordElementToBigInt(word, -1)).toBe(0n);
42
- expect(wordElementToBigInt(word, 4)).toBe(0n);
43
- });
44
- });
45
- describe('wordToHex', () => {
46
- it('should convert word back to hex string', () => {
47
- const originalHex = '0xd6c130dba13c67ac4733915f24bea9d19f517f51a65c74ded7bcd27e066b400e';
48
- const word = Word.fromHex(originalHex);
49
- const hex = wordToHex(word);
50
- expect(hex).toBe(originalHex);
51
- });
52
- });
53
- });
54
- //# sourceMappingURL=word.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"word.test.js","sourceRoot":"","sources":["../../src/utils/word.test.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- # The MASM code of the Multi-Signature Authentication component integrated with a state guardian.
2
- #
3
- # See the `AuthGuardedMultisig` Rust type's documentation for more details.
4
-
5
- use miden::standards::auth::multisig
6
- use miden::standards::auth::guardian
7
-
8
- pub use {update_signers_and_threshold} from miden::standards::auth::multisig
9
- pub use {get_threshold_and_num_approvers} from miden::standards::auth::multisig
10
- pub use {set_procedure_threshold} from miden::standards::auth::multisig
11
- pub use {get_signer_at} from miden::standards::auth::multisig
12
- pub use {is_signer} from miden::standards::auth::multisig
13
-
14
- pub use {update_guardian_public_key} from miden::standards::auth::guardian
15
-
16
- #! Authenticate a transaction with multi-signature support and optional guardian verification.
17
- #!
18
- #! Inputs:
19
- #! Operand stack: [SALT]
20
- #! Outputs:
21
- #! Operand stack: []
22
- #!
23
- #! Invocation: call
24
- @auth_script
25
- pub proc auth_tx_guarded_multisig(salt: word)
26
- # zero the leading user params (not exposed through this component's interface); the SALT
27
- # occupies the trailing four
28
- push.0.0.0
29
- # => [0, 0, 0, SALT]
30
-
31
- exec.multisig::auth_tx
32
- # => [TX_SUMMARY_COMMITMENT]
33
-
34
- dupw
35
- # => [TX_SUMMARY_COMMITMENT, TX_SUMMARY_COMMITMENT]
36
-
37
- exec.guardian::verify_signature
38
- # => [TX_SUMMARY_COMMITMENT]
39
-
40
- exec.multisig::record_and_assert_new_tx
41
- # => []
42
- end
@@ -1,238 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { createMultisigAccount, validateMultisigConfig } from './builder.js';
3
- import { GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM } from './masm/account-components/auth.js';
4
-
5
- const {
6
- buildMultisigStorageSlots,
7
- buildGuardianStorageSlots,
8
- withSupportsAllTypes,
9
- compileComponent,
10
- MockAccountBuilder,
11
- } = vi.hoisted(() => {
12
- const buildMultisigStorageSlots = vi.fn(() => ['multisig-slots']);
13
- const buildGuardianStorageSlots = vi.fn(() => ['guardian-slots']);
14
- const withSupportsAllTypes = vi.fn((component) => component);
15
- const compileComponent = vi.fn((code, slots) => ({
16
- code,
17
- slots,
18
- withSupportsAllTypes: () => withSupportsAllTypes({ code, slots }),
19
- }));
20
-
21
- class MockAccountBuilder {
22
- accountType() {
23
- return this;
24
- }
25
-
26
- storageMode() {
27
- return this;
28
- }
29
-
30
- withAuthComponent() {
31
- return this;
32
- }
33
-
34
- withComponent() {
35
- return this;
36
- }
37
-
38
- withBasicWalletComponent() {
39
- return this;
40
- }
41
-
42
- build() {
43
- return {
44
- account: { id: () => ({ toString: () => '0x' + 'a'.repeat(30) }) },
45
- };
46
- }
47
-
48
- buildWithoutSchemaCommitment() {
49
- return {
50
- account: { id: () => ({ toString: () => '0x' + 'a'.repeat(30) }) },
51
- };
52
- }
53
- }
54
-
55
- return {
56
- buildMultisigStorageSlots,
57
- buildGuardianStorageSlots,
58
- withSupportsAllTypes,
59
- compileComponent,
60
- MockAccountBuilder,
61
- };
62
- });
63
-
64
- vi.mock('./storage.js', () => ({
65
- buildMultisigStorageSlots,
66
- buildGuardianStorageSlots,
67
- }));
68
-
69
- vi.mock('@miden-sdk/miden-sdk', () => ({
70
- AccountBuilder: MockAccountBuilder,
71
- AccountComponent: {
72
- compile: compileComponent,
73
- },
74
- AccountStorageMode: {
75
- public: () => 'public',
76
- private: () => 'private',
77
- },
78
- }));
79
-
80
- describe('createMultisigAccount', () => {
81
- beforeEach(() => {
82
- vi.stubGlobal('crypto', {
83
- getRandomValues(buffer: Uint8Array) {
84
- return buffer;
85
- },
86
- });
87
- buildMultisigStorageSlots.mockClear();
88
- buildGuardianStorageSlots.mockClear();
89
- withSupportsAllTypes.mockClear();
90
- compileComponent.mockClear();
91
- });
92
-
93
- function makeClient() {
94
- const authBuilder = {
95
- linkModule: vi.fn(),
96
- compileAccountComponentCode: vi.fn((source) => ({ source })),
97
- };
98
- const webClient = {
99
- createCodeBuilder: vi.fn().mockReturnValue(authBuilder),
100
- accounts: {
101
- insert: vi.fn().mockResolvedValue(undefined),
102
- },
103
- };
104
- return { authBuilder, webClient };
105
- }
106
-
107
- it('compiles the guarded component without re-linking SDK-provided modules (Falcon)', async () => {
108
- const { authBuilder, webClient } = makeClient();
109
-
110
- await createMultisigAccount(
111
- webClient as never,
112
- {
113
- threshold: 1,
114
- signerCommitments: ['0x' + '1'.repeat(64)],
115
- guardianCommitment: '0x' + '2'.repeat(64),
116
- },
117
- 'http://localhost:57291',
118
- );
119
-
120
- // The web SDK assembler already provides `miden::standards::auth::*`; re-linking would
121
- // raise a duplicate-definition error, so the builder must NOT call linkModule.
122
- expect(authBuilder.linkModule).not.toHaveBeenCalled();
123
- expect(authBuilder.compileAccountComponentCode).toHaveBeenCalledWith(
124
- GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM,
125
- );
126
- expect(webClient.accounts.insert).toHaveBeenCalledTimes(1);
127
- });
128
-
129
- it('uses the same scheme-agnostic component for ECDSA', async () => {
130
- const { authBuilder, webClient } = makeClient();
131
-
132
- await createMultisigAccount(
133
- webClient as never,
134
- {
135
- threshold: 1,
136
- signerCommitments: ['0x' + '1'.repeat(64)],
137
- guardianCommitment: '0x' + '2'.repeat(64),
138
- signatureScheme: 'ecdsa',
139
- },
140
- 'http://localhost:57291',
141
- );
142
-
143
- expect(authBuilder.linkModule).not.toHaveBeenCalled();
144
- expect(authBuilder.compileAccountComponentCode).toHaveBeenCalledWith(
145
- GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM,
146
- );
147
- expect(webClient.accounts.insert).toHaveBeenCalledTimes(1);
148
- });
149
- });
150
-
151
- describe('validateMultisigConfig', () => {
152
- const signer = '0x' + '1'.repeat(64);
153
-
154
- it('rejects a guardian commitment equal to a signer (matches upstream Rust invariant)', () => {
155
- expect(() =>
156
- validateMultisigConfig({
157
- threshold: 1,
158
- signerCommitments: [signer],
159
- guardianCommitment: signer,
160
- }),
161
- ).toThrow(/different from all signer commitments/);
162
- });
163
-
164
- it('accepts a distinct guardian commitment', () => {
165
- expect(() =>
166
- validateMultisigConfig({
167
- threshold: 1,
168
- signerCommitments: [signer],
169
- guardianCommitment: '0x' + '2'.repeat(64),
170
- }),
171
- ).not.toThrow();
172
- });
173
-
174
- describe('procedure threshold overrides vs update_procedure_threshold', () => {
175
- const signers = Array.from({ length: 5 }, (_, i) => '0x' + String(i + 1).repeat(64));
176
- const guardian = '0x' + '9'.repeat(64);
177
-
178
- const config = (
179
- threshold: number,
180
- procedureThresholds: Array<{ procedure: string; threshold: number }>,
181
- ) =>
182
- ({
183
- threshold,
184
- signerCommitments: signers,
185
- guardianCommitment: guardian,
186
- procedureThresholds,
187
- }) as Parameters<typeof validateMultisigConfig>[0];
188
-
189
- it('rejects an override above the default threshold that guards the setter', () => {
190
- expect(() =>
191
- validateMultisigConfig(config(2, [{ procedure: 'send_asset', threshold: 4 }])),
192
- ).toThrow(/exceeds the threshold of 2 that guards update_procedure_threshold/);
193
- });
194
-
195
- it('accepts the same override once the setter is raised to match', () => {
196
- expect(() =>
197
- validateMultisigConfig(
198
- config(2, [
199
- { procedure: 'send_asset', threshold: 4 },
200
- { procedure: 'update_procedure_threshold', threshold: 4 },
201
- ]),
202
- ),
203
- ).not.toThrow();
204
- });
205
-
206
- it('rejects an override above an explicitly raised setter', () => {
207
- expect(() =>
208
- validateMultisigConfig(
209
- config(2, [
210
- { procedure: 'send_asset', threshold: 4 },
211
- { procedure: 'update_procedure_threshold', threshold: 3 },
212
- ]),
213
- ),
214
- ).toThrow(/exceeds the threshold of 3 that guards update_procedure_threshold/);
215
- });
216
-
217
- it('accepts overrides at or below the default threshold', () => {
218
- expect(() =>
219
- validateMultisigConfig(
220
- config(3, [
221
- { procedure: 'send_asset', threshold: 3 },
222
- { procedure: 'receive_asset', threshold: 1 },
223
- ]),
224
- ),
225
- ).not.toThrow();
226
- });
227
-
228
- it('allows the setter override to exceed the default threshold', () => {
229
- // Raising only the setter is always safe: it makes overrides harder to
230
- // edit, never easier.
231
- expect(() =>
232
- validateMultisigConfig(
233
- config(2, [{ procedure: 'update_procedure_threshold', threshold: 5 }]),
234
- ),
235
- ).not.toThrow();
236
- });
237
- });
238
- });