@openzeppelin/miden-multisig-client 0.12.6

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 (215) hide show
  1. package/README.md +189 -0
  2. package/dist/account/builder.d.ts +23 -0
  3. package/dist/account/builder.d.ts.map +1 -0
  4. package/dist/account/builder.js +85 -0
  5. package/dist/account/builder.js.map +1 -0
  6. package/dist/account/index.d.ts +6 -0
  7. package/dist/account/index.d.ts.map +1 -0
  8. package/dist/account/index.js +6 -0
  9. package/dist/account/index.js.map +1 -0
  10. package/dist/account/masm.d.ts +3 -0
  11. package/dist/account/masm.d.ts.map +1 -0
  12. package/dist/account/masm.js +605 -0
  13. package/dist/account/masm.js.map +1 -0
  14. package/dist/account/storage.d.ts +10 -0
  15. package/dist/account/storage.d.ts.map +1 -0
  16. package/dist/account/storage.js +56 -0
  17. package/dist/account/storage.js.map +1 -0
  18. package/dist/account.d.ts +104 -0
  19. package/dist/account.d.ts.map +1 -0
  20. package/dist/account.js +136 -0
  21. package/dist/account.js.map +1 -0
  22. package/dist/builder.d.ts +54 -0
  23. package/dist/builder.d.ts.map +1 -0
  24. package/dist/builder.js +78 -0
  25. package/dist/builder.js.map +1 -0
  26. package/dist/client.d.ts +73 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +104 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/client.test.d.ts +2 -0
  31. package/dist/client.test.d.ts.map +1 -0
  32. package/dist/client.test.js +150 -0
  33. package/dist/client.test.js.map +1 -0
  34. package/dist/http.d.ts +64 -0
  35. package/dist/http.d.ts.map +1 -0
  36. package/dist/http.js +162 -0
  37. package/dist/http.js.map +1 -0
  38. package/dist/index.d.ts +53 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +52 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/inspector.d.ts +49 -0
  43. package/dist/inspector.d.ts.map +1 -0
  44. package/dist/inspector.js +120 -0
  45. package/dist/inspector.js.map +1 -0
  46. package/dist/inspector.test.d.ts +2 -0
  47. package/dist/inspector.test.d.ts.map +1 -0
  48. package/dist/inspector.test.js +205 -0
  49. package/dist/inspector.test.js.map +1 -0
  50. package/dist/keystore.d.ts +65 -0
  51. package/dist/keystore.d.ts.map +1 -0
  52. package/dist/keystore.js +121 -0
  53. package/dist/keystore.js.map +1 -0
  54. package/dist/miden.d.ts +9 -0
  55. package/dist/miden.d.ts.map +1 -0
  56. package/dist/miden.js +26 -0
  57. package/dist/miden.js.map +1 -0
  58. package/dist/multisig/helpers.d.ts +4 -0
  59. package/dist/multisig/helpers.d.ts.map +1 -0
  60. package/dist/multisig/helpers.js +21 -0
  61. package/dist/multisig/helpers.js.map +1 -0
  62. package/dist/multisig/helpers.test.d.ts +2 -0
  63. package/dist/multisig/helpers.test.d.ts.map +1 -0
  64. package/dist/multisig/helpers.test.js +94 -0
  65. package/dist/multisig/helpers.test.js.map +1 -0
  66. package/dist/multisig/metadata.d.ts +18 -0
  67. package/dist/multisig/metadata.d.ts.map +1 -0
  68. package/dist/multisig/metadata.js +100 -0
  69. package/dist/multisig/metadata.js.map +1 -0
  70. package/dist/multisig/metadata.test.d.ts +2 -0
  71. package/dist/multisig/metadata.test.d.ts.map +1 -0
  72. package/dist/multisig/metadata.test.js +323 -0
  73. package/dist/multisig/metadata.test.js.map +1 -0
  74. package/dist/multisig.d.ts +199 -0
  75. package/dist/multisig.d.ts.map +1 -0
  76. package/dist/multisig.js +821 -0
  77. package/dist/multisig.js.map +1 -0
  78. package/dist/multisig.test.d.ts +2 -0
  79. package/dist/multisig.test.d.ts.map +1 -0
  80. package/dist/multisig.test.js +1121 -0
  81. package/dist/multisig.test.js.map +1 -0
  82. package/dist/procedures.d.ts +57 -0
  83. package/dist/procedures.d.ts.map +1 -0
  84. package/dist/procedures.js +62 -0
  85. package/dist/procedures.js.map +1 -0
  86. package/dist/signer.d.ts +36 -0
  87. package/dist/signer.d.ts.map +1 -0
  88. package/dist/signer.js +68 -0
  89. package/dist/signer.js.map +1 -0
  90. package/dist/signer.test.d.ts +2 -0
  91. package/dist/signer.test.d.ts.map +1 -0
  92. package/dist/signer.test.js +117 -0
  93. package/dist/signer.test.js.map +1 -0
  94. package/dist/transaction/consumeNotes.d.ts +7 -0
  95. package/dist/transaction/consumeNotes.d.ts.map +1 -0
  96. package/dist/transaction/consumeNotes.js +28 -0
  97. package/dist/transaction/consumeNotes.js.map +1 -0
  98. package/dist/transaction/index.d.ts +7 -0
  99. package/dist/transaction/index.d.ts.map +1 -0
  100. package/dist/transaction/index.js +6 -0
  101. package/dist/transaction/index.js.map +1 -0
  102. package/dist/transaction/options.d.ts +6 -0
  103. package/dist/transaction/options.d.ts.map +1 -0
  104. package/dist/transaction/options.js +2 -0
  105. package/dist/transaction/options.js.map +1 -0
  106. package/dist/transaction/p2id.d.ts +7 -0
  107. package/dist/transaction/p2id.d.ts.map +1 -0
  108. package/dist/transaction/p2id.js +43 -0
  109. package/dist/transaction/p2id.js.map +1 -0
  110. package/dist/transaction/summary.d.ts +3 -0
  111. package/dist/transaction/summary.d.ts.map +1 -0
  112. package/dist/transaction/summary.js +6 -0
  113. package/dist/transaction/summary.js.map +1 -0
  114. package/dist/transaction/updatePsm.d.ts +7 -0
  115. package/dist/transaction/updatePsm.d.ts.map +1 -0
  116. package/dist/transaction/updatePsm.js +43 -0
  117. package/dist/transaction/updatePsm.js.map +1 -0
  118. package/dist/transaction/updateSigners.d.ts +8 -0
  119. package/dist/transaction/updateSigners.d.ts.map +1 -0
  120. package/dist/transaction/updateSigners.js +60 -0
  121. package/dist/transaction/updateSigners.js.map +1 -0
  122. package/dist/transaction.d.ts +6 -0
  123. package/dist/transaction.d.ts.map +1 -0
  124. package/dist/transaction.js +8 -0
  125. package/dist/transaction.js.map +1 -0
  126. package/dist/transaction.test.d.ts +2 -0
  127. package/dist/transaction.test.d.ts.map +1 -0
  128. package/dist/transaction.test.js +117 -0
  129. package/dist/transaction.test.js.map +1 -0
  130. package/dist/transport/http.d.ts +64 -0
  131. package/dist/transport/http.d.ts.map +1 -0
  132. package/dist/transport/http.js +162 -0
  133. package/dist/transport/http.js.map +1 -0
  134. package/dist/transport/index.d.ts +5 -0
  135. package/dist/transport/index.d.ts.map +1 -0
  136. package/dist/transport/index.js +5 -0
  137. package/dist/transport/index.js.map +1 -0
  138. package/dist/types/proposal.d.ts +74 -0
  139. package/dist/types/proposal.d.ts.map +1 -0
  140. package/dist/types/proposal.js +2 -0
  141. package/dist/types/proposal.js.map +1 -0
  142. package/dist/types.d.ts +60 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +2 -0
  145. package/dist/types.js.map +1 -0
  146. package/dist/utils/encoding.d.ts +7 -0
  147. package/dist/utils/encoding.d.ts.map +1 -0
  148. package/dist/utils/encoding.js +54 -0
  149. package/dist/utils/encoding.js.map +1 -0
  150. package/dist/utils/encoding.test.d.ts +2 -0
  151. package/dist/utils/encoding.test.d.ts.map +1 -0
  152. package/dist/utils/encoding.test.js +185 -0
  153. package/dist/utils/encoding.test.js.map +1 -0
  154. package/dist/utils/index.d.ts +5 -0
  155. package/dist/utils/index.d.ts.map +1 -0
  156. package/dist/utils/index.js +5 -0
  157. package/dist/utils/index.js.map +1 -0
  158. package/dist/utils/random.d.ts +3 -0
  159. package/dist/utils/random.d.ts.map +1 -0
  160. package/dist/utils/random.js +14 -0
  161. package/dist/utils/random.js.map +1 -0
  162. package/dist/utils/signature.d.ts +12 -0
  163. package/dist/utils/signature.d.ts.map +1 -0
  164. package/dist/utils/signature.js +28 -0
  165. package/dist/utils/signature.js.map +1 -0
  166. package/dist/utils/signature.test.d.ts +2 -0
  167. package/dist/utils/signature.test.d.ts.map +1 -0
  168. package/dist/utils/signature.test.js +149 -0
  169. package/dist/utils/signature.test.js.map +1 -0
  170. package/dist/utils/word.d.ts +4 -0
  171. package/dist/utils/word.d.ts.map +1 -0
  172. package/dist/utils/word.js +8 -0
  173. package/dist/utils/word.js.map +1 -0
  174. package/dist/utils/word.test.d.ts +2 -0
  175. package/dist/utils/word.test.d.ts.map +1 -0
  176. package/dist/utils/word.test.js +54 -0
  177. package/dist/utils/word.test.js.map +1 -0
  178. package/masm/multisig.masm +423 -0
  179. package/masm/psm.masm +178 -0
  180. package/package.json +42 -0
  181. package/src/account/builder.ts +112 -0
  182. package/src/account/index.ts +15 -0
  183. package/src/account/masm.ts +606 -0
  184. package/src/account/storage.ts +70 -0
  185. package/src/client.test.ts +177 -0
  186. package/src/client.ts +129 -0
  187. package/src/index.ts +118 -0
  188. package/src/inspector.test.ts +237 -0
  189. package/src/inspector.ts +142 -0
  190. package/src/multisig/helpers.test.ts +114 -0
  191. package/src/multisig/helpers.ts +23 -0
  192. package/src/multisig.test.ts +1294 -0
  193. package/src/multisig.ts +1097 -0
  194. package/src/procedures.ts +72 -0
  195. package/src/signer.test.ts +135 -0
  196. package/src/signer.ts +75 -0
  197. package/src/transaction/consumeNotes.ts +41 -0
  198. package/src/transaction/index.ts +7 -0
  199. package/src/transaction/options.ts +7 -0
  200. package/src/transaction/p2id.ts +105 -0
  201. package/src/transaction/summary.ts +12 -0
  202. package/src/transaction/updatePsm.ts +69 -0
  203. package/src/transaction/updateSigners.ts +96 -0
  204. package/src/transaction.test.ts +136 -0
  205. package/src/transaction.ts +16 -0
  206. package/src/types/proposal.ts +80 -0
  207. package/src/types.ts +81 -0
  208. package/src/utils/encoding.test.ts +233 -0
  209. package/src/utils/encoding.ts +60 -0
  210. package/src/utils/index.ts +5 -0
  211. package/src/utils/random.ts +15 -0
  212. package/src/utils/signature.test.ts +187 -0
  213. package/src/utils/signature.ts +36 -0
  214. package/src/utils/word.test.ts +64 -0
  215. package/src/utils/word.ts +11 -0
@@ -0,0 +1,187 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { signatureHexToBytes, buildSignatureAdviceEntry, mergeSignatureAdviceMaps, toWord } from './signature.js';
3
+
4
+ // Mock the Miden SDK
5
+ vi.mock('@demox-labs/miden-sdk', () => ({
6
+ AdviceMap: vi.fn().mockImplementation(() => ({
7
+ insert: vi.fn(),
8
+ })),
9
+ Felt: vi.fn().mockImplementation((v: bigint) => ({ value: v })),
10
+ FeltArray: vi.fn().mockImplementation((arr: any[]) => arr),
11
+ Rpo256: {
12
+ hashElements: vi.fn().mockReturnValue({
13
+ toHex: () => '0x' + 'h'.repeat(64),
14
+ }),
15
+ },
16
+ Signature: {
17
+ deserialize: vi.fn().mockReturnValue({
18
+ toPreparedSignature: vi.fn().mockReturnValue([1, 2, 3, 4]),
19
+ }),
20
+ },
21
+ Word: {
22
+ fromHex: vi.fn((hex: string) => ({
23
+ toHex: () => hex,
24
+ toFelts: () => [
25
+ { value: 1n },
26
+ { value: 2n },
27
+ { value: 3n },
28
+ { value: 4n },
29
+ ],
30
+ })),
31
+ },
32
+ }));
33
+
34
+ describe('signature utilities', () => {
35
+ beforeEach(() => {
36
+ vi.clearAllMocks();
37
+ });
38
+
39
+ describe('signatureHexToBytes', () => {
40
+ it('prepends auth scheme byte (0 = RpoFalcon512)', () => {
41
+ const result = signatureHexToBytes('deadbeef');
42
+ expect(result[0]).toBe(0); // RpoFalcon512 scheme byte
43
+ });
44
+
45
+ it('converts hex to bytes after prefix', () => {
46
+ const result = signatureHexToBytes('deadbeef');
47
+ expect(result.slice(1)).toEqual(new Uint8Array([0xde, 0xad, 0xbe, 0xef]));
48
+ });
49
+
50
+ it('handles 0x prefix', () => {
51
+ const result = signatureHexToBytes('0xaabbccdd');
52
+ expect(result[0]).toBe(0);
53
+ expect(result.slice(1)).toEqual(new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]));
54
+ });
55
+
56
+ it('returns correct length (input bytes + 1)', () => {
57
+ const sigHex = 'a'.repeat(128); // 64 bytes
58
+ const result = signatureHexToBytes(sigHex);
59
+ expect(result.length).toBe(65); // 64 bytes + 1 prefix byte
60
+ });
61
+
62
+ it('handles empty signature', () => {
63
+ const result = signatureHexToBytes('');
64
+ expect(result).toEqual(new Uint8Array([0])); // Just the prefix
65
+ });
66
+
67
+ it('handles empty with 0x prefix', () => {
68
+ const result = signatureHexToBytes('0x');
69
+ expect(result).toEqual(new Uint8Array([0]));
70
+ });
71
+ });
72
+
73
+ describe('buildSignatureAdviceEntry', () => {
74
+ it('returns key and values', async () => {
75
+ const { Word, Signature } = await import('@demox-labs/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
+
80
+ const { key, values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
81
+
82
+ expect(key).toBeDefined();
83
+ expect(values).toBeDefined();
84
+ });
85
+
86
+ it('hashes pubkey commitment and message to produce key', async () => {
87
+ const { Word, Signature, Rpo256 } = await import('@demox-labs/miden-sdk');
88
+ const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
89
+ const message = Word.fromHex('0x' + 'b'.repeat(64));
90
+ const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
91
+
92
+ buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
93
+
94
+ expect(Rpo256.hashElements).toHaveBeenCalled();
95
+ });
96
+
97
+ it('uses toPreparedSignature to get values', async () => {
98
+ const { Word, Signature } = await import('@demox-labs/miden-sdk');
99
+ const pubkeyCommitment = Word.fromHex('0x' + 'a'.repeat(64));
100
+ const message = Word.fromHex('0x' + 'b'.repeat(64));
101
+ const signature = Signature.deserialize(new Uint8Array([0, 1, 2, 3]));
102
+
103
+ const { values } = buildSignatureAdviceEntry(pubkeyCommitment, message, signature);
104
+
105
+ expect(signature.toPreparedSignature).toHaveBeenCalledWith(message);
106
+ expect(values).toEqual([1, 2, 3, 4]);
107
+ });
108
+ });
109
+
110
+ describe('mergeSignatureAdviceMaps', () => {
111
+ it('inserts all entries into advice map', async () => {
112
+ const { AdviceMap, Word, Signature } = await import('@demox-labs/miden-sdk');
113
+ const advice = new AdviceMap();
114
+
115
+ const entries = [
116
+ {
117
+ key: Word.fromHex('0x' + 'a'.repeat(64)),
118
+ values: [{ value: 1n }, { value: 2n }],
119
+ },
120
+ {
121
+ key: Word.fromHex('0x' + 'b'.repeat(64)),
122
+ values: [{ value: 3n }, { value: 4n }],
123
+ },
124
+ ];
125
+
126
+ const result = mergeSignatureAdviceMaps(advice, entries as any);
127
+
128
+ expect(advice.insert).toHaveBeenCalledTimes(2);
129
+ expect(result).toBe(advice);
130
+ });
131
+
132
+ it('returns the same advice map', async () => {
133
+ const { AdviceMap } = await import('@demox-labs/miden-sdk');
134
+ const advice = new AdviceMap();
135
+
136
+ const result = mergeSignatureAdviceMaps(advice, []);
137
+
138
+ expect(result).toBe(advice);
139
+ });
140
+
141
+ it('handles empty entries array', async () => {
142
+ const { AdviceMap } = await import('@demox-labs/miden-sdk');
143
+ const advice = new AdviceMap();
144
+
145
+ mergeSignatureAdviceMaps(advice, []);
146
+
147
+ expect(advice.insert).not.toHaveBeenCalled();
148
+ });
149
+ });
150
+
151
+ describe('toWord', () => {
152
+ it('creates Word from hex string', async () => {
153
+ const { Word } = await import('@demox-labs/miden-sdk');
154
+
155
+ const word = toWord('abc123');
156
+
157
+ expect(Word.fromHex).toHaveBeenCalled();
158
+ expect(word).toBeDefined();
159
+ });
160
+
161
+ it('normalizes hex before creating Word', async () => {
162
+ const { Word } = await import('@demox-labs/miden-sdk');
163
+
164
+ toWord('abc');
165
+
166
+ // Should be called with normalized hex (0x + padded to 64 chars)
167
+ expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'abc');
168
+ });
169
+
170
+ it('handles 0x prefix', async () => {
171
+ const { Word } = await import('@demox-labs/miden-sdk');
172
+
173
+ toWord('0xdef');
174
+
175
+ expect(Word.fromHex).toHaveBeenCalledWith('0x' + '0'.repeat(61) + 'def');
176
+ });
177
+
178
+ it('handles full 64-char hex', async () => {
179
+ const { Word } = await import('@demox-labs/miden-sdk');
180
+ const fullHex = 'f'.repeat(64);
181
+
182
+ toWord(fullHex);
183
+
184
+ expect(Word.fromHex).toHaveBeenCalledWith('0x' + fullHex);
185
+ });
186
+ });
187
+ });
@@ -0,0 +1,36 @@
1
+ import { AdviceMap, Felt, FeltArray, Rpo256, Signature, Word } from '@demox-labs/miden-sdk';
2
+ import { hexToBytes, normalizeHexWord } from './encoding.js';
3
+
4
+ export function signatureHexToBytes(hex: string): Uint8Array {
5
+ const sigBytes = hexToBytes(hex);
6
+ const withPrefix = new Uint8Array(sigBytes.length + 1);
7
+ withPrefix[0] = 0;
8
+ withPrefix.set(sigBytes, 1);
9
+ return withPrefix;
10
+ }
11
+
12
+ export function buildSignatureAdviceEntry(
13
+ pubkeyCommitment: Word,
14
+ message: Word,
15
+ signature: Signature,
16
+ ): { key: Word; values: Felt[] } {
17
+ const elements = new FeltArray([
18
+ ...pubkeyCommitment.toFelts(),
19
+ ...message.toFelts(),
20
+ ]);
21
+ const key = Rpo256.hashElements(elements);
22
+ const values = signature.toPreparedSignature(message);
23
+ return { key, values };
24
+ }
25
+
26
+ export function mergeSignatureAdviceMaps(advice: AdviceMap, entries: Array<{ key: Word; values: Felt[] }>): AdviceMap {
27
+ for (const entry of entries) {
28
+ advice.insert(entry.key, new FeltArray(entry.values));
29
+ }
30
+ return advice;
31
+ }
32
+
33
+ export function toWord(hex: string): Word {
34
+ return Word.fromHex(normalizeHexWord(hex));
35
+ }
36
+
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { wordElementToBigInt, wordToHex } from './word.js';
3
+ import { Word } from '@demox-labs/miden-sdk';
4
+
5
+ // Mock the Miden SDK Word class
6
+ vi.mock('@demox-labs/miden-sdk', () => ({
7
+ Word: {
8
+ fromHex: (hex: string): { toU64s: () => BigUint64Array; toHex: () => string } => {
9
+ // Parse hex string (remove 0x prefix if present)
10
+ const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
11
+ if (cleanHex.length !== 64) {
12
+ throw new Error('Hex string must be 64 characters');
13
+ }
14
+
15
+ // Parse as big-endian: [e3_bytes][e2_bytes][e1_bytes][e0_bytes]
16
+ const e3 = BigInt('0x' + cleanHex.slice(0, 16));
17
+ const e2 = BigInt('0x' + cleanHex.slice(16, 32));
18
+ const e1 = BigInt('0x' + cleanHex.slice(32, 48));
19
+ const e0 = BigInt('0x' + cleanHex.slice(48, 64));
20
+
21
+ const elements = new BigUint64Array([e0, e1, e2, e3]);
22
+
23
+ return {
24
+ toU64s: () => elements,
25
+ toHex: () => {
26
+ const h3 = elements[3].toString(16).padStart(16, '0');
27
+ const h2 = elements[2].toString(16).padStart(16, '0');
28
+ const h1 = elements[1].toString(16).padStart(16, '0');
29
+ const h0 = elements[0].toString(16).padStart(16, '0');
30
+ return '0x' + h3 + h2 + h1 + h0;
31
+ },
32
+ };
33
+ },
34
+ },
35
+ }));
36
+
37
+ describe('word utilities', () => {
38
+ describe('wordElementToBigInt', () => {
39
+ it('should return element at valid index', () => {
40
+ const word = Word.fromHex(
41
+ '0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f'
42
+ );
43
+ expect(wordElementToBigInt(word as Word, 0)).toBe(BigInt('0xedd7134bdcdb4b6f'));
44
+ expect(wordElementToBigInt(word as Word, 3)).toBe(BigInt('0x016ab79593165e5b'));
45
+ });
46
+
47
+ it('should return 0n for invalid index', () => {
48
+ const word = Word.fromHex(
49
+ '0x016ab79593165e5b849776919e0c0298fb9dac880d593d93edd7134bdcdb4b6f'
50
+ );
51
+ expect(wordElementToBigInt(word as Word, -1)).toBe(0n);
52
+ expect(wordElementToBigInt(word as Word, 4)).toBe(0n);
53
+ });
54
+ });
55
+
56
+ describe('wordToHex', () => {
57
+ it('should convert word back to hex string', () => {
58
+ const originalHex = '0xd6c130dba13c67ac4733915f24bea9d19f517f51a65c74ded7bcd27e066b400e';
59
+ const word = Word.fromHex(originalHex);
60
+ const hex = wordToHex(word as Word);
61
+ expect(hex).toBe(originalHex);
62
+ });
63
+ });
64
+ });
@@ -0,0 +1,11 @@
1
+ import { Word } from '@demox-labs/miden-sdk';
2
+
3
+ export function wordToHex(word: Word): string {
4
+ return word.toHex();
5
+ }
6
+
7
+ export function wordElementToBigInt(word: Word, index: number): bigint {
8
+ const elements = word.toU64s();
9
+ return index >= 0 && index < elements.length ? elements[index] : 0n;
10
+ }
11
+