@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,88 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach } from 'vitest';
2
- import { EcdsaSigner } from './ecdsa.js';
3
- vi.mock('@miden-sdk/miden-sdk', () => {
4
- const mockSignature = {
5
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5]),
6
- };
7
- const mockCommitment = {
8
- toHex: () => '0x' + 'a'.repeat(64),
9
- };
10
- const mockPublicKey = {
11
- toCommitment: () => mockCommitment,
12
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
13
- };
14
- const mockSecretKey = {
15
- publicKey: vi.fn().mockReturnValue(mockPublicKey),
16
- sign: vi.fn().mockReturnValue(mockSignature),
17
- };
18
- return {
19
- AuthSecretKey: vi.fn(),
20
- Word: {
21
- fromHex: vi.fn((hex) => ({
22
- toHex: () => hex,
23
- toFelts: () => [1, 2, 3, 4],
24
- })),
25
- },
26
- AccountId: {
27
- fromHex: vi.fn((hex) => ({
28
- toString: () => hex,
29
- prefix: () => ({ asInt: () => BigInt(1) }),
30
- suffix: () => ({ asInt: () => BigInt(2) }),
31
- })),
32
- },
33
- Felt: vi.fn().mockImplementation((value) => ({ value })),
34
- FeltArray: vi.fn().mockImplementation((elements) => elements),
35
- Rpo256: {
36
- hashElements: vi.fn().mockReturnValue({
37
- toHex: () => '0x' + 'b'.repeat(64),
38
- toFelts: () => [1, 2, 3, 4],
39
- }),
40
- },
41
- };
42
- });
43
- describe('EcdsaSigner', () => {
44
- let mockSecretKey;
45
- let signer;
46
- beforeEach(async () => {
47
- vi.clearAllMocks();
48
- mockSecretKey = {
49
- publicKey: vi.fn().mockReturnValue({
50
- toCommitment: () => ({ toHex: () => '0x' + 'a'.repeat(64) }),
51
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
52
- }),
53
- sign: vi.fn().mockReturnValue({
54
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5]),
55
- }),
56
- };
57
- signer = new EcdsaSigner(mockSecretKey);
58
- });
59
- it('signs request-bound auth messages for ECDSA', async () => {
60
- const { Rpo256 } = await import('@miden-sdk/miden-sdk');
61
- const signature = await signer.signRequest('0x' + 'a'.repeat(30), 1700000000, { toBytes: () => new Uint8Array([1, 2, 3, 4]) });
62
- expect(signature).toBe('0x0102030405');
63
- expect(mockSecretKey.sign).toHaveBeenCalled();
64
- expect(Rpo256.hashElements).toHaveBeenCalledTimes(2);
65
- });
66
- it('skips rebinding when the signer key is already attached to the same account', async () => {
67
- const accountId = '0x' + 'd'.repeat(30);
68
- const midenClient = {
69
- keystore: {
70
- getAccountId: vi.fn().mockResolvedValue({ toString: () => accountId }),
71
- insert: vi.fn().mockResolvedValue(undefined),
72
- },
73
- };
74
- await signer.bindAccountKey(midenClient, accountId);
75
- expect(midenClient.keystore.insert).not.toHaveBeenCalled();
76
- });
77
- it('throws when the signer key is already attached to a different account', async () => {
78
- const midenClient = {
79
- keystore: {
80
- getAccountId: vi.fn().mockResolvedValue({ toString: () => '0x' + 'e'.repeat(30) }),
81
- insert: vi.fn().mockResolvedValue(undefined),
82
- },
83
- };
84
- await expect(signer.bindAccountKey(midenClient, '0x' + 'd'.repeat(30))).rejects.toThrow('already bound to account');
85
- expect(midenClient.keystore.insert).not.toHaveBeenCalled();
86
- });
87
- });
88
- //# sourceMappingURL=ecdsa.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ecdsa.test.js","sourceRoot":"","sources":["../../src/signers/ecdsa.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=falcon.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"falcon.test.d.ts","sourceRoot":"","sources":["../../src/signers/falcon.test.ts"],"names":[],"mappings":""}
@@ -1,161 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { FalconSigner } from './falcon.js';
3
- vi.mock('@miden-sdk/miden-sdk', () => {
4
- const mockSignature = {
5
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
6
- };
7
- const mockCommitment = {
8
- toHex: () => '0x' + 'a'.repeat(64),
9
- };
10
- const mockPublicKey = {
11
- toCommitment: () => mockCommitment,
12
- serialize: () => new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
13
- };
14
- const mockSecretKey = {
15
- publicKey: vi.fn().mockReturnValue(mockPublicKey),
16
- sign: vi.fn().mockReturnValue(mockSignature),
17
- };
18
- return {
19
- AuthSecretKey: {
20
- rpoFalconWithRNG: vi.fn().mockReturnValue(mockSecretKey),
21
- },
22
- Word: {
23
- fromHex: vi.fn((hex) => ({
24
- toHex: () => hex,
25
- toFelts: () => [1, 2, 3, 4],
26
- })),
27
- },
28
- AccountId: {
29
- fromHex: vi.fn((hex) => ({
30
- toString: () => hex,
31
- prefix: () => ({ asInt: () => BigInt(1) }),
32
- suffix: () => ({ asInt: () => BigInt(2) }),
33
- })),
34
- },
35
- Felt: vi.fn().mockImplementation((v) => ({ value: v })),
36
- FeltArray: vi.fn().mockImplementation((arr) => arr),
37
- Rpo256: {
38
- hashElements: vi.fn().mockReturnValue({
39
- toHex: () => '0x' + 'b'.repeat(64),
40
- toFelts: () => [1, 2, 3, 4],
41
- }),
42
- },
43
- };
44
- });
45
- describe('FalconSigner', () => {
46
- let mockSecretKey;
47
- let signer;
48
- beforeEach(async () => {
49
- vi.clearAllMocks();
50
- const { AuthSecretKey } = await import('@miden-sdk/miden-sdk');
51
- mockSecretKey = AuthSecretKey.rpoFalconWithRNG(new Uint8Array(32));
52
- signer = new FalconSigner(mockSecretKey);
53
- });
54
- describe('constructor', () => {
55
- it('extracts commitment from public key', () => {
56
- expect(signer.commitment).toBe('0x' + 'a'.repeat(64));
57
- });
58
- it('extracts public key without first byte', () => {
59
- expect(signer.publicKey).toBe('0x0102030405060708090a0b0c0d0e0f');
60
- });
61
- it('calls publicKey method on secret key', () => {
62
- expect(mockSecretKey.publicKey).toHaveBeenCalled();
63
- });
64
- });
65
- describe('signAccountIdWithTimestamp', () => {
66
- it('handles account ID with 0x prefix', async () => {
67
- const signature = await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
68
- expect(signature).toMatch(/^0x[a-f0-9]+$/);
69
- });
70
- it('handles account ID without 0x prefix', async () => {
71
- const signature = await signer.signAccountIdWithTimestamp('a'.repeat(30), 1700000000);
72
- expect(signature).toMatch(/^0x[a-f0-9]+$/);
73
- });
74
- it('calls sign method with hashed digest', async () => {
75
- await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
76
- expect(mockSecretKey.sign).toHaveBeenCalled();
77
- });
78
- it('returns signature without first byte', async () => {
79
- const signature = await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
80
- expect(signature).toBe('0x010203040506070809');
81
- });
82
- it('includes timestamp in signed payload', async () => {
83
- const { Felt, FeltArray } = await import('@miden-sdk/miden-sdk');
84
- await signer.signAccountIdWithTimestamp('0x' + 'a'.repeat(30), 1700000000);
85
- expect(FeltArray).toHaveBeenCalledWith(expect.arrayContaining([
86
- expect.anything(),
87
- expect.anything(),
88
- expect.anything(),
89
- expect.anything(),
90
- ]));
91
- });
92
- });
93
- describe('signRequest', () => {
94
- it('signs account ID, timestamp, and request payload for Falcon auth', async () => {
95
- const { Rpo256 } = await import('@miden-sdk/miden-sdk');
96
- const signature = await signer.signRequest('0x' + 'a'.repeat(30), 1700000000, {
97
- toBytes: () => new Uint8Array([1, 2, 3, 4]),
98
- });
99
- expect(signature).toBe('0x010203040506070809');
100
- expect(mockSecretKey.sign).toHaveBeenCalled();
101
- expect(Rpo256.hashElements).toHaveBeenCalledTimes(2);
102
- });
103
- });
104
- describe('signCommitment', () => {
105
- it('handles commitment with 0x prefix', async () => {
106
- const signature = await signer.signCommitment('0x' + 'c'.repeat(64));
107
- expect(signature).toMatch(/^0x[a-f0-9]+$/);
108
- });
109
- it('handles commitment without 0x prefix', async () => {
110
- const signature = await signer.signCommitment('c'.repeat(64));
111
- expect(signature).toMatch(/^0x[a-f0-9]+$/);
112
- });
113
- it('pads short commitment hex to 64 characters', async () => {
114
- const signature = await signer.signCommitment('abc');
115
- expect(signature).toMatch(/^0x[a-f0-9]+$/);
116
- });
117
- it('calls sign method with word from hex', async () => {
118
- await signer.signCommitment('0x' + 'c'.repeat(64));
119
- expect(mockSecretKey.sign).toHaveBeenCalled();
120
- });
121
- it('returns signature without first byte', async () => {
122
- const signature = await signer.signCommitment('0x' + 'c'.repeat(64));
123
- expect(signature).toBe('0x010203040506070809');
124
- });
125
- });
126
- describe('bindAccountKey', () => {
127
- it('inserts the signer key when the commitment is not bound yet', async () => {
128
- const midenClient = {
129
- keystore: {
130
- getAccountId: vi.fn().mockResolvedValue(null),
131
- insert: vi.fn().mockResolvedValue(undefined),
132
- },
133
- };
134
- await signer.bindAccountKey(midenClient, '0x' + 'd'.repeat(30));
135
- expect(midenClient.keystore.getAccountId).toHaveBeenCalledTimes(1);
136
- expect(midenClient.keystore.insert).toHaveBeenCalledTimes(1);
137
- });
138
- it('skips insert when the signer key is already bound to the same account', async () => {
139
- const accountId = '0x' + 'd'.repeat(30);
140
- const midenClient = {
141
- keystore: {
142
- getAccountId: vi.fn().mockResolvedValue({ toString: () => accountId }),
143
- insert: vi.fn().mockResolvedValue(undefined),
144
- },
145
- };
146
- await signer.bindAccountKey(midenClient, accountId);
147
- expect(midenClient.keystore.insert).not.toHaveBeenCalled();
148
- });
149
- it('throws when the signer key is already bound to a different account', async () => {
150
- const midenClient = {
151
- keystore: {
152
- getAccountId: vi.fn().mockResolvedValue({ toString: () => '0x' + 'e'.repeat(30) }),
153
- insert: vi.fn().mockResolvedValue(undefined),
154
- },
155
- };
156
- await expect(signer.bindAccountKey(midenClient, '0x' + 'd'.repeat(30))).rejects.toThrow('already bound to account');
157
- expect(midenClient.keystore.insert).not.toHaveBeenCalled();
158
- });
159
- });
160
- });
161
- //# sourceMappingURL=falcon.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"falcon.test.js","sourceRoot":"","sources":["../../src/signers/falcon.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=miden-wallet.ecdsa-recovery.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"miden-wallet.ecdsa-recovery.test.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.ecdsa-recovery.test.ts"],"names":[],"mappings":""}
@@ -1,148 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { secp256k1 } from '@noble/curves/secp256k1';
3
- import { keccak_256 } from '@noble/hashes/sha3.js';
4
- import { MidenWalletSigner } from './miden-wallet.js';
5
- import { tryComputeEcdsaCommitmentHex } from '../utils/signature.js';
6
- import { bytesToHex, hexToBytes } from '../utils/encoding.js';
7
- import { buildGuardianSignatureFromSigner } from '../multisig/signing.js';
8
- // Real-crypto repro for the reported failure:
9
- // "assertion failed with error message: invalid public key commitment"
10
- //
11
- // These tests use the real WASM SDK (Poseidon2/PublicKey, via tests/setup-wasm.ts)
12
- // and real secp256k1 keypairs — NOT mocks — so they exercise the exact kernel
13
- // invariant `Poseidon2(publicKey) == pub_key_commitment` that the transaction
14
- // kernel enforces in `ecdsa_k256_keccak.masm` (`assert_eqw "invalid public key
15
- // commitment"`). A wallet-delegated ECDSA cosigner whose `publicKey` degrades to
16
- // the 32-byte commitment — or is a valid-but-wrong key — fails that invariant.
17
- // Deterministic keys so the repro is reproducible run-to-run.
18
- const PRIVATE_KEY = hexToBytes('0x' + '11'.repeat(32));
19
- const COMPRESSED_PUBKEY_HEX = bytesToHex(secp256k1.getPublicKey(PRIVATE_KEY, true));
20
- // A second, unrelated key: valid secp256k1 but NOT the one the commitment is for.
21
- const OTHER_PRIVATE_KEY = hexToBytes('0x' + '22'.repeat(32));
22
- const OTHER_COMPRESSED_PUBKEY_HEX = bytesToHex(secp256k1.getPublicKey(OTHER_PRIVATE_KEY, true));
23
- /** Asserts a nullable value is present and returns it narrowed (avoids `!`). */
24
- function expectPresent(value) {
25
- expect(value ?? null).not.toBeNull();
26
- return value;
27
- }
28
- /**
29
- * A wallet that signs like the real Miden Wallet ECDSA path: it keccak256-hashes
30
- * the word bytes it receives, produces a 65-byte `r||s||v` signature, and prepends
31
- * a 1-byte scheme tag (which `MidenWalletSigner.signWord` strips via `slice(1)`).
32
- */
33
- function ecdsaWallet(privateKey) {
34
- return {
35
- async signBytes(data) {
36
- const msgHash = keccak_256(data);
37
- const sig = secp256k1.sign(msgHash, privateKey);
38
- const compact = sig.toCompactRawBytes(); // 64 bytes: r || s
39
- const tagged = new Uint8Array(1 + 65);
40
- tagged[0] = 1; // scheme tag, dropped by the signer
41
- tagged.set(compact, 1);
42
- tagged[1 + 64] = sig.recovery; // recovery byte v
43
- return tagged;
44
- },
45
- };
46
- }
47
- /** Minimal ECDSA delegate (`localAuthSigner`) carrying a fixed public key. */
48
- function ecdsaDelegate(commitment, publicKey) {
49
- return {
50
- commitment,
51
- publicKey,
52
- scheme: 'ecdsa',
53
- signAccountIdWithTimestamp: async () => '0x00',
54
- signCommitment: async () => '0x00',
55
- };
56
- }
57
- describe('MidenWalletSigner ECDSA public-key resolution', () => {
58
- it('resolves the real ECDSA public key from its own signature so it hashes to the account commitment', async () => {
59
- // The account's stored commitment is Poseidon2(pubkey) — exactly what the kernel checks.
60
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
61
- // Wallet-delegated ECDSA cosigner constructed WITHOUT an explicit public key —
62
- // the reported failure path, where `publicKey` silently fell back to the commitment.
63
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
64
- await signer.signCommitment(accountCommitment);
65
- // The resolved public key must be the real 33-byte key, not the 32-byte commitment...
66
- expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
67
- expect(signer.publicKey).not.toBe(accountCommitment);
68
- // ...and it must Poseidon2-hash back to the commitment (the kernel's assert_eqw).
69
- expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
70
- });
71
- it('fails closed when the wallet signature recovers a key that does not match the commitment', async () => {
72
- // The account commitment is for PRIVATE_KEY, but the wallet signs with a
73
- // different key. Recovery must reject the mismatch rather than trust it.
74
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
75
- const signer = new MidenWalletSigner(ecdsaWallet(OTHER_PRIVATE_KEY), accountCommitment, 'ecdsa');
76
- await signer.signCommitment(accountCommitment);
77
- expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
78
- });
79
- it('accepts an explicit ECDSA public key whose commitment matches, without needing to sign', () => {
80
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
81
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, COMPRESSED_PUBKEY_HEX);
82
- expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
83
- expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
84
- });
85
- it('rejects an explicit ECDSA public key whose commitment does not match the signer commitment', () => {
86
- // A well-formed 33-byte key (passes format validation) that belongs to a
87
- // different account. It must be rejected at the source, not carried into signing.
88
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
89
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, OTHER_COMPRESSED_PUBKEY_HEX);
90
- expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
91
- });
92
- it('rejects an explicit ECDSA key that is a valid length but not a secp256k1 point', () => {
93
- // 33-byte, correct compressed tag, but x is off-curve — must be rejected at
94
- // construction, SDK-independently, not silently carried to execute time.
95
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
96
- expect(() => new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, '0x02' + 'ff'.repeat(32))).toThrow(/not a valid secp256k1 point/);
97
- });
98
- it('compresses an explicitly-provided 65-byte uncompressed public key', () => {
99
- const uncompressed = bytesToHex(secp256k1.getPublicKey(PRIVATE_KEY, false)); // 65 bytes
100
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
101
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', undefined, uncompressed);
102
- expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
103
- });
104
- it('accepts a localAuthSigner whose ECDSA public key matches the commitment', () => {
105
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
106
- const delegate = ecdsaDelegate(accountCommitment, COMPRESSED_PUBKEY_HEX);
107
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
108
- expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
109
- expect(tryComputeEcdsaCommitmentHex(signer.publicKey)).toBe(accountCommitment);
110
- });
111
- it('rejects a localAuthSigner whose ECDSA public key does not match the commitment', () => {
112
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
113
- const delegate = ecdsaDelegate(accountCommitment, OTHER_COMPRESSED_PUBKEY_HEX);
114
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
115
- expect(() => signer.publicKey).toThrow(/does not match the signer commitment/);
116
- });
117
- it('rejects a localAuthSigner whose ECDSA key is a valid length but not a secp256k1 point', () => {
118
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
119
- const delegate = ecdsaDelegate(accountCommitment, '0x02' + 'ff'.repeat(32));
120
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa', delegate);
121
- expect(() => signer.publicKey).toThrow(/not a valid secp256k1 point/);
122
- });
123
- it('resolves the public key through a non-signCommitment path (signLookupMessage)', async () => {
124
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
125
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
126
- await signer.signLookupMessage(accountCommitment, 1700000000);
127
- expect(signer.publicKey).toBe(COMPRESSED_PUBKEY_HEX);
128
- });
129
- it('builds a guardian ProposalSignature carrying the recovered key (integration via buildGuardianSignatureFromSigner)', async () => {
130
- const accountCommitment = expectPresent(tryComputeEcdsaCommitmentHex(COMPRESSED_PUBKEY_HEX));
131
- const signer = new MidenWalletSigner(ecdsaWallet(PRIVATE_KEY), accountCommitment, 'ecdsa');
132
- // The exact call the guardian flow makes (multisig/signing.ts): sign the
133
- // commitment, then read `signer.publicKey` for the ProposalSignature that is sent
134
- // to the guardian and packed into the transaction advice map. This is the seam
135
- // where the report observed `publicKey === commitment`.
136
- const proposalSignature = await buildGuardianSignatureFromSigner(signer, accountCommitment);
137
- expect(proposalSignature.scheme).toBe('ecdsa');
138
- if (proposalSignature.scheme !== 'ecdsa')
139
- throw new Error('expected an ecdsa ProposalSignature');
140
- // The signature reaching the guardian/kernel must carry the real 33-byte key,
141
- // not the 32-byte commitment — otherwise Poseidon2(publicKey) == commitment fails.
142
- const resolvedKey = expectPresent(proposalSignature.publicKey);
143
- expect(resolvedKey).toBe(COMPRESSED_PUBKEY_HEX);
144
- expect(resolvedKey).not.toBe(accountCommitment);
145
- expect(tryComputeEcdsaCommitmentHex(resolvedKey)).toBe(accountCommitment);
146
- });
147
- });
148
- //# sourceMappingURL=miden-wallet.ecdsa-recovery.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"miden-wallet.ecdsa-recovery.test.js","sourceRoot":"","sources":["../../src/signers/miden-wallet.ecdsa-recovery.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=miden-wallet.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"miden-wallet.test.d.ts","sourceRoot":"","sources":["../../src/signers/miden-wallet.test.ts"],"names":[],"mappings":""}
@@ -1,164 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { MidenWalletSigner } from './miden-wallet.js';
3
- vi.mock('@miden-sdk/miden-sdk', () => ({
4
- Word: {
5
- fromHex: vi.fn((hex) => ({
6
- toHex: () => hex,
7
- toFelts: () => [
8
- { asInt: () => 1n },
9
- { asInt: () => 2n },
10
- { asInt: () => 3n },
11
- { asInt: () => 4n },
12
- ],
13
- })),
14
- },
15
- AccountId: {
16
- fromHex: vi.fn(() => ({
17
- prefix: () => ({ asInt: () => BigInt(1) }),
18
- suffix: () => ({ asInt: () => BigInt(2) }),
19
- })),
20
- },
21
- Felt: vi.fn().mockImplementation((v) => ({ value: v })),
22
- FeltArray: vi.fn().mockImplementation((arr) => arr),
23
- Rpo256: {
24
- hashElements: vi.fn().mockReturnValue({
25
- toHex: () => '0x' + 'bb'.repeat(32),
26
- toFelts: () => [
27
- { asInt: () => 10n },
28
- { asInt: () => 20n },
29
- { asInt: () => 30n },
30
- { asInt: () => 40n },
31
- ],
32
- }),
33
- },
34
- }));
35
- describe('MidenWalletSigner', () => {
36
- let mockWallet;
37
- beforeEach(() => {
38
- vi.clearAllMocks();
39
- mockWallet = {
40
- signBytes: vi.fn().mockResolvedValue(new Uint8Array([0x00, 0x01, 0x02, 0x03, 0x04])),
41
- };
42
- });
43
- describe('constructor', () => {
44
- it('should set commitment, scheme, and publicKey', () => {
45
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
46
- expect(signer.commitment).toBe('0xcommitment');
47
- expect(signer.scheme).toBe('falcon');
48
- expect(signer.publicKey).toBe('0xcommitment');
49
- });
50
- it('throws on an invalid explicit ECDSA publicKey instead of falling back to the commitment', () => {
51
- expect(() => new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', undefined, '0xwalletpubkey')).toThrow(/invalid ECDSA public key/);
52
- });
53
- it('does not fall back to the commitment for an ECDSA signer with no key (throws until a signature exists)', () => {
54
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa');
55
- expect(() => signer.publicKey).toThrow(/not available yet/);
56
- });
57
- // ECDSA publicKey resolution against a real commitment (explicit key and
58
- // localAuthSigner, match and mismatch) needs real Poseidon2 and is covered in
59
- // miden-wallet.ecdsa-recovery.test.ts, which runs the WASM SDK.
60
- });
61
- describe('signAccountIdWithTimestamp', () => {
62
- it('should delegate to localAuthSigner when present', async () => {
63
- const localSigner = {
64
- commitment: '0xlocal',
65
- publicKey: '0xlocalpubkey',
66
- scheme: 'ecdsa',
67
- signAccountIdWithTimestamp: vi.fn().mockResolvedValue('0xlocalsig'),
68
- signCommitment: vi.fn(),
69
- };
70
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
71
- const result = await signer.signAccountIdWithTimestamp('0x' + 'aa'.repeat(15), 1700000000);
72
- expect(result).toBe('0xlocalsig');
73
- expect(localSigner.signAccountIdWithTimestamp).toHaveBeenCalledWith('0x' + 'aa'.repeat(15), 1700000000);
74
- expect(mockWallet.signBytes).not.toHaveBeenCalled();
75
- });
76
- it('should use wallet signing when no localAuthSigner', async () => {
77
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
78
- const result = await signer.signAccountIdWithTimestamp('0x' + 'aa'.repeat(15), 1700000000);
79
- expect(mockWallet.signBytes).toHaveBeenCalled();
80
- expect(result).toMatch(/^0x/);
81
- });
82
- });
83
- describe('signCommitment', () => {
84
- it('should always use wallet signing', async () => {
85
- const localSigner = {
86
- commitment: '0xlocal',
87
- publicKey: '0xlocalpubkey',
88
- scheme: 'ecdsa',
89
- signAccountIdWithTimestamp: vi.fn(),
90
- signCommitment: vi.fn(),
91
- };
92
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
93
- await signer.signCommitment('0x' + 'cc'.repeat(32));
94
- expect(mockWallet.signBytes).toHaveBeenCalled();
95
- });
96
- });
97
- describe('signRequest', () => {
98
- it('delegates to localAuthSigner when present', async () => {
99
- const localSigner = {
100
- commitment: '0xlocal',
101
- publicKey: '0xlocalpubkey',
102
- scheme: 'ecdsa',
103
- signAccountIdWithTimestamp: vi.fn(),
104
- signRequest: vi.fn().mockResolvedValue('0xlocalsig'),
105
- signCommitment: vi.fn(),
106
- };
107
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
108
- const result = await signer.signRequest('0x' + 'aa'.repeat(15), 1700000000, { toBytes: () => new Uint8Array([1, 2, 3, 4]) });
109
- expect(result).toBe('0xlocalsig');
110
- expect(localSigner.signRequest).toHaveBeenCalled();
111
- expect(mockWallet.signBytes).not.toHaveBeenCalled();
112
- });
113
- it('uses request-bound auth digest for wallet-backed ECDSA signing', async () => {
114
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa');
115
- await signer.signRequest('0x' + 'aa'.repeat(15), 1700000000, { toBytes: () => new Uint8Array([1, 2, 3, 4]) });
116
- expect(mockWallet.signBytes).toHaveBeenCalledWith(expect.any(Uint8Array), 'word');
117
- });
118
- });
119
- describe('signLookupMessage', () => {
120
- it('delegates to localAuthSigner when present', async () => {
121
- const localSigner = {
122
- commitment: '0xlocal',
123
- publicKey: '0xlocalpubkey',
124
- scheme: 'ecdsa',
125
- signAccountIdWithTimestamp: vi.fn(),
126
- signCommitment: vi.fn(),
127
- signLookupMessage: vi.fn().mockResolvedValue('0xlocallookupsig'),
128
- };
129
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
130
- const result = await signer.signLookupMessage('0x' + 'cc'.repeat(32), 1700000000);
131
- expect(result).toBe('0xlocallookupsig');
132
- expect(localSigner.signLookupMessage).toHaveBeenCalledWith('0x' + 'cc'.repeat(32), 1700000000);
133
- expect(mockWallet.signBytes).not.toHaveBeenCalled();
134
- });
135
- it('uses wallet signing over the LookupAuthMessage digest when no localAuthSigner', async () => {
136
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
137
- const result = await signer.signLookupMessage('0x' + 'cc'.repeat(32), 1700000000);
138
- expect(mockWallet.signBytes).toHaveBeenCalledTimes(1);
139
- expect(mockWallet.signBytes).toHaveBeenCalledWith(expect.any(Uint8Array), 'word');
140
- expect(result).toMatch(/^0x/);
141
- });
142
- it('falls back to wallet signing when localAuthSigner does not implement signLookupMessage', async () => {
143
- const localSigner = {
144
- commitment: '0xlocal',
145
- publicKey: '0xlocalpubkey',
146
- scheme: 'ecdsa',
147
- signAccountIdWithTimestamp: vi.fn(),
148
- signCommitment: vi.fn(),
149
- };
150
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'ecdsa', localSigner);
151
- await signer.signLookupMessage('0x' + 'cc'.repeat(32), 1700000000);
152
- expect(mockWallet.signBytes).toHaveBeenCalledTimes(1);
153
- });
154
- });
155
- describe('signature byte stripping', () => {
156
- it('should strip the first byte from wallet signature response', async () => {
157
- mockWallet.signBytes.mockResolvedValue(new Uint8Array([0x00, 0xaa, 0xbb, 0xcc]));
158
- const signer = new MidenWalletSigner(mockWallet, '0xcommitment', 'falcon');
159
- const result = await signer.signCommitment('0x' + 'cc'.repeat(32));
160
- expect(result).toBe('0xaabbcc');
161
- });
162
- });
163
- });
164
- //# sourceMappingURL=miden-wallet.test.js.map