@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,150 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { MultisigClient } from './client.js';
3
+ // Mock the Miden SDK
4
+ vi.mock('@demox-labs/miden-sdk', () => ({
5
+ AccountId: {
6
+ fromHex: vi.fn((hex) => ({ toString: () => hex })),
7
+ },
8
+ Account: {
9
+ deserialize: vi.fn(() => ({
10
+ id: () => ({
11
+ toString: () => '0x' + 'd'.repeat(30),
12
+ prefix: () => ({ asInt: () => BigInt(1) }),
13
+ suffix: () => ({ asInt: () => BigInt(2) }),
14
+ }),
15
+ storage: vi.fn(),
16
+ vault: vi.fn(),
17
+ })),
18
+ },
19
+ }));
20
+ // Mock the AccountInspector
21
+ vi.mock('./inspector.js', () => ({
22
+ AccountInspector: {
23
+ fromAccount: vi.fn(() => ({
24
+ threshold: 2,
25
+ numSigners: 2,
26
+ signerCommitments: ['0x' + 'a'.repeat(64), '0x' + 'b'.repeat(64)],
27
+ psmEnabled: true,
28
+ psmCommitment: '0x' + 'c'.repeat(64),
29
+ vaultBalances: [],
30
+ procedureThresholds: new Map(),
31
+ })),
32
+ },
33
+ }));
34
+ // Mock the account creation module
35
+ vi.mock('./account/index.js', () => ({
36
+ createMultisigAccount: vi.fn().mockResolvedValue({
37
+ account: {
38
+ id: () => ({
39
+ toString: () => '0x' + 'a'.repeat(30),
40
+ prefix: () => ({ asInt: () => BigInt(1) }),
41
+ suffix: () => ({ asInt: () => BigInt(2) }),
42
+ }),
43
+ serialize: () => new Uint8Array([1, 2, 3]),
44
+ },
45
+ seed: new Uint8Array([4, 5, 6]),
46
+ }),
47
+ }));
48
+ // Mock fetch for PSM client
49
+ const mockFetch = vi.fn();
50
+ vi.stubGlobal('fetch', mockFetch);
51
+ describe('MultisigClient', () => {
52
+ let webClient;
53
+ let mockSigner;
54
+ beforeEach(() => {
55
+ mockFetch.mockReset();
56
+ webClient = {
57
+ createScriptBuilder: vi.fn(),
58
+ executeTransaction: vi.fn(),
59
+ proveTransaction: vi.fn(),
60
+ submitProvenTransaction: vi.fn(),
61
+ applyTransaction: vi.fn(),
62
+ syncState: vi.fn(),
63
+ newAccount: vi.fn(),
64
+ getAccount: vi.fn().mockResolvedValue(null),
65
+ };
66
+ mockSigner = {
67
+ commitment: '0x' + '1'.repeat(64),
68
+ publicKey: '0x' + '2'.repeat(64),
69
+ signAccountIdWithTimestamp: vi.fn().mockReturnValue('0x' + 'a'.repeat(128)),
70
+ signCommitment: vi.fn().mockReturnValue('0x' + 'b'.repeat(128)),
71
+ };
72
+ });
73
+ describe('constructor', () => {
74
+ it('should create client with default PSM endpoint', () => {
75
+ const client = new MultisigClient(webClient);
76
+ expect(client).toBeInstanceOf(MultisigClient);
77
+ });
78
+ it('should create client with custom PSM endpoint', () => {
79
+ const client = new MultisigClient(webClient, { psmEndpoint: 'http://custom:8080' });
80
+ expect(client).toBeInstanceOf(MultisigClient);
81
+ });
82
+ });
83
+ describe('psmClient getter', () => {
84
+ it('should expose PSM client for getting pubkey', () => {
85
+ const client = new MultisigClient(webClient);
86
+ expect(client.psmClient).toBeDefined();
87
+ });
88
+ });
89
+ describe('create', () => {
90
+ it('should create multisig and return Multisig instance', async () => {
91
+ const client = new MultisigClient(webClient);
92
+ const config = {
93
+ threshold: 2,
94
+ signerCommitments: ['0x' + 'a'.repeat(64), '0x' + 'b'.repeat(64)],
95
+ psmCommitment: '0x' + 'c'.repeat(64),
96
+ };
97
+ const multisig = await client.create(config, mockSigner);
98
+ expect(multisig).toBeDefined();
99
+ expect(multisig.threshold).toBe(2);
100
+ expect(multisig.signerCommitments).toEqual(config.signerCommitments);
101
+ expect(multisig.psmCommitment).toBe(config.psmCommitment);
102
+ });
103
+ it('should set signer on PSM client', async () => {
104
+ const client = new MultisigClient(webClient);
105
+ const config = {
106
+ threshold: 1,
107
+ signerCommitments: ['0x' + 'a'.repeat(64)],
108
+ psmCommitment: '0x' + 'c'.repeat(64),
109
+ };
110
+ const multisig = await client.create(config, mockSigner);
111
+ expect(multisig.signerCommitment).toBe(mockSigner.commitment);
112
+ });
113
+ });
114
+ describe('load', () => {
115
+ it('should load existing multisig account and detect config', async () => {
116
+ const client = new MultisigClient(webClient);
117
+ // Mock getState response
118
+ mockFetch.mockResolvedValueOnce({
119
+ ok: true,
120
+ json: async () => ({
121
+ account_id: '0x' + 'd'.repeat(30),
122
+ commitment: '0x' + 'e'.repeat(64),
123
+ state_json: { data: 'base64state' },
124
+ created_at: '2024-01-01T00:00:00Z',
125
+ updated_at: '2024-01-02T00:00:00Z',
126
+ }),
127
+ });
128
+ const accountId = '0x' + 'd'.repeat(30);
129
+ const multisig = await client.load(accountId, mockSigner);
130
+ expect(multisig).toBeDefined();
131
+ expect(multisig.accountId).toBe(accountId);
132
+ // Config is detected from account storage via AccountInspector
133
+ expect(multisig.threshold).toBe(2);
134
+ expect(multisig.signerCommitments).toEqual(['0x' + 'a'.repeat(64), '0x' + 'b'.repeat(64)]);
135
+ expect(multisig.psmCommitment).toBe('0x' + 'c'.repeat(64));
136
+ expect(multisig.account).toBeNull(); // Loaded accounts don't have the SDK Account
137
+ });
138
+ it('should throw if account not found on PSM', async () => {
139
+ const client = new MultisigClient(webClient);
140
+ mockFetch.mockResolvedValueOnce({
141
+ ok: false,
142
+ status: 404,
143
+ statusText: 'Not Found',
144
+ text: async () => 'Account not found',
145
+ });
146
+ await expect(client.load('0xnonexistent', mockSigner)).rejects.toThrow();
147
+ });
148
+ });
149
+ });
150
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * HTTP client for PSM server communication.
3
+ */
4
+ import type { ConfigureRequest, ConfigureResponse, DeltaObject, DeltaProposalRequest, DeltaProposalResponse, SignProposalRequest, Signer, StateObject } from './types.js';
5
+ /**
6
+ * Error thrown by the PSM HTTP client.
7
+ */
8
+ export declare class PsmHttpError extends Error {
9
+ readonly status: number;
10
+ readonly statusText: string;
11
+ readonly body: string;
12
+ constructor(status: number, statusText: string, body: string);
13
+ }
14
+ /**
15
+ * HTTP client for PSM server.
16
+ */
17
+ export declare class PsmHttpClient {
18
+ private readonly baseUrl;
19
+ private signer;
20
+ constructor(baseUrl: string);
21
+ /**
22
+ * Set the signer for authenticated requests.
23
+ */
24
+ setSigner(signer: Signer): void;
25
+ /**
26
+ * Get the PSM server's public key.
27
+ */
28
+ getPubkey(): Promise<string>;
29
+ /**
30
+ * Configure/register an account on PSM.
31
+ */
32
+ configure(request: ConfigureRequest): Promise<ConfigureResponse>;
33
+ /**
34
+ * Get account state from PSM.
35
+ */
36
+ getState(accountId: string): Promise<StateObject>;
37
+ /**
38
+ * Get all delta proposals for an account.
39
+ */
40
+ getDeltaProposals(accountId: string): Promise<DeltaObject[]>;
41
+ /**
42
+ * Push a new delta proposal.
43
+ */
44
+ pushDeltaProposal(request: DeltaProposalRequest): Promise<DeltaProposalResponse>;
45
+ /**
46
+ * Sign a delta proposal.
47
+ */
48
+ signDeltaProposal(request: SignProposalRequest): Promise<DeltaObject>;
49
+ /**
50
+ * Push a delta (execute a proposal).
51
+ */
52
+ pushDelta(delta: DeltaObject): Promise<DeltaObject>;
53
+ /**
54
+ * Get a specific delta by nonce.
55
+ */
56
+ getDelta(accountId: string, nonce: number): Promise<DeltaObject>;
57
+ /**
58
+ * Get merged delta since a nonce.
59
+ */
60
+ getDeltaSince(accountId: string, fromNonce: number): Promise<DeltaObject>;
61
+ private fetch;
62
+ private fetchAuthenticated;
63
+ }
64
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EAIrB,mBAAmB,EACnB,MAAM,EACN,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;aAEnB,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,MAAM;gBAFZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAK/B;AAED;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,MAAM,CAAuB;gBAER,OAAO,EAAE,MAAM;IAE5C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQtE;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQvD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASlE;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAQtF;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ3E;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAQzD;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAWtE;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAejE,KAAK;YAkBL,kBAAkB;CAoBjC"}
package/dist/http.js ADDED
@@ -0,0 +1,162 @@
1
+ /**
2
+ * HTTP client for PSM server communication.
3
+ */
4
+ /**
5
+ * Error thrown by the PSM HTTP client.
6
+ */
7
+ export class PsmHttpError extends Error {
8
+ status;
9
+ statusText;
10
+ body;
11
+ constructor(status, statusText, body) {
12
+ super(`PSM HTTP error ${status}: ${statusText} - ${body}`);
13
+ this.status = status;
14
+ this.statusText = statusText;
15
+ this.body = body;
16
+ this.name = 'PsmHttpError';
17
+ }
18
+ }
19
+ /**
20
+ * HTTP client for PSM server.
21
+ */
22
+ export class PsmHttpClient {
23
+ baseUrl;
24
+ signer = null;
25
+ constructor(baseUrl) {
26
+ this.baseUrl = baseUrl;
27
+ }
28
+ /**
29
+ * Set the signer for authenticated requests.
30
+ */
31
+ setSigner(signer) {
32
+ this.signer = signer;
33
+ }
34
+ /**
35
+ * Get the PSM server's public key.
36
+ */
37
+ async getPubkey() {
38
+ const response = await this.fetch('/pubkey', { method: 'GET' });
39
+ const data = (await response.json());
40
+ return data.pubkey;
41
+ }
42
+ /**
43
+ * Configure/register an account on PSM.
44
+ */
45
+ async configure(request) {
46
+ const response = await this.fetchAuthenticated('/configure', {
47
+ method: 'POST',
48
+ body: JSON.stringify(request),
49
+ }, request.account_id);
50
+ return (await response.json());
51
+ }
52
+ /**
53
+ * Get account state from PSM.
54
+ */
55
+ async getState(accountId) {
56
+ const params = new URLSearchParams({ account_id: accountId });
57
+ const response = await this.fetchAuthenticated(`/state?${params}`, {
58
+ method: 'GET',
59
+ }, accountId);
60
+ return (await response.json());
61
+ }
62
+ /**
63
+ * Get all delta proposals for an account.
64
+ */
65
+ async getDeltaProposals(accountId) {
66
+ const params = new URLSearchParams({ account_id: accountId });
67
+ const response = await this.fetchAuthenticated(`/delta/proposal?${params}`, {
68
+ method: 'GET',
69
+ }, accountId);
70
+ const data = (await response.json());
71
+ return data.proposals;
72
+ }
73
+ /**
74
+ * Push a new delta proposal.
75
+ */
76
+ async pushDeltaProposal(request) {
77
+ const response = await this.fetchAuthenticated('/delta/proposal', {
78
+ method: 'POST',
79
+ body: JSON.stringify(request),
80
+ }, request.account_id);
81
+ return (await response.json());
82
+ }
83
+ /**
84
+ * Sign a delta proposal.
85
+ */
86
+ async signDeltaProposal(request) {
87
+ const response = await this.fetchAuthenticated('/delta/proposal', {
88
+ method: 'PUT',
89
+ body: JSON.stringify(request),
90
+ }, request.account_id);
91
+ return (await response.json());
92
+ }
93
+ /**
94
+ * Push a delta (execute a proposal).
95
+ */
96
+ async pushDelta(delta) {
97
+ const response = await this.fetchAuthenticated('/delta', {
98
+ method: 'POST',
99
+ body: JSON.stringify(delta),
100
+ }, delta.account_id);
101
+ return (await response.json());
102
+ }
103
+ /**
104
+ * Get a specific delta by nonce.
105
+ */
106
+ async getDelta(accountId, nonce) {
107
+ const params = new URLSearchParams({
108
+ account_id: accountId,
109
+ nonce: nonce.toString(),
110
+ });
111
+ const response = await this.fetchAuthenticated(`/delta?${params}`, {
112
+ method: 'GET',
113
+ }, accountId);
114
+ return (await response.json());
115
+ }
116
+ /**
117
+ * Get merged delta since a nonce.
118
+ */
119
+ async getDeltaSince(accountId, fromNonce) {
120
+ const params = new URLSearchParams({
121
+ account_id: accountId,
122
+ nonce: fromNonce.toString(),
123
+ });
124
+ const response = await this.fetchAuthenticated(`/delta/since?${params}`, {
125
+ method: 'GET',
126
+ }, accountId);
127
+ return (await response.json());
128
+ }
129
+ // ==========================================================================
130
+ // Private helpers
131
+ // ==========================================================================
132
+ async fetch(path, init) {
133
+ const url = `${this.baseUrl}${path}`;
134
+ const response = await fetch(url, {
135
+ ...init,
136
+ headers: {
137
+ 'Content-Type': 'application/json',
138
+ ...init.headers,
139
+ },
140
+ });
141
+ if (!response.ok) {
142
+ const body = await response.text();
143
+ throw new PsmHttpError(response.status, response.statusText, body);
144
+ }
145
+ return response;
146
+ }
147
+ async fetchAuthenticated(path, init, accountId) {
148
+ if (!this.signer) {
149
+ throw new Error('No signer configured. Call setSigner() first.');
150
+ }
151
+ const signature = this.signer.signAccountId(accountId);
152
+ return this.fetch(path, {
153
+ ...init,
154
+ headers: {
155
+ ...init.headers,
156
+ 'x-pubkey': this.signer.publicKey,
157
+ 'x-signature': signature,
158
+ },
159
+ });
160
+ }
161
+ }
162
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @openzeppelin/miden-multisig-client
3
+ *
4
+ * TypeScript SDK for Miden multisig accounts with PSM (Private State Manager) integration.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import {
9
+ * MultisigClient,
10
+ * FalconSigner,
11
+ * } from '@openzeppelin/miden-multisig-client';
12
+ * import { WebClient, SecretKey } from '@demox-labs/miden-sdk';
13
+ *
14
+ * // Initialize WebClient
15
+ * const webClient = await WebClient.createClient('https://rpc.testnet.miden.io:443');
16
+ * await webClient.syncState();
17
+ *
18
+ * // Generate a key dynamically
19
+ * const seed = new Uint8Array(32);
20
+ * crypto.getRandomValues(seed);
21
+ * const secretKey = SecretKey.rpoFalconWithRNG(seed);
22
+ *
23
+ * // Store in miden-sdk's keystore
24
+ * await webClient.addAccountSecretKeyToWebStore(secretKey);
25
+ *
26
+ * // Create a signer
27
+ * const signer = new FalconSigner(secretKey);
28
+ *
29
+ * // Create multisig client
30
+ * const client = new MultisigClient(webClient, { psmEndpoint: 'http://localhost:3000' });
31
+ *
32
+ * // Get PSM pubkey for config
33
+ * const psmCommitment = await client.psmClient.getPubkey();
34
+ *
35
+ * // Create multisig account
36
+ * const config = { threshold: 2, signerCommitments: [signer.commitment, ...], psmCommitment };
37
+ * const multisig = await client.create(config, signer);
38
+ *
39
+ * // Register on PSM and work with proposals
40
+ * await multisig.registerOnPsm();
41
+ * await multisig.syncProposals();
42
+ * ```
43
+ */
44
+ export { MultisigClient, type MultisigClientConfig } from './client.js';
45
+ export { Multisig, type AccountState } from './multisig.js';
46
+ export { AccountInspector, type DetectedMultisigConfig, type VaultBalance } from './inspector.js';
47
+ export { executeForSummary, buildUpdateSignersTransactionRequest, buildUpdatePsmTransactionRequest, buildConsumeNotesTransactionRequest, buildP2idTransactionRequest, } from './transaction.js';
48
+ export { PsmHttpClient, PsmHttpError } from '@openzeppelin/psm-client';
49
+ export { FalconSigner } from './signer.js';
50
+ export { createMultisigAccount, validateMultisigConfig, buildMultisigStorageSlots, buildPsmStorageSlots, storageLayoutBuilder, StorageLayoutBuilder, } from './account/index.js';
51
+ export { PROCEDURE_ROOTS, getProcedureRoot, isProcedureName, getProcedureNames, type ProcedureName, } from './procedures.js';
52
+ export type { MultisigAccountState, MultisigConfig, CreateAccountResult, ProcedureThreshold, Proposal, ProposalStatus, ProposalSignatureEntry, ProposalMetadata, ProposalType, ExportedProposal, TransactionType, ConsumableNote, NoteAsset, FalconSignature, Signer, AuthConfig, DeltaObject, DeltaStatus, StateObject, CosignerSignature, ConfigureRequest, ConfigureResponse, DeltaProposalRequest, DeltaProposalResponse, ProposalsResponse, PubkeyResponse, SignProposalRequest, } from './types.js';
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,oCAAoC,EACpC,gCAAgC,EAChC,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAEV,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAGlB,QAAQ,EACR,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAGhB,eAAe,EAGf,cAAc,EACd,SAAS,EAGT,eAAe,EACf,MAAM,EAGN,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,iBAAiB,EAGjB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @openzeppelin/miden-multisig-client
3
+ *
4
+ * TypeScript SDK for Miden multisig accounts with PSM (Private State Manager) integration.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import {
9
+ * MultisigClient,
10
+ * FalconSigner,
11
+ * } from '@openzeppelin/miden-multisig-client';
12
+ * import { WebClient, SecretKey } from '@demox-labs/miden-sdk';
13
+ *
14
+ * // Initialize WebClient
15
+ * const webClient = await WebClient.createClient('https://rpc.testnet.miden.io:443');
16
+ * await webClient.syncState();
17
+ *
18
+ * // Generate a key dynamically
19
+ * const seed = new Uint8Array(32);
20
+ * crypto.getRandomValues(seed);
21
+ * const secretKey = SecretKey.rpoFalconWithRNG(seed);
22
+ *
23
+ * // Store in miden-sdk's keystore
24
+ * await webClient.addAccountSecretKeyToWebStore(secretKey);
25
+ *
26
+ * // Create a signer
27
+ * const signer = new FalconSigner(secretKey);
28
+ *
29
+ * // Create multisig client
30
+ * const client = new MultisigClient(webClient, { psmEndpoint: 'http://localhost:3000' });
31
+ *
32
+ * // Get PSM pubkey for config
33
+ * const psmCommitment = await client.psmClient.getPubkey();
34
+ *
35
+ * // Create multisig account
36
+ * const config = { threshold: 2, signerCommitments: [signer.commitment, ...], psmCommitment };
37
+ * const multisig = await client.create(config, signer);
38
+ *
39
+ * // Register on PSM and work with proposals
40
+ * await multisig.registerOnPsm();
41
+ * await multisig.syncProposals();
42
+ * ```
43
+ */
44
+ export { MultisigClient } from './client.js';
45
+ export { Multisig } from './multisig.js';
46
+ export { AccountInspector } from './inspector.js';
47
+ export { executeForSummary, buildUpdateSignersTransactionRequest, buildUpdatePsmTransactionRequest, buildConsumeNotesTransactionRequest, buildP2idTransactionRequest, } from './transaction.js';
48
+ export { PsmHttpClient, PsmHttpError } from '@openzeppelin/psm-client';
49
+ export { FalconSigner } from './signer.js';
50
+ export { createMultisigAccount, validateMultisigConfig, buildMultisigStorageSlots, buildPsmStorageSlots, storageLayoutBuilder, StorageLayoutBuilder, } from './account/index.js';
51
+ export { PROCEDURE_ROOTS, getProcedureRoot, isProcedureName, getProcedureNames, } from './procedures.js';
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,cAAc,EAA6B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAkD,MAAM,gBAAgB,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,oCAAoC,EACpC,gCAAgC,EAChC,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAElB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Account Inspector - Inspects account storage to detect multisig configuration.
3
+ */
4
+ import { Account } from '@demox-labs/miden-sdk';
5
+ import { type ProcedureName } from './procedures.js';
6
+ export interface VaultBalance {
7
+ faucetId: string;
8
+ amount: bigint;
9
+ }
10
+ export interface DetectedMultisigConfig {
11
+ threshold: number;
12
+ numSigners: number;
13
+ signerCommitments: string[];
14
+ psmEnabled: boolean;
15
+ psmCommitment: string | null;
16
+ vaultBalances: VaultBalance[];
17
+ procedureThresholds: Map<ProcedureName, number>;
18
+ }
19
+ /**
20
+ * Inspects an account to detect its multisig configuration.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * // From base64-encoded state
25
+ * const config = AccountInspector.fromBase64(stateDataBase64);
26
+ * console.log(`${config.threshold}-of-${config.numSigners} multisig`);
27
+ *
28
+ * // From Miden SDK Account
29
+ * const config = AccountInspector.fromAccount(account);
30
+ * ```
31
+ */
32
+ export declare class AccountInspector {
33
+ private constructor();
34
+ /**
35
+ * Inspect a base64-encoded serialized account.
36
+ *
37
+ * @param base64Data - Base64-encoded Account bytes
38
+ * @returns Detected multisig configuration
39
+ */
40
+ static fromBase64(base64Data: string): DetectedMultisigConfig;
41
+ /**
42
+ * Inspect a Miden SDK Account object.
43
+ *
44
+ * @param account - The Account object from Miden SDK
45
+ * @returns Detected multisig configuration
46
+ */
47
+ static fromAccount(account: Account): DetectedMultisigConfig;
48
+ }
49
+ //# sourceMappingURL=inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../src/inspector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAQ,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE1F,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,mBAAmB,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO;IAEP;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB;IAM7D;;;;;OAKG;IAEH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,sBAAsB;CAkF7D"}