@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.
- package/README.md +189 -0
- package/dist/account/builder.d.ts +23 -0
- package/dist/account/builder.d.ts.map +1 -0
- package/dist/account/builder.js +85 -0
- package/dist/account/builder.js.map +1 -0
- package/dist/account/index.d.ts +6 -0
- package/dist/account/index.d.ts.map +1 -0
- package/dist/account/index.js +6 -0
- package/dist/account/index.js.map +1 -0
- package/dist/account/masm.d.ts +3 -0
- package/dist/account/masm.d.ts.map +1 -0
- package/dist/account/masm.js +605 -0
- package/dist/account/masm.js.map +1 -0
- package/dist/account/storage.d.ts +10 -0
- package/dist/account/storage.d.ts.map +1 -0
- package/dist/account/storage.js +56 -0
- package/dist/account/storage.js.map +1 -0
- package/dist/account.d.ts +104 -0
- package/dist/account.d.ts.map +1 -0
- package/dist/account.js +136 -0
- package/dist/account.js.map +1 -0
- package/dist/builder.d.ts +54 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +78 -0
- package/dist/builder.js.map +1 -0
- package/dist/client.d.ts +73 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +104 -0
- package/dist/client.js.map +1 -0
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/client.test.js +150 -0
- package/dist/client.test.js.map +1 -0
- package/dist/http.d.ts +64 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +162 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +49 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +120 -0
- package/dist/inspector.js.map +1 -0
- package/dist/inspector.test.d.ts +2 -0
- package/dist/inspector.test.d.ts.map +1 -0
- package/dist/inspector.test.js +205 -0
- package/dist/inspector.test.js.map +1 -0
- package/dist/keystore.d.ts +65 -0
- package/dist/keystore.d.ts.map +1 -0
- package/dist/keystore.js +121 -0
- package/dist/keystore.js.map +1 -0
- package/dist/miden.d.ts +9 -0
- package/dist/miden.d.ts.map +1 -0
- package/dist/miden.js +26 -0
- package/dist/miden.js.map +1 -0
- package/dist/multisig/helpers.d.ts +4 -0
- package/dist/multisig/helpers.d.ts.map +1 -0
- package/dist/multisig/helpers.js +21 -0
- package/dist/multisig/helpers.js.map +1 -0
- package/dist/multisig/helpers.test.d.ts +2 -0
- package/dist/multisig/helpers.test.d.ts.map +1 -0
- package/dist/multisig/helpers.test.js +94 -0
- package/dist/multisig/helpers.test.js.map +1 -0
- package/dist/multisig/metadata.d.ts +18 -0
- package/dist/multisig/metadata.d.ts.map +1 -0
- package/dist/multisig/metadata.js +100 -0
- package/dist/multisig/metadata.js.map +1 -0
- package/dist/multisig/metadata.test.d.ts +2 -0
- package/dist/multisig/metadata.test.d.ts.map +1 -0
- package/dist/multisig/metadata.test.js +323 -0
- package/dist/multisig/metadata.test.js.map +1 -0
- package/dist/multisig.d.ts +199 -0
- package/dist/multisig.d.ts.map +1 -0
- package/dist/multisig.js +821 -0
- package/dist/multisig.js.map +1 -0
- package/dist/multisig.test.d.ts +2 -0
- package/dist/multisig.test.d.ts.map +1 -0
- package/dist/multisig.test.js +1121 -0
- package/dist/multisig.test.js.map +1 -0
- package/dist/procedures.d.ts +57 -0
- package/dist/procedures.d.ts.map +1 -0
- package/dist/procedures.js +62 -0
- package/dist/procedures.js.map +1 -0
- package/dist/signer.d.ts +36 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +68 -0
- package/dist/signer.js.map +1 -0
- package/dist/signer.test.d.ts +2 -0
- package/dist/signer.test.d.ts.map +1 -0
- package/dist/signer.test.js +117 -0
- package/dist/signer.test.js.map +1 -0
- package/dist/transaction/consumeNotes.d.ts +7 -0
- package/dist/transaction/consumeNotes.d.ts.map +1 -0
- package/dist/transaction/consumeNotes.js +28 -0
- package/dist/transaction/consumeNotes.js.map +1 -0
- package/dist/transaction/index.d.ts +7 -0
- package/dist/transaction/index.d.ts.map +1 -0
- package/dist/transaction/index.js +6 -0
- package/dist/transaction/index.js.map +1 -0
- package/dist/transaction/options.d.ts +6 -0
- package/dist/transaction/options.d.ts.map +1 -0
- package/dist/transaction/options.js +2 -0
- package/dist/transaction/options.js.map +1 -0
- package/dist/transaction/p2id.d.ts +7 -0
- package/dist/transaction/p2id.d.ts.map +1 -0
- package/dist/transaction/p2id.js +43 -0
- package/dist/transaction/p2id.js.map +1 -0
- package/dist/transaction/summary.d.ts +3 -0
- package/dist/transaction/summary.d.ts.map +1 -0
- package/dist/transaction/summary.js +6 -0
- package/dist/transaction/summary.js.map +1 -0
- package/dist/transaction/updatePsm.d.ts +7 -0
- package/dist/transaction/updatePsm.d.ts.map +1 -0
- package/dist/transaction/updatePsm.js +43 -0
- package/dist/transaction/updatePsm.js.map +1 -0
- package/dist/transaction/updateSigners.d.ts +8 -0
- package/dist/transaction/updateSigners.d.ts.map +1 -0
- package/dist/transaction/updateSigners.js +60 -0
- package/dist/transaction/updateSigners.js.map +1 -0
- package/dist/transaction.d.ts +6 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +8 -0
- package/dist/transaction.js.map +1 -0
- package/dist/transaction.test.d.ts +2 -0
- package/dist/transaction.test.d.ts.map +1 -0
- package/dist/transaction.test.js +117 -0
- package/dist/transaction.test.js.map +1 -0
- package/dist/transport/http.d.ts +64 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +162 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/types/proposal.d.ts +74 -0
- package/dist/types/proposal.d.ts.map +1 -0
- package/dist/types/proposal.js +2 -0
- package/dist/types/proposal.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/encoding.d.ts +7 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +54 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/encoding.test.d.ts +2 -0
- package/dist/utils/encoding.test.d.ts.map +1 -0
- package/dist/utils/encoding.test.js +185 -0
- package/dist/utils/encoding.test.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/random.d.ts +3 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/random.js +14 -0
- package/dist/utils/random.js.map +1 -0
- package/dist/utils/signature.d.ts +12 -0
- package/dist/utils/signature.d.ts.map +1 -0
- package/dist/utils/signature.js +28 -0
- package/dist/utils/signature.js.map +1 -0
- package/dist/utils/signature.test.d.ts +2 -0
- package/dist/utils/signature.test.d.ts.map +1 -0
- package/dist/utils/signature.test.js +149 -0
- package/dist/utils/signature.test.js.map +1 -0
- package/dist/utils/word.d.ts +4 -0
- package/dist/utils/word.d.ts.map +1 -0
- package/dist/utils/word.js +8 -0
- package/dist/utils/word.js.map +1 -0
- package/dist/utils/word.test.d.ts +2 -0
- package/dist/utils/word.test.d.ts.map +1 -0
- package/dist/utils/word.test.js +54 -0
- package/dist/utils/word.test.js.map +1 -0
- package/masm/multisig.masm +423 -0
- package/masm/psm.masm +178 -0
- package/package.json +42 -0
- package/src/account/builder.ts +112 -0
- package/src/account/index.ts +15 -0
- package/src/account/masm.ts +606 -0
- package/src/account/storage.ts +70 -0
- package/src/client.test.ts +177 -0
- package/src/client.ts +129 -0
- package/src/index.ts +118 -0
- package/src/inspector.test.ts +237 -0
- package/src/inspector.ts +142 -0
- package/src/multisig/helpers.test.ts +114 -0
- package/src/multisig/helpers.ts +23 -0
- package/src/multisig.test.ts +1294 -0
- package/src/multisig.ts +1097 -0
- package/src/procedures.ts +72 -0
- package/src/signer.test.ts +135 -0
- package/src/signer.ts +75 -0
- package/src/transaction/consumeNotes.ts +41 -0
- package/src/transaction/index.ts +7 -0
- package/src/transaction/options.ts +7 -0
- package/src/transaction/p2id.ts +105 -0
- package/src/transaction/summary.ts +12 -0
- package/src/transaction/updatePsm.ts +69 -0
- package/src/transaction/updateSigners.ts +96 -0
- package/src/transaction.test.ts +136 -0
- package/src/transaction.ts +16 -0
- package/src/types/proposal.ts +80 -0
- package/src/types.ts +81 -0
- package/src/utils/encoding.test.ts +233 -0
- package/src/utils/encoding.ts +60 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/random.ts +15 -0
- package/src/utils/signature.test.ts +187 -0
- package/src/utils/signature.ts +36 -0
- package/src/utils/word.test.ts +64 -0
- 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
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|