@openzeppelin/miden-multisig-client 0.16.1 → 0.17.0-rc.1

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 (207) hide show
  1. package/README.md +192 -11
  2. package/dist/account/builder.d.ts.map +1 -1
  3. package/dist/account/builder.js +32 -25
  4. package/dist/account/builder.js.map +1 -1
  5. package/dist/account/builder.test.js +73 -21
  6. package/dist/account/builder.test.js.map +1 -1
  7. package/dist/account/layout.d.ts +31 -0
  8. package/dist/account/layout.d.ts.map +1 -0
  9. package/dist/account/layout.js +31 -0
  10. package/dist/account/layout.js.map +1 -0
  11. package/dist/account/masm/account-components/auth.d.ts +1 -4
  12. package/dist/account/masm/account-components/auth.d.ts.map +1 -1
  13. package/dist/account/masm/account-components/auth.js +36 -53
  14. package/dist/account/masm/account-components/auth.js.map +1 -1
  15. package/dist/account/masm/index.d.ts +0 -1
  16. package/dist/account/masm/index.d.ts.map +1 -1
  17. package/dist/account/masm/index.js +0 -1
  18. package/dist/account/masm/index.js.map +1 -1
  19. package/dist/account/storage.d.ts +4 -0
  20. package/dist/account/storage.d.ts.map +1 -1
  21. package/dist/account/storage.js +9 -20
  22. package/dist/account/storage.js.map +1 -1
  23. package/dist/client.d.ts +4 -0
  24. package/dist/client.d.ts.map +1 -1
  25. package/dist/client.js +10 -5
  26. package/dist/client.js.map +1 -1
  27. package/dist/client.test.js +74 -16
  28. package/dist/client.test.js.map +1 -1
  29. package/dist/index.d.ts +5 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +3 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/inspector.d.ts +59 -1
  34. package/dist/inspector.d.ts.map +1 -1
  35. package/dist/inspector.js +157 -29
  36. package/dist/inspector.js.map +1 -1
  37. package/dist/inspector.test.js +246 -37
  38. package/dist/inspector.test.js.map +1 -1
  39. package/dist/multisig.d.ts +109 -33
  40. package/dist/multisig.d.ts.map +1 -1
  41. package/dist/multisig.js +307 -104
  42. package/dist/multisig.js.map +1 -1
  43. package/dist/multisig.test.js +582 -58
  44. package/dist/multisig.test.js.map +1 -1
  45. package/dist/procedures.d.ts +6 -7
  46. package/dist/procedures.d.ts.map +1 -1
  47. package/dist/procedures.js +6 -7
  48. package/dist/procedures.js.map +1 -1
  49. package/dist/proposal/metadata.d.ts.map +1 -1
  50. package/dist/proposal/metadata.js +13 -2
  51. package/dist/proposal/metadata.js.map +1 -1
  52. package/dist/proposal/metadata.test.js +57 -0
  53. package/dist/proposal/metadata.test.js.map +1 -1
  54. package/dist/prover/errors.d.ts +5 -0
  55. package/dist/prover/errors.d.ts.map +1 -1
  56. package/dist/prover/errors.js +7 -155
  57. package/dist/prover/errors.js.map +1 -1
  58. package/dist/prover/errors.test.js +5 -0
  59. package/dist/prover/errors.test.js.map +1 -1
  60. package/dist/prover/retry.d.ts +1 -6
  61. package/dist/prover/retry.d.ts.map +1 -1
  62. package/dist/prover/retry.js +5 -28
  63. package/dist/prover/retry.js.map +1 -1
  64. package/dist/prover/retry.test.js +1 -1
  65. package/dist/prover/retry.test.js.map +1 -1
  66. package/dist/prover/workflow.d.ts +4 -3
  67. package/dist/prover/workflow.d.ts.map +1 -1
  68. package/dist/prover/workflow.js +5 -2
  69. package/dist/prover/workflow.js.map +1 -1
  70. package/dist/prover/workflow.test.js +28 -3
  71. package/dist/prover/workflow.test.js.map +1 -1
  72. package/dist/retry/classify.d.ts +16 -0
  73. package/dist/retry/classify.d.ts.map +1 -0
  74. package/dist/retry/classify.js +187 -0
  75. package/dist/retry/classify.js.map +1 -0
  76. package/dist/retry/runtime.d.ts +13 -0
  77. package/dist/retry/runtime.d.ts.map +1 -0
  78. package/dist/retry/runtime.js +33 -0
  79. package/dist/retry/runtime.js.map +1 -0
  80. package/dist/rpc/config.d.ts +11 -0
  81. package/dist/rpc/config.d.ts.map +1 -0
  82. package/dist/rpc/config.js +17 -0
  83. package/dist/rpc/config.js.map +1 -0
  84. package/dist/rpc/config.test.d.ts +2 -0
  85. package/dist/rpc/config.test.d.ts.map +1 -0
  86. package/dist/rpc/config.test.js +24 -0
  87. package/dist/rpc/config.test.js.map +1 -0
  88. package/dist/rpc/errors.d.ts +2 -0
  89. package/dist/rpc/errors.d.ts.map +1 -0
  90. package/dist/rpc/errors.js +11 -0
  91. package/dist/rpc/errors.js.map +1 -0
  92. package/dist/rpc/errors.test.d.ts +2 -0
  93. package/dist/rpc/errors.test.d.ts.map +1 -0
  94. package/dist/rpc/errors.test.js +34 -0
  95. package/dist/rpc/errors.test.js.map +1 -0
  96. package/dist/rpc/retry.d.ts +4 -0
  97. package/dist/rpc/retry.d.ts.map +1 -0
  98. package/dist/rpc/retry.js +6 -0
  99. package/dist/rpc/retry.js.map +1 -0
  100. package/dist/rpc/retry.test.d.ts +2 -0
  101. package/dist/rpc/retry.test.d.ts.map +1 -0
  102. package/dist/rpc/retry.test.js +98 -0
  103. package/dist/rpc/retry.test.js.map +1 -0
  104. package/dist/transaction/index.d.ts +1 -1
  105. package/dist/transaction/index.d.ts.map +1 -1
  106. package/dist/transaction/index.js +1 -1
  107. package/dist/transaction/index.js.map +1 -1
  108. package/dist/transaction/p2id.d.ts +17 -6
  109. package/dist/transaction/p2id.d.ts.map +1 -1
  110. package/dist/transaction/p2id.js +22 -31
  111. package/dist/transaction/p2id.js.map +1 -1
  112. package/dist/transaction/p2id.test.js +62 -24
  113. package/dist/transaction/p2id.test.js.map +1 -1
  114. package/dist/transaction/summary.d.ts +45 -2
  115. package/dist/transaction/summary.d.ts.map +1 -1
  116. package/dist/transaction/summary.js +42 -2
  117. package/dist/transaction/summary.js.map +1 -1
  118. package/dist/transaction/summary.test.d.ts +2 -0
  119. package/dist/transaction/summary.test.d.ts.map +1 -0
  120. package/dist/transaction/summary.test.js +26 -0
  121. package/dist/transaction/summary.test.js.map +1 -0
  122. package/dist/transaction/updateGuardian.d.ts.map +1 -1
  123. package/dist/transaction/updateGuardian.js +16 -18
  124. package/dist/transaction/updateGuardian.js.map +1 -1
  125. package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -1
  126. package/dist/transaction/updateProcedureThreshold.js +15 -17
  127. package/dist/transaction/updateProcedureThreshold.js.map +1 -1
  128. package/dist/transaction/updateSigners.d.ts +6 -1
  129. package/dist/transaction/updateSigners.d.ts.map +1 -1
  130. package/dist/transaction/updateSigners.js +20 -17
  131. package/dist/transaction/updateSigners.js.map +1 -1
  132. package/dist/transaction.d.ts +2 -2
  133. package/dist/transaction.d.ts.map +1 -1
  134. package/dist/transaction.js +1 -1
  135. package/dist/transaction.js.map +1 -1
  136. package/dist/types/proposal.d.ts +28 -4
  137. package/dist/types/proposal.d.ts.map +1 -1
  138. package/dist/types/proposal.js +18 -0
  139. package/dist/types/proposal.js.map +1 -1
  140. package/dist/types.d.ts +0 -1
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/utils/signature.d.ts +11 -7
  143. package/dist/utils/signature.d.ts.map +1 -1
  144. package/dist/utils/signature.js +24 -58
  145. package/dist/utils/signature.js.map +1 -1
  146. package/dist/utils/word.d.ts +7 -0
  147. package/dist/utils/word.d.ts.map +1 -1
  148. package/dist/utils/word.js +15 -0
  149. package/dist/utils/word.js.map +1 -1
  150. package/masm/account_components/auth/guarded_multisig.masm +42 -0
  151. package/package.json +7 -4
  152. package/src/account/builder.test.ts +111 -45
  153. package/src/account/builder.ts +45 -33
  154. package/src/account/layout.ts +33 -0
  155. package/src/account/masm/account-components/auth.ts +36 -56
  156. package/src/account/masm/index.ts +0 -1
  157. package/src/account/storage.ts +9 -22
  158. package/src/client.test.ts +87 -16
  159. package/src/client.ts +16 -3
  160. package/src/index.ts +27 -1
  161. package/src/inspector.test.ts +330 -38
  162. package/src/inspector.ts +196 -33
  163. package/src/multisig.test.ts +680 -63
  164. package/src/multisig.ts +400 -115
  165. package/src/procedures.ts +6 -7
  166. package/src/proposal/metadata.test.ts +76 -0
  167. package/src/proposal/metadata.ts +13 -2
  168. package/src/prover/errors.test.ts +8 -0
  169. package/src/prover/errors.ts +7 -175
  170. package/src/prover/retry.test.ts +1 -1
  171. package/src/prover/retry.ts +10 -35
  172. package/src/prover/workflow.test.ts +40 -4
  173. package/src/prover/workflow.ts +16 -4
  174. package/src/retry/classify.ts +220 -0
  175. package/src/retry/runtime.ts +45 -0
  176. package/src/rpc/config.test.ts +45 -0
  177. package/src/rpc/config.ts +30 -0
  178. package/src/rpc/errors.test.ts +69 -0
  179. package/src/rpc/errors.ts +12 -0
  180. package/src/rpc/retry.test.ts +144 -0
  181. package/src/rpc/retry.ts +12 -0
  182. package/src/transaction/index.ts +7 -1
  183. package/src/transaction/p2id.test.ts +112 -31
  184. package/src/transaction/p2id.ts +39 -38
  185. package/src/transaction/summary.test.ts +32 -0
  186. package/src/transaction/summary.ts +83 -4
  187. package/src/transaction/updateGuardian.ts +15 -25
  188. package/src/transaction/updateProcedureThreshold.ts +13 -29
  189. package/src/transaction/updateSigners.ts +38 -30
  190. package/src/transaction.ts +8 -1
  191. package/src/types/proposal.ts +43 -4
  192. package/src/types.ts +0 -1
  193. package/src/utils/signature.ts +32 -65
  194. package/src/utils/word.ts +17 -0
  195. package/dist/account/masm/auth.d.ts +0 -5
  196. package/dist/account/masm/auth.d.ts.map +0 -1
  197. package/dist/account/masm/auth.js +0 -1509
  198. package/dist/account/masm/auth.js.map +0 -1
  199. package/masm/account_components/auth/multisig.masm +0 -12
  200. package/masm/account_components/auth/multisig_ecdsa.masm +0 -12
  201. package/masm/account_components/auth/multisig_guardian.masm +0 -16
  202. package/masm/account_components/auth/multisig_guardian_ecdsa.masm +0 -16
  203. package/masm/auth/guardian.masm +0 -199
  204. package/masm/auth/guardian_ecdsa.masm +0 -195
  205. package/masm/auth/multisig.masm +0 -554
  206. package/masm/auth/multisig_ecdsa.masm +0 -554
  207. package/src/account/masm/auth.ts +0 -1512
@@ -1 +1 @@
1
- {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/utils/signature.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import { Word } from '@miden-sdk/miden-sdk';
2
2
  export declare function wordToHex(word: Word): string;
3
3
  export declare function wordElementToBigInt(word: Word, index: number): bigint;
4
+ /**
5
+ * True when every element of the word is zero. The SDK's storage-map reads
6
+ * return `Word::empty()` for a key with no entry (`StorageMap::get` is
7
+ * `unwrap_or_default()` in miden-protocol), so readers use this to detect
8
+ * absent entries.
9
+ */
10
+ export declare function isEmptyWord(word: Word): boolean;
4
11
  export declare function wordToBytes(word: {
5
12
  toFelts: () => Array<{
6
13
  asInt: () => bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"word.d.ts","sourceRoot":"","sources":["../../src/utils/word.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASrE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,UAAU,CAU/F"}
1
+ {"version":3,"file":"word.d.ts","sourceRoot":"","sources":["../../src/utils/word.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASrE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAS/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,UAAU,CAU/F"}
@@ -10,6 +10,21 @@ export function wordElementToBigInt(word, index) {
10
10
  const elements = typeof word.toU64s === 'function' ? word.toU64s() : word.toFelts().map(f => f.asInt());
11
11
  return index < elements.length ? elements[index] : 0n;
12
12
  }
13
+ /**
14
+ * True when every element of the word is zero. The SDK's storage-map reads
15
+ * return `Word::empty()` for a key with no entry (`StorageMap::get` is
16
+ * `unwrap_or_default()` in miden-protocol), so readers use this to detect
17
+ * absent entries.
18
+ */
19
+ export function isEmptyWord(word) {
20
+ const elements = typeof word.toU64s === 'function' ? word.toU64s() : word.toFelts().map(f => f.asInt());
21
+ for (const element of elements) {
22
+ if (element !== 0n) {
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
13
28
  export function wordToBytes(word) {
14
29
  const felts = word.toFelts();
15
30
  const buf = new Uint8Array(32);
@@ -1 +1 @@
1
- {"version":3,"file":"word.js","sourceRoot":"","sources":["../../src/utils/word.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,KAAa;IAC3D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,4EAA4E;IAC5E,yDAAyD;IACzD,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAuD;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"word.js","sourceRoot":"","sources":["../../src/utils/word.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAU,EAAE,KAAa;IAC3D,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,4EAA4E;IAC5E,yDAAyD;IACzD,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAU;IACpC,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAuD;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,42 @@
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openzeppelin/miden-multisig-client",
3
- "version": "0.16.1",
3
+ "version": "0.17.0-rc.1",
4
4
  "description": "TypeScript SDK for Miden multisig accounts with GUARDIAN integration",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,16 +33,19 @@
33
33
  "typecheck": "npm run generate:masm && tsc --noEmit",
34
34
  "clean": "rm -rf dist",
35
35
  "test": "npm run generate:masm && vitest run",
36
- "test:watch": "npm run generate:masm && vitest"
36
+ "test:watch": "npm run generate:masm && vitest",
37
+ "test:browser": "playwright test --config playwright.config.ts"
37
38
  },
38
39
  "dependencies": {
39
- "@miden-sdk/miden-sdk": "^0.15.8",
40
+ "@miden-sdk/miden-sdk": "0.16.0-rc.3",
40
41
  "@noble/curves": "^1.9.7",
41
42
  "@noble/hashes": "^2.0.1",
42
- "@openzeppelin/guardian-client": "^0.16.1"
43
+ "@openzeppelin/guardian-client": "^0.17.0-rc.1"
43
44
  },
44
45
  "devDependencies": {
46
+ "@playwright/test": "^1.60.0",
45
47
  "typescript": "^5.7.2",
48
+ "vite": "^5.4.21",
46
49
  "vitest": "^2.1.8"
47
50
  },
48
51
  "engines": {
@@ -1,15 +1,6 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { createMultisigAccount } from './builder.js';
3
- import {
4
- MULTISIG_ECDSA_MASM,
5
- MULTISIG_MASM,
6
- GUARDIAN_ECDSA_MASM,
7
- GUARDIAN_MASM,
8
- } from './masm/auth.js';
9
- import {
10
- MULTISIG_GUARDIAN_ACCOUNT_COMPONENT_MASM,
11
- MULTISIG_GUARDIAN_ECDSA_ACCOUNT_COMPONENT_MASM,
12
- } from './masm/account-components/auth.js';
2
+ import { createMultisigAccount, validateMultisigConfig } from './builder.js';
3
+ import { GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM } from './masm/account-components/auth.js';
13
4
 
14
5
  const {
15
6
  buildMultisigStorageSlots,
@@ -53,6 +44,12 @@ const {
53
44
  account: { id: () => ({ toString: () => '0x' + 'a'.repeat(30) }) },
54
45
  };
55
46
  }
47
+
48
+ buildWithoutSchemaCommitment() {
49
+ return {
50
+ account: { id: () => ({ toString: () => '0x' + 'a'.repeat(30) }) },
51
+ };
52
+ }
56
53
  }
57
54
 
58
55
  return {
@@ -93,7 +90,7 @@ describe('createMultisigAccount', () => {
93
90
  compileComponent.mockClear();
94
91
  });
95
92
 
96
- it('uses Falcon MASM by default', async () => {
93
+ function makeClient() {
97
94
  const authBuilder = {
98
95
  linkModule: vi.fn(),
99
96
  compileAccountComponentCode: vi.fn((source) => ({ source })),
@@ -104,6 +101,11 @@ describe('createMultisigAccount', () => {
104
101
  insert: vi.fn().mockResolvedValue(undefined),
105
102
  },
106
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();
107
109
 
108
110
  await createMultisigAccount(
109
111
  webClient as never,
@@ -115,33 +117,17 @@ describe('createMultisigAccount', () => {
115
117
  'http://localhost:57291',
116
118
  );
117
119
 
118
- expect(authBuilder.linkModule).toHaveBeenNthCalledWith(
119
- 1,
120
- 'openzeppelin::auth::guardian',
121
- GUARDIAN_MASM,
122
- );
123
- expect(authBuilder.linkModule).toHaveBeenNthCalledWith(
124
- 2,
125
- 'openzeppelin::auth::multisig',
126
- MULTISIG_MASM,
127
- );
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();
128
123
  expect(authBuilder.compileAccountComponentCode).toHaveBeenCalledWith(
129
- MULTISIG_GUARDIAN_ACCOUNT_COMPONENT_MASM,
124
+ GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM,
130
125
  );
131
126
  expect(webClient.accounts.insert).toHaveBeenCalledTimes(1);
132
127
  });
133
128
 
134
- it('uses ECDSA MASM when requested', async () => {
135
- const authBuilder = {
136
- linkModule: vi.fn(),
137
- compileAccountComponentCode: vi.fn((source) => ({ source })),
138
- };
139
- const webClient = {
140
- createCodeBuilder: vi.fn().mockReturnValue(authBuilder),
141
- accounts: {
142
- insert: vi.fn().mockResolvedValue(undefined),
143
- },
144
- };
129
+ it('uses the same scheme-agnostic component for ECDSA', async () => {
130
+ const { authBuilder, webClient } = makeClient();
145
131
 
146
132
  await createMultisigAccount(
147
133
  webClient as never,
@@ -154,19 +140,99 @@ describe('createMultisigAccount', () => {
154
140
  'http://localhost:57291',
155
141
  );
156
142
 
157
- expect(authBuilder.linkModule).toHaveBeenNthCalledWith(
158
- 1,
159
- 'openzeppelin::auth::guardian_ecdsa',
160
- GUARDIAN_ECDSA_MASM,
161
- );
162
- expect(authBuilder.linkModule).toHaveBeenNthCalledWith(
163
- 2,
164
- 'openzeppelin::auth::multisig_ecdsa',
165
- MULTISIG_ECDSA_MASM,
166
- );
143
+ expect(authBuilder.linkModule).not.toHaveBeenCalled();
167
144
  expect(authBuilder.compileAccountComponentCode).toHaveBeenCalledWith(
168
- MULTISIG_GUARDIAN_ECDSA_ACCOUNT_COMPONENT_MASM,
145
+ GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM,
169
146
  );
170
147
  expect(webClient.accounts.insert).toHaveBeenCalledTimes(1);
171
148
  });
172
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
+ });
@@ -9,22 +9,29 @@ import {
9
9
  AccountComponent,
10
10
  AccountStorageMode,
11
11
  type MidenClient,
12
+ type WasmWebClient,
12
13
  } from '@miden-sdk/miden-sdk';
13
14
  import type { MultisigConfig, CreateAccountResult } from '../types.js';
14
15
  import { getRawMidenClient } from '../raw-client.js';
15
16
  import { buildMultisigStorageSlots, buildGuardianStorageSlots } from './storage.js';
16
- import {
17
- MULTISIG_ECDSA_MASM,
18
- MULTISIG_MASM,
19
- GUARDIAN_ECDSA_MASM,
20
- GUARDIAN_MASM,
21
- } from './masm/auth.js';
22
- import {
23
- MULTISIG_GUARDIAN_ACCOUNT_COMPONENT_MASM,
24
- MULTISIG_GUARDIAN_ECDSA_ACCOUNT_COMPONENT_MASM,
25
- } from './masm/account-components/auth.js';
17
+ import { GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM } from './masm/account-components/auth.js';
26
18
  import { normalizeSignerCommitment } from '../utils/signature.js';
27
19
 
20
+ /** Builds the guarded-multisig component without relinking assembler-provided libraries. */
21
+ function buildGuardedMultisigComponent(
22
+ authBuilder: Awaited<ReturnType<WasmWebClient['createCodeBuilder']>>,
23
+ config: MultisigConfig,
24
+ ): AccountComponent {
25
+ const authSlots = [
26
+ ...buildMultisigStorageSlots(config),
27
+ ...buildGuardianStorageSlots(config),
28
+ ];
29
+ const authComponentCode = authBuilder.compileAccountComponentCode(
30
+ GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM,
31
+ );
32
+ return AccountComponent.compile(authComponentCode, authSlots).withSupportsAllTypes();
33
+ }
34
+
28
35
  /**
29
36
  * Creates a multisig account with GUARDIAN authentication.
30
37
  *
@@ -39,31 +46,10 @@ export async function createMultisigAccount(
39
46
  midenRpcEndpoint: string,
40
47
  ): Promise<CreateAccountResult> {
41
48
  validateMultisigConfig(config);
42
- const signatureScheme = config.signatureScheme ?? 'falcon';
43
49
  const rawClient = await getRawMidenClient(midenClient, midenRpcEndpoint);
44
- const authSlots = [
45
- ...buildMultisigStorageSlots(config),
46
- ...buildGuardianStorageSlots(config),
47
- ];
48
- const guardianMasm = signatureScheme === 'ecdsa' ? GUARDIAN_ECDSA_MASM : GUARDIAN_MASM;
49
- const multisigMasm = signatureScheme === 'ecdsa' ? MULTISIG_ECDSA_MASM : MULTISIG_MASM;
50
- const authComponentMasm = signatureScheme === 'ecdsa'
51
- ? MULTISIG_GUARDIAN_ECDSA_ACCOUNT_COMPONENT_MASM
52
- : MULTISIG_GUARDIAN_ACCOUNT_COMPONENT_MASM;
53
- const guardianLibraryPath = signatureScheme === 'ecdsa'
54
- ? 'openzeppelin::auth::guardian_ecdsa'
55
- : 'openzeppelin::auth::guardian';
56
- const multisigLibraryPath = signatureScheme === 'ecdsa'
57
- ? 'openzeppelin::auth::multisig_ecdsa'
58
- : 'openzeppelin::auth::multisig';
59
50
 
60
51
  const authBuilder = await rawClient.createCodeBuilder();
61
- authBuilder.linkModule(guardianLibraryPath, guardianMasm);
62
- authBuilder.linkModule(multisigLibraryPath, multisigMasm);
63
- const authComponentCode = authBuilder.compileAccountComponentCode(authComponentMasm);
64
- const authComponent = AccountComponent
65
- .compile(authComponentCode, authSlots)
66
- .withSupportsAllTypes();
52
+ const authComponent = buildGuardedMultisigComponent(authBuilder, config);
67
53
 
68
54
  let seed = config.seed;
69
55
  // Generate random seed if not provided
@@ -82,7 +68,7 @@ export async function createMultisigAccount(
82
68
  .withAuthComponent(authComponent)
83
69
  .withBasicWalletComponent();
84
70
 
85
- const result = accountBuilder.build();
71
+ const result = accountBuilder.buildWithoutSchemaCommitment();
86
72
 
87
73
  await midenClient.accounts.insert({ account: result.account, overwrite: false });
88
74
 
@@ -123,6 +109,9 @@ export function validateMultisigConfig(config: MultisigConfig): void {
123
109
  if (!config.guardianCommitment) {
124
110
  throw new Error('GUARDIAN commitment is required');
125
111
  }
112
+ if (signerCommitments.has(normalizeSignerCommitment(config.guardianCommitment))) {
113
+ throw new Error('GUARDIAN commitment must be different from all signer commitments');
114
+ }
126
115
 
127
116
  // Validate procedure thresholds if provided
128
117
  if (config.procedureThresholds) {
@@ -142,5 +131,28 @@ export function validateMultisigConfig(config: MultisigConfig): void {
142
131
  }
143
132
  seen.add(pt.procedure);
144
133
  }
134
+
135
+ // An override is only enforceable if lowering it costs at least as many
136
+ // signatures as the override itself demands. `update_procedure_threshold`
137
+ // is the procedure that edits overrides, so anything above its own
138
+ // effective threshold can be lowered by a smaller quorum and then used:
139
+ // a 2-of-5 with `send_asset: 4` is a 2-of-5 spend lock, not a 4-of-5 one.
140
+ // Mirrors `AuthMultisig::new` in miden-standards, which rejects the same
141
+ // shape, so Rust cannot build an account TypeScript would otherwise allow.
142
+ const setterOverride = config.procedureThresholds.find(
143
+ (pt) => pt.procedure === 'update_procedure_threshold'
144
+ )?.threshold;
145
+ const setterThreshold = setterOverride ?? config.threshold;
146
+
147
+ for (const pt of config.procedureThresholds) {
148
+ if (pt.threshold > setterThreshold) {
149
+ throw new Error(
150
+ `procedure threshold override for ${pt.procedure} (${pt.threshold}) exceeds the ` +
151
+ `threshold of ${setterThreshold} that guards update_procedure_threshold; such an ` +
152
+ `override can be removed by a smaller quorum. Raise the update_procedure_threshold ` +
153
+ `override to at least ${pt.threshold} to make it enforceable`
154
+ );
155
+ }
156
+ }
145
157
  }
146
158
  }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `AuthGuardedMultisig` storage slot names (`miden::standards::auth::*`),
3
+ * shared by the writer (`account/storage.ts`) and the readers
4
+ * (`inspector.ts`). Single source of truth so the two cannot drift. These
5
+ * must match the Rust `miden-standards` component exactly: account ID and
6
+ * commitment derive from the storage layout, so any divergence breaks
7
+ * cross-SDK determinism (guarded by the parity test).
8
+ *
9
+ * Deliberately not re-exported from the package index: consumers should use
10
+ * the `AccountInspector` accessors rather than reading storage directly
11
+ * (issue #306).
12
+ */
13
+
14
+ export const MULTISIG_SLOT_NAMES = {
15
+ THRESHOLD_CONFIG: 'miden::standards::auth::multisig::threshold_config',
16
+ SIGNER_PUBLIC_KEYS: 'miden::standards::auth::multisig::approver_public_keys',
17
+ SIGNER_SCHEME_IDS: 'miden::standards::auth::multisig::approver_schemes',
18
+ EXECUTED_TRANSACTIONS: 'miden::standards::auth::multisig::executed_transactions',
19
+ PROCEDURE_THRESHOLDS: 'miden::standards::auth::multisig::procedure_thresholds',
20
+ } as const;
21
+
22
+ export const GUARDIAN_SLOT_NAMES = {
23
+ PUBLIC_KEY: 'miden::standards::auth::guardian::pub_key',
24
+ SCHEME_ID: 'miden::standards::auth::guardian::scheme',
25
+ } as const;
26
+
27
+ /**
28
+ * Sanity ceiling for the signer count read from `threshold_config`. The
29
+ * contract has no on-chain maximum (the felt is only asserted to be a u32),
30
+ * so a corrupt or adversarial account could report an arbitrarily large
31
+ * count; readers bound their loops with this instead of trusting it.
32
+ */
33
+ export const MAX_SIGNERS = 1000;
@@ -1,66 +1,46 @@
1
1
  // This file is generated by scripts/generate-masm.mjs from the MASM contract sources.
2
2
  // Do not edit it by hand.
3
3
 
4
- export const MULTISIG_ACCOUNT_COMPONENT_MASM = `# Multi-Signature RPO Falcon 512 Authentication Component
5
-
6
- use openzeppelin::auth::multisig
7
-
8
- pub use multisig::update_signers_and_threshold
9
- pub use multisig::update_procedure_threshold
10
-
4
+ export const GUARDED_MULTISIG_ACCOUNT_COMPONENT_MASM = `# The MASM code of the Multi-Signature Authentication component integrated with a state guardian.
5
+ #
6
+ # See the \`AuthGuardedMultisig\` Rust type's documentation for more details.
7
+
8
+ use miden::standards::auth::multisig
9
+ use miden::standards::auth::guardian
10
+
11
+ pub use {update_signers_and_threshold} from miden::standards::auth::multisig
12
+ pub use {get_threshold_and_num_approvers} from miden::standards::auth::multisig
13
+ pub use {set_procedure_threshold} from miden::standards::auth::multisig
14
+ pub use {get_signer_at} from miden::standards::auth::multisig
15
+ pub use {is_signer} from miden::standards::auth::multisig
16
+
17
+ pub use {update_guardian_public_key} from miden::standards::auth::guardian
18
+
19
+ #! Authenticate a transaction with multi-signature support and optional guardian verification.
20
+ #!
21
+ #! Inputs:
22
+ #! Operand stack: [SALT]
23
+ #! Outputs:
24
+ #! Operand stack: []
25
+ #!
26
+ #! Invocation: call
11
27
  @auth_script
12
- pub proc auth_tx_multisig(salt: word)
13
- exec.multisig::auth_tx
14
- exec.multisig::assert_new_tx
15
- end
16
- `;
28
+ pub proc auth_tx_guarded_multisig(salt: word)
29
+ # zero the leading user params (not exposed through this component's interface); the SALT
30
+ # occupies the trailing four
31
+ push.0.0.0
32
+ # => [0, 0, 0, SALT]
17
33
 
18
- export const MULTISIG_GUARDIAN_ACCOUNT_COMPONENT_MASM = `# Multi-Signature RPO Falcon 512 Authentication Component With GUARDIAN
19
-
20
- use openzeppelin::auth::multisig
21
- use openzeppelin::auth::guardian
22
-
23
- pub use multisig::update_signers_and_threshold
24
- pub use multisig::update_procedure_threshold
25
- pub use guardian::update_guardian_public_key
26
- pub use guardian::verify_guardian_signature
27
-
28
- @auth_script
29
- pub proc auth_tx_multisig_guardian(salt: word)
30
34
  exec.multisig::auth_tx
31
- exec.guardian::verify_guardian_signature
32
- exec.multisig::assert_new_tx
33
- end
34
- `;
35
-
36
- export const MULTISIG_ECDSA_ACCOUNT_COMPONENT_MASM = `# Multi-Signature ECDSA secp256k1 Authentication Component
37
-
38
- use openzeppelin::auth::multisig_ecdsa
35
+ # => [TX_SUMMARY_COMMITMENT]
39
36
 
40
- pub use multisig_ecdsa::update_signers_and_threshold
41
- pub use multisig_ecdsa::update_procedure_threshold
37
+ dupw
38
+ # => [TX_SUMMARY_COMMITMENT, TX_SUMMARY_COMMITMENT]
39
+
40
+ exec.guardian::verify_signature
41
+ # => [TX_SUMMARY_COMMITMENT]
42
42
 
43
- @auth_script
44
- pub proc auth_tx_multisig_ecdsa(salt: word)
45
- exec.multisig_ecdsa::auth_tx
46
- exec.multisig_ecdsa::assert_new_tx
47
- end
48
- `;
49
-
50
- export const MULTISIG_GUARDIAN_ECDSA_ACCOUNT_COMPONENT_MASM = `# Multi-Signature ECDSA secp256k1 Authentication Component With GUARDIAN
51
-
52
- use openzeppelin::auth::multisig_ecdsa
53
- use openzeppelin::auth::guardian_ecdsa
54
-
55
- pub use multisig_ecdsa::update_signers_and_threshold
56
- pub use multisig_ecdsa::update_procedure_threshold
57
- pub use guardian_ecdsa::update_guardian_public_key
58
- pub use guardian_ecdsa::verify_guardian_signature
59
-
60
- @auth_script
61
- pub proc auth_tx_multisig_guardian_ecdsa(salt: word)
62
- exec.multisig_ecdsa::auth_tx
63
- exec.guardian_ecdsa::verify_guardian_signature
64
- exec.multisig_ecdsa::assert_new_tx
43
+ exec.multisig::record_and_assert_new_tx
44
+ # => []
65
45
  end
66
46
  `;
@@ -1,5 +1,4 @@
1
1
  // This file is generated by scripts/generate-masm.mjs from the MASM contract sources.
2
2
  // Do not edit it by hand.
3
3
 
4
- export * from './auth.js';
5
4
  export * from './account-components/auth.js';