@aurum-sdk/core 0.1.5 → 0.2.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.
@@ -119,6 +119,325 @@ function sortWallets(wallets, options = {}) {
119
119
  return result;
120
120
  }
121
121
 
122
+ // src/services/sentry.ts
123
+ import * as Sentry from "@sentry/browser";
124
+ var initialized = false;
125
+ var telemetryEnabled = true;
126
+ function getEnvironment() {
127
+ if (typeof window !== "undefined") {
128
+ const hostname = window.location.hostname;
129
+ if (hostname === "localhost" || hostname === "127.0.0.1") {
130
+ return "development";
131
+ }
132
+ }
133
+ return "production";
134
+ }
135
+ function initSentry(enabled = true) {
136
+ telemetryEnabled = enabled;
137
+ if (initialized || !telemetryEnabled || false) return;
138
+ initialized = true;
139
+ Sentry.init({
140
+ dsn: "https://0bb16fd7057ac7b45ae0ab416cdbea8b@o4505953815494656.ingest.us.sentry.io/4509747448184832",
141
+ environment: getEnvironment(),
142
+ release: `@aurum-sdk/core@${"0.2.0"}`,
143
+ sendDefaultPii: false,
144
+ enableLogs: true
145
+ });
146
+ }
147
+ function getUrl() {
148
+ if (typeof window !== "undefined") {
149
+ return window.location.href;
150
+ }
151
+ return void 0;
152
+ }
153
+ var sentryLogger = {
154
+ info: (message, attributes) => {
155
+ if (telemetryEnabled) Sentry.logger.info(message, { url: getUrl(), ...attributes });
156
+ },
157
+ warn: (message, attributes) => {
158
+ if (telemetryEnabled) Sentry.logger.warn(message, { url: getUrl(), ...attributes });
159
+ },
160
+ error: (message, attributes) => {
161
+ if (telemetryEnabled) Sentry.logger.error(message, { url: getUrl(), ...attributes });
162
+ }
163
+ };
164
+
165
+ // src/wallet-adapters/AppKitAdapter.ts
166
+ import { getLogoDataUri } from "@aurum-sdk/logos";
167
+ import { WalletId as WalletId2, WalletName } from "@aurum-sdk/types";
168
+
169
+ // src/utils/isConfigError.ts
170
+ var isConfigError = (error) => {
171
+ const name = error?.name;
172
+ return name === "ConfigError";
173
+ };
174
+ var createConfigError = (adapterName) => {
175
+ const error = new Error(`Missing required project ID for ${adapterName}`);
176
+ error.name = "ConfigError";
177
+ return error;
178
+ };
179
+
180
+ // src/wallet-adapters/AppKitAdapter.ts
181
+ var AppKitAdapter = class {
182
+ constructor(config) {
183
+ this.id = WalletId2.WalletConnect;
184
+ this.name = WalletName.WalletConnect;
185
+ this.icon = getLogoDataUri(WalletId2.WalletConnect, "brand") ?? "";
186
+ this.hide = true;
187
+ this.downloadUrl = null;
188
+ this.wcDeepLinkUrl = null;
189
+ this.modal = null;
190
+ this.wagmiAdapter = null;
191
+ this.provider = null;
192
+ this.address = null;
193
+ this.accountsChangedCallback = null;
194
+ this.unsubscribeFunctions = [];
195
+ this.initPromise = null;
196
+ this.config = {
197
+ projectId: config.projectId,
198
+ appName: config.appName,
199
+ modalZIndex: config.modalZIndex,
200
+ theme: config.theme
201
+ };
202
+ }
203
+ async ensureInitialized() {
204
+ if (this.modal) return;
205
+ if (!this.initPromise) {
206
+ this.initPromise = this.initializeAppKit();
207
+ }
208
+ await this.initPromise;
209
+ }
210
+ async initializeAppKit() {
211
+ if (typeof window === "undefined") return;
212
+ const [{ createAppKit }, { WagmiAdapter }, { mainnet }] = await Promise.all([
213
+ import("@reown/appkit"),
214
+ import("@reown/appkit-adapter-wagmi"),
215
+ import("@reown/appkit/networks")
216
+ ]);
217
+ const networks = [mainnet];
218
+ this.wagmiAdapter = new WagmiAdapter({
219
+ projectId: this.config.projectId,
220
+ networks,
221
+ ssr: true
222
+ });
223
+ this.modal = createAppKit({
224
+ adapters: [this.wagmiAdapter],
225
+ networks,
226
+ projectId: this.config.projectId,
227
+ metadata: {
228
+ name: this.config.appName,
229
+ description: this.config.appName,
230
+ url: window.location.origin,
231
+ icons: []
232
+ },
233
+ allowUnsupportedChain: true,
234
+ themeMode: this.config.theme,
235
+ themeVariables: {
236
+ "--apkt-z-index": this.config.modalZIndex + 1
237
+ }
238
+ });
239
+ this.setupEventListeners();
240
+ }
241
+ setupEventListeners() {
242
+ if (!this.modal) return;
243
+ const unsubscribeProviders = this.modal.subscribeProviders((state) => {
244
+ const eip155Provider = state["eip155"];
245
+ this.provider = eip155Provider || null;
246
+ if (!eip155Provider) {
247
+ this.address = null;
248
+ }
249
+ });
250
+ this.unsubscribeFunctions.push(unsubscribeProviders);
251
+ }
252
+ syncAddressFromWagmi() {
253
+ if (!this.wagmiAdapter?.wagmiConfig) return;
254
+ const { state } = this.wagmiAdapter.wagmiConfig;
255
+ if (state.current && state.connections) {
256
+ const connection = state.connections.get(state.current);
257
+ if (connection?.accounts?.[0]) {
258
+ this.address = connection.accounts[0];
259
+ }
260
+ }
261
+ }
262
+ async syncProviderFromModal() {
263
+ if (!this.modal) return;
264
+ try {
265
+ const getProvidersFn = this.modal.getProviders;
266
+ if (typeof getProvidersFn === "function") {
267
+ const providers = getProvidersFn.call(this.modal);
268
+ const eip155Provider = providers?.["eip155"];
269
+ if (eip155Provider) {
270
+ this.provider = eip155Provider;
271
+ return;
272
+ }
273
+ }
274
+ if (this.wagmiAdapter?.wagmiConfig) {
275
+ const { state } = this.wagmiAdapter.wagmiConfig;
276
+ if (state.current && state.connections) {
277
+ const connection = state.connections.get(state.current);
278
+ const connector = connection?.connector;
279
+ if (connector && typeof connector.getProvider === "function") {
280
+ try {
281
+ const provider = await connector.getProvider();
282
+ if (provider) {
283
+ this.provider = provider;
284
+ }
285
+ } catch (error) {
286
+ sentryLogger.warn("Failed to get provider from wagmi connector", { error });
287
+ }
288
+ }
289
+ }
290
+ }
291
+ } catch (error) {
292
+ sentryLogger.warn("Failed to get provider from WalletConnect modal", { error });
293
+ }
294
+ }
295
+ isInstalled() {
296
+ return true;
297
+ }
298
+ async connect() {
299
+ if (!this.config.projectId) {
300
+ throw createConfigError("WalletConnect");
301
+ }
302
+ await this.ensureInitialized();
303
+ if (!this.modal) {
304
+ sentryLogger.error("WalletConnect modal is not available");
305
+ throw new Error("WalletConnect modal is not available");
306
+ }
307
+ const existingAddress = this.modal.getAddress();
308
+ if (this.modal.getIsConnectedState() && existingAddress) {
309
+ await this.syncProviderFromModal();
310
+ if (this.provider) {
311
+ this.address = existingAddress;
312
+ return {
313
+ address: existingAddress,
314
+ provider: this.provider,
315
+ walletId: this.id
316
+ };
317
+ }
318
+ await this.disconnect();
319
+ }
320
+ this.modal.open({ view: "AllWallets" });
321
+ return await this.waitForConnection();
322
+ }
323
+ waitForConnection(timeout = 6e4) {
324
+ return new Promise((resolve, reject) => {
325
+ const startTime = Date.now();
326
+ let unsubscribeState = null;
327
+ let isResolved = false;
328
+ const cleanup = () => {
329
+ unsubscribeState?.();
330
+ };
331
+ const checkConnection = async () => {
332
+ if (isResolved) return true;
333
+ this.syncAddressFromWagmi();
334
+ if (this.address && !this.provider) {
335
+ await this.syncProviderFromModal();
336
+ }
337
+ if (this.provider && this.address) {
338
+ try {
339
+ const accounts = await this.provider.request({ method: "eth_accounts" });
340
+ if (accounts && accounts.length > 0) {
341
+ isResolved = true;
342
+ cleanup();
343
+ this.modal?.close();
344
+ resolve({
345
+ address: this.address,
346
+ provider: this.provider,
347
+ walletId: this.id
348
+ });
349
+ return true;
350
+ }
351
+ return false;
352
+ } catch {
353
+ return false;
354
+ }
355
+ }
356
+ return false;
357
+ };
358
+ unsubscribeState = this.modal.subscribeState(async (state) => {
359
+ if (await checkConnection()) return;
360
+ if (state.open === false && !this.address && !isResolved) {
361
+ cleanup();
362
+ reject(new Error("Connection rejected by user"));
363
+ }
364
+ });
365
+ const pollTimeout = async () => {
366
+ if (await checkConnection()) return;
367
+ if (Date.now() - startTime > timeout) {
368
+ cleanup();
369
+ reject(new Error("Connection timeout"));
370
+ return;
371
+ }
372
+ setTimeout(pollTimeout, 500);
373
+ };
374
+ pollTimeout();
375
+ });
376
+ }
377
+ async tryRestoreConnection() {
378
+ await this.ensureInitialized();
379
+ if (!this.modal || !this.wagmiAdapter) return null;
380
+ try {
381
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
382
+ const wagmiConfig = this.wagmiAdapter.wagmiConfig;
383
+ if (wagmiConfig?.state?.current && wagmiConfig.state.connections) {
384
+ const connection = wagmiConfig.state.connections.get(wagmiConfig.state.current);
385
+ if (connection?.accounts?.[0]) {
386
+ this.address = connection.accounts[0];
387
+ if (this.provider && this.address) {
388
+ return {
389
+ address: this.address,
390
+ provider: this.provider,
391
+ walletId: this.id
392
+ };
393
+ }
394
+ }
395
+ }
396
+ return null;
397
+ } catch {
398
+ return null;
399
+ }
400
+ }
401
+ async disconnect() {
402
+ if (!this.modal) {
403
+ this.address = null;
404
+ this.provider = null;
405
+ return;
406
+ }
407
+ await this.modal.disconnect("eip155");
408
+ const timeout = Date.now() + 2e3;
409
+ while (Date.now() < timeout && (this.modal.getIsConnectedState() || this.modal.getAddress())) {
410
+ await new Promise((r) => setTimeout(r, 100));
411
+ }
412
+ this.address = null;
413
+ this.provider = null;
414
+ }
415
+ getProvider() {
416
+ return this.provider;
417
+ }
418
+ onAccountsChanged(callback) {
419
+ if (!this.provider?.on) return;
420
+ if (this.accountsChangedCallback) {
421
+ this.provider.removeListener?.("accountsChanged", this.accountsChangedCallback);
422
+ }
423
+ this.accountsChangedCallback = (accounts) => {
424
+ this.address = accounts[0] || null;
425
+ callback(accounts);
426
+ };
427
+ this.provider.on("accountsChanged", this.accountsChangedCallback);
428
+ }
429
+ removeListeners() {
430
+ if (this.provider?.removeListener && this.accountsChangedCallback) {
431
+ this.provider.removeListener("accountsChanged", this.accountsChangedCallback);
432
+ this.accountsChangedCallback = null;
433
+ }
434
+ this.unsubscribeFunctions.forEach((unsub) => unsub());
435
+ this.unsubscribeFunctions = [];
436
+ }
437
+ };
438
+ /** Internal identifier for distinguishing from WalletConnectAdapter */
439
+ AppKitAdapter.INTERNAL_ID = "appkit-modal";
440
+
122
441
  // src/utils/platform/isMobile.ts
123
442
  import MobileDetect from "mobile-detect";
124
443
  function isMobile() {
@@ -735,62 +1054,6 @@ import { useEffect as useEffect4, useState as useState7 } from "react";
735
1054
 
736
1055
  // src/contexts/EmailAuthContext.tsx
737
1056
  import { createContext as createContext3, useContext as useContext3, useState as useState6 } from "react";
738
-
739
- // src/services/sentry.ts
740
- import * as Sentry from "@sentry/browser";
741
- var initialized = false;
742
- var telemetryEnabled = true;
743
- function getEnvironment() {
744
- if (typeof window !== "undefined") {
745
- const hostname = window.location.hostname;
746
- if (hostname === "localhost" || hostname === "127.0.0.1") {
747
- return "development";
748
- }
749
- }
750
- return "production";
751
- }
752
- function initSentry(enabled = true) {
753
- telemetryEnabled = enabled;
754
- if (initialized || !telemetryEnabled || false) return;
755
- initialized = true;
756
- Sentry.init({
757
- dsn: "https://0bb16fd7057ac7b45ae0ab416cdbea8b@o4505953815494656.ingest.us.sentry.io/4509747448184832",
758
- environment: getEnvironment(),
759
- release: `@aurum-sdk/core@${"0.1.5"}`,
760
- sendDefaultPii: false,
761
- enableLogs: true
762
- });
763
- }
764
- function getUrl() {
765
- if (typeof window !== "undefined") {
766
- return window.location.href;
767
- }
768
- return void 0;
769
- }
770
- var sentryLogger = {
771
- info: (message, attributes) => {
772
- if (telemetryEnabled) Sentry.logger.info(message, { url: getUrl(), ...attributes });
773
- },
774
- warn: (message, attributes) => {
775
- if (telemetryEnabled) Sentry.logger.warn(message, { url: getUrl(), ...attributes });
776
- },
777
- error: (message, attributes) => {
778
- if (telemetryEnabled) Sentry.logger.error(message, { url: getUrl(), ...attributes });
779
- }
780
- };
781
-
782
- // src/utils/isConfigError.ts
783
- var isConfigError = (error) => {
784
- const name = error?.name;
785
- return name === "ConfigError";
786
- };
787
- var createConfigError = (adapterName) => {
788
- const error = new Error(`Missing required project ID for ${adapterName}`);
789
- error.name = "ConfigError";
790
- return error;
791
- };
792
-
793
- // src/contexts/EmailAuthContext.tsx
794
1057
  import { jsx as jsx17 } from "react/jsx-runtime";
795
1058
  var EmailAuthContext = createContext3(null);
796
1059
  var useEmailAuth = () => {
@@ -1050,7 +1313,7 @@ var WalletButtonLabel = ({ type }) => {
1050
1313
  };
1051
1314
 
1052
1315
  // src/components/WalletButton/WalletButton.tsx
1053
- import { WalletId as WalletId2 } from "@aurum-sdk/types";
1316
+ import { WalletId as WalletId3 } from "@aurum-sdk/types";
1054
1317
  import { jsx as jsx23, jsxs as jsxs8 } from "react/jsx-runtime";
1055
1318
  var WalletButton = ({
1056
1319
  wallet,
@@ -1071,7 +1334,7 @@ var WalletButton = ({
1071
1334
  /* @__PURE__ */ jsx23(WalletLogoWrapper, { id: wallet.id, size: iconSize, sizeSlot: "sm" }),
1072
1335
  /* @__PURE__ */ jsx23(Text, { weight: "semibold", size: "md", children: wallet.name })
1073
1336
  ] }),
1074
- wallet.id === WalletId2.WalletConnect && !isLastUsed ? /* @__PURE__ */ jsx23(QrCode, { color: "var(--color-foreground)", size: 18 }) : /* @__PURE__ */ jsx23(WalletButtonLabel, { type: label })
1337
+ wallet.id === WalletId3.WalletConnect && !isLastUsed ? /* @__PURE__ */ jsx23(QrCode, { color: "var(--color-foreground)", size: 18 }) : /* @__PURE__ */ jsx23(WalletButtonLabel, { type: label })
1075
1338
  ] })
1076
1339
  },
1077
1340
  wallet.id
@@ -1172,12 +1435,12 @@ var WalletListStacked = ({ wallets, hasEmailAuth }) => {
1172
1435
  };
1173
1436
 
1174
1437
  // src/components/ConnectModal/SelectWallet.tsx
1175
- import { WalletId as WalletId3 } from "@aurum-sdk/types";
1438
+ import { WalletId as WalletId4 } from "@aurum-sdk/types";
1176
1439
  import { Fragment as Fragment3, jsx as jsx26, jsxs as jsxs11 } from "react/jsx-runtime";
1177
1440
  var SelectWalletPage = () => {
1178
1441
  const { displayedWallets } = useConnectModal();
1179
1442
  const { onDismiss, brandConfig } = useWidgetContext();
1180
- const hasEmailAuth = displayedWallets.some((wallet) => wallet.id === WalletId3.Email);
1443
+ const hasEmailAuth = displayedWallets.some((wallet) => wallet.id === WalletId4.Email);
1181
1444
  const sortedWallets = useMemo3(() => sortWallets(displayedWallets), [displayedWallets]);
1182
1445
  const isGridLayout = brandConfig.walletLayout === "grid";
1183
1446
  return /* @__PURE__ */ jsxs11(Fragment3, { children: [
@@ -1385,7 +1648,7 @@ var ConnectionStatusBase = ({
1385
1648
  };
1386
1649
 
1387
1650
  // src/components/ConnectModal/ConnectionStatus/Desktop.tsx
1388
- import { WalletId as WalletId4 } from "@aurum-sdk/types";
1651
+ import { WalletId as WalletId5 } from "@aurum-sdk/types";
1389
1652
  import { jsx as jsx31 } from "react/jsx-runtime";
1390
1653
  var ConnectionStatusPage = () => {
1391
1654
  const { selectedWallet } = useConnectModal();
@@ -1393,7 +1656,7 @@ var ConnectionStatusPage = () => {
1393
1656
  ConnectionStatusBase,
1394
1657
  {
1395
1658
  pendingHeaderText: `Approve in ${selectedWallet?.name}`,
1396
- pendingSubContent: /* @__PURE__ */ jsx31(Text, { align: "center", size: "sm", variant: "secondary", children: selectedWallet?.id === WalletId4.Ledger ? `Please wait for the Ledger Live modal to open` : `Please check your wallet to
1659
+ pendingSubContent: /* @__PURE__ */ jsx31(Text, { align: "center", size: "sm", variant: "secondary", children: selectedWallet?.id === WalletId5.Ledger ? `Please wait for the Ledger Live modal to open` : `Please check your wallet to
1397
1660
  approve the connection` })
1398
1661
  }
1399
1662
  );
@@ -1432,13 +1695,13 @@ import { useRef as useRef4, useEffect as useEffect7 } from "react";
1432
1695
  import { QRCode } from "react-qrcode-logo";
1433
1696
 
1434
1697
  // src/utils/generateQrCodeWalletLogo.tsx
1435
- import { getLogoDataUri } from "@aurum-sdk/logos";
1436
- import { WalletId as WalletId5 } from "@aurum-sdk/types";
1698
+ import { getLogoDataUri as getLogoDataUri2 } from "@aurum-sdk/logos";
1699
+ import { WalletId as WalletId6 } from "@aurum-sdk/types";
1437
1700
  var generateQrCodeWalletLogo = (walletAdapter) => {
1438
- if (walletAdapter && walletAdapter.id !== WalletId5.AppKit && walletAdapter.icon) {
1701
+ if (walletAdapter && !(walletAdapter instanceof AppKitAdapter) && walletAdapter.icon) {
1439
1702
  return walletAdapter.icon;
1440
1703
  }
1441
- return getLogoDataUri(WalletId5.WalletConnect) ?? "";
1704
+ return getLogoDataUri2(WalletId6.WalletConnect) ?? "";
1442
1705
  };
1443
1706
 
1444
1707
  // src/components/QRCodeDisplay/QREye.tsx
@@ -1597,7 +1860,6 @@ var QRCodeSkeleton = ({ size = 128 }) => {
1597
1860
  };
1598
1861
 
1599
1862
  // src/components/QRCodeDisplay/QRCodeDisplay.tsx
1600
- import { WalletId as WalletId6 } from "@aurum-sdk/types";
1601
1863
  import { jsx as jsx36, jsxs as jsxs18 } from "react/jsx-runtime";
1602
1864
  var QRCodeDisplay = ({ uri, size = 256 }) => {
1603
1865
  const { brandConfig } = useWidgetContext();
@@ -1606,12 +1868,12 @@ var QRCodeDisplay = ({ uri, size = 256 }) => {
1606
1868
  const bgColor = brandConfig.theme === "light" ? "#ffffff" : "#121212";
1607
1869
  const logoWalletRef = useRef4(null);
1608
1870
  useEffect7(() => {
1609
- if (selectedWallet && selectedWallet.id !== WalletId6.AppKit) {
1871
+ if (selectedWallet && !(selectedWallet instanceof AppKitAdapter)) {
1610
1872
  logoWalletRef.current = selectedWallet;
1611
1873
  }
1612
1874
  }, [selectedWallet]);
1613
1875
  const logoWallet = logoWalletRef.current || selectedWallet;
1614
- const appKitAdapter = displayedWallets.find(({ id }) => id === WalletId6.AppKit);
1876
+ const appKitAdapter = displayedWallets.find((w) => w instanceof AppKitAdapter);
1615
1877
  const handleAppKitConnect = async () => {
1616
1878
  if (appKitAdapter) {
1617
1879
  connectWallet(appKitAdapter);
@@ -1663,7 +1925,7 @@ var QRCodeDisplay = ({ uri, size = 256 }) => {
1663
1925
 
1664
1926
  // src/components/ConnectModal/QRCodePage.tsx
1665
1927
  import { ChevronLeft as ChevronLeft2, X as X4, SquareArrowOutUpRight, CircleCheck as CircleCheck2 } from "lucide-react";
1666
- import { WalletId as WalletId7, WalletName } from "@aurum-sdk/types";
1928
+ import { WalletName as WalletName2 } from "@aurum-sdk/types";
1667
1929
  import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs19 } from "react/jsx-runtime";
1668
1930
  var QRCodePage = () => {
1669
1931
  const { onDismiss } = useWidgetContext();
@@ -1672,7 +1934,7 @@ var QRCodePage = () => {
1672
1934
  const [connectionUri, setConnectionUri] = useState10(null);
1673
1935
  const originalWalletRef = useRef5(null);
1674
1936
  useEffect8(() => {
1675
- if (selectedWallet && selectedWallet.id !== WalletId7.AppKit) {
1937
+ if (selectedWallet && !(selectedWallet instanceof AppKitAdapter)) {
1676
1938
  originalWalletRef.current = selectedWallet;
1677
1939
  }
1678
1940
  }, [selectedWallet]);
@@ -1680,7 +1942,7 @@ var QRCodePage = () => {
1680
1942
  const goBackToHome = () => {
1681
1943
  navigateTo(PAGE_IDS.SELECT_WALLET);
1682
1944
  };
1683
- const title = displayWallet?.name === WalletName.WalletConnect || displayWallet?.name === WalletName.AppKit ? "Scan QR code" : `Scan with ${displayWallet?.name} app`;
1945
+ const title = displayWallet?.name === WalletName2.WalletConnect ? "Scan QR code" : `Scan with ${displayWallet?.name} app`;
1684
1946
  useEffect8(() => {
1685
1947
  const handleWalletConnectURI = (event) => {
1686
1948
  setConnectionUri(event.detail.uri);
@@ -2160,8 +2422,198 @@ var registerGlobalCleanup = (cleanupFn) => {
2160
2422
  return cleanup;
2161
2423
  };
2162
2424
 
2425
+ // src/wallet-adapters/WalletConnectAdapter.ts
2426
+ import { getLogoDataUri as getLogoDataUri3 } from "@aurum-sdk/logos";
2427
+ import { WalletId as WalletId7, WalletName as WalletName3 } from "@aurum-sdk/types";
2428
+ var WalletConnectAdapter = class {
2429
+ constructor(config) {
2430
+ this.id = WalletId7.WalletConnect;
2431
+ this.name = WalletName3.WalletConnect;
2432
+ this.icon = getLogoDataUri3(WalletId7.WalletConnect, "brand") ?? "";
2433
+ this.hide = false;
2434
+ this.downloadUrl = null;
2435
+ this.wcDeepLinkUrl = null;
2436
+ this.provider = null;
2437
+ this.connectionUri = null;
2438
+ this.accountsChangedCallback = null;
2439
+ this.initPromise = null;
2440
+ this.config = {
2441
+ projectId: config.projectId,
2442
+ appName: config.appName
2443
+ };
2444
+ }
2445
+ async ensureInitialized() {
2446
+ if (this.provider) return;
2447
+ if (!this.initPromise) {
2448
+ this.initPromise = this.initializeProvider();
2449
+ }
2450
+ await this.initPromise;
2451
+ }
2452
+ async initializeProvider() {
2453
+ if (typeof window === "undefined") return;
2454
+ const { EthereumProvider } = await import("@walletconnect/ethereum-provider");
2455
+ this.provider = await EthereumProvider.init({
2456
+ projectId: this.config.projectId ?? "",
2457
+ optionalChains: [1],
2458
+ showQrModal: false,
2459
+ metadata: {
2460
+ name: this.config.appName,
2461
+ description: this.config.appName,
2462
+ url: window.location.origin,
2463
+ icons: []
2464
+ }
2465
+ });
2466
+ this.provider.on("display_uri", (uri) => {
2467
+ this.connectionUri = uri;
2468
+ if (typeof window !== "undefined") {
2469
+ window.dispatchEvent(new CustomEvent("walletconnect:uri", { detail: { uri } }));
2470
+ }
2471
+ });
2472
+ this.provider.on("connect", (session) => {
2473
+ if (typeof window !== "undefined") {
2474
+ window.dispatchEvent(new CustomEvent("walletconnect:connect", { detail: { session } }));
2475
+ }
2476
+ });
2477
+ this.provider.on("disconnect", () => {
2478
+ this.connectionUri = null;
2479
+ });
2480
+ this.provider.on("session_delete", () => {
2481
+ if (typeof window !== "undefined") {
2482
+ window.dispatchEvent(new CustomEvent("walletconnect:disconnect"));
2483
+ }
2484
+ });
2485
+ }
2486
+ isInstalled() {
2487
+ return true;
2488
+ }
2489
+ async connect() {
2490
+ if (!this.config.projectId) {
2491
+ throw createConfigError("WalletConnect");
2492
+ }
2493
+ try {
2494
+ await this.ensureInitialized();
2495
+ if (!this.provider) {
2496
+ sentryLogger.error("connect: WalletConnect is not available");
2497
+ throw new Error("WalletConnect is not available");
2498
+ }
2499
+ const accounts = await this.provider.enable();
2500
+ if (!accounts || accounts.length === 0 || !accounts[0]) {
2501
+ sentryLogger.error("connect: No accounts returned from WalletConnect");
2502
+ throw new Error("No accounts returned from WalletConnect");
2503
+ }
2504
+ return {
2505
+ address: accounts[0],
2506
+ provider: this.provider,
2507
+ walletId: this.id
2508
+ };
2509
+ } catch {
2510
+ this.connectionUri = null;
2511
+ throw new Error("Failed to connect to WalletConnect");
2512
+ }
2513
+ }
2514
+ getConnectionUri() {
2515
+ return this.connectionUri;
2516
+ }
2517
+ /**
2518
+ * Starts a WalletConnect session for headless/custom QR code flows.
2519
+ * Returns the URI immediately and a function to wait for the connection.
2520
+ */
2521
+ async startSession(timeout = 1e4) {
2522
+ if (!this.config.projectId) {
2523
+ throw new Error("WalletConnect projectId is required");
2524
+ }
2525
+ await this.ensureInitialized();
2526
+ if (!this.provider) {
2527
+ sentryLogger.error("startSession: WalletConnect is not available");
2528
+ throw new Error("WalletConnect is not available");
2529
+ }
2530
+ this.connectionUri = null;
2531
+ const uriPromise = new Promise((resolve, reject) => {
2532
+ const timeoutId = setTimeout(() => {
2533
+ reject(new Error("Timeout waiting for WalletConnect URI"));
2534
+ }, timeout);
2535
+ this.provider.once("display_uri", (uri2) => {
2536
+ clearTimeout(timeoutId);
2537
+ this.connectionUri = uri2;
2538
+ resolve(uri2);
2539
+ });
2540
+ });
2541
+ const connectionPromise = (async () => {
2542
+ const accounts = await this.provider.enable();
2543
+ if (!accounts || accounts.length === 0 || !accounts[0]) {
2544
+ sentryLogger.error("startSession: No accounts returned from WalletConnect");
2545
+ throw new Error("No accounts returned from WalletConnect");
2546
+ }
2547
+ return {
2548
+ address: accounts[0],
2549
+ provider: this.provider,
2550
+ walletId: this.id
2551
+ };
2552
+ })();
2553
+ const uri = await uriPromise;
2554
+ return {
2555
+ uri,
2556
+ waitForConnection: async () => {
2557
+ try {
2558
+ return await connectionPromise;
2559
+ } catch {
2560
+ this.connectionUri = null;
2561
+ throw new Error("Failed to connect via WalletConnect");
2562
+ }
2563
+ }
2564
+ };
2565
+ }
2566
+ async tryRestoreConnection() {
2567
+ try {
2568
+ await this.ensureInitialized();
2569
+ if (!this.provider) {
2570
+ return null;
2571
+ }
2572
+ const accounts = this.provider.accounts;
2573
+ if (!accounts || accounts.length === 0 || !accounts[0]) {
2574
+ return null;
2575
+ }
2576
+ return {
2577
+ address: accounts[0],
2578
+ provider: this.provider,
2579
+ walletId: this.id
2580
+ };
2581
+ } catch {
2582
+ return null;
2583
+ }
2584
+ }
2585
+ async disconnect() {
2586
+ try {
2587
+ if (this.provider) {
2588
+ await this.provider.disconnect();
2589
+ }
2590
+ } finally {
2591
+ this.connectionUri = null;
2592
+ this.provider = null;
2593
+ this.initPromise = null;
2594
+ }
2595
+ }
2596
+ getProvider() {
2597
+ return this.provider;
2598
+ }
2599
+ // Called by Aurum when user connects wallet
2600
+ // Passes Aurum.ts --> syncStateFromAccountsChanged() to handle the provider accounts changed event
2601
+ onAccountsChanged(callback) {
2602
+ if (!this.provider?.on) return;
2603
+ if (this.accountsChangedCallback) {
2604
+ this.provider.removeListener?.("accountsChanged", this.accountsChangedCallback);
2605
+ }
2606
+ this.accountsChangedCallback = callback;
2607
+ this.provider.on("accountsChanged", this.accountsChangedCallback);
2608
+ }
2609
+ removeListeners() {
2610
+ if (!this.provider?.removeListener || !this.accountsChangedCallback) return;
2611
+ this.provider.removeListener("accountsChanged", this.accountsChangedCallback);
2612
+ this.accountsChangedCallback = null;
2613
+ }
2614
+ };
2615
+
2163
2616
  // src/hooks/useConnectSelectedWallet.tsx
2164
- import { WalletId as WalletId8 } from "@aurum-sdk/types";
2165
2617
  var useConnectSelectedWallet = () => {
2166
2618
  const { navigateTo } = useNavigation();
2167
2619
  const connectInstalledWallet = async ({ adapter, onConnect, setSuccess }) => {
@@ -2181,7 +2633,7 @@ var useConnectSelectedWallet = () => {
2181
2633
  }
2182
2634
  };
2183
2635
  const connectUninstalledWalletQRCode = async ({ displayedWallets, onConnect, setSuccess }) => {
2184
- const walletConnectAdapter = displayedWallets?.find(({ id }) => id === WalletId8.WalletConnect);
2636
+ const walletConnectAdapter = displayedWallets?.find((w) => w instanceof WalletConnectAdapter);
2185
2637
  if (!walletConnectAdapter) {
2186
2638
  sentryLogger.error("connectUninstalledWalletQRCode: WalletConnect adapter not found");
2187
2639
  throw new Error("WalletConnect adapter not found");
@@ -2207,7 +2659,7 @@ var useConnectSelectedWallet = () => {
2207
2659
  onConnect,
2208
2660
  setSuccess
2209
2661
  }) => {
2210
- const walletConnectAdapter = displayedWallets?.find(({ id }) => id === WalletId8.WalletConnect);
2662
+ const walletConnectAdapter = displayedWallets?.find((w) => w instanceof WalletConnectAdapter);
2211
2663
  if (!walletConnectAdapter) {
2212
2664
  sentryLogger.error("connectWithMobileDeepLink: WalletConnect adapter not found");
2213
2665
  throw new Error("WalletConnect adapter not found");
@@ -2269,7 +2721,7 @@ var useConnectSelectedWallet = () => {
2269
2721
  };
2270
2722
 
2271
2723
  // src/contexts/ConnectModalContext.tsx
2272
- import { WalletId as WalletId9 } from "@aurum-sdk/types";
2724
+ import { WalletId as WalletId8 } from "@aurum-sdk/types";
2273
2725
  import { jsx as jsx43 } from "react/jsx-runtime";
2274
2726
  var ConnectModalContext = createContext4(null);
2275
2727
  var useConnectModal = () => {
@@ -2304,12 +2756,12 @@ var ConnectModalProvider = ({ children, displayedWallets, onConnect }) => {
2304
2756
  const isDesktop = !isOnMobile;
2305
2757
  const hasDeepLink = Boolean(wallet.wcDeepLinkUrl);
2306
2758
  if (isDesktop) {
2307
- if (wallet.id === WalletId9.AppKit)
2759
+ if (wallet instanceof AppKitAdapter)
2308
2760
  return await connectAppKit({ adapter: wallet, onConnect, setSuccess: setQrSuccess });
2309
2761
  if (!wallet.isInstalled() && !hasDeepLink) {
2310
2762
  return await redirectToDownloadPage();
2311
2763
  }
2312
- if (wallet.id === WalletId9.WalletConnect || !wallet.isInstalled())
2764
+ if (wallet.id === WalletId8.WalletConnect || !wallet.isInstalled())
2313
2765
  return await connectUninstalledWalletQRCode({
2314
2766
  adapter: wallet,
2315
2767
  displayedWallets,
@@ -2319,11 +2771,11 @@ var ConnectModalProvider = ({ children, displayedWallets, onConnect }) => {
2319
2771
  return await connectInstalledWallet({ adapter: wallet, onConnect, setSuccess });
2320
2772
  }
2321
2773
  if (isOnMobile) {
2322
- if (wallet.id === WalletId9.WalletConnect || wallet.id === WalletId9.AppKit) {
2323
- const appkitAdapter = displayedWallets?.find(({ id }) => id === WalletId9.AppKit);
2774
+ if (wallet.id === WalletId8.WalletConnect) {
2775
+ const appkitAdapter = displayedWallets?.find((w) => w instanceof AppKitAdapter);
2324
2776
  if (!appkitAdapter) {
2325
- sentryLogger.error("AppKit adapter not found");
2326
- throw new Error("AppKit adapter not found");
2777
+ sentryLogger.error("WalletConnect modal adapter not found");
2778
+ throw new Error("WalletConnect modal adapter not found");
2327
2779
  }
2328
2780
  return await connectAppKit({ adapter: appkitAdapter, onConnect, setSuccess: setQrSuccess });
2329
2781
  }
@@ -2431,9 +2883,11 @@ export {
2431
2883
  initSentry,
2432
2884
  sentryLogger,
2433
2885
  createConfigError,
2886
+ AppKitAdapter,
2434
2887
  isMobile,
2888
+ WalletConnectAdapter,
2435
2889
  ConnectUIProviders,
2436
2890
  ConnectPages,
2437
2891
  generateCompleteStyles
2438
2892
  };
2439
- //# sourceMappingURL=chunk-5NXCRO5Q.mjs.map
2893
+ //# sourceMappingURL=chunk-NRC534B3.mjs.map