@dynamic-labs-sdk/starknet 0.0.0 → 0.6.0

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 (75) hide show
  1. package/README.md +15 -0
  2. package/dist/StarknetNetworkProvider.types.d.ts +8 -0
  3. package/dist/StarknetNetworkProvider.types.d.ts.map +1 -0
  4. package/dist/StarknetWalletAccount.types.d.ts +8 -0
  5. package/dist/StarknetWalletAccount.types.d.ts.map +1 -0
  6. package/dist/StarknetWalletProvider.types.d.ts +12 -0
  7. package/dist/StarknetWalletProvider.types.d.ts.map +1 -0
  8. package/dist/addStarknetExtension/addStarknetExtension.d.ts +10 -0
  9. package/dist/addStarknetExtension/addStarknetExtension.d.ts.map +1 -0
  10. package/dist/addStarknetExtension/index.d.ts +2 -0
  11. package/dist/addStarknetExtension/index.d.ts.map +1 -0
  12. package/dist/addStarknetInjectedWalletsExtension-CnzMRWdu.esm.js +513 -0
  13. package/dist/addStarknetInjectedWalletsExtension-CnzMRWdu.esm.js.map +1 -0
  14. package/dist/addStarknetInjectedWalletsExtension-Dfzz6tOd.cjs.js +582 -0
  15. package/dist/addStarknetInjectedWalletsExtension-Dfzz6tOd.cjs.js.map +1 -0
  16. package/dist/errors/NotStarknetProviderError/NotStarknetProviderError.d.ts +8 -0
  17. package/dist/errors/NotStarknetProviderError/NotStarknetProviderError.d.ts.map +1 -0
  18. package/dist/errors/NotStarknetProviderError/index.d.ts +2 -0
  19. package/dist/errors/NotStarknetProviderError/index.d.ts.map +1 -0
  20. package/dist/exports/index.d.ts +9 -0
  21. package/dist/exports/index.d.ts.map +1 -0
  22. package/dist/exports/injected.d.ts +2 -0
  23. package/dist/exports/injected.d.ts.map +1 -0
  24. package/dist/getStarknetAccount/getStarknetAccount.d.ts +9 -0
  25. package/dist/getStarknetAccount/getStarknetAccount.d.ts.map +1 -0
  26. package/dist/getStarknetAccount/index.d.ts +2 -0
  27. package/dist/getStarknetAccount/index.d.ts.map +1 -0
  28. package/dist/index.cjs.js +70 -0
  29. package/dist/index.cjs.js.map +1 -0
  30. package/dist/index.esm.js +63 -0
  31. package/dist/index.esm.js.map +1 -0
  32. package/dist/injected/addStarknetInjectedWalletsExtension/addStarknetInjectedWalletsExtension.d.ts +10 -0
  33. package/dist/injected/addStarknetInjectedWalletsExtension/addStarknetInjectedWalletsExtension.d.ts.map +1 -0
  34. package/dist/injected/addStarknetInjectedWalletsExtension/index.d.ts +2 -0
  35. package/dist/injected/addStarknetInjectedWalletsExtension/index.d.ts.map +1 -0
  36. package/dist/injected/utils/createWalletProviderFromStarknetWallet/createWalletProviderFromStarknetWallet.d.ts +10 -0
  37. package/dist/injected/utils/createWalletProviderFromStarknetWallet/createWalletProviderFromStarknetWallet.d.ts.map +1 -0
  38. package/dist/injected/utils/createWalletProviderFromStarknetWallet/index.d.ts +2 -0
  39. package/dist/injected/utils/createWalletProviderFromStarknetWallet/index.d.ts.map +1 -0
  40. package/dist/injected.cjs.js +9 -0
  41. package/dist/injected.cjs.js.map +1 -0
  42. package/dist/injected.esm.js +9 -0
  43. package/dist/injected.esm.js.map +1 -0
  44. package/dist/isStarknetNetworkProvider/index.d.ts +2 -0
  45. package/dist/isStarknetNetworkProvider/index.d.ts.map +1 -0
  46. package/dist/isStarknetNetworkProvider/isStarknetNetworkProvider.d.ts +4 -0
  47. package/dist/isStarknetNetworkProvider/isStarknetNetworkProvider.d.ts.map +1 -0
  48. package/dist/isStarknetWalletAccount/index.d.ts +2 -0
  49. package/dist/isStarknetWalletAccount/index.d.ts.map +1 -0
  50. package/dist/isStarknetWalletAccount/isStarknetWalletAccount.d.ts +4 -0
  51. package/dist/isStarknetWalletAccount/isStarknetWalletAccount.d.ts.map +1 -0
  52. package/dist/isStarknetWalletProvider/index.d.ts +2 -0
  53. package/dist/isStarknetWalletProvider/index.d.ts.map +1 -0
  54. package/dist/isStarknetWalletProvider/isStarknetWalletProvider.d.ts +4 -0
  55. package/dist/isStarknetWalletProvider/isStarknetWalletProvider.d.ts.map +1 -0
  56. package/dist/registerStarknetNetworkProviderBuilder/index.d.ts +2 -0
  57. package/dist/registerStarknetNetworkProviderBuilder/index.d.ts.map +1 -0
  58. package/dist/registerStarknetNetworkProviderBuilder/registerStarknetNetworkProviderBuilder.d.ts +3 -0
  59. package/dist/registerStarknetNetworkProviderBuilder/registerStarknetNetworkProviderBuilder.d.ts.map +1 -0
  60. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  61. package/dist/utils/constants.d.ts +5 -0
  62. package/dist/utils/constants.d.ts.map +1 -0
  63. package/dist/utils/createStarknetNetworkProvider/createStarknetNetworkProvider.d.ts +4 -0
  64. package/dist/utils/createStarknetNetworkProvider/createStarknetNetworkProvider.d.ts.map +1 -0
  65. package/dist/utils/createStarknetNetworkProvider/index.d.ts +2 -0
  66. package/dist/utils/createStarknetNetworkProvider/index.d.ts.map +1 -0
  67. package/dist/utils/fetchStarknetBalance/fetchStarknetBalance.d.ts +8 -0
  68. package/dist/utils/fetchStarknetBalance/fetchStarknetBalance.d.ts.map +1 -0
  69. package/dist/utils/fetchStarknetBalance/index.d.ts +2 -0
  70. package/dist/utils/fetchStarknetBalance/index.d.ts.map +1 -0
  71. package/dist/utils/formatStarknetTypedDataMessage/formatStarknetTypedDataMessage.d.ts +8 -0
  72. package/dist/utils/formatStarknetTypedDataMessage/formatStarknetTypedDataMessage.d.ts.map +1 -0
  73. package/dist/utils/formatStarknetTypedDataMessage/index.d.ts +2 -0
  74. package/dist/utils/formatStarknetTypedDataMessage/index.d.ts.map +1 -0
  75. package/package.json +43 -1
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @dynamic-labs-sdk/starknet
2
+
3
+ This package contains the Starknet integration for the Dynamic SDK.
4
+
5
+ ## Usage
6
+
7
+ ```ts
8
+ import { addStarknetExtension } from '@dynamic-labs-sdk/starknet';
9
+ import { createDynamicClient } from '@dynamic-labs-sdk/client';
10
+
11
+ const dynamicClient = createDynamicClient({
12
+ environmentId: '123',
13
+ });
14
+ addStarknetExtension(dynamicClient);
15
+ ```
@@ -0,0 +1,8 @@
1
+ import type { BaseNetworkProvider } from '@dynamic-labs-sdk/client/core';
2
+ export type StarknetNetworkProvider = BaseNetworkProvider<'STARK'>;
3
+ declare global {
4
+ interface NetworkProviderMap {
5
+ STARK: StarknetNetworkProvider;
6
+ }
7
+ }
8
+ //# sourceMappingURL=StarknetNetworkProvider.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StarknetNetworkProvider.types.d.ts","sourceRoot":"","sources":["../src/StarknetNetworkProvider.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAEnE,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,kBAAkB;QAC1B,KAAK,EAAE,uBAAuB,CAAC;KAChC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { BaseWalletAccount } from '@dynamic-labs-sdk/client/core';
2
+ export type StarknetWalletAccount = BaseWalletAccount<'STARK'>;
3
+ declare global {
4
+ interface WalletAccountMap {
5
+ STARK: StarknetWalletAccount;
6
+ }
7
+ }
8
+ //# sourceMappingURL=StarknetWalletAccount.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StarknetWalletAccount.types.d.ts","sourceRoot":"","sources":["../src/StarknetWalletAccount.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE/D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,gBAAgB;QACxB,KAAK,EAAE,qBAAqB,CAAC;KAC9B;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { WalletProvider } from '@dynamic-labs-sdk/client/core';
2
+ import type { WalletAccount } from 'starknet';
3
+ import type { StarknetWalletAccount } from './StarknetWalletAccount.types';
4
+ export type StarknetWalletProvider = WalletProvider & {
5
+ chain: 'STARK';
6
+ getStarknetAccount: (args: {
7
+ walletAccount: StarknetWalletAccount;
8
+ }) => Promise<{
9
+ account: WalletAccount;
10
+ }>;
11
+ };
12
+ //# sourceMappingURL=StarknetWalletProvider.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StarknetWalletProvider.types.d.ts","sourceRoot":"","sources":["../src/StarknetWalletProvider.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,aAAa,EAAE,qBAAqB,CAAC;KACtC,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;CAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Adds the Starknet extension to the Dynamic client.
3
+ *
4
+ * This is a convenience function that adds support for a variety of Starknet wallets,
5
+ * like Braavos, Ready and more.
6
+ *
7
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
8
+ */
9
+ export declare const addStarknetExtension: (client?: import("@dynamic-labs-sdk/client").DynamicClient) => void;
10
+ //# sourceMappingURL=addStarknetExtension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addStarknetExtension.d.ts","sourceRoot":"","sources":["../../src/addStarknetExtension/addStarknetExtension.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,eAAO,MAAM,oBAAoB,iEAAkC,IAElE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { addStarknetExtension } from './addStarknetExtension';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/addStarknetExtension/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,513 @@
1
+ import { WalletProviderPriority, assertDefined, createBaseNetworkProvider, createWalletProviderEventEmitter, formatWalletProviderGroupKey, formatWalletProviderKey, getCore, getDefaultClient, getNetworkProviderBuilderRegistry, getWalletProviderRegistry, hasExtension, registerExtension } from "@dynamic-labs-sdk/client/core";
2
+ import starknetCore from "@starknet-io/get-starknet-core";
3
+ import { Contract, RpcProvider, WalletAccount, cairo } from "starknet";
4
+ import { assertWalletAccountSigningAvailability, getActiveNetworkData } from "@dynamic-labs-sdk/client";
5
+ import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
6
+
7
+ //#region package.json
8
+ var name = "@dynamic-labs-sdk/starknet";
9
+ var version = "0.6.0";
10
+
11
+ //#endregion
12
+ //#region src/utils/constants.ts
13
+ const WEI_PER_ETH = 0xde0b6b3a7640000;
14
+ const ETH_STARKNET_ADDRESS = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7";
15
+ const ETH_CONTRACT_ABI = [
16
+ {
17
+ members: [{
18
+ name: "low",
19
+ offset: 0,
20
+ type: "felt"
21
+ }, {
22
+ name: "high",
23
+ offset: 1,
24
+ type: "felt"
25
+ }],
26
+ name: "Uint256",
27
+ size: 2,
28
+ type: "struct"
29
+ },
30
+ {
31
+ data: [
32
+ {
33
+ name: "from_",
34
+ type: "felt"
35
+ },
36
+ {
37
+ name: "to",
38
+ type: "felt"
39
+ },
40
+ {
41
+ name: "value",
42
+ type: "Uint256"
43
+ }
44
+ ],
45
+ keys: [],
46
+ name: "Transfer",
47
+ type: "event"
48
+ },
49
+ {
50
+ data: [
51
+ {
52
+ name: "owner",
53
+ type: "felt"
54
+ },
55
+ {
56
+ name: "spender",
57
+ type: "felt"
58
+ },
59
+ {
60
+ name: "value",
61
+ type: "Uint256"
62
+ }
63
+ ],
64
+ keys: [],
65
+ name: "Approval",
66
+ type: "event"
67
+ },
68
+ {
69
+ inputs: [],
70
+ name: "name",
71
+ outputs: [{
72
+ name: "name",
73
+ type: "felt"
74
+ }],
75
+ stateMutability: "view",
76
+ type: "function"
77
+ },
78
+ {
79
+ inputs: [],
80
+ name: "symbol",
81
+ outputs: [{
82
+ name: "symbol",
83
+ type: "felt"
84
+ }],
85
+ stateMutability: "view",
86
+ type: "function"
87
+ },
88
+ {
89
+ inputs: [],
90
+ name: "totalSupply",
91
+ outputs: [{
92
+ name: "totalSupply",
93
+ type: "Uint256"
94
+ }],
95
+ stateMutability: "view",
96
+ type: "function"
97
+ },
98
+ {
99
+ inputs: [],
100
+ name: "decimals",
101
+ outputs: [{
102
+ name: "decimals",
103
+ type: "felt"
104
+ }],
105
+ stateMutability: "view",
106
+ type: "function"
107
+ },
108
+ {
109
+ inputs: [{
110
+ name: "account",
111
+ type: "felt"
112
+ }],
113
+ name: "balanceOf",
114
+ outputs: [{
115
+ name: "balance",
116
+ type: "Uint256"
117
+ }],
118
+ stateMutability: "view",
119
+ type: "function"
120
+ },
121
+ {
122
+ inputs: [{
123
+ name: "owner",
124
+ type: "felt"
125
+ }, {
126
+ name: "spender",
127
+ type: "felt"
128
+ }],
129
+ name: "allowance",
130
+ outputs: [{
131
+ name: "remaining",
132
+ type: "Uint256"
133
+ }],
134
+ stateMutability: "view",
135
+ type: "function"
136
+ },
137
+ {
138
+ inputs: [],
139
+ name: "permittedMinter",
140
+ outputs: [{
141
+ name: "minter",
142
+ type: "felt"
143
+ }],
144
+ stateMutability: "view",
145
+ type: "function"
146
+ },
147
+ {
148
+ inputs: [],
149
+ name: "initialized",
150
+ outputs: [{
151
+ name: "res",
152
+ type: "felt"
153
+ }],
154
+ stateMutability: "view",
155
+ type: "function"
156
+ },
157
+ {
158
+ inputs: [],
159
+ name: "get_version",
160
+ outputs: [{
161
+ name: "version",
162
+ type: "felt"
163
+ }],
164
+ stateMutability: "view",
165
+ type: "function"
166
+ },
167
+ {
168
+ inputs: [],
169
+ name: "get_identity",
170
+ outputs: [{
171
+ name: "identity",
172
+ type: "felt"
173
+ }],
174
+ stateMutability: "view",
175
+ type: "function"
176
+ },
177
+ {
178
+ inputs: [{
179
+ name: "init_vector_len",
180
+ type: "felt"
181
+ }, {
182
+ name: "init_vector",
183
+ type: "felt*"
184
+ }],
185
+ name: "initialize",
186
+ outputs: [],
187
+ type: "function"
188
+ },
189
+ {
190
+ inputs: [{
191
+ name: "recipient",
192
+ type: "felt"
193
+ }, {
194
+ name: "amount",
195
+ type: "Uint256"
196
+ }],
197
+ name: "transfer",
198
+ outputs: [{
199
+ name: "success",
200
+ type: "felt"
201
+ }],
202
+ type: "function"
203
+ },
204
+ {
205
+ inputs: [
206
+ {
207
+ name: "sender",
208
+ type: "felt"
209
+ },
210
+ {
211
+ name: "recipient",
212
+ type: "felt"
213
+ },
214
+ {
215
+ name: "amount",
216
+ type: "Uint256"
217
+ }
218
+ ],
219
+ name: "transferFrom",
220
+ outputs: [{
221
+ name: "success",
222
+ type: "felt"
223
+ }],
224
+ type: "function"
225
+ },
226
+ {
227
+ inputs: [{
228
+ name: "spender",
229
+ type: "felt"
230
+ }, {
231
+ name: "amount",
232
+ type: "Uint256"
233
+ }],
234
+ name: "approve",
235
+ outputs: [{
236
+ name: "success",
237
+ type: "felt"
238
+ }],
239
+ type: "function"
240
+ },
241
+ {
242
+ inputs: [{
243
+ name: "spender",
244
+ type: "felt"
245
+ }, {
246
+ name: "added_value",
247
+ type: "Uint256"
248
+ }],
249
+ name: "increaseAllowance",
250
+ outputs: [{
251
+ name: "success",
252
+ type: "felt"
253
+ }],
254
+ type: "function"
255
+ },
256
+ {
257
+ inputs: [{
258
+ name: "spender",
259
+ type: "felt"
260
+ }, {
261
+ name: "subtracted_value",
262
+ type: "Uint256"
263
+ }],
264
+ name: "decreaseAllowance",
265
+ outputs: [{
266
+ name: "success",
267
+ type: "felt"
268
+ }],
269
+ type: "function"
270
+ },
271
+ {
272
+ inputs: [{
273
+ name: "recipient",
274
+ type: "felt"
275
+ }, {
276
+ name: "amount",
277
+ type: "Uint256"
278
+ }],
279
+ name: "permissionedMint",
280
+ outputs: [],
281
+ type: "function"
282
+ },
283
+ {
284
+ inputs: [{
285
+ name: "account",
286
+ type: "felt"
287
+ }, {
288
+ name: "amount",
289
+ type: "Uint256"
290
+ }],
291
+ name: "permissionedBurn",
292
+ outputs: [],
293
+ type: "function"
294
+ }
295
+ ];
296
+
297
+ //#endregion
298
+ //#region src/utils/fetchStarknetBalance/fetchStarknetBalance.ts
299
+ const fetchStarknetBalance = async ({ address, networkData }) => {
300
+ const { balance } = await new Contract(ETH_CONTRACT_ABI, ETH_STARKNET_ADDRESS, new RpcProvider({ nodeUrl: networkData.rpcUrls.http[0] })).balanceOf(address);
301
+ return (Number(cairo.uint256(balance.low).low) / WEI_PER_ETH).toFixed(6);
302
+ };
303
+
304
+ //#endregion
305
+ //#region src/utils/createStarknetNetworkProvider/createStarknetNetworkProvider.ts
306
+ const createStarknetNetworkProvider = (networkData) => ({
307
+ ...createBaseNetworkProvider("STARK", networkData),
308
+ getBalance: async ({ address }) => ({ balance: await fetchStarknetBalance({
309
+ address,
310
+ networkData
311
+ }) })
312
+ });
313
+
314
+ //#endregion
315
+ //#region src/registerStarknetNetworkProviderBuilder/registerStarknetNetworkProviderBuilder.ts
316
+ const registerStarknetNetworkProviderBuilder = (client) => {
317
+ const networkProviderBuilderRegistry = getNetworkProviderBuilderRegistry(client);
318
+ if (networkProviderBuilderRegistry.get().get("STARK")) return;
319
+ networkProviderBuilderRegistry.register({
320
+ builder: createStarknetNetworkProvider,
321
+ chain: "STARK"
322
+ });
323
+ };
324
+
325
+ //#endregion
326
+ //#region src/utils/formatStarknetTypedDataMessage/formatStarknetTypedDataMessage.ts
327
+ const defaultTypedData = {
328
+ primaryType: "Message",
329
+ types: {
330
+ Message: [{
331
+ name: "message",
332
+ type: "felt"
333
+ }],
334
+ StarkNetDomain: [
335
+ {
336
+ name: "name",
337
+ type: "felt"
338
+ },
339
+ {
340
+ name: "chainId",
341
+ type: "felt"
342
+ },
343
+ {
344
+ name: "version",
345
+ type: "felt"
346
+ }
347
+ ]
348
+ }
349
+ };
350
+ const formatStarknetTypedDataMessage = ({ inputMessage, chainId }) => {
351
+ let nonce, domain;
352
+ try {
353
+ const { nonce: parsedNonce, domain: parsedDomain } = JSON.parse(inputMessage);
354
+ nonce = parsedNonce;
355
+ domain = parsedDomain;
356
+ } catch {
357
+ nonce = inputMessage;
358
+ domain = "domain";
359
+ }
360
+ const message = { message: nonce.substring(0, 31) };
361
+ return {
362
+ ...defaultTypedData,
363
+ domain: {
364
+ chainId,
365
+ name: domain.substring(0, 31),
366
+ version: "0.0.1"
367
+ },
368
+ message
369
+ };
370
+ };
371
+
372
+ //#endregion
373
+ //#region src/injected/utils/createWalletProviderFromStarknetWallet/createWalletProviderFromStarknetWallet.ts
374
+ const createWalletProviderFromStarknetWallet = ({ dynamicClient, starknetWindowProvider }) => {
375
+ const walletProviderType = WalletProviderEnum.BrowserExtension;
376
+ const key = formatWalletProviderKey({
377
+ chain: "STARK",
378
+ displayName: starknetWindowProvider.name,
379
+ walletProviderType
380
+ });
381
+ const connect = async () => {
382
+ return { addresses: (await starknetWindowProvider.request({ type: "wallet_requestAccounts" })).map((address) => ({ address })) };
383
+ };
384
+ const disconnect = async () => {
385
+ try {
386
+ await starknetWindowProvider.request({ type: "wallet_disconnect" });
387
+ } catch {}
388
+ await starknetCore.disconnect();
389
+ };
390
+ const getActiveNetworkId = async () => {
391
+ return { networkId: await starknetWindowProvider.request({ type: "wallet_requestChainId" }) };
392
+ };
393
+ const getConnectedAddresses = async () => {
394
+ return { addresses: await starknetWindowProvider.request({
395
+ params: { silent_mode: true },
396
+ type: "wallet_requestAccounts"
397
+ }) };
398
+ };
399
+ const getStarknetAccount = async ({ walletAccount }) => {
400
+ await assertWalletAccountSigningAvailability({ walletAccount }, dynamicClient);
401
+ const { networkData } = await getActiveNetworkData({ walletAccount }, dynamicClient);
402
+ assertDefined(networkData, "No active network data found");
403
+ const rpcProvider = new RpcProvider({ nodeUrl: networkData.rpcUrls.http[0] });
404
+ return { account: await WalletAccount.connectSilent(rpcProvider, starknetWindowProvider) };
405
+ };
406
+ const signMessage = async ({ message, walletAccount }) => {
407
+ assertDefined(walletAccount, "Wallet account not found");
408
+ await assertWalletAccountSigningAvailability({ walletAccount }, dynamicClient);
409
+ const { networkId } = await getActiveNetworkId();
410
+ const encodedMessage = formatStarknetTypedDataMessage({
411
+ chainId: networkId,
412
+ inputMessage: message
413
+ });
414
+ return { signature: (await starknetWindowProvider.request({
415
+ params: encodedMessage,
416
+ type: "wallet_signTypedData"
417
+ })).join(",") };
418
+ };
419
+ const switchActiveNetwork = async ({ networkId }) => {
420
+ await starknetWindowProvider.request({
421
+ params: { chainId: networkId },
422
+ type: "wallet_switchStarknetChain"
423
+ });
424
+ };
425
+ const { getEventEmitter, cleanupEventEmitter } = createWalletProviderEventEmitter({
426
+ removeEventListeners: ({ setupReturnValue }) => {
427
+ assertDefined(setupReturnValue, "Setup return value not defined");
428
+ setupReturnValue.removeNetworkChangeListener();
429
+ setupReturnValue.removeAccountChangeListener();
430
+ },
431
+ setupEventListeners: ({ handleAccountsChanged, handleNetworkChanged }) => {
432
+ const onAccountsChanged = (accounts) => {
433
+ handleAccountsChanged({ addresses: accounts ?? [] });
434
+ };
435
+ starknetWindowProvider.on("accountsChanged", onAccountsChanged);
436
+ const removeAccountChangeListener = () => {
437
+ starknetWindowProvider.off("accountsChanged", onAccountsChanged);
438
+ };
439
+ const onNetworkChanged = (network) => {
440
+ if (!network) return;
441
+ handleNetworkChanged({ networkId: network.toString() });
442
+ };
443
+ starknetWindowProvider.on("networkChanged", onNetworkChanged);
444
+ const removeNetworkChangeListener = () => {
445
+ starknetWindowProvider.off("networkChanged", onNetworkChanged);
446
+ };
447
+ return {
448
+ removeAccountChangeListener,
449
+ removeNetworkChangeListener
450
+ };
451
+ },
452
+ supportedEvents: ["accountsChanged", "networkChanged"]
453
+ });
454
+ const terminate = async () => {
455
+ cleanupEventEmitter();
456
+ };
457
+ return {
458
+ chain: "STARK",
459
+ connect,
460
+ disconnect,
461
+ get events() {
462
+ return getEventEmitter();
463
+ },
464
+ getActiveNetworkId,
465
+ getConnectedAddresses,
466
+ getStarknetAccount,
467
+ groupKey: formatWalletProviderGroupKey(starknetWindowProvider.name),
468
+ key,
469
+ metadata: {
470
+ displayName: starknetWindowProvider.name,
471
+ icon: typeof starknetWindowProvider.icon === "string" ? starknetWindowProvider.icon : starknetWindowProvider.icon.light
472
+ },
473
+ signMessage,
474
+ switchActiveNetwork,
475
+ terminate,
476
+ walletProviderType
477
+ };
478
+ };
479
+
480
+ //#endregion
481
+ //#region src/injected/addStarknetInjectedWalletsExtension/addStarknetInjectedWalletsExtension.ts
482
+ const STARKNET_INJECTED_WALLETS_EXTENSION_KEY = "starknetInjectedWallets";
483
+ /**
484
+ * Adds the Starknet Injected Wallets extension to the Dynamic client.
485
+ *
486
+ * This extension enables integration with many Starknet wallets, like Braavos, Ready and Xverse.
487
+ *
488
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
489
+ */
490
+ const addStarknetInjectedWalletsExtension = (client = getDefaultClient()) => {
491
+ if (hasExtension({ extensionKey: STARKNET_INJECTED_WALLETS_EXTENSION_KEY }, client)) return;
492
+ registerExtension({ extensionKey: STARKNET_INJECTED_WALLETS_EXTENSION_KEY }, client);
493
+ registerStarknetNetworkProviderBuilder(client);
494
+ const walletProviderRegistry = getWalletProviderRegistry(client);
495
+ starknetCore.getAvailableWallets().then((starknetWindowProviders) => {
496
+ starknetWindowProviders.forEach((starknetWindowProvider) => {
497
+ const walletProvider = createWalletProviderFromStarknetWallet({
498
+ dynamicClient: client,
499
+ starknetWindowProvider
500
+ });
501
+ walletProviderRegistry.register({
502
+ priority: WalletProviderPriority.WINDOW_INJECT,
503
+ walletProvider
504
+ });
505
+ });
506
+ }).catch((error) => {
507
+ getCore(client).logger.error("Error getting available starknet wallets", error);
508
+ });
509
+ };
510
+
511
+ //#endregion
512
+ export { name as a, WEI_PER_ETH as i, ETH_CONTRACT_ABI as n, version as o, ETH_STARKNET_ADDRESS as r, addStarknetInjectedWalletsExtension as t };
513
+ //# sourceMappingURL=addStarknetInjectedWalletsExtension-CnzMRWdu.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addStarknetInjectedWalletsExtension-CnzMRWdu.esm.js","names":["ETH_CONTRACT_ABI: Abi","message: Record<string, unknown>","connect: StarknetWalletProvider['connect']","disconnect: StarknetWalletProvider['disconnect']","getActiveNetworkId: StarknetWalletProvider['getActiveNetworkId']","getConnectedAddresses: StarknetWalletProvider['getConnectedAddresses']","getStarknetAccount: StarknetWalletProvider['getStarknetAccount']","signMessage: StarknetWalletProvider['signMessage']","switchActiveNetwork: StarknetWalletProvider['switchActiveNetwork']","terminate: StarknetWalletProvider['terminate']"],"sources":["../package.json","../src/utils/constants.ts","../src/utils/fetchStarknetBalance/fetchStarknetBalance.ts","../src/utils/createStarknetNetworkProvider/createStarknetNetworkProvider.ts","../src/registerStarknetNetworkProviderBuilder/registerStarknetNetworkProviderBuilder.ts","../src/utils/formatStarknetTypedDataMessage/formatStarknetTypedDataMessage.ts","../src/injected/utils/createWalletProviderFromStarknetWallet/createWalletProviderFromStarknetWallet.ts","../src/injected/addStarknetInjectedWalletsExtension/addStarknetInjectedWalletsExtension.ts"],"sourcesContent":["","/* eslint-disable custom-rules/ban-ethereum-eth-terms */\n\nimport type { Abi } from 'starknet';\n\n// Starknet uses ETH as its native token: 1 ETH = 10^18 wei.\nexport const WEI_PER_ETH = 1e18;\n\nexport const ETH_STARKNET_ADDRESS =\n '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7';\n\nexport const ETH_CONTRACT_ABI: Abi = [\n {\n members: [\n {\n name: 'low',\n offset: 0,\n type: 'felt',\n },\n {\n name: 'high',\n offset: 1,\n type: 'felt',\n },\n ],\n name: 'Uint256',\n size: 2,\n type: 'struct',\n },\n {\n data: [\n {\n name: 'from_',\n type: 'felt',\n },\n {\n name: 'to',\n type: 'felt',\n },\n {\n name: 'value',\n type: 'Uint256',\n },\n ],\n keys: [],\n name: 'Transfer',\n type: 'event',\n },\n {\n data: [\n {\n name: 'owner',\n type: 'felt',\n },\n {\n name: 'spender',\n type: 'felt',\n },\n {\n name: 'value',\n type: 'Uint256',\n },\n ],\n keys: [],\n name: 'Approval',\n type: 'event',\n },\n {\n inputs: [],\n name: 'name',\n outputs: [\n {\n name: 'name',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n name: 'symbol',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n name: 'totalSupply',\n type: 'Uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'decimals',\n outputs: [\n {\n name: 'decimals',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'account',\n type: 'felt',\n },\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'Uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'owner',\n type: 'felt',\n },\n {\n name: 'spender',\n type: 'felt',\n },\n ],\n name: 'allowance',\n outputs: [\n {\n name: 'remaining',\n type: 'Uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'permittedMinter',\n outputs: [\n {\n name: 'minter',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'initialized',\n outputs: [\n {\n name: 'res',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'get_version',\n outputs: [\n {\n name: 'version',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'get_identity',\n outputs: [\n {\n name: 'identity',\n type: 'felt',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'init_vector_len',\n type: 'felt',\n },\n {\n name: 'init_vector',\n type: 'felt*',\n },\n ],\n name: 'initialize',\n outputs: [],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'recipient',\n type: 'felt',\n },\n {\n name: 'amount',\n type: 'Uint256',\n },\n ],\n name: 'transfer',\n outputs: [\n {\n name: 'success',\n type: 'felt',\n },\n ],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'sender',\n type: 'felt',\n },\n {\n name: 'recipient',\n type: 'felt',\n },\n {\n name: 'amount',\n type: 'Uint256',\n },\n ],\n name: 'transferFrom',\n outputs: [\n {\n name: 'success',\n type: 'felt',\n },\n ],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'spender',\n type: 'felt',\n },\n {\n name: 'amount',\n type: 'Uint256',\n },\n ],\n name: 'approve',\n outputs: [\n {\n name: 'success',\n type: 'felt',\n },\n ],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'spender',\n type: 'felt',\n },\n {\n name: 'added_value',\n type: 'Uint256',\n },\n ],\n name: 'increaseAllowance',\n outputs: [\n {\n name: 'success',\n type: 'felt',\n },\n ],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'spender',\n type: 'felt',\n },\n {\n name: 'subtracted_value',\n type: 'Uint256',\n },\n ],\n name: 'decreaseAllowance',\n outputs: [\n {\n name: 'success',\n type: 'felt',\n },\n ],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'recipient',\n type: 'felt',\n },\n {\n name: 'amount',\n type: 'Uint256',\n },\n ],\n name: 'permissionedMint',\n outputs: [],\n type: 'function',\n },\n {\n inputs: [\n {\n name: 'account',\n type: 'felt',\n },\n {\n name: 'amount',\n type: 'Uint256',\n },\n ],\n name: 'permissionedBurn',\n outputs: [],\n type: 'function',\n },\n];\n","/* eslint-disable custom-rules/ban-ethereum-eth-terms */\nimport type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { Contract, RpcProvider, cairo } from 'starknet';\n\nimport {\n ETH_CONTRACT_ABI,\n ETH_STARKNET_ADDRESS,\n WEI_PER_ETH,\n} from '../constants';\n\ntype FetchStarknetBalanceParams = {\n address: string;\n networkData: NetworkData;\n};\n\nexport const fetchStarknetBalance = async ({\n address,\n networkData,\n}: FetchStarknetBalanceParams): Promise<string | null> => {\n const provider = new RpcProvider({\n nodeUrl: networkData.rpcUrls.http[0],\n });\n\n const contract = new Contract(\n ETH_CONTRACT_ABI,\n ETH_STARKNET_ADDRESS,\n provider\n );\n\n const { balance } = await contract.balanceOf(address);\n\n return (Number(cairo.uint256(balance.low).low) / WEI_PER_ETH).toFixed(6);\n};\n","import type { NetworkData } from '@dynamic-labs-sdk/client';\nimport { createBaseNetworkProvider } from '@dynamic-labs-sdk/client/core';\n\nimport type { StarknetNetworkProvider } from '../../StarknetNetworkProvider.types';\nimport { fetchStarknetBalance } from '../fetchStarknetBalance';\n\nexport const createStarknetNetworkProvider = (\n networkData: NetworkData\n): StarknetNetworkProvider => ({\n ...createBaseNetworkProvider('STARK', networkData),\n getBalance: async ({ address }) => ({\n balance: await fetchStarknetBalance({\n address,\n networkData,\n }),\n }),\n});\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworkProviderBuilderRegistry } from '@dynamic-labs-sdk/client/core';\n\nimport { createStarknetNetworkProvider } from '../utils/createStarknetNetworkProvider';\n\nexport const registerStarknetNetworkProviderBuilder = (\n client: DynamicClient\n): void => {\n const networkProviderBuilderRegistry =\n getNetworkProviderBuilderRegistry(client);\n\n // If the Starknet network provider builder is already registered, return.\n if (networkProviderBuilderRegistry.get().get('STARK')) {\n return;\n }\n\n networkProviderBuilderRegistry.register({\n builder: createStarknetNetworkProvider,\n chain: 'STARK',\n });\n};\n","import type { TypedData, constants } from 'starknet';\n\nconst defaultTypedData = {\n primaryType: 'Message',\n types: {\n Message: [\n {\n name: 'message',\n type: 'felt',\n },\n ],\n StarkNetDomain: [\n {\n name: 'name',\n type: 'felt',\n },\n {\n name: 'chainId',\n type: 'felt',\n },\n {\n name: 'version',\n type: 'felt',\n },\n ],\n },\n};\n\ntype FormatStarknetTypedDataMessageParams = {\n chainId: constants.StarknetChainId;\n inputMessage: string;\n};\n\nexport const formatStarknetTypedDataMessage = ({\n inputMessage,\n chainId,\n}: FormatStarknetTypedDataMessageParams): TypedData => {\n let nonce, domain;\n try {\n const { nonce: parsedNonce, domain: parsedDomain } =\n JSON.parse(inputMessage);\n nonce = parsedNonce;\n domain = parsedDomain;\n } catch {\n nonce = inputMessage;\n domain = 'domain';\n }\n\n // Starknet strings could be at most 31 chars long\n const message: Record<string, unknown> = {\n message: nonce.substring(0, 31),\n };\n\n return {\n ...defaultTypedData,\n domain: {\n chainId,\n name: domain.substring(0, 31),\n version: '0.0.1',\n },\n message,\n };\n};\n","import {\n type DynamicClient,\n assertWalletAccountSigningAvailability,\n getActiveNetworkData,\n} from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { StarknetWindowObject } from '@starknet-io/get-starknet-core';\nimport starknetCore from '@starknet-io/get-starknet-core';\nimport { RpcProvider, WalletAccount, type constants } from 'starknet';\n\nimport type { StarknetWalletProvider } from '../../../StarknetWalletProvider.types';\nimport { formatStarknetTypedDataMessage } from '../../../utils/formatStarknetTypedDataMessage';\n\ntype CreateWalletProviderFromStarknetWalletParams = {\n dynamicClient: DynamicClient;\n starknetWindowProvider: StarknetWindowObject;\n};\n\nexport const createWalletProviderFromStarknetWallet = ({\n dynamicClient,\n starknetWindowProvider,\n}: CreateWalletProviderFromStarknetWalletParams): StarknetWalletProvider => {\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain: 'STARK',\n displayName: starknetWindowProvider.name,\n walletProviderType,\n });\n\n const connect: StarknetWalletProvider['connect'] = async () => {\n const accounts = await starknetWindowProvider.request({\n type: 'wallet_requestAccounts',\n });\n\n return {\n addresses: accounts.map((address) => ({\n address,\n })),\n };\n };\n\n const disconnect: StarknetWalletProvider['disconnect'] = async () => {\n try {\n await starknetWindowProvider.request({\n type: 'wallet_disconnect',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n } catch {\n // Do nothing, wallet is missing `wallet_disconnect` method\n }\n await starknetCore.disconnect();\n };\n\n const getActiveNetworkId: StarknetWalletProvider['getActiveNetworkId'] =\n async () => {\n const chainId = await starknetWindowProvider.request({\n type: 'wallet_requestChainId',\n });\n\n return {\n networkId: chainId,\n };\n };\n\n const getConnectedAddresses: StarknetWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await starknetWindowProvider.request({\n params: {\n silent_mode: true,\n },\n type: 'wallet_requestAccounts',\n });\n\n return {\n addresses: accounts,\n };\n };\n\n const getStarknetAccount: StarknetWalletProvider['getStarknetAccount'] =\n async ({ walletAccount }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const { networkData } = await getActiveNetworkData(\n { walletAccount },\n dynamicClient\n );\n\n assertDefined(networkData, 'No active network data found');\n\n const rpcProvider = new RpcProvider({\n nodeUrl: networkData.rpcUrls.http[0],\n });\n\n const account = await WalletAccount.connectSilent(\n rpcProvider,\n starknetWindowProvider\n );\n\n return { account };\n };\n\n const signMessage: StarknetWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n {\n walletAccount,\n },\n dynamicClient\n );\n\n const { networkId } = await getActiveNetworkId();\n\n const encodedMessage = formatStarknetTypedDataMessage({\n chainId: networkId as constants.StarknetChainId,\n inputMessage: message,\n });\n\n const signature = await starknetWindowProvider.request({\n params: encodedMessage,\n type: 'wallet_signTypedData',\n });\n\n return { signature: signature.join(',') };\n };\n\n const switchActiveNetwork: StarknetWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) => {\n await starknetWindowProvider.request({\n params: {\n chainId: networkId,\n },\n type: 'wallet_switchStarknetChain',\n });\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<{\n removeAccountChangeListener: VoidFunction;\n removeNetworkChangeListener: VoidFunction;\n }>({\n removeEventListeners: ({ setupReturnValue }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n\n setupReturnValue.removeNetworkChangeListener();\n setupReturnValue.removeAccountChangeListener();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleNetworkChanged,\n }) => {\n const onAccountsChanged = (accounts: string[] | undefined) => {\n handleAccountsChanged({\n addresses: accounts ?? [],\n });\n };\n starknetWindowProvider.on('accountsChanged', onAccountsChanged);\n const removeAccountChangeListener = () => {\n starknetWindowProvider.off('accountsChanged', onAccountsChanged);\n };\n\n const onNetworkChanged = (network: string | undefined) => {\n if (!network) {\n return;\n }\n\n handleNetworkChanged({\n networkId: network.toString(),\n });\n };\n starknetWindowProvider.on('networkChanged', onNetworkChanged);\n const removeNetworkChangeListener = () => {\n starknetWindowProvider.off('networkChanged', onNetworkChanged);\n };\n\n return {\n removeAccountChangeListener,\n removeNetworkChangeListener,\n };\n },\n\n supportedEvents: ['accountsChanged', 'networkChanged'],\n });\n\n const terminate: StarknetWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n const walletProvider: StarknetWalletProvider = {\n chain: 'STARK',\n connect,\n disconnect,\n get events() {\n return getEventEmitter();\n },\n getActiveNetworkId,\n getConnectedAddresses,\n getStarknetAccount,\n groupKey: formatWalletProviderGroupKey(starknetWindowProvider.name),\n key,\n metadata: {\n displayName: starknetWindowProvider.name,\n icon:\n typeof starknetWindowProvider.icon === 'string'\n ? starknetWindowProvider.icon\n : starknetWindowProvider.icon.light,\n },\n signMessage,\n switchActiveNetwork,\n terminate,\n walletProviderType,\n };\n\n return walletProvider;\n};\n","import {\n WalletProviderPriority,\n getCore,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\nimport starknetCore from '@starknet-io/get-starknet-core';\n\nimport { registerStarknetNetworkProviderBuilder } from '../../registerStarknetNetworkProviderBuilder';\nimport { createWalletProviderFromStarknetWallet } from '../utils/createWalletProviderFromStarknetWallet';\n\nexport const STARKNET_INJECTED_WALLETS_EXTENSION_KEY =\n 'starknetInjectedWallets';\n\n/**\n * Adds the Starknet Injected Wallets extension to the Dynamic client.\n *\n * This extension enables integration with many Starknet wallets, like Braavos, Ready and Xverse.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n */\nexport const addStarknetInjectedWalletsExtension = (\n client = getDefaultClient()\n): void => {\n if (\n hasExtension(\n { extensionKey: STARKNET_INJECTED_WALLETS_EXTENSION_KEY },\n client\n )\n ) {\n return;\n }\n\n registerExtension(\n { extensionKey: STARKNET_INJECTED_WALLETS_EXTENSION_KEY },\n client\n );\n\n registerStarknetNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n starknetCore\n .getAvailableWallets()\n .then((starknetWindowProviders) => {\n starknetWindowProviders.forEach((starknetWindowProvider) => {\n const walletProvider = createWalletProviderFromStarknetWallet({\n dynamicClient: client,\n starknetWindowProvider,\n });\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WINDOW_INJECT,\n walletProvider,\n });\n });\n })\n .catch((error) => {\n getCore(client).logger.error(\n 'Error getting available starknet wallets',\n error\n );\n });\n};\n"],"mappings":";;;;;;;;;;;;ACKA,MAAa,cAAc;AAE3B,MAAa,uBACX;AAEF,MAAaA,mBAAwB;CACnC;EACE,SAAS,CACP;GACE,MAAM;GACN,QAAQ;GACR,MAAM;GACP,EACD;GACE,MAAM;GACN,QAAQ;GACR,MAAM;GACP,CACF;EACD,MAAM;EACN,MAAM;EACN,MAAM;EACP;CACD;EACE,MAAM;GACJ;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACF;EACD,MAAM,EAAE;EACR,MAAM;EACN,MAAM;EACP;CACD;EACE,MAAM;GACJ;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACF;EACD,MAAM,EAAE;EACR,MAAM;EACN,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,EAAE;EACV,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,iBAAiB;EACjB,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,EAAE;EACX,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACP;CACD;EACE,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACD;IACE,MAAM;IACN,MAAM;IACP;GACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GACN,MAAM;GACP,EACD;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACN,SAAS,CACP;GACE,MAAM;GACN,MAAM;GACP,CACF;EACD,MAAM;EACP;CACD;EACE,QAAQ,CACN;GACE,MAAM;GA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"}