@openzeppelin/miden-multisig-client 0.13.1 → 0.13.3

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 (275) hide show
  1. package/README.md +98 -119
  2. package/dist/account/builder.d.ts +18 -0
  3. package/dist/account/builder.d.ts.map +1 -1
  4. package/dist/account/builder.js +59 -29
  5. package/dist/account/builder.js.map +1 -1
  6. package/dist/account/builder.test.js +108 -32
  7. package/dist/account/builder.test.js.map +1 -1
  8. package/dist/account/index.d.ts +1 -1
  9. package/dist/account/index.d.ts.map +1 -1
  10. package/dist/account/index.js +1 -1
  11. package/dist/account/index.js.map +1 -1
  12. package/dist/account/masm/account-components/auth.d.ts +5 -0
  13. package/dist/account/masm/account-components/auth.d.ts.map +1 -0
  14. package/dist/account/masm/account-components/auth.js +67 -0
  15. package/dist/account/masm/account-components/auth.js.map +1 -0
  16. package/dist/account/masm/auth.d.ts +5 -0
  17. package/dist/account/masm/auth.d.ts.map +1 -0
  18. package/dist/account/masm/auth.js +1395 -0
  19. package/dist/account/masm/auth.js.map +1 -0
  20. package/dist/account/masm/index.d.ts +3 -0
  21. package/dist/account/masm/index.d.ts.map +1 -0
  22. package/dist/account/masm/index.js +5 -0
  23. package/dist/account/masm/index.js.map +1 -0
  24. package/dist/account/masm.d.ts +1 -4
  25. package/dist/account/masm.d.ts.map +1 -1
  26. package/dist/account/masm.js +3 -1034
  27. package/dist/account/masm.js.map +1 -1
  28. package/dist/account/storage.d.ts +2 -2
  29. package/dist/account/storage.d.ts.map +1 -1
  30. package/dist/account/storage.js +18 -16
  31. package/dist/account/storage.js.map +1 -1
  32. package/dist/client.d.ts +67 -9
  33. package/dist/client.d.ts.map +1 -1
  34. package/dist/client.js +73 -22
  35. package/dist/client.js.map +1 -1
  36. package/dist/client.test.js +31 -32
  37. package/dist/client.test.js.map +1 -1
  38. package/dist/index.d.ts +54 -12
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +53 -9
  41. package/dist/index.js.map +1 -1
  42. package/dist/inspector.d.ts +32 -6
  43. package/dist/inspector.d.ts.map +1 -1
  44. package/dist/inspector.js +58 -23
  45. package/dist/inspector.js.map +1 -1
  46. package/dist/inspector.test.js +18 -18
  47. package/dist/inspector.test.js.map +1 -1
  48. package/dist/multisig/proposal/execution.d.ts +4 -4
  49. package/dist/multisig/proposal/execution.d.ts.map +1 -1
  50. package/dist/multisig/proposal/execution.js +42 -31
  51. package/dist/multisig/proposal/execution.js.map +1 -1
  52. package/dist/multisig/proposal/parser.d.ts +3 -3
  53. package/dist/multisig/proposal/parser.d.ts.map +1 -1
  54. package/dist/multisig/proposal/parser.js +23 -23
  55. package/dist/multisig/proposal/parser.js.map +1 -1
  56. package/dist/multisig/signing.d.ts +3 -3
  57. package/dist/multisig/signing.d.ts.map +1 -1
  58. package/dist/multisig/signing.js +3 -3
  59. package/dist/multisig/signing.js.map +1 -1
  60. package/dist/multisig.d.ts +188 -48
  61. package/dist/multisig.d.ts.map +1 -1
  62. package/dist/multisig.js +650 -308
  63. package/dist/multisig.js.map +1 -1
  64. package/dist/multisig.test.js +1680 -241
  65. package/dist/multisig.test.js.map +1 -1
  66. package/dist/procedures.d.ts +46 -24
  67. package/dist/procedures.d.ts.map +1 -1
  68. package/dist/procedures.js +46 -21
  69. package/dist/procedures.js.map +1 -1
  70. package/dist/proposal/factory.d.ts +18 -0
  71. package/dist/proposal/factory.d.ts.map +1 -0
  72. package/dist/proposal/factory.js +99 -0
  73. package/dist/proposal/factory.js.map +1 -0
  74. package/dist/proposal/metadata.d.ts +5 -12
  75. package/dist/proposal/metadata.d.ts.map +1 -1
  76. package/dist/proposal/metadata.js +118 -174
  77. package/dist/proposal/metadata.js.map +1 -1
  78. package/dist/proposal/signatures.d.ts +10 -0
  79. package/dist/proposal/signatures.d.ts.map +1 -0
  80. package/dist/proposal/signatures.js +54 -0
  81. package/dist/proposal/signatures.js.map +1 -0
  82. package/dist/signer.d.ts +2 -0
  83. package/dist/signer.d.ts.map +1 -1
  84. package/dist/signer.js +2 -0
  85. package/dist/signer.js.map +1 -1
  86. package/dist/signers/ecdsa.d.ts +3 -0
  87. package/dist/signers/ecdsa.d.ts.map +1 -1
  88. package/dist/signers/ecdsa.js +8 -4
  89. package/dist/signers/ecdsa.js.map +1 -1
  90. package/dist/signers/ecdsa.test.d.ts +2 -0
  91. package/dist/signers/ecdsa.test.d.ts.map +1 -0
  92. package/dist/signers/ecdsa.test.js +65 -0
  93. package/dist/signers/ecdsa.test.js.map +1 -0
  94. package/dist/signers/falcon.d.ts +3 -0
  95. package/dist/signers/falcon.d.ts.map +1 -1
  96. package/dist/signers/falcon.js +8 -4
  97. package/dist/signers/falcon.js.map +1 -1
  98. package/dist/signers/falcon.test.js +12 -0
  99. package/dist/signers/falcon.test.js.map +1 -1
  100. package/dist/signers/miden-wallet.d.ts +3 -1
  101. package/dist/signers/miden-wallet.d.ts.map +1 -1
  102. package/dist/signers/miden-wallet.js +11 -2
  103. package/dist/signers/miden-wallet.js.map +1 -1
  104. package/dist/signers/miden-wallet.test.js +26 -0
  105. package/dist/signers/miden-wallet.test.js.map +1 -1
  106. package/dist/signers/para.d.ts +3 -3
  107. package/dist/signers/para.d.ts.map +1 -1
  108. package/dist/signers/para.js +15 -6
  109. package/dist/signers/para.js.map +1 -1
  110. package/dist/signers/para.test.js +39 -0
  111. package/dist/signers/para.test.js.map +1 -1
  112. package/dist/transaction/consumeNotes.d.ts.map +1 -1
  113. package/dist/transaction/consumeNotes.js +1 -0
  114. package/dist/transaction/consumeNotes.js.map +1 -1
  115. package/dist/transaction/index.d.ts +2 -1
  116. package/dist/transaction/index.d.ts.map +1 -1
  117. package/dist/transaction/index.js +2 -1
  118. package/dist/transaction/index.js.map +1 -1
  119. package/dist/transaction/options.d.ts +1 -1
  120. package/dist/transaction/options.d.ts.map +1 -1
  121. package/dist/transaction/p2id.d.ts +1 -0
  122. package/dist/transaction/p2id.d.ts.map +1 -1
  123. package/dist/transaction/p2id.js +9 -3
  124. package/dist/transaction/p2id.js.map +1 -1
  125. package/dist/transaction/updateGuardian.d.ts +7 -0
  126. package/dist/transaction/updateGuardian.d.ts.map +1 -0
  127. package/dist/transaction/{updatePsm.js → updateGuardian.js} +15 -29
  128. package/dist/transaction/updateGuardian.js.map +1 -0
  129. package/dist/transaction/updateProcedureThreshold.d.ts +9 -0
  130. package/dist/transaction/updateProcedureThreshold.d.ts.map +1 -0
  131. package/dist/transaction/updateProcedureThreshold.js +55 -0
  132. package/dist/transaction/updateProcedureThreshold.js.map +1 -0
  133. package/dist/transaction/updateSigners.d.ts.map +1 -1
  134. package/dist/transaction/updateSigners.js +5 -23
  135. package/dist/transaction/updateSigners.js.map +1 -1
  136. package/dist/transaction.d.ts +2 -1
  137. package/dist/transaction.d.ts.map +1 -1
  138. package/dist/transaction.js +2 -1
  139. package/dist/transaction.js.map +1 -1
  140. package/dist/types/proposal.d.ts +32 -15
  141. package/dist/types/proposal.d.ts.map +1 -1
  142. package/dist/types.d.ts +24 -7
  143. package/dist/types.d.ts.map +1 -1
  144. package/dist/utils/digest.d.ts +5 -0
  145. package/dist/utils/digest.d.ts.map +1 -1
  146. package/dist/utils/digest.js +34 -1
  147. package/dist/utils/digest.js.map +1 -1
  148. package/dist/utils/digest.test.d.ts +2 -0
  149. package/dist/utils/digest.test.d.ts.map +1 -0
  150. package/dist/utils/digest.test.js +48 -0
  151. package/dist/utils/digest.test.js.map +1 -0
  152. package/dist/utils/signature.d.ts +3 -1
  153. package/dist/utils/signature.d.ts.map +1 -1
  154. package/dist/utils/signature.js +31 -6
  155. package/dist/utils/signature.js.map +1 -1
  156. package/dist/utils/word.test.js +1 -52
  157. package/dist/utils/word.test.js.map +1 -1
  158. package/masm/account_components/auth/multisig.masm +13 -0
  159. package/masm/account_components/auth/multisig_ecdsa.masm +13 -0
  160. package/masm/account_components/auth/multisig_guardian.masm +17 -0
  161. package/masm/account_components/auth/multisig_guardian_ecdsa.masm +17 -0
  162. package/masm/auth/guardian.masm +177 -0
  163. package/masm/auth/guardian_ecdsa.masm +178 -0
  164. package/masm/{multisig.masm → auth/multisig.masm} +149 -55
  165. package/masm/{multisig_ecdsa.masm → auth/multisig_ecdsa.masm} +148 -56
  166. package/package.json +11 -9
  167. package/src/account/builder.test.ts +165 -0
  168. package/src/account/builder.ts +71 -34
  169. package/src/account/index.ts +1 -1
  170. package/src/account/masm/account-components/auth.ts +70 -0
  171. package/src/account/masm/auth.ts +1398 -0
  172. package/src/account/masm/index.ts +5 -0
  173. package/src/account/masm.ts +3 -1040
  174. package/src/account/storage.ts +18 -16
  175. package/src/client.test.ts +31 -35
  176. package/src/client.ts +98 -26
  177. package/src/index.ts +84 -22
  178. package/src/inspector.test.ts +17 -17
  179. package/src/inspector.ts +63 -29
  180. package/src/multisig/proposal/execution.ts +66 -49
  181. package/src/multisig/proposal/parser.ts +26 -26
  182. package/src/multisig/signing.ts +4 -4
  183. package/src/multisig.test.ts +2097 -248
  184. package/src/multisig.ts +882 -388
  185. package/src/procedures.ts +50 -26
  186. package/src/proposal/factory.ts +171 -0
  187. package/src/proposal/metadata.ts +165 -0
  188. package/src/proposal/signatures.ts +68 -0
  189. package/src/signer.ts +2 -0
  190. package/src/signers/ecdsa.test.ts +80 -0
  191. package/src/signers/ecdsa.ts +15 -4
  192. package/src/signers/falcon.test.ts +19 -0
  193. package/src/signers/falcon.ts +16 -5
  194. package/src/signers/miden-wallet.test.ts +47 -0
  195. package/src/signers/miden-wallet.ts +18 -1
  196. package/src/signers/para.test.ts +57 -0
  197. package/src/signers/para.ts +26 -7
  198. package/src/transaction/consumeNotes.ts +1 -0
  199. package/src/transaction/index.ts +2 -2
  200. package/src/transaction/options.ts +1 -2
  201. package/src/transaction/p2id.test.ts +190 -0
  202. package/src/transaction/p2id.ts +11 -5
  203. package/src/transaction/rpoRandomCoin.test.ts +64 -0
  204. package/src/transaction/rpoRandomCoin.ts +24 -0
  205. package/src/transaction/{updatePsm.ts → updateGuardian.ts} +19 -32
  206. package/src/transaction/updateProcedureThreshold.ts +97 -0
  207. package/src/transaction/updateSigners.ts +12 -27
  208. package/src/transaction.ts +5 -3
  209. package/src/types/proposal.ts +43 -11
  210. package/src/types.ts +29 -11
  211. package/src/utils/digest.test.ts +55 -0
  212. package/src/utils/digest.ts +51 -1
  213. package/src/utils/signature.ts +47 -9
  214. package/src/utils/word.test.ts +1 -55
  215. package/dist/account.d.ts +0 -104
  216. package/dist/account.d.ts.map +0 -1
  217. package/dist/account.js +0 -136
  218. package/dist/account.js.map +0 -1
  219. package/dist/builder.d.ts +0 -54
  220. package/dist/builder.d.ts.map +0 -1
  221. package/dist/builder.js +0 -78
  222. package/dist/builder.js.map +0 -1
  223. package/dist/http.d.ts +0 -64
  224. package/dist/http.d.ts.map +0 -1
  225. package/dist/http.js +0 -162
  226. package/dist/http.js.map +0 -1
  227. package/dist/keystore.d.ts +0 -65
  228. package/dist/keystore.d.ts.map +0 -1
  229. package/dist/keystore.js +0 -121
  230. package/dist/keystore.js.map +0 -1
  231. package/dist/miden.d.ts +0 -9
  232. package/dist/miden.d.ts.map +0 -1
  233. package/dist/miden.js +0 -26
  234. package/dist/miden.js.map +0 -1
  235. package/dist/multisig/metadata.d.ts +0 -18
  236. package/dist/multisig/metadata.d.ts.map +0 -1
  237. package/dist/multisig/metadata.js +0 -100
  238. package/dist/multisig/metadata.js.map +0 -1
  239. package/dist/multisig/metadata.test.d.ts +0 -2
  240. package/dist/multisig/metadata.test.d.ts.map +0 -1
  241. package/dist/multisig/metadata.test.js +0 -323
  242. package/dist/multisig/metadata.test.js.map +0 -1
  243. package/dist/proposal/exported.d.ts +0 -12
  244. package/dist/proposal/exported.d.ts.map +0 -1
  245. package/dist/proposal/exported.js +0 -88
  246. package/dist/proposal/exported.js.map +0 -1
  247. package/dist/signer.test.d.ts +0 -2
  248. package/dist/signer.test.d.ts.map +0 -1
  249. package/dist/signer.test.js +0 -123
  250. package/dist/signer.test.js.map +0 -1
  251. package/dist/transaction/p2id.interop.test.d.ts +0 -2
  252. package/dist/transaction/p2id.interop.test.d.ts.map +0 -1
  253. package/dist/transaction/p2id.interop.test.js +0 -36
  254. package/dist/transaction/p2id.interop.test.js.map +0 -1
  255. package/dist/transaction/updatePsm.d.ts +0 -7
  256. package/dist/transaction/updatePsm.d.ts.map +0 -1
  257. package/dist/transaction/updatePsm.js.map +0 -1
  258. package/dist/transport/http.d.ts +0 -64
  259. package/dist/transport/http.d.ts.map +0 -1
  260. package/dist/transport/http.js +0 -162
  261. package/dist/transport/http.js.map +0 -1
  262. package/dist/transport/index.d.ts +0 -5
  263. package/dist/transport/index.d.ts.map +0 -1
  264. package/dist/transport/index.js +0 -5
  265. package/dist/transport/index.js.map +0 -1
  266. package/dist/utils/state-validation.d.ts +0 -5
  267. package/dist/utils/state-validation.d.ts.map +0 -1
  268. package/dist/utils/state-validation.js +0 -30
  269. package/dist/utils/state-validation.js.map +0 -1
  270. package/dist/utils/validation.d.ts +0 -6
  271. package/dist/utils/validation.d.ts.map +0 -1
  272. package/dist/utils/validation.js +0 -52
  273. package/dist/utils/validation.js.map +0 -1
  274. package/masm/psm.masm +0 -178
  275. package/masm/psm_ecdsa.masm +0 -179
package/src/inspector.ts CHANGED
@@ -1,9 +1,13 @@
1
+ /**
2
+ * Account Inspector - Inspects account storage to detect multisig configuration.
3
+ */
4
+
1
5
  import { Account, Word } from '@miden-sdk/miden-sdk';
2
6
  import { base64ToUint8Array } from './utils/encoding.js';
3
7
  import { wordElementToBigInt, wordToHex } from './utils/word.js';
4
8
  import { getProcedureRoot, getProcedureNames, type ProcedureName } from './procedures.js';
5
- import type { SignatureScheme } from './types.js';
6
9
 
10
+ // Storage slot names matching the MASM definitions
7
11
  const MULTISIG_SLOT_NAMES = {
8
12
  THRESHOLD_CONFIG: 'openzeppelin::multisig::threshold_config',
9
13
  SIGNER_PUBLIC_KEYS: 'openzeppelin::multisig::signer_public_keys',
@@ -11,9 +15,9 @@ const MULTISIG_SLOT_NAMES = {
11
15
  PROCEDURE_THRESHOLDS: 'openzeppelin::multisig::procedure_thresholds',
12
16
  } as const;
13
17
 
14
- const PSM_SLOT_NAMES = {
15
- SELECTOR: 'openzeppelin::psm::selector',
16
- PUBLIC_KEY: 'openzeppelin::psm::public_key',
18
+ const GUARDIAN_SLOT_NAMES = {
19
+ SELECTOR: 'openzeppelin::guardian::selector',
20
+ PUBLIC_KEY: 'openzeppelin::guardian::public_key',
17
21
  } as const;
18
22
 
19
23
  export interface VaultBalance {
@@ -25,23 +29,48 @@ export interface DetectedMultisigConfig {
25
29
  threshold: number;
26
30
  numSigners: number;
27
31
  signerCommitments: string[];
28
- psmEnabled: boolean;
29
- psmCommitment: string | null;
32
+ guardianEnabled: boolean;
33
+ guardianCommitment: string | null;
30
34
  vaultBalances: VaultBalance[];
31
35
  procedureThresholds: Map<ProcedureName, number>;
32
- signatureScheme: SignatureScheme;
33
36
  }
34
37
 
38
+ /**
39
+ * Inspects an account to detect its multisig configuration.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * // From base64-encoded state
44
+ * const config = AccountInspector.fromBase64(stateDataBase64);
45
+ * console.log(`${config.threshold}-of-${config.numSigners} multisig`);
46
+ *
47
+ * // From Miden SDK Account
48
+ * const config = AccountInspector.fromAccount(account);
49
+ * ```
50
+ */
35
51
  export class AccountInspector {
36
52
  private constructor() {}
37
53
 
38
- static fromBase64(base64Data: string, signatureScheme: SignatureScheme = 'falcon'): DetectedMultisigConfig {
39
- const bytes = base64ToUint8Array(base64Data);
40
- const account = Account.deserialize(bytes);
41
- return AccountInspector.fromAccount(account, signatureScheme);
54
+ /**
55
+ * Inspect a base64-encoded serialized account.
56
+ *
57
+ * @param base64Data - Base64-encoded Account bytes
58
+ * @returns Detected multisig configuration
59
+ */
60
+ static fromBase64(base64Data: string): DetectedMultisigConfig {
61
+ const bytes = base64ToUint8Array(base64Data);
62
+ const account = Account.deserialize(bytes);
63
+ return AccountInspector.fromAccount(account);
42
64
  }
43
65
 
44
- static fromAccount(account: Account, signatureScheme: SignatureScheme = 'falcon'): DetectedMultisigConfig {
66
+ /**
67
+ * Inspect a Miden SDK Account object.
68
+ *
69
+ * @param account - The Account object from Miden SDK
70
+ * @returns Detected multisig configuration
71
+ */
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ static fromAccount(account: Account): DetectedMultisigConfig {
45
74
  const storage = account.storage();
46
75
 
47
76
  const slot0 = storage.getItem(MULTISIG_SLOT_NAMES.THRESHOLD_CONFIG) as Word;
@@ -56,26 +85,28 @@ export class AccountInspector {
56
85
  if (commitment) {
57
86
  signerCommitments.push(wordToHex(commitment));
58
87
  }
59
- } catch {
88
+ } catch (error) {
89
+ console.warn(error);
60
90
  }
61
91
  }
62
92
 
63
- let psmEnabled = false;
64
- let psmCommitment: string | null = null;
93
+ let guardianEnabled = false;
94
+ let guardianCommitment: string | null = null;
65
95
 
66
96
  try {
67
- const psmSlot0 = storage.getItem(PSM_SLOT_NAMES.SELECTOR) as Word;
68
- const selector = Number(wordElementToBigInt(psmSlot0, 0));
69
- psmEnabled = selector === 1;
97
+ const guardianSlot0 = storage.getItem(GUARDIAN_SLOT_NAMES.SELECTOR) as Word;
98
+ const selector = Number(wordElementToBigInt(guardianSlot0, 0));
99
+ guardianEnabled = selector === 1;
70
100
 
71
- if (psmEnabled) {
101
+ if (guardianEnabled) {
72
102
  const zeroKey = new Word(new BigUint64Array([0n, 0n, 0n, 0n]));
73
- const psmKey = storage.getMapItem(PSM_SLOT_NAMES.PUBLIC_KEY, zeroKey) as Word;
74
- if (psmKey) {
75
- psmCommitment = wordToHex(psmKey);
103
+ const guardianKey = storage.getMapItem(GUARDIAN_SLOT_NAMES.PUBLIC_KEY, zeroKey) as Word;
104
+ if (guardianKey) {
105
+ guardianCommitment = wordToHex(guardianKey);
76
106
  }
77
107
  }
78
- } catch {
108
+ } catch (error) {
109
+ console.warn(error);
79
110
  }
80
111
 
81
112
  const vaultBalances: VaultBalance[] = [];
@@ -88,13 +119,16 @@ export class AccountInspector {
88
119
  amount: BigInt(asset.amount()),
89
120
  });
90
121
  }
91
- } catch {
122
+ } catch (error) {
123
+ console.warn(error);
92
124
  }
93
125
 
126
+ // Read procedure threshold overrides from storage slot 3
127
+ // Storage layout: slot 3 is a map of PROC_ROOT => [threshold, 0, 0, 0]
94
128
  const procedureThresholds = new Map<ProcedureName, number>();
95
- for (const procName of getProcedureNames(signatureScheme)) {
129
+ for (const procName of getProcedureNames()) {
96
130
  try {
97
- const rootHex = getProcedureRoot(procName, signatureScheme);
131
+ const rootHex = getProcedureRoot(procName);
98
132
  const rootWord = Word.fromHex(rootHex);
99
133
  const value = storage.getMapItem(MULTISIG_SLOT_NAMES.PROCEDURE_THRESHOLDS, rootWord) as Word;
100
134
  if (value) {
@@ -104,6 +138,7 @@ export class AccountInspector {
104
138
  }
105
139
  }
106
140
  } catch {
141
+ // Procedure threshold not set - use default
107
142
  }
108
143
  }
109
144
 
@@ -111,11 +146,10 @@ export class AccountInspector {
111
146
  threshold,
112
147
  numSigners,
113
148
  signerCommitments,
114
- psmEnabled,
115
- psmCommitment,
149
+ guardianEnabled,
150
+ guardianCommitment,
116
151
  vaultBalances,
117
152
  procedureThresholds,
118
- signatureScheme,
119
153
  };
120
154
  }
121
155
  }
@@ -1,4 +1,4 @@
1
- import { type DeltaObject, type PsmHttpClient } from '@openzeppelin/psm-client';
1
+ import { type DeltaObject, type GuardianHttpClient } from '@openzeppelin/guardian-client';
2
2
  import type { WebClient, TransactionRequest } from '@miden-sdk/miden-sdk';
3
3
  import {
4
4
  AccountId,
@@ -12,7 +12,8 @@ import type { ProposalType, TransactionProposal } from '../../types.js';
12
12
  import {
13
13
  buildConsumeNotesTransactionRequest,
14
14
  buildP2idTransactionRequest,
15
- buildUpdatePsmTransactionRequest,
15
+ buildUpdateGuardianTransactionRequest,
16
+ buildUpdateProcedureThresholdTransactionRequest,
16
17
  buildUpdateSignersTransactionRequest,
17
18
  } from '../../transaction.js';
18
19
  import { base64ToUint8Array, normalizeHexWord } from '../../utils/encoding.js';
@@ -39,11 +40,11 @@ interface ExecuteProposalWorkflowParams {
39
40
  accountId: string;
40
41
  threshold: number;
41
42
  signerCommitments: string[];
42
- psmCommitment: string;
43
- psmPublicKey?: string;
43
+ guardianCommitment: string;
44
+ guardianPublicKey?: string;
44
45
  signatureScheme: 'falcon' | 'ecdsa';
45
46
  getEffectiveThreshold: (proposalType: ProposalType) => number;
46
- psm: PsmHttpClient;
47
+ guardian: GuardianHttpClient;
47
48
  webClient: WebClient;
48
49
  }
49
50
 
@@ -56,12 +57,12 @@ export async function executeProposalWorkflow(
56
57
  params.getEffectiveThreshold,
57
58
  );
58
59
 
59
- const isSwitchPsm = params.proposal.metadata.proposalType === 'switch_psm';
60
+ const isSwitchGuardian = params.proposal.metadata.proposalType === 'switch_guardian';
60
61
  const executionSource = await resolveExecutionSource(
61
- params.psm,
62
+ params.guardian,
62
63
  params.accountId,
63
64
  params.proposal,
64
- isSwitchPsm,
65
+ isSwitchGuardian,
65
66
  );
66
67
  const executionData = prepareExecutionData(executionSource.txSummaryBase64);
67
68
 
@@ -71,12 +72,12 @@ export async function executeProposalWorkflow(
71
72
  executionData.txCommitmentHex,
72
73
  );
73
74
 
74
- if (!isSwitchPsm && executionSource.delta) {
75
- await appendPsmAckAdvice(
76
- params.psm,
75
+ if (!isSwitchGuardian && executionSource.delta) {
76
+ await appendGuardianAckAdvice(
77
+ params.guardian,
77
78
  executionSource.delta,
78
- params.psmCommitment,
79
- params.psmPublicKey,
79
+ params.guardianCommitment,
80
+ params.guardianPublicKey,
80
81
  params.signatureScheme,
81
82
  executionData.txCommitmentHex,
82
83
  adviceMap,
@@ -101,12 +102,12 @@ export async function createTransactionProposalRequest(
101
102
  params.getEffectiveThreshold,
102
103
  );
103
104
 
104
- const isSwitchPsm = params.proposal.metadata.proposalType === 'switch_psm';
105
+ const isSwitchGuardian = params.proposal.metadata.proposalType === 'switch_guardian';
105
106
  const executionSource = await resolveExecutionSource(
106
- params.psm,
107
+ params.guardian,
107
108
  params.accountId,
108
109
  params.proposal,
109
- isSwitchPsm,
110
+ isSwitchGuardian,
110
111
  );
111
112
  const executionData = prepareExecutionData(executionSource.txSummaryBase64);
112
113
 
@@ -116,12 +117,12 @@ export async function createTransactionProposalRequest(
116
117
  executionData.txCommitmentHex,
117
118
  );
118
119
 
119
- if (!isSwitchPsm && executionSource.delta) {
120
- await appendPsmAckAdvice(
121
- params.psm,
120
+ if (!isSwitchGuardian && executionSource.delta) {
121
+ await appendGuardianAckAdvice(
122
+ params.guardian,
122
123
  executionSource.delta,
123
- params.psmCommitment,
124
- params.psmPublicKey,
124
+ params.guardianCommitment,
125
+ params.guardianPublicKey,
125
126
  params.signatureScheme,
126
127
  executionData.txCommitmentHex,
127
128
  adviceMap,
@@ -151,16 +152,16 @@ function ensureProposalReady(
151
152
  }
152
153
 
153
154
  async function resolveExecutionSource(
154
- psm: PsmHttpClient,
155
+ guardian: GuardianHttpClient,
155
156
  accountId: string,
156
157
  proposal: TransactionProposal,
157
- isSwitchPsm: boolean,
158
+ isSwitchGuardian: boolean,
158
159
  ): Promise<ResolveExecutionSourceResult> {
159
- if (isSwitchPsm) {
160
+ if (isSwitchGuardian) {
160
161
  return { txSummaryBase64: proposal.txSummary };
161
162
  }
162
163
 
163
- const deltas = await psm.getDeltaProposals(accountId);
164
+ const deltas = await guardian.getDeltaProposals(accountId);
164
165
  const delta = deltas.find(
165
166
  (d) => computeCommitmentFromTxSummary(d.deltaPayload.txSummary.data) === proposal.commitment,
166
167
  );
@@ -214,14 +215,17 @@ function buildCosignerAdviceMap(
214
215
  );
215
216
  const signature = Signature.deserialize(sigBytes);
216
217
  const txCommitment = Word.fromHex(normalizeHexWord(txCommitmentHex));
217
- const isEcdsa =
218
- cosignerSig.signature.scheme === 'ecdsa' && cosignerSig.signature.publicKey;
218
+ const ecdsaPublicKey =
219
+ cosignerSig.signature.scheme === 'ecdsa'
220
+ ? cosignerSig.signature.publicKey
221
+ : undefined;
222
+ const isEcdsa = cosignerSig.signature.scheme === 'ecdsa' && Boolean(ecdsaPublicKey);
219
223
 
220
224
  const { key, values } = buildSignatureAdviceEntry(
221
225
  signerCommitment,
222
226
  txCommitment,
223
227
  signature,
224
- isEcdsa ? cosignerSig.signature.publicKey : undefined,
228
+ ecdsaPublicKey,
225
229
  isEcdsa ? cosignerSig.signature.signature : undefined,
226
230
  );
227
231
  adviceMap.insert(key, new FeltArray(values));
@@ -230,11 +234,11 @@ function buildCosignerAdviceMap(
230
234
  return adviceMap;
231
235
  }
232
236
 
233
- async function appendPsmAckAdvice(
234
- psm: PsmHttpClient,
237
+ async function appendGuardianAckAdvice(
238
+ guardian: GuardianHttpClient,
235
239
  delta: DeltaObject,
236
- psmCommitmentHex: string,
237
- psmPublicKey: string | undefined,
240
+ guardianCommitmentHex: string,
241
+ guardianPublicKey: string | undefined,
238
242
  defaultAckScheme: 'falcon' | 'ecdsa',
239
243
  txCommitmentHex: string,
240
244
  adviceMap: AdviceMap,
@@ -244,31 +248,31 @@ async function appendPsmAckAdvice(
244
248
  deltaPayload: delta.deltaPayload.txSummary,
245
249
  };
246
250
 
247
- const pushResult = await psm.pushDelta(executionDelta);
251
+ const pushResult = await guardian.pushDelta(executionDelta);
248
252
  const ackSigHex = pushResult.ackSig;
249
253
  if (!ackSigHex) {
250
- throw new Error('PSM did not return acknowledgment signature');
254
+ throw new Error('GUARDIAN did not return acknowledgment signature');
251
255
  }
252
256
 
253
- const psmAckScheme: 'ecdsa' | 'falcon' =
257
+ const guardianAckScheme: 'ecdsa' | 'falcon' =
254
258
  (pushResult.ackScheme as 'ecdsa' | 'falcon') || defaultAckScheme;
255
- const ackPubkey = pushResult.ackPubkey || psmPublicKey;
256
- const normalizedPsmCommitment = normalizeHexWord(psmCommitmentHex);
259
+ const ackPubkey = pushResult.ackPubkey || guardianPublicKey;
260
+ const normalizedGuardianCommitment = normalizeHexWord(guardianCommitmentHex);
257
261
 
258
- if (psmAckScheme === 'ecdsa' && ackPubkey) {
262
+ if (guardianAckScheme === 'ecdsa' && ackPubkey) {
259
263
  const derived = tryComputeEcdsaCommitmentHex(ackPubkey);
260
- if (derived && derived !== normalizedPsmCommitment) {
261
- throw new Error('PSM public key commitment mismatch');
264
+ if (derived && derived !== normalizedGuardianCommitment) {
265
+ throw new Error('GUARDIAN public key commitment mismatch');
262
266
  }
263
267
  }
264
268
 
265
- const psmCommitment = Word.fromHex(normalizedPsmCommitment);
266
- const ackSigBytes = signatureHexToBytes(ackSigHex, psmAckScheme);
269
+ const guardianCommitment = Word.fromHex(normalizedGuardianCommitment);
270
+ const ackSigBytes = signatureHexToBytes(ackSigHex, guardianAckScheme);
267
271
  const ackSignature = Signature.deserialize(ackSigBytes);
268
272
  const txCommitment = Word.fromHex(normalizeHexWord(txCommitmentHex));
269
- const isAckEcdsa = psmAckScheme === 'ecdsa' && ackPubkey;
273
+ const isAckEcdsa = guardianAckScheme === 'ecdsa' && ackPubkey;
270
274
  const { key, values } = buildSignatureAdviceEntry(
271
- psmCommitment,
275
+ guardianCommitment,
272
276
  txCommitment,
273
277
  ackSignature,
274
278
  isAckEcdsa ? ackPubkey : undefined,
@@ -299,15 +303,28 @@ async function buildFinalRequest(
299
303
  );
300
304
  return request;
301
305
  }
302
- case 'switch_psm': {
303
- if (!metadata.newPsmPubkey) {
306
+ case 'switch_guardian': {
307
+ if (!metadata.newGuardianPubkey) {
304
308
  throw new Error(
305
- 'Proposal missing newPsmPubkey. Was it created with createSwitchPsmProposal?',
309
+ 'Proposal missing newGuardianPubkey. Was it created with createSwitchGuardianProposal?',
306
310
  );
307
311
  }
308
- const { request } = await buildUpdatePsmTransactionRequest(
312
+ const { request } = await buildUpdateGuardianTransactionRequest(
309
313
  params.webClient,
310
- metadata.newPsmPubkey,
314
+ metadata.newGuardianPubkey,
315
+ {
316
+ salt: normalizedSalt,
317
+ signatureAdviceMap: adviceMap,
318
+ signatureScheme: params.signatureScheme,
319
+ },
320
+ );
321
+ return request;
322
+ }
323
+ case 'update_procedure_threshold': {
324
+ const { request } = await buildUpdateProcedureThresholdTransactionRequest(
325
+ params.webClient,
326
+ metadata.targetProcedure,
327
+ metadata.targetThreshold,
311
328
  {
312
329
  salt: normalizedSalt,
313
330
  signatureAdviceMap: adviceMap,
@@ -1,8 +1,8 @@
1
1
  import type {
2
2
  DeltaObject,
3
3
  DeltaStatus,
4
- ProposalMetadata as PsmProposalMetadata,
5
- } from '@openzeppelin/psm-client';
4
+ ProposalMetadata as GuardianProposalMetadata,
5
+ } from '@openzeppelin/guardian-client';
6
6
  import type {
7
7
  ProposalMetadata,
8
8
  ProposalType,
@@ -11,8 +11,8 @@ import type {
11
11
  TransactionProposalStatus,
12
12
  } from '../../types.js';
13
13
 
14
- export function buildPsmMetadata(metadata: ProposalMetadata): PsmProposalMetadata {
15
- const base: PsmProposalMetadata = {
14
+ export function buildGuardianMetadata(metadata: ProposalMetadata): GuardianProposalMetadata {
15
+ const base: GuardianProposalMetadata = {
16
16
  proposalType: metadata.proposalType,
17
17
  description: metadata.description,
18
18
  salt: metadata.saltHex,
@@ -31,13 +31,13 @@ export function buildPsmMetadata(metadata: ProposalMetadata): PsmProposalMetadat
31
31
  faucetId: metadata.faucetId,
32
32
  amount: metadata.amount,
33
33
  };
34
- case 'switch_psm':
34
+ case 'switch_guardian':
35
35
  return {
36
36
  ...base,
37
37
  targetThreshold: metadata.targetThreshold,
38
38
  signerCommitments: metadata.targetSignerCommitments,
39
- newPsmPubkey: metadata.newPsmPubkey,
40
- newPsmEndpoint: metadata.newPsmEndpoint,
39
+ newGuardianPubkey: metadata.newGuardianPubkey,
40
+ newGuardianEndpoint: metadata.newGuardianEndpoint,
41
41
  };
42
42
  case 'add_signer':
43
43
  case 'remove_signer':
@@ -54,46 +54,46 @@ export function buildPsmMetadata(metadata: ProposalMetadata): PsmProposalMetadat
54
54
  }
55
55
  }
56
56
 
57
- export function fromPsmMetadata(psm: PsmProposalMetadata): ProposalMetadata | undefined {
58
- if (!psm.proposalType) return undefined;
57
+ export function fromGuardianMetadata(guardian: GuardianProposalMetadata): ProposalMetadata | undefined {
58
+ if (!guardian.proposalType) return undefined;
59
59
 
60
60
  const base = {
61
- description: psm.description ?? '',
62
- saltHex: psm.salt,
61
+ description: guardian.description ?? '',
62
+ saltHex: guardian.salt,
63
63
  };
64
64
 
65
- switch (psm.proposalType) {
65
+ switch (guardian.proposalType) {
66
66
  case 'p2id':
67
67
  return {
68
68
  ...base,
69
69
  proposalType: 'p2id',
70
- recipientId: psm.recipientId ?? '',
71
- faucetId: psm.faucetId ?? '',
72
- amount: psm.amount ?? '0',
70
+ recipientId: guardian.recipientId ?? '',
71
+ faucetId: guardian.faucetId ?? '',
72
+ amount: guardian.amount ?? '0',
73
73
  };
74
74
  case 'consume_notes':
75
75
  return {
76
76
  ...base,
77
77
  proposalType: 'consume_notes',
78
- noteIds: psm.noteIds ?? [],
78
+ noteIds: guardian.noteIds ?? [],
79
79
  };
80
- case 'switch_psm':
80
+ case 'switch_guardian':
81
81
  return {
82
82
  ...base,
83
- proposalType: 'switch_psm',
84
- newPsmPubkey: psm.newPsmPubkey ?? '',
85
- newPsmEndpoint: psm.newPsmEndpoint,
86
- targetThreshold: psm.targetThreshold,
87
- targetSignerCommitments: psm.signerCommitments,
83
+ proposalType: 'switch_guardian',
84
+ newGuardianPubkey: guardian.newGuardianPubkey ?? '',
85
+ newGuardianEndpoint: guardian.newGuardianEndpoint,
86
+ targetThreshold: guardian.targetThreshold,
87
+ targetSignerCommitments: guardian.signerCommitments,
88
88
  };
89
89
  case 'add_signer':
90
90
  case 'remove_signer':
91
91
  case 'change_threshold':
92
92
  return {
93
93
  ...base,
94
- proposalType: psm.proposalType,
95
- targetThreshold: psm.targetThreshold ?? 0,
96
- targetSignerCommitments: psm.signerCommitments ?? [],
94
+ proposalType: guardian.proposalType,
95
+ targetThreshold: guardian.targetThreshold ?? 0,
96
+ targetSignerCommitments: guardian.signerCommitments ?? [],
97
97
  };
98
98
  default:
99
99
  return undefined;
@@ -178,7 +178,7 @@ export function resolveMetadata(
178
178
  ): ProposalMetadata | undefined {
179
179
  if (existingMetadata) return existingMetadata;
180
180
  if (!delta.deltaPayload.metadata) return undefined;
181
- return fromPsmMetadata(delta.deltaPayload.metadata);
181
+ return fromGuardianMetadata(delta.deltaPayload.metadata);
182
182
  }
183
183
 
184
184
  export function signatureRequirementForProposal(
@@ -1,7 +1,7 @@
1
- import type { ProposalSignature, Signer } from '@openzeppelin/psm-client';
1
+ import type { ProposalSignature, Signer } from '@openzeppelin/guardian-client';
2
2
  import type { SignatureScheme } from '../types.js';
3
3
 
4
- export function toPsmSignature(
4
+ export function toGuardianSignature(
5
5
  scheme: SignatureScheme,
6
6
  signatureHex: string,
7
7
  publicKey?: string,
@@ -15,10 +15,10 @@ export function toPsmSignature(
15
15
  return { scheme: 'falcon', signature: signatureHex };
16
16
  }
17
17
 
18
- export async function buildPsmSignatureFromSigner(
18
+ export async function buildGuardianSignatureFromSigner(
19
19
  signer: Signer,
20
20
  commitment: string,
21
21
  ): Promise<ProposalSignature> {
22
22
  const signatureHex = await signer.signCommitment(commitment);
23
- return toPsmSignature(signer.scheme, signatureHex, signer.publicKey);
23
+ return toGuardianSignature(signer.scheme, signatureHex, signer.publicKey);
24
24
  }