@0xkey-io/core 0.1.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 (183) hide show
  1. package/LICENSE +201 -0
  2. package/README.MD +7 -0
  3. package/dist/0xkey-helpers.d.ts +68 -0
  4. package/dist/0xkey-helpers.d.ts.map +1 -0
  5. package/dist/0xkey-helpers.js +466 -0
  6. package/dist/0xkey-helpers.js.map +1 -0
  7. package/dist/0xkey-helpers.mjs +399 -0
  8. package/dist/0xkey-helpers.mjs.map +1 -0
  9. package/dist/__clients__/core.d.ts +1201 -0
  10. package/dist/__clients__/core.d.ts.map +1 -0
  11. package/dist/__clients__/core.js +3489 -0
  12. package/dist/__clients__/core.js.map +1 -0
  13. package/dist/__clients__/core.mjs +3487 -0
  14. package/dist/__clients__/core.mjs.map +1 -0
  15. package/dist/__generated__/sdk-client-base.d.ts +281 -0
  16. package/dist/__generated__/sdk-client-base.d.ts.map +1 -0
  17. package/dist/__generated__/sdk-client-base.js +3906 -0
  18. package/dist/__generated__/sdk-client-base.js.map +1 -0
  19. package/dist/__generated__/sdk-client-base.mjs +3904 -0
  20. package/dist/__generated__/sdk-client-base.mjs.map +1 -0
  21. package/dist/__generated__/version.d.ts +2 -0
  22. package/dist/__generated__/version.d.ts.map +1 -0
  23. package/dist/__generated__/version.js +6 -0
  24. package/dist/__generated__/version.js.map +1 -0
  25. package/dist/__generated__/version.mjs +4 -0
  26. package/dist/__generated__/version.mjs.map +1 -0
  27. package/dist/__inputs__/public_api.types.d.ts +6014 -0
  28. package/dist/__inputs__/public_api.types.d.ts.map +1 -0
  29. package/dist/__polyfills__/jest.setup.webcrypto.d.ts +2 -0
  30. package/dist/__polyfills__/jest.setup.webcrypto.d.ts.map +1 -0
  31. package/dist/__polyfills__/window.d.ts +15 -0
  32. package/dist/__polyfills__/window.d.ts.map +1 -0
  33. package/dist/__polyfills__/window.js +30 -0
  34. package/dist/__polyfills__/window.js.map +1 -0
  35. package/dist/__polyfills__/window.mjs +28 -0
  36. package/dist/__polyfills__/window.mjs.map +1 -0
  37. package/dist/__stampers__/api/base.d.ts +27 -0
  38. package/dist/__stampers__/api/base.d.ts.map +1 -0
  39. package/dist/__stampers__/api/base.js +102 -0
  40. package/dist/__stampers__/api/base.js.map +1 -0
  41. package/dist/__stampers__/api/base.mjs +100 -0
  42. package/dist/__stampers__/api/base.mjs.map +1 -0
  43. package/dist/__stampers__/api/mobile/stamper.d.ts +15 -0
  44. package/dist/__stampers__/api/mobile/stamper.d.ts.map +1 -0
  45. package/dist/__stampers__/api/mobile/stamper.js +119 -0
  46. package/dist/__stampers__/api/mobile/stamper.js.map +1 -0
  47. package/dist/__stampers__/api/mobile/stamper.mjs +117 -0
  48. package/dist/__stampers__/api/mobile/stamper.mjs.map +1 -0
  49. package/dist/__stampers__/api/web/stamper.d.ts +14 -0
  50. package/dist/__stampers__/api/web/stamper.d.ts.map +1 -0
  51. package/dist/__stampers__/api/web/stamper.js +201 -0
  52. package/dist/__stampers__/api/web/stamper.js.map +1 -0
  53. package/dist/__stampers__/api/web/stamper.mjs +199 -0
  54. package/dist/__stampers__/api/web/stamper.mjs.map +1 -0
  55. package/dist/__stampers__/passkey/base.d.ts +16 -0
  56. package/dist/__stampers__/passkey/base.d.ts.map +1 -0
  57. package/dist/__stampers__/passkey/base.js +138 -0
  58. package/dist/__stampers__/passkey/base.js.map +1 -0
  59. package/dist/__stampers__/passkey/base.mjs +134 -0
  60. package/dist/__stampers__/passkey/base.mjs.map +1 -0
  61. package/dist/__storage__/base.d.ts +3 -0
  62. package/dist/__storage__/base.d.ts.map +1 -0
  63. package/dist/__storage__/base.js +27 -0
  64. package/dist/__storage__/base.js.map +1 -0
  65. package/dist/__storage__/base.mjs +25 -0
  66. package/dist/__storage__/base.mjs.map +1 -0
  67. package/dist/__storage__/mobile/storage.d.ts +18 -0
  68. package/dist/__storage__/mobile/storage.d.ts.map +1 -0
  69. package/dist/__storage__/mobile/storage.js +76 -0
  70. package/dist/__storage__/mobile/storage.js.map +1 -0
  71. package/dist/__storage__/mobile/storage.mjs +74 -0
  72. package/dist/__storage__/mobile/storage.mjs.map +1 -0
  73. package/dist/__storage__/web/storage.d.ts +19 -0
  74. package/dist/__storage__/web/storage.d.ts.map +1 -0
  75. package/dist/__storage__/web/storage.js +79 -0
  76. package/dist/__storage__/web/storage.js.map +1 -0
  77. package/dist/__storage__/web/storage.mjs +77 -0
  78. package/dist/__storage__/web/storage.mjs.map +1 -0
  79. package/dist/__typedoc-entry__/index.d.ts +3 -0
  80. package/dist/__typedoc-entry__/index.d.ts.map +1 -0
  81. package/dist/__types__/auth.d.ts +120 -0
  82. package/dist/__types__/auth.d.ts.map +1 -0
  83. package/dist/__types__/auth.js +7 -0
  84. package/dist/__types__/auth.js.map +1 -0
  85. package/dist/__types__/auth.mjs +5 -0
  86. package/dist/__types__/auth.mjs.map +1 -0
  87. package/dist/__types__/config.d.ts +145 -0
  88. package/dist/__types__/config.d.ts.map +1 -0
  89. package/dist/__types__/enums.d.ts +59 -0
  90. package/dist/__types__/enums.d.ts.map +1 -0
  91. package/dist/__types__/enums.js +72 -0
  92. package/dist/__types__/enums.js.map +1 -0
  93. package/dist/__types__/enums.mjs +70 -0
  94. package/dist/__types__/enums.mjs.map +1 -0
  95. package/dist/__types__/error.d.ts +13 -0
  96. package/dist/__types__/error.d.ts.map +1 -0
  97. package/dist/__types__/error.js +18 -0
  98. package/dist/__types__/error.js.map +1 -0
  99. package/dist/__types__/error.mjs +16 -0
  100. package/dist/__types__/error.mjs.map +1 -0
  101. package/dist/__types__/export.d.ts +10 -0
  102. package/dist/__types__/export.d.ts.map +1 -0
  103. package/dist/__types__/external-wallets.d.ts +203 -0
  104. package/dist/__types__/external-wallets.d.ts.map +1 -0
  105. package/dist/__types__/http.d.ts +17 -0
  106. package/dist/__types__/http.d.ts.map +1 -0
  107. package/dist/__types__/http.js +11 -0
  108. package/dist/__types__/http.js.map +1 -0
  109. package/dist/__types__/http.mjs +9 -0
  110. package/dist/__types__/http.mjs.map +1 -0
  111. package/dist/__types__/index.d.ts +10 -0
  112. package/dist/__types__/index.d.ts.map +1 -0
  113. package/dist/__types__/method-types/import-export-params.d.ts +38 -0
  114. package/dist/__types__/method-types/import-export-params.d.ts.map +1 -0
  115. package/dist/__types__/method-types/shared.d.ts +378 -0
  116. package/dist/__types__/method-types/shared.d.ts.map +1 -0
  117. package/dist/__wallet__/base.d.ts +14 -0
  118. package/dist/__wallet__/base.d.ts.map +1 -0
  119. package/dist/__wallet__/base.js +35 -0
  120. package/dist/__wallet__/base.js.map +1 -0
  121. package/dist/__wallet__/base.mjs +33 -0
  122. package/dist/__wallet__/base.mjs.map +1 -0
  123. package/dist/__wallet__/connector.d.ts +60 -0
  124. package/dist/__wallet__/connector.d.ts.map +1 -0
  125. package/dist/__wallet__/connector.js +93 -0
  126. package/dist/__wallet__/connector.js.map +1 -0
  127. package/dist/__wallet__/connector.mjs +91 -0
  128. package/dist/__wallet__/connector.mjs.map +1 -0
  129. package/dist/__wallet__/mobile/manager.d.ts +51 -0
  130. package/dist/__wallet__/mobile/manager.d.ts.map +1 -0
  131. package/dist/__wallet__/mobile/manager.js +115 -0
  132. package/dist/__wallet__/mobile/manager.js.map +1 -0
  133. package/dist/__wallet__/mobile/manager.mjs +113 -0
  134. package/dist/__wallet__/mobile/manager.mjs.map +1 -0
  135. package/dist/__wallet__/stamper.d.ts +90 -0
  136. package/dist/__wallet__/stamper.d.ts.map +1 -0
  137. package/dist/__wallet__/stamper.js +183 -0
  138. package/dist/__wallet__/stamper.js.map +1 -0
  139. package/dist/__wallet__/stamper.mjs +180 -0
  140. package/dist/__wallet__/stamper.mjs.map +1 -0
  141. package/dist/__wallet__/wallet-connect/base.d.ts +182 -0
  142. package/dist/__wallet__/wallet-connect/base.d.ts.map +1 -0
  143. package/dist/__wallet__/wallet-connect/base.js +606 -0
  144. package/dist/__wallet__/wallet-connect/base.js.map +1 -0
  145. package/dist/__wallet__/wallet-connect/base.mjs +604 -0
  146. package/dist/__wallet__/wallet-connect/base.mjs.map +1 -0
  147. package/dist/__wallet__/wallet-connect/client.d.ts +132 -0
  148. package/dist/__wallet__/wallet-connect/client.d.ts.map +1 -0
  149. package/dist/__wallet__/wallet-connect/client.js +262 -0
  150. package/dist/__wallet__/wallet-connect/client.js.map +1 -0
  151. package/dist/__wallet__/wallet-connect/client.mjs +260 -0
  152. package/dist/__wallet__/wallet-connect/client.mjs.map +1 -0
  153. package/dist/__wallet__/web/manager.d.ts +70 -0
  154. package/dist/__wallet__/web/manager.d.ts.map +1 -0
  155. package/dist/__wallet__/web/manager.js +177 -0
  156. package/dist/__wallet__/web/manager.js.map +1 -0
  157. package/dist/__wallet__/web/manager.mjs +175 -0
  158. package/dist/__wallet__/web/manager.mjs.map +1 -0
  159. package/dist/__wallet__/web/native/ethereum.d.ts +101 -0
  160. package/dist/__wallet__/web/native/ethereum.d.ts.map +1 -0
  161. package/dist/__wallet__/web/native/ethereum.js +339 -0
  162. package/dist/__wallet__/web/native/ethereum.js.map +1 -0
  163. package/dist/__wallet__/web/native/ethereum.mjs +336 -0
  164. package/dist/__wallet__/web/native/ethereum.mjs.map +1 -0
  165. package/dist/__wallet__/web/native/solana.d.ts +72 -0
  166. package/dist/__wallet__/web/native/solana.d.ts.map +1 -0
  167. package/dist/__wallet__/web/native/solana.js +215 -0
  168. package/dist/__wallet__/web/native/solana.js.map +1 -0
  169. package/dist/__wallet__/web/native/solana.mjs +212 -0
  170. package/dist/__wallet__/web/native/solana.mjs.map +1 -0
  171. package/dist/index.d.ts +19 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +83 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/index.mjs +10 -0
  176. package/dist/index.mjs.map +1 -0
  177. package/dist/utils.d.ts +160 -0
  178. package/dist/utils.d.ts.map +1 -0
  179. package/dist/utils.js +1047 -0
  180. package/dist/utils.js.map +1 -0
  181. package/dist/utils.mjs +1007 -0
  182. package/dist/utils.mjs.map +1 -0
  183. package/package.json +80 -0
@@ -0,0 +1,336 @@
1
+ import { toHex, recoverPublicKey, hashMessage } from 'viem';
2
+ import { Transaction } from 'ethers';
3
+ import { compressRawPublicKey } from '@0xkey-io/crypto';
4
+ import { SignIntent, WalletInterfaceType, Chain } from '../../../__types__/enums.mjs';
5
+ import { uint8ArrayFromHexString, uint8ArrayToHexString } from '@0xkey-io/encoding';
6
+ import { withTimeoutFallback } from '../../../utils.mjs';
7
+
8
+ /**
9
+ * Abstract base class for Ethereum wallet implementations.
10
+ *
11
+ * Provides shared logic for:
12
+ * - Provider discovery via EIP-6963 (request/announce events)
13
+ * - Connecting/disconnecting via EIP-1193
14
+ * - Recovering compressed secp256k1 public keys from EIP-191 signatures
15
+ */
16
+ class BaseEthereumWallet {
17
+ constructor() {
18
+ this.interfaceType = WalletInterfaceType.Ethereum;
19
+ /**
20
+ * Retrieves the compressed secp256k1 public key by signing a known message.
21
+ *
22
+ * - Signs the fixed string "GET_PUBLIC_KEY" (EIP-191) and recovers the key.
23
+ * - Returns the compressed public key as a hex string (no 0x prefix).
24
+ *
25
+ * @param provider - The wallet provider to use.
26
+ * @returns A promise that resolves to the compressed public key (hex-encoded).
27
+ */
28
+ this.getPublicKey = async (provider) => {
29
+ const message = "GET_PUBLIC_KEY";
30
+ const signature = await this.sign(message, provider, SignIntent.SignMessage);
31
+ return getCompressedPublicKey(signature, message);
32
+ };
33
+ /**
34
+ * Discovers EIP-1193 providers using the EIP-6963 standard.
35
+ *
36
+ * - Dispatches "eip6963:requestProvider" and listens for "eip6963:announceProvider".
37
+ * - For each discovered provider, attempts to read `eth_accounts` and `eth_chainId`
38
+ * (silently ignored if unavailable), defaulting to chainId "0x1".
39
+ * - Returns providers discovered during this discovery cycle; may be empty.
40
+ *
41
+ * @returns A promise that resolves to a list of available wallet providers.
42
+ */
43
+ this.getProviders = async () => {
44
+ const discovered = [];
45
+ const seenRdns = new Set();
46
+ const providerPromises = [];
47
+ const handler = (ev) => {
48
+ const { provider, info } = ev.detail;
49
+ // some wallets (e.g., Backpack) announce multiple providers. They do this to expose providers
50
+ // that extend EIP-1193 capabilities with additional methods. Since every provider we receive
51
+ // is EIP-1193 compliant, it doesn't matter which one we take. Here we just take the first
52
+ // one to avoid duplicates
53
+ if (info.rdns && seenRdns.has(info.rdns)) {
54
+ return;
55
+ }
56
+ if (info.rdns) {
57
+ seenRdns.add(info.rdns);
58
+ }
59
+ const promise = (async () => {
60
+ let connectedAddresses = [];
61
+ // we default to Ethereum mainnet
62
+ let chainId = "0x1";
63
+ try {
64
+ // wrap provider calls in a timeout to prevent hanging providers from blocking discovery
65
+ const accounts = await withTimeoutFallback(provider.request?.({
66
+ method: "eth_accounts",
67
+ }) ?? Promise.resolve([]), []);
68
+ if (Array.isArray(accounts))
69
+ connectedAddresses = accounts;
70
+ // we only request the chainId if there is a connected account because:
71
+ //
72
+ // 1. if there are no connected accounts, the chainId is irrelevant
73
+ //
74
+ // 2. some non-Ethereum-native wallets (e.g., Cosmos-based wallets) veer off EIP-1193 standards and prompt
75
+ // the user on chain-related RPC calls like `eth_chainId` because they enforce chain-level permissions
76
+ if (connectedAddresses.length > 0) {
77
+ chainId = await withTimeoutFallback(provider.request({
78
+ method: "eth_chainId",
79
+ }), "0x1");
80
+ }
81
+ }
82
+ catch {
83
+ // fail silently
84
+ }
85
+ discovered.push({
86
+ interfaceType: WalletInterfaceType.Ethereum,
87
+ chainInfo: {
88
+ namespace: Chain.Ethereum,
89
+ chainId,
90
+ },
91
+ // Some wallet providers include leading whitespace in their icon URLs.
92
+ // Next.js 15+ and other frameworks are strict about URL formatting,
93
+ // so we trim
94
+ info: {
95
+ ...info,
96
+ ...(info.icon && { icon: info.icon.trim() }),
97
+ },
98
+ provider,
99
+ connectedAddresses,
100
+ });
101
+ })();
102
+ providerPromises.push(promise);
103
+ };
104
+ window.addEventListener("eip6963:announceProvider", handler);
105
+ window.dispatchEvent(new Event("eip6963:requestProvider"));
106
+ window.removeEventListener("eip6963:announceProvider", handler);
107
+ await Promise.all(providerPromises);
108
+ return discovered;
109
+ };
110
+ /**
111
+ * Requests or verifies account connection via `eth_requestAccounts`.
112
+ *
113
+ * - If the wallet is already connected, resolves immediately (no prompt).
114
+ * - If not connected, the wallet will typically prompt the user to authorize.
115
+ *
116
+ * @param provider - The wallet provider to use.
117
+ * @returns A promise that resolves with the connected wallet's address.
118
+ * @throws {Error} If the wallet returns no accounts after the request.
119
+ */
120
+ this.connectWalletAccount = async (provider) => {
121
+ const wallet = asEip1193(provider);
122
+ return await getAccount(wallet);
123
+ };
124
+ /**
125
+ * Attempts to disconnect the wallet by revoking `eth_accounts` permission.
126
+ *
127
+ * - Calls `wallet_revokePermissions` with `{ eth_accounts: {} }`.
128
+ * - Provider behavior is wallet-specific: some implement it, some ignore it,
129
+ * and others (e.g., Phantom) throw “method not supported”.
130
+ *
131
+ * @param provider - The wallet provider to disconnect.
132
+ * @returns A promise that resolves once the request completes (or rejects if the provider errors).
133
+ */
134
+ this.disconnectWalletAccount = async (provider) => {
135
+ const wallet = asEip1193(provider);
136
+ await wallet.request({
137
+ method: "wallet_revokePermissions",
138
+ params: [{ eth_accounts: {} }],
139
+ });
140
+ };
141
+ }
142
+ /**
143
+ * Switches to a new EVM chain, with add-then-switch fallback.
144
+ *
145
+ * - Tries `wallet_switchEthereumChain` first.
146
+ * - If the wallet returns error code 4902 (unknown chain):
147
+ * - If `chainOrId` is a string (hex chainId), throws and asks the caller to pass metadata.
148
+ * - If `chainOrId` is a `SwitchableChain`, calls `wallet_addEthereumChain` and then retries the switch.
149
+ *
150
+ * @param provider - The wallet provider to use.
151
+ * @param chainOrId - Hex chain ID string or full `SwitchableChain` metadata.
152
+ * @throws {Error} If provider is non-EVM, adding/switching fails, or metadata is missing.
153
+ */
154
+ async switchChain(provider, chainOrId) {
155
+ if (provider.chainInfo.namespace !== Chain.Ethereum) {
156
+ throw new Error("Only EVM wallets can switch chains");
157
+ }
158
+ const wallet = asEip1193(provider);
159
+ const chainId = typeof chainOrId === "string" ? chainOrId : chainOrId.id;
160
+ try {
161
+ // first we just try switching
162
+ await wallet.request({
163
+ method: "wallet_switchEthereumChain",
164
+ params: [{ chainId }],
165
+ });
166
+ }
167
+ catch (err) {
168
+ // if the error is not “chain not found”
169
+ // we just re-throw it
170
+ if (err.code !== 4902) {
171
+ throw err;
172
+ }
173
+ // no metadata was provided so we throw an error
174
+ // telling them to pass it in
175
+ if (typeof chainOrId === "string") {
176
+ throw new Error(`Chain ${chainId} not recognized. ` +
177
+ `If you want to add it, call switchChain with a SwitchableChain object.`);
178
+ }
179
+ // we have full metadata and can add the chain and switch
180
+ const { name, rpcUrls, blockExplorerUrls, iconUrls, nativeCurrency } = chainOrId;
181
+ // add the chain
182
+ await wallet.request({
183
+ method: "wallet_addEthereumChain",
184
+ params: [
185
+ {
186
+ chainId,
187
+ chainName: name,
188
+ rpcUrls,
189
+ blockExplorerUrls,
190
+ iconUrls,
191
+ nativeCurrency,
192
+ },
193
+ ],
194
+ });
195
+ // then switch again
196
+ await wallet.request({
197
+ method: "wallet_switchEthereumChain",
198
+ params: [{ chainId }],
199
+ });
200
+ }
201
+ }
202
+ }
203
+ /**
204
+ * EthereumWallet implementation using EIP-1193 compatible providers.
205
+ *
206
+ * Handles message signing and transaction submission.
207
+ */
208
+ class EthereumWallet extends BaseEthereumWallet {
209
+ constructor() {
210
+ super(...arguments);
211
+ /**
212
+ * Signs a message or sends a transaction depending on intent.
213
+ *
214
+ * - `SignMessage` → `personal_sign` (hex signature).
215
+ * - `SignAndSendTransaction` → `eth_sendTransaction` (tx hash).
216
+ * - For transactions, `message` must be a raw tx that `Transaction.from(...)` can parse.
217
+ * - May prompt the user (account access, signing, or send).
218
+ *
219
+ * @param payload - The payload or raw transaction to be signed/sent.
220
+ * @param provider - The wallet provider to use.
221
+ * @param intent - Signing intent (SignMessage or SignAndSendTransaction).
222
+ * @returns A promise that resolves to a hex string (signature or tx hash).
223
+ * @throws {Error} If the intent is unsupported or the wallet rejects the request.
224
+ */
225
+ this.sign = async (payload, provider, intent) => {
226
+ const selectedProvider = asEip1193(provider);
227
+ const account = await getAccount(selectedProvider);
228
+ switch (intent) {
229
+ case SignIntent.SignMessage:
230
+ return await selectedProvider.request({
231
+ method: "personal_sign",
232
+ params: [payload, account],
233
+ });
234
+ case SignIntent.SignAndSendTransaction: {
235
+ const tx = Transaction.from(payload);
236
+ const base = {
237
+ from: account,
238
+ to: tx.to?.toString(),
239
+ value: toHex(tx.value),
240
+ gas: toHex(tx.gasLimit),
241
+ nonce: toHex(tx.nonce),
242
+ chainId: toHex(tx.chainId),
243
+ data: tx.data?.toString() ?? "0x",
244
+ };
245
+ // Some libs use undefined for legacy, so normalize
246
+ const txType = tx.type ?? 0;
247
+ let txParams;
248
+ if (txType === undefined || txType === 0 || txType === 1) {
249
+ // legacy or EIP-2930 (gasPrice-based)
250
+ if (tx.gasPrice == null) {
251
+ throw new Error("Legacy or EIP-2930 transaction missing gasPrice");
252
+ }
253
+ txParams = {
254
+ ...base,
255
+ gasPrice: toHex(tx.gasPrice),
256
+ };
257
+ }
258
+ else {
259
+ // EIP-1559 or future fee-market types
260
+ if (tx.maxFeePerGas == null || tx.maxPriorityFeePerGas == null) {
261
+ throw new Error("EIP-1559-style transaction missing maxFeePerGas or maxPriorityFeePerGas");
262
+ }
263
+ txParams = {
264
+ ...base,
265
+ maxFeePerGas: toHex(tx.maxFeePerGas),
266
+ maxPriorityFeePerGas: toHex(tx.maxPriorityFeePerGas),
267
+ };
268
+ }
269
+ return await selectedProvider.request({
270
+ method: "eth_sendTransaction",
271
+ params: [txParams],
272
+ });
273
+ }
274
+ default:
275
+ throw new Error(`Unsupported sign intent: ${intent}`);
276
+ }
277
+ };
278
+ }
279
+ }
280
+ /**
281
+ * Retrieves the active Ethereum account from a provider.
282
+ *
283
+ * - Calls `eth_requestAccounts` (usually no prompt).
284
+ *
285
+ * @param provider - EIP-1193 compliant provider.
286
+ * @returns A promise resolving to the connected Ethereum address.
287
+ * @throws {Error} If no connected account is found.
288
+ */
289
+ const getAccount = async (provider) => {
290
+ const [connectedAccount] = await provider.request({
291
+ method: "eth_requestAccounts",
292
+ });
293
+ if (!connectedAccount)
294
+ throw new Error("No connected account found");
295
+ return connectedAccount;
296
+ };
297
+ /**
298
+ * Recovers and compresses the public key from a signed message.
299
+ *
300
+ * - Recovers the secp256k1 public key from an EIP-191 signature and compresses it.
301
+ * - Returns a hex string with no 0x prefix.
302
+ *
303
+ * @param signature - The signature as a hex string.
304
+ * @param message - The original signed message.
305
+ * @returns A promise resolving to the compressed public key (hex-encoded).
306
+ */
307
+ const getCompressedPublicKey = async (signature, message) => {
308
+ const secp256k1PublicKey = await recoverPublicKey({
309
+ hash: hashMessage(message),
310
+ signature: signature,
311
+ });
312
+ const publicKeyHex = secp256k1PublicKey.startsWith("0x")
313
+ ? secp256k1PublicKey.slice(2)
314
+ : secp256k1PublicKey;
315
+ const publicKeyBytes = uint8ArrayFromHexString(publicKeyHex);
316
+ const publicKeyBytesCompressed = compressRawPublicKey(publicKeyBytes);
317
+ return uint8ArrayToHexString(publicKeyBytesCompressed);
318
+ };
319
+ /**
320
+ * Validates and casts a `WalletProvider` to an EIP-1193 provider.
321
+ *
322
+ * - Expects `provider.request` to be a function.
323
+ *
324
+ * @param p - The wallet provider to validate.
325
+ * @returns An EIP-1193 provider.
326
+ * @throws {Error} If the provider does not implement `request()`.
327
+ */
328
+ const asEip1193 = (p) => {
329
+ if (p.provider && typeof p.provider.request === "function") {
330
+ return p.provider;
331
+ }
332
+ throw new Error("Expected an EIP-1193 provider (Ethereum wallet)");
333
+ };
334
+
335
+ export { BaseEthereumWallet, EthereumWallet };
336
+ //# sourceMappingURL=ethereum.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethereum.mjs","sources":["../../../../src/__wallet__/web/native/ethereum.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { SignIntent, SolanaWalletInterface, WalletInterfaceType, WalletProvider } from "../../../__types__";
2
+ /**
3
+ * Abstract base class for Solana wallet implementations using Wallet Standard.
4
+ *
5
+ * Provides shared logic for:
6
+ * - Provider discovery via `@wallet-standard/app` (`getWallets()`).
7
+ * - Connecting via `standard:connect` and disconnecting via `standard:disconnect`.
8
+ * - Public key retrieval from the wallet's account address (base58 → hex).
9
+ */
10
+ export declare abstract class BaseSolanaWallet implements SolanaWalletInterface {
11
+ readonly interfaceType = WalletInterfaceType.Solana;
12
+ abstract sign(message: string | Uint8Array, provider: WalletProvider, intent: SignIntent): Promise<string>;
13
+ /**
14
+ * Retrieves the ed25519 public key for the active account as hex (no 0x prefix).
15
+ *
16
+ * - Ensures the wallet is connected (calls `standard:connect` if needed).
17
+ * - Decodes the Wallet Standard account address (base58) to raw bytes.
18
+ *
19
+ * @param provider - The wallet provider to use.
20
+ * @returns Hex-encoded ed25519 public key (no 0x prefix).
21
+ * @throws {Error} If no account is available.
22
+ */
23
+ getPublicKey: (provider: WalletProvider) => Promise<string>;
24
+ /**
25
+ * Discovers Solana-capable Wallet Standard providers.
26
+ *
27
+ * - Uses `getWallets().get()` and filters wallets with at least one `chains` entry
28
+ * starting with `"solana:"`.
29
+ * - For each wallet, collects branding info and any currently connected addresses.
30
+ *
31
+ * @returns A list of discovered Solana `WalletProvider`s (may be empty).
32
+ */
33
+ getProviders: () => Promise<WalletProvider[]>;
34
+ /**
35
+ * Connects the wallet account, prompting the user if necessary.
36
+ *
37
+ * - Calls `standard:connect` only if no accounts are present. This will prompt the user to connect their wallet.
38
+ *
39
+ * @param provider - The wallet provider to connect.
40
+ * @returns A promise that resolves with the connected wallet's address.
41
+ * @throws {Error} If the wallet does not implement `standard:connect`.
42
+ */
43
+ connectWalletAccount: (provider: WalletProvider) => Promise<string>;
44
+ /**
45
+ * Disconnects the wallet account using Wallet Standard.
46
+ *
47
+ * - Calls `standard:disconnect` if implemented.
48
+ * - Throws if the wallet does not implement `standard:disconnect`.
49
+ *
50
+ * @param provider - The wallet provider to disconnect.
51
+ * @returns A promise that resolves once the wallet disconnects.
52
+ * @throws {Error} If `standard:disconnect` is not supported by the wallet.
53
+ */
54
+ disconnectWalletAccount: (provider: WalletProvider) => Promise<void>;
55
+ }
56
+ /**
57
+ * Signs a message or transaction with the connected Solana wallet.
58
+ *
59
+ * - Ensures the wallet is connected (may prompt via `standard:connect` if its not).
60
+ * - `SignMessage` → `solana:signMessage` (returns hex signature).
61
+ * - `SignTransaction` → `solana:signTransaction` (returns hex signature).
62
+ *
63
+ * @param payload - UTF-8 string (for message) or hex string (for transaction bytes).
64
+ * @param provider - The wallet provider to use.
65
+ * @param intent - The signing intent.
66
+ * @returns Hex-encoded signature (no 0x prefix).
67
+ * @throws {Error} If the provider lacks required features or intent is unsupported.
68
+ */
69
+ export declare class SolanaWallet extends BaseSolanaWallet {
70
+ sign: (payload: string, provider: WalletProvider, intent: SignIntent) => Promise<string>;
71
+ }
72
+ //# sourceMappingURL=solana.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../../../src/__wallet__/web/native/solana.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EAEf,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;GAOG;AACH,8BAAsB,gBAAiB,YAAW,qBAAqB;IACrE,QAAQ,CAAC,aAAa,8BAA8B;IAEpD,QAAQ,CAAC,IAAI,CACX,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC;IAElB;;;;;;;;;OASG;IACH,YAAY,aAAoB,cAAc,KAAG,QAAQ,MAAM,CAAC,CAS9D;IAEF;;;;;;;;OAQG;IACH,YAAY,QAAa,QAAQ,cAAc,EAAE,CAAC,CAwChD;IAEF;;;;;;;;OAQG;IACH,oBAAoB,aAAoB,cAAc,KAAG,QAAQ,MAAM,CAAC,CAGtE;IAEF;;;;;;;;;OASG;IACH,uBAAuB,aAAoB,cAAc,KAAG,QAAQ,IAAI,CAAC,CAUvE;CACH;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,IAAI,YACO,MAAM,YACL,cAAc,UAChB,UAAU,KACjB,QAAQ,MAAM,CAAC,CA8DhB;CACH"}
@@ -0,0 +1,215 @@
1
+ 'use strict';
2
+
3
+ var app = require('@wallet-standard/app');
4
+ var encoding = require('@0xkey-io/encoding');
5
+ var enums = require('../../../__types__/enums.js');
6
+ var utils = require('../../../utils.js');
7
+
8
+ /**
9
+ * Abstract base class for Solana wallet implementations using Wallet Standard.
10
+ *
11
+ * Provides shared logic for:
12
+ * - Provider discovery via `@wallet-standard/app` (`getWallets()`).
13
+ * - Connecting via `standard:connect` and disconnecting via `standard:disconnect`.
14
+ * - Public key retrieval from the wallet's account address (base58 → hex).
15
+ */
16
+ class BaseSolanaWallet {
17
+ constructor() {
18
+ this.interfaceType = enums.WalletInterfaceType.Solana;
19
+ /**
20
+ * Retrieves the ed25519 public key for the active account as hex (no 0x prefix).
21
+ *
22
+ * - Ensures the wallet is connected (calls `standard:connect` if needed).
23
+ * - Decodes the Wallet Standard account address (base58) to raw bytes.
24
+ *
25
+ * @param provider - The wallet provider to use.
26
+ * @returns Hex-encoded ed25519 public key (no 0x prefix).
27
+ * @throws {Error} If no account is available.
28
+ */
29
+ this.getPublicKey = async (provider) => {
30
+ const wallet = asSolana(provider);
31
+ await connectAccount(wallet);
32
+ const account = wallet.accounts[0];
33
+ if (!account) {
34
+ throw new Error("No account in wallet");
35
+ }
36
+ const rawBytes = encoding.bs58.decode(account.address);
37
+ return encoding.uint8ArrayToHexString(rawBytes);
38
+ };
39
+ /**
40
+ * Discovers Solana-capable Wallet Standard providers.
41
+ *
42
+ * - Uses `getWallets().get()` and filters wallets with at least one `chains` entry
43
+ * starting with `"solana:"`.
44
+ * - For each wallet, collects branding info and any currently connected addresses.
45
+ *
46
+ * @returns A list of discovered Solana `WalletProvider`s (may be empty).
47
+ */
48
+ this.getProviders = async () => {
49
+ const discovered = [];
50
+ const walletsApi = app.getWallets();
51
+ const providers = walletsApi
52
+ .get()
53
+ .filter((w) => w.chains?.some((c) => c.startsWith("solana:")));
54
+ await Promise.all(providers.map(async (wallet) => {
55
+ // wrap account access in a timeout to prevent hanging providers from blocking discovery
56
+ const connectedAddresses = await utils.withTimeoutFallback((async () => {
57
+ try {
58
+ return wallet.accounts?.map((a) => a.address) ?? [];
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ })(), []);
64
+ discovered.push({
65
+ interfaceType: enums.WalletInterfaceType.Solana,
66
+ chainInfo: {
67
+ namespace: enums.Chain.Solana,
68
+ },
69
+ // Some wallet providers include leading whitespace in their icon URLs.
70
+ // Next.js 15+ and other frameworks are strict about URL formatting,
71
+ // so we trim
72
+ info: {
73
+ name: wallet.name,
74
+ ...(wallet.icon && { icon: wallet.icon.trim() }),
75
+ },
76
+ provider: wallet,
77
+ connectedAddresses,
78
+ });
79
+ }));
80
+ return discovered;
81
+ };
82
+ /**
83
+ * Connects the wallet account, prompting the user if necessary.
84
+ *
85
+ * - Calls `standard:connect` only if no accounts are present. This will prompt the user to connect their wallet.
86
+ *
87
+ * @param provider - The wallet provider to connect.
88
+ * @returns A promise that resolves with the connected wallet's address.
89
+ * @throws {Error} If the wallet does not implement `standard:connect`.
90
+ */
91
+ this.connectWalletAccount = async (provider) => {
92
+ const wallet = asSolana(provider);
93
+ return await connectAccount(wallet);
94
+ };
95
+ /**
96
+ * Disconnects the wallet account using Wallet Standard.
97
+ *
98
+ * - Calls `standard:disconnect` if implemented.
99
+ * - Throws if the wallet does not implement `standard:disconnect`.
100
+ *
101
+ * @param provider - The wallet provider to disconnect.
102
+ * @returns A promise that resolves once the wallet disconnects.
103
+ * @throws {Error} If `standard:disconnect` is not supported by the wallet.
104
+ */
105
+ this.disconnectWalletAccount = async (provider) => {
106
+ const wallet = asSolana(provider);
107
+ const disconnectFeature = wallet.features["standard:disconnect"];
108
+ if (disconnectFeature) {
109
+ await disconnectFeature.disconnect();
110
+ }
111
+ else {
112
+ throw new Error("Wallet does not support standard:disconnect");
113
+ }
114
+ };
115
+ }
116
+ }
117
+ /**
118
+ * Signs a message or transaction with the connected Solana wallet.
119
+ *
120
+ * - Ensures the wallet is connected (may prompt via `standard:connect` if its not).
121
+ * - `SignMessage` → `solana:signMessage` (returns hex signature).
122
+ * - `SignTransaction` → `solana:signTransaction` (returns hex signature).
123
+ *
124
+ * @param payload - UTF-8 string (for message) or hex string (for transaction bytes).
125
+ * @param provider - The wallet provider to use.
126
+ * @param intent - The signing intent.
127
+ * @returns Hex-encoded signature (no 0x prefix).
128
+ * @throws {Error} If the provider lacks required features or intent is unsupported.
129
+ */
130
+ class SolanaWallet extends BaseSolanaWallet {
131
+ constructor() {
132
+ super(...arguments);
133
+ this.sign = async (payload, provider, intent) => {
134
+ const wallet = asSolana(provider);
135
+ await connectAccount(wallet);
136
+ const account = wallet.accounts[0];
137
+ if (!account)
138
+ throw new Error("No account available");
139
+ switch (intent) {
140
+ case enums.SignIntent.SignMessage: {
141
+ const signFeature = wallet.features["solana:signMessage"];
142
+ if (!signFeature)
143
+ throw new Error("Provider does not support solana:signMessage");
144
+ const data = new TextEncoder().encode(payload);
145
+ const results = await signFeature.signMessage({
146
+ account,
147
+ message: data,
148
+ });
149
+ if (!results?.length || !results[0]?.signature) {
150
+ throw new Error("No signature returned from signMessage");
151
+ }
152
+ return encoding.uint8ArrayToHexString(results[0].signature);
153
+ }
154
+ case enums.SignIntent.SignTransaction: {
155
+ const signFeature = wallet.features["solana:signTransaction"];
156
+ if (!signFeature)
157
+ throw new Error("Provider does not support solana:signTransaction");
158
+ const data = encoding.uint8ArrayFromHexString(payload);
159
+ const results = await signFeature.signTransaction({
160
+ account,
161
+ transaction: data,
162
+ });
163
+ if (!results?.length || !results[0]?.signedTransaction) {
164
+ throw new Error("No signature returned from signTransaction");
165
+ }
166
+ return encoding.uint8ArrayToHexString(results[0].signedTransaction);
167
+ }
168
+ default:
169
+ throw new Error(`Unsupported sign intent: ${intent}`);
170
+ }
171
+ };
172
+ }
173
+ }
174
+ /**
175
+ * Casts a WalletRpcProvider to a Wallet Standard Solana wallet.
176
+ *
177
+ * - Validates presence of the Wallet Standard `features` map and `solana:signMessage`.
178
+ * - Use this before calling Solana-specific features (signMessage, signTransaction, etc.).
179
+ *
180
+ * @param provider - The wallet provider to cast.
181
+ * @returns The Wallet Standard wallet object.
182
+ * @throws {Error} If the provider is not a Wallet Standard Solana wallet.
183
+ */
184
+ const asSolana = (provider) => {
185
+ if (provider.provider &&
186
+ "features" in provider.provider &&
187
+ "solana:signMessage" in provider.provider.features) {
188
+ return provider.provider;
189
+ }
190
+ throw new Error("Expected a Wallet-Standard provider (Solana wallet)");
191
+ };
192
+ /**
193
+ * Ensures the given Wallet Standard wallet has at least one connected account.
194
+ *
195
+ * - If accounts already exist, resolves immediately.
196
+ * - If not, attempts `standard:connect`, which may prompt the user.
197
+ *
198
+ * @param wallet - The Wallet Standard wallet to connect.
199
+ * @returns A promise that resolves with the connected wallet's address.
200
+ * @throws {Error} If the wallet does not implement `standard:connect`.
201
+ */
202
+ const connectAccount = async (wallet) => {
203
+ if (wallet.accounts.length)
204
+ return wallet.accounts[0].address;
205
+ const stdConnect = wallet.features["standard:connect"];
206
+ if (stdConnect) {
207
+ await stdConnect.connect();
208
+ return wallet.accounts[0].address;
209
+ }
210
+ throw new Error("Wallet is not connected and does not implement standard:connect");
211
+ };
212
+
213
+ exports.BaseSolanaWallet = BaseSolanaWallet;
214
+ exports.SolanaWallet = SolanaWallet;
215
+ //# sourceMappingURL=solana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solana.js","sources":["../../../../src/__wallet__/web/native/solana.ts"],"sourcesContent":[null],"names":["WalletInterfaceType","bs58","uint8ArrayToHexString","getWallets","withTimeoutFallback","Chain","SignIntent","uint8ArrayFromHexString"],"mappings":";;;;;;;AAkBA;;;;;;;AAOG;MACmB,gBAAgB,CAAA;AAAtC,IAAA,WAAA,GAAA;AACW,QAAA,IAAA,CAAA,aAAa,GAAGA,yBAAmB,CAAC,MAAM;AAQnD;;;;;;;;;AASG;AACH,QAAA,IAAA,CAAA,YAAY,GAAG,OAAO,QAAwB,KAAqB;AACjE,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;AACjC,YAAA,MAAM,cAAc,CAAC,MAAM,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;YACA,MAAM,QAAQ,GAAGC,aAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;AAC7C,YAAA,OAAOC,8BAAqB,CAAC,QAAQ,CAAC;AACxC,QAAA,CAAC;AAED;;;;;;;;AAQG;QACH,IAAA,CAAA,YAAY,GAAG,YAAsC;YACnD,MAAM,UAAU,GAAqB,EAAE;AACvC,YAAA,MAAM,UAAU,GAAGC,cAAU,EAAE;YAC/B,MAAM,SAAS,GAAG;AACf,iBAAA,GAAG;iBACH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAEhE,YAAA,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,GAAG,CAAC,OAAO,MAAM,KAAI;;gBAE7B,MAAM,kBAAkB,GAAG,MAAMC,yBAAmB,CAClD,CAAC,YAAW;AACV,oBAAA,IAAI;AACF,wBAAA,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC1D;AAAE,oBAAA,MAAM;AACN,wBAAA,OAAO,EAAE;oBACX;AACF,gBAAA,CAAC,GAAG,EACJ,EAAE,CACH;gBAED,UAAU,CAAC,IAAI,CAAC;oBACd,aAAa,EAAEJ,yBAAmB,CAAC,MAAM;AACzC,oBAAA,SAAS,EAAE;wBACT,SAAS,EAAEK,WAAK,CAAC,MAAM;AACxB,qBAAA;;;;AAID,oBAAA,IAAI,EAAE;wBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,wBAAA,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;AACjD,qBAAA;AACD,oBAAA,QAAQ,EAAE,MAA2B;oBACrC,kBAAkB;AACnB,iBAAA,CAAC;YACJ,CAAC,CAAC,CACH;AAED,YAAA,OAAO,UAAU;AACnB,QAAA,CAAC;AAED;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,oBAAoB,GAAG,OAAO,QAAwB,KAAqB;AACzE,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;AACjC,YAAA,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC;AACrC,QAAA,CAAC;AAED;;;;;;;;;AASG;AACH,QAAA,IAAA,CAAA,uBAAuB,GAAG,OAAO,QAAwB,KAAmB;AAC1E,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACjC,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAElD;YACb,IAAI,iBAAiB,EAAE;AACrB,gBAAA,MAAM,iBAAiB,CAAC,UAAU,EAAE;YACtC;iBAAO;AACL,gBAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC;YAChE;AACF,QAAA,CAAC;IACH;AAAC;AAED;;;;;;;;;;;;AAYG;AACG,MAAO,YAAa,SAAQ,gBAAgB,CAAA;AAAlD,IAAA,WAAA,GAAA;;QACE,IAAA,CAAA,IAAI,GAAG,OACL,OAAe,EACf,QAAwB,EACxB,MAAkB,KACC;AACnB,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;AACjC,YAAA,MAAM,cAAc,CAAC,MAAM,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YAErD,QAAQ,MAAM;AACZ,gBAAA,KAAKC,gBAAU,CAAC,WAAW,EAAE;oBAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAS3C;AAEb,oBAAA,IAAI,CAAC,WAAW;AACd,wBAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC;oBAEjE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;AAC9C,oBAAA,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC;wBAC5C,OAAO;AACP,wBAAA,OAAO,EAAE,IAAI;AACd,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE;AAC9C,wBAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;oBAC3D;oBAEA,OAAOJ,8BAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpD;AAEA,gBAAA,KAAKI,gBAAU,CAAC,eAAe,EAAE;oBAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAO/C;AAEb,oBAAA,IAAI,CAAC,WAAW;AACd,wBAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC;AAErE,oBAAA,MAAM,IAAI,GAAGC,gCAAuB,CAAC,OAAO,CAAC;AAC7C,oBAAA,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC;wBAChD,OAAO;AACP,wBAAA,WAAW,EAAE,IAAI;AAClB,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE;AACtD,wBAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;oBAC/D;oBAEA,OAAOL,8BAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBAC5D;AAEA,gBAAA;AACE,oBAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAA,CAAE,CAAC;;AAE3D,QAAA,CAAC;IACH;AAAC;AAED;;;;;;;;;AASG;AACH,MAAM,QAAQ,GAAG,CAAC,QAAwB,KAAe;IACvD,IACE,QAAQ,CAAC,QAAQ;QACjB,UAAU,IAAI,QAAQ,CAAC,QAAQ;AAC/B,QAAA,oBAAoB,IAAK,QAAQ,CAAC,QAAgB,CAAC,QAAQ,EAC3D;QACA,OAAO,QAAQ,CAAC,QAAqB;IACvC;AACA,IAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;AACxE,CAAC;AAED;;;;;;;;;AASG;AACH,MAAM,cAAc,GAAG,OAAO,MAAiB,KAAqB;AAClE,IAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO;IAE9D,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAExC;IAEb,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,UAAU,CAAC,OAAO,EAAE;QAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO;IACpC;AAEA,IAAA,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE;AACH,CAAC;;;;;"}