@xrpl-wallet-kit/browser 0.1.3 → 0.1.4

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.
@@ -2121,7 +2121,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2121
2121
  nativeAsset: "XRP",
2122
2122
  nativeAssetDecimals: 6,
2123
2123
  rpcUrl: "wss://xrplcluster.com",
2124
- httpRpcUrl: "https://xrplcluster.com",
2124
+ httpRpcUrl: "https://xrpl.ws",
2125
2125
  walletConnectChainId: "xrpl:0",
2126
2126
  explorerTxUrl: "https://livenet.xrpl.org/transactions/{hash}",
2127
2127
  explorerAccountUrl: "https://livenet.xrpl.org/accounts/{address}"
@@ -2336,6 +2336,97 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2336
2336
  }
2337
2337
  };
2338
2338
  }
2339
+ const DEFAULT_MAX_TRANSACTIONS = 10;
2340
+ const DEFAULT_STALE_SUBMITTED_MS = 10 * 60 * 1e3;
2341
+ class WalletTransactionStore {
2342
+ constructor(options = {}) {
2343
+ this.max = Math.max(1, Math.floor(options.max ?? DEFAULT_MAX_TRANSACTIONS));
2344
+ this.staleSubmittedMs = Math.max(0, options.staleSubmittedMs ?? DEFAULT_STALE_SUBMITTED_MS);
2345
+ this.storage = options.storage ?? createBrowserWalletStorage("");
2346
+ this.now = options.now ?? Date.now;
2347
+ }
2348
+ async get(accountAddress, networkId) {
2349
+ const transactions2 = this.normalize(await this.readList(this.key(networkId, accountAddress)));
2350
+ const now = this.now();
2351
+ let changed = false;
2352
+ const normalized = transactions2.map((transaction2) => {
2353
+ if (transaction2.status === "submitted" && this.staleSubmittedMs > 0 && now - transaction2.submittedAt > this.staleSubmittedMs) {
2354
+ changed = true;
2355
+ return { ...transaction2, status: "unknown" };
2356
+ }
2357
+ return transaction2;
2358
+ });
2359
+ if (changed)
2360
+ await this.writeList(this.key(networkId, accountAddress), normalized);
2361
+ return normalized;
2362
+ }
2363
+ async add(accountAddress, networkId, transaction2) {
2364
+ const key = this.key(networkId, accountAddress);
2365
+ const current = await this.readList(key);
2366
+ const withoutDuplicate = current.filter((item) => item.hash !== transaction2.hash);
2367
+ const next = this.normalize([transaction2, ...withoutDuplicate]).slice(0, this.max);
2368
+ await this.writeList(key, next);
2369
+ await this.addIndex(accountAddress, networkId);
2370
+ }
2371
+ async clear(accountAddress, networkId) {
2372
+ if (networkId) {
2373
+ await this.storage.removeItem(this.key(networkId, accountAddress));
2374
+ return;
2375
+ }
2376
+ const index2 = await this.readIndex(accountAddress);
2377
+ await Promise.all(index2.map((id2) => this.storage.removeItem(this.key(id2, accountAddress))));
2378
+ await this.storage.removeItem(this.indexKey(accountAddress));
2379
+ }
2380
+ normalize(transactions2) {
2381
+ return transactions2.filter((transaction2) => typeof transaction2.hash === "string" && transaction2.hash.length > 0).sort((a2, b2) => this.timestamp(b2) - this.timestamp(a2));
2382
+ }
2383
+ timestamp(transaction2) {
2384
+ return transaction2.confirmedAt ?? transaction2.failedAt ?? transaction2.submittedAt ?? 0;
2385
+ }
2386
+ async readList(key) {
2387
+ try {
2388
+ const raw = await this.storage.getItem(key);
2389
+ if (!raw)
2390
+ return [];
2391
+ const parsed = JSON.parse(raw);
2392
+ return Array.isArray(parsed) ? parsed.filter(this.isStoredTransaction) : [];
2393
+ } catch {
2394
+ return [];
2395
+ }
2396
+ }
2397
+ async writeList(key, transactions2) {
2398
+ await this.storage.setItem(key, JSON.stringify(transactions2.slice(0, this.max)));
2399
+ }
2400
+ async addIndex(accountAddress, networkId) {
2401
+ const current = await this.readIndex(accountAddress);
2402
+ if (current.includes(networkId))
2403
+ return;
2404
+ await this.storage.setItem(this.indexKey(accountAddress), JSON.stringify([...current, networkId]));
2405
+ }
2406
+ async readIndex(accountAddress) {
2407
+ try {
2408
+ const raw = await this.storage.getItem(this.indexKey(accountAddress));
2409
+ if (!raw)
2410
+ return [];
2411
+ const parsed = JSON.parse(raw);
2412
+ return Array.isArray(parsed) ? parsed.filter((value) => typeof value === "string") : [];
2413
+ } catch {
2414
+ return [];
2415
+ }
2416
+ }
2417
+ isStoredTransaction(value) {
2418
+ if (!value || typeof value !== "object")
2419
+ return false;
2420
+ const transaction2 = value;
2421
+ return typeof transaction2.hash === "string" && typeof transaction2.status === "string" && typeof transaction2.submittedAt === "number";
2422
+ }
2423
+ key(networkId, accountAddress) {
2424
+ return `xwk_tx:${networkId}:${accountAddress}`;
2425
+ }
2426
+ indexKey(accountAddress) {
2427
+ return `xwk_tx_index:${accountAddress}`;
2428
+ }
2429
+ }
2339
2430
  const SESSION_KEY = "session";
2340
2431
  const WALLET_STORAGE_VERSION = 1;
2341
2432
  const RECOVER_SESSION_RETRY_DELAYS_MS = [0, 700, 1600, 3e3];
@@ -2359,6 +2450,13 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2359
2450
  this.networks = this.networkRegistry.list();
2360
2451
  this.storage = config.storage ?? new MemoryWalletStorage();
2361
2452
  this.logger = createWalletKitLogger(config.logger);
2453
+ if (config.persistTransactions) {
2454
+ const persistOptions = typeof config.persistTransactions === "object" ? config.persistTransactions : {};
2455
+ this.transactionStore = new WalletTransactionStore({
2456
+ ...persistOptions,
2457
+ storage: persistOptions.storage ?? this.storage
2458
+ });
2459
+ }
2362
2460
  (_a2 = config.adapters) == null ? void 0 : _a2.forEach((adapter) => this.register(adapter));
2363
2461
  }
2364
2462
  register(adapter) {
@@ -2451,6 +2549,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2451
2549
  }
2452
2550
  const enrichedSession2 = await this.enrichSession(this.withWalletMetadata(restored.session, adapter));
2453
2551
  this.setSession(enrichedSession2);
2552
+ await this.loadPersistedTransactions(enrichedSession2);
2454
2553
  this.emit("session_restored", { adapterId: enrichedSession2.adapterId, account: enrichedSession2.account, session: enrichedSession2 });
2455
2554
  this.emit("connected", { adapterId: enrichedSession2.adapterId, account: enrichedSession2.account, session: enrichedSession2 });
2456
2555
  return enrichedSession2;
@@ -2461,6 +2560,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2461
2560
  }
2462
2561
  const enrichedSession = await this.enrichSession(this.withWalletMetadata(session, adapter));
2463
2562
  this.setSession(enrichedSession);
2563
+ await this.loadPersistedTransactions(enrichedSession);
2464
2564
  this.emit("session_restored", { adapterId: enrichedSession.adapterId, account: enrichedSession.account, session: enrichedSession, stale: true });
2465
2565
  this.emit("connected", { adapterId: enrichedSession.adapterId, account: enrichedSession.account, session: enrichedSession });
2466
2566
  return enrichedSession;
@@ -2504,6 +2604,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2504
2604
  const enrichedSession = await this.enrichSession(this.withWalletMetadata(recovered.session, adapter));
2505
2605
  this.setSession(enrichedSession);
2506
2606
  await this.saveSession(enrichedSession);
2607
+ await this.loadPersistedTransactions(enrichedSession);
2507
2608
  this.emit("session_restored", { adapterId: enrichedSession.adapterId, account: enrichedSession.account, session: enrichedSession });
2508
2609
  this.emit("connected", { adapterId: enrichedSession.adapterId, account: enrichedSession.account, session: enrichedSession });
2509
2610
  return enrichedSession;
@@ -2544,6 +2645,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2544
2645
  const session = await this.enrichSession(this.withWalletMetadata(result.session ?? { adapterId, account: { ...result.account, network }, connectedAt: Date.now() }, adapter));
2545
2646
  this.setSession(session);
2546
2647
  await this.saveSession(session);
2648
+ await this.loadPersistedTransactions(session);
2547
2649
  this.emit("connected", { adapterId, account: session.account, session });
2548
2650
  return session;
2549
2651
  } catch (error) {
@@ -2601,6 +2703,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2601
2703
  } finally {
2602
2704
  this.activeAdapterId = null;
2603
2705
  this.activeSession = null;
2706
+ this.transactions.clear();
2604
2707
  await this.storage.removeItem(SESSION_KEY);
2605
2708
  this.emit("disconnected", { adapterId });
2606
2709
  }
@@ -2707,11 +2810,14 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2707
2810
  metadata: request.metadata ?? (existing == null ? void 0 : existing.metadata)
2708
2811
  };
2709
2812
  this.transactions.set(transaction2.hash, transaction2);
2813
+ void this.persistTransaction(transaction2).catch((error) => {
2814
+ this.logger.debug(`Transaction persistence failed for ${transaction2.hash}`, error);
2815
+ });
2710
2816
  if (status === "confirmed") {
2711
2817
  this.emit("tx_confirmed", { adapterId: transaction2.adapterId, account: transaction2.account, hash: transaction2.hash, result: transaction2.result, transaction: transaction2 });
2712
2818
  } else if (status === "failed") {
2713
2819
  this.emit("tx_failed", { adapterId: transaction2.adapterId, account: transaction2.account, hash: transaction2.hash, error: transaction2.error ?? new Error("Transaction failed"), transaction: transaction2 });
2714
- } else {
2820
+ } else if (status === "submitted") {
2715
2821
  this.emit("tx_submitted", { adapterId: transaction2.adapterId, account: transaction2.account, hash: transaction2.hash, transaction: transaction2 });
2716
2822
  this.confirmTransaction(transaction2);
2717
2823
  }
@@ -2751,6 +2857,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2751
2857
  }
2752
2858
  };
2753
2859
  void this.saveSession(this.activeSession);
2860
+ void this.loadPersistedTransactions(this.activeSession);
2754
2861
  }
2755
2862
  this.emit("accountChanged", { adapterId, account, previousAccount });
2756
2863
  }
@@ -2766,6 +2873,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2766
2873
  }
2767
2874
  };
2768
2875
  void this.saveSession(this.activeSession);
2876
+ void this.loadPersistedTransactions(this.activeSession);
2769
2877
  }
2770
2878
  this.emit("networkChanged", { adapterId, network, previousNetwork });
2771
2879
  }
@@ -2918,6 +3026,35 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
2918
3026
  raw: response
2919
3027
  };
2920
3028
  }
3029
+ async loadPersistedTransactions(session) {
3030
+ if (!this.transactionStore)
3031
+ return;
3032
+ const address = session.account.address;
3033
+ if (!address)
3034
+ return;
3035
+ const transactions2 = await this.transactionStore.get(address, this.transactionNetworkId(session.account));
3036
+ this.transactions.clear();
3037
+ transactions2.forEach((transaction2) => this.transactions.set(transaction2.hash, transaction2));
3038
+ transactions2.forEach((transaction2) => {
3039
+ if (transaction2.status === "submitted")
3040
+ this.confirmTransaction(transaction2);
3041
+ });
3042
+ }
3043
+ async persistTransaction(transaction2) {
3044
+ if (!this.transactionStore)
3045
+ return;
3046
+ const account = transaction2.account ?? this.getAccount() ?? void 0;
3047
+ if (!(account == null ? void 0 : account.address))
3048
+ return;
3049
+ await this.transactionStore.add(account.address, this.transactionNetworkId(account), {
3050
+ ...transaction2,
3051
+ account
3052
+ });
3053
+ }
3054
+ transactionNetworkId(account) {
3055
+ var _a2, _b;
3056
+ return ((_a2 = account == null ? void 0 : account.network) == null ? void 0 : _a2.id) ?? ((_b = account == null ? void 0 : account.network) == null ? void 0 : _b.networkType) ?? this.config.network ?? "mainnet";
3057
+ }
2921
3058
  async fetchJsonRpc(rpcUrl, body, signal, timeoutMs) {
2922
3059
  let timer;
2923
3060
  let timeoutController;
@@ -15422,13 +15559,15 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
15422
15559
  }
15423
15560
  }
15424
15561
  async restoreSession(session) {
15425
- var _a2;
15562
+ var _a2, _b;
15426
15563
  if (!this.sdk && this.options.apiKey) {
15427
15564
  this.sdk = new distExports.Xumm(this.options.apiKey);
15428
15565
  this.auth = this.sdk;
15429
15566
  }
15430
15567
  const state2 = await this.checkXamanState({ network: session.account.network });
15431
- const account = ((_a2 = state2 == null ? void 0 : state2.account) == null ? void 0 : _a2.address) ? { ...session.account, ...state2.account } : session.account;
15568
+ if (!((_a2 = state2 == null ? void 0 : state2.account) == null ? void 0 : _a2.address) || state2.account.address !== session.account.address)
15569
+ return null;
15570
+ const account = ((_b = state2 == null ? void 0 : state2.account) == null ? void 0 : _b.address) ? { ...session.account, ...state2.account } : session.account;
15432
15571
  return { account, session: { ...session, account }, raw: (state2 == null ? void 0 : state2.raw) ?? null };
15433
15572
  }
15434
15573
  async canRecoverSession() {
@@ -16144,6 +16283,8 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16144
16283
  variant: connectButton.variant,
16145
16284
  copyAddress: accountPanel.copyAddress,
16146
16285
  showAddressQr: accountPanel.showAddressQr,
16286
+ showRecentTransactions: accountPanel.showRecentTransactions,
16287
+ maxVisibleTransactions: accountPanel.maxVisibleTransactions,
16147
16288
  disconnect: accountPanel.disconnect,
16148
16289
  explorer: accountPanel.explorer,
16149
16290
  showWeb3Name: identity2.enabled ?? true,
@@ -16164,6 +16305,8 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
16164
16305
  showAdapterIcon: true,
16165
16306
  showChevron: true,
16166
16307
  showBalance: false,
16308
+ showRecentTransactions: false,
16309
+ maxVisibleTransactions: 5,
16167
16310
  fallbackToAddress: true,
16168
16311
  copyAddress: true,
16169
16312
  explorer: false,
@@ -20680,6 +20823,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20680
20823
  this.balanceRefreshTimers = /* @__PURE__ */ new Set();
20681
20824
  this.panelOpen = false;
20682
20825
  this.addressQrOpen = false;
20826
+ this.txSectionOpen = true;
20683
20827
  this.panelScrollLocked = false;
20684
20828
  this.connecting = false;
20685
20829
  this.copied = false;
@@ -20700,6 +20844,8 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20700
20844
  fallbackToAddress: true,
20701
20845
  copyAddress: true,
20702
20846
  showAddressQr: true,
20847
+ showRecentTransactions: false,
20848
+ maxVisibleTransactions: 5,
20703
20849
  explorer: false,
20704
20850
  disconnect: true,
20705
20851
  accountPanel: true,
@@ -20757,10 +20903,15 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20757
20903
  }));
20758
20904
  this.offEvents.push(options.manager.on("tx_submitted", () => {
20759
20905
  this.scheduleBalanceRefresh([1600, 4e3]);
20906
+ this.render();
20760
20907
  }));
20761
20908
  this.offEvents.push(options.manager.on("tx_confirmed", () => {
20762
20909
  this.clearBalanceRefreshTimers();
20763
20910
  void this.resolveBalance(options.manager.getSession());
20911
+ this.render();
20912
+ }));
20913
+ this.offEvents.push(options.manager.on("tx_failed", () => {
20914
+ this.render();
20764
20915
  }));
20765
20916
  this.offEvents.push(options.manager.on("accountChanged", () => {
20766
20917
  this.clearBalanceRefreshTimers();
@@ -20877,6 +21028,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20877
21028
  if (event.target instanceof Node && ((_a2 = this.accountPanelPortal) == null ? void 0 : _a2.contains(event.target)))
20878
21029
  return;
20879
21030
  this.panelOpen = false;
21031
+ this.addressQrOpen = false;
20880
21032
  this.render();
20881
21033
  }
20882
21034
  handleDocumentKeyDown(event) {
@@ -20884,6 +21036,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20884
21036
  return;
20885
21037
  if (event.key === "Escape") {
20886
21038
  this.panelOpen = false;
21039
+ this.addressQrOpen = false;
20887
21040
  this.render();
20888
21041
  return;
20889
21042
  }
@@ -20944,7 +21097,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20944
21097
  this.accountPanelPortal = void 0;
20945
21098
  }
20946
21099
  bindPanelActions(root) {
20947
- var _a2, _b, _c, _d, _e2, _f;
21100
+ var _a2, _b, _c, _d, _e2, _f, _g;
20948
21101
  (_a2 = root.querySelector("[data-xwk-account-close]")) == null ? void 0 : _a2.addEventListener("click", () => this.closePanel());
20949
21102
  (_b = root.querySelector("[data-xwk-account-back]")) == null ? void 0 : _b.addEventListener("click", (event) => {
20950
21103
  event.stopPropagation();
@@ -20962,7 +21115,12 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
20962
21115
  event.stopPropagation();
20963
21116
  this.openAddressQr();
20964
21117
  });
20965
- (_f = root.querySelector("[data-xwk-disconnect]")) == null ? void 0 : _f.addEventListener("click", () => void this.disconnect());
21118
+ (_f = root.querySelector("[data-xwk-tx-toggle]")) == null ? void 0 : _f.addEventListener("click", (event) => {
21119
+ event.stopPropagation();
21120
+ this.txSectionOpen = !this.txSectionOpen;
21121
+ this.render();
21122
+ });
21123
+ (_g = root.querySelector("[data-xwk-disconnect]")) == null ? void 0 : _g.addEventListener("click", () => void this.disconnect());
20966
21124
  }
20967
21125
  openAddressQr() {
20968
21126
  if (!this.options.manager.getSession())
@@ -21195,8 +21353,9 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21195
21353
  const label = this.connecting ? messages.connecting : session ? this.getAccountLabel(session) : this.options.label;
21196
21354
  const balance = session && this.options.showBalance && this.balanceLoading ? `<span class="xwk-button-balance xwk-button-balance-loading">${this.balanceSpinnerIcon()}</span>` : session && this.options.showBalance && this.activationStatus === "unfunded" ? `<span class="xwk-button-balance">(${this.escapeHtml(messages.notActivated)})</span>` : session && this.options.showBalance && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<span class="xwk-button-balance">(${this.escapeHtml(this.balance.formatted)})</span>` : "";
21197
21355
  const icon = this.options.showAdapterIcon ? this.renderWalletIcon(connected ? session == null ? void 0 : session.wallet : void 0) : "";
21356
+ const pendingDot = connected && this.options.showRecentTransactions && this.getPendingTransactionCount() > 0 ? `<span class="xwk-button-pending-dot" aria-hidden="true"></span>` : "";
21198
21357
  const chevron = connected && this.options.showChevron && this.options.accountPanel ? `<span class="xwk-button-chevron" aria-hidden="true">${this.chevronIcon()}</span>` : "";
21199
- return `<button class="xwk-account-button" data-xwk-wallet-button type="button">${icon}<span class="xwk-button-label">${this.escapeHtml(label)}${balance}</span>${chevron}</button>`;
21358
+ return `<button class="xwk-account-button" data-xwk-wallet-button type="button">${icon}${pendingDot}<span class="xwk-button-label">${this.escapeHtml(label)}${balance}</span>${chevron}</button>`;
21200
21359
  }
21201
21360
  renderPanel() {
21202
21361
  const messages = this.messages();
@@ -21205,11 +21364,13 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21205
21364
  return "";
21206
21365
  const content = this.addressQrOpen ? this.renderAddressQrPanelContent(session) : this.renderPanelContent(session);
21207
21366
  const title = this.addressQrOpen ? messages.addressQr : messages.connected;
21367
+ const hasTransactions = !this.addressQrOpen && this.options.showRecentTransactions && this.getVisibleTransactions(session).length > 0;
21368
+ const panelStateClass = `${this.addressQrOpen ? " xwk-account-panel-address-qr" : ""}${hasTransactions ? " xwk-account-panel-with-transactions" : ""}`;
21208
21369
  const leading = this.addressQrOpen ? `<button class="xwk-account-back" type="button" data-xwk-account-back aria-label="${this.escapeHtml(messages.back)}">${this.backIcon()}</button>` : `<span></span>`;
21209
21370
  if (this.options.accountPanelMode === "modal") {
21210
- return `<div class="xwk-account-overlay" data-xwk-account-overlay role="presentation"><section class="xwk-account-panel xwk-account-panel-modal${this.addressQrOpen ? " xwk-account-panel-address-qr" : ""}" role="dialog" aria-modal="true" aria-label="${this.escapeHtml(title)}" tabindex="-1"><div class="xwk-account-modal-header">${leading}<h2>${this.escapeHtml(title)}</h2><button class="xwk-account-close" type="button" data-xwk-account-close aria-label="${this.escapeHtml(messages.close)}">&times;</button></div><div class="xwk-account-modal-body">${content}</div></section></div>`;
21371
+ return `<div class="xwk-account-overlay" data-xwk-account-overlay role="presentation"><section class="xwk-account-panel xwk-account-panel-modal${panelStateClass}" role="dialog" aria-modal="true" aria-label="${this.escapeHtml(title)}" tabindex="-1"><div class="xwk-account-modal-header">${leading}<h2>${this.escapeHtml(title)}</h2><button class="xwk-account-close" type="button" data-xwk-account-close aria-label="${this.escapeHtml(messages.close)}">&times;</button></div><div class="xwk-account-modal-body">${content}</div></section></div>`;
21211
21372
  }
21212
- return `<div class="xwk-account-panel xwk-account-panel-dropdown${this.addressQrOpen ? " xwk-account-panel-address-qr" : ""}" role="dialog" aria-label="${this.escapeHtml(title)}">${content}</div>`;
21373
+ return `<div class="xwk-account-panel xwk-account-panel-dropdown${panelStateClass}" role="dialog" aria-label="${this.escapeHtml(title)}">${content}</div>`;
21213
21374
  }
21214
21375
  renderPanelContent(session) {
21215
21376
  var _a2;
@@ -21226,12 +21387,14 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21226
21387
  const nativeAsset = getNativeAsset(session.account.network);
21227
21388
  const notActivated = this.options.showBalance && this.activationStatus === "unfunded" ? `<div class="xwk-account-warning">${this.escapeHtml(messages.accountNotActivated(nativeAsset))}</div>` : "";
21228
21389
  const balance = this.options.showBalance && this.balanceLoading ? `<div class="xwk-account-balance xwk-account-balance-loading">${this.balanceSpinnerIcon()}<span>${this.escapeHtml(messages.connecting)}</span></div>` : this.options.showBalance && this.activationStatus !== "unfunded" && ((_a2 = this.balance) == null ? void 0 : _a2.formatted) ? `<div class="xwk-account-balance">${this.escapeHtml(this.balance.formatted)}</div>` : "";
21390
+ const metaRow = balance ? `<div class="xwk-account-meta-row">${balance}</div>` : "";
21229
21391
  const addressQrButton = this.renderAddressQrButton(address);
21230
21392
  const hasIdentity = this.shouldShowWeb3Name() && this.identityName;
21231
21393
  const addressLabel = hasIdentity && address ? `<div class="xwk-account-address">${this.escapeHtml(this.formatAddress(address))}${addressQrButton}</div>` : "";
21232
21394
  const actions = `<div class="xwk-account-panel-actions">${copy}${explorer}${disconnect}</div>`;
21233
21395
  const accountName = !hasIdentity && addressQrButton && this.options.fallbackToAddress ? `<div class="xwk-account-name xwk-account-name-with-qr xwk-account-name-address"><span>${this.escapeHtml(label)}</span>${addressQrButton}</div>` : `<div class="xwk-account-name">${this.escapeHtml(label)}</div>`;
21234
- return `<div class="xwk-account-hero">${this.renderAccountAvatar(session)}</div>${accountName}${addressLabel}${balance}${notActivated}${actions}`;
21396
+ const transactions2 = this.renderTransactionHistory(session);
21397
+ return `<div class="xwk-account-hero">${this.renderAccountAvatar(session)}</div>${accountName}${addressLabel}${metaRow}${notActivated}${transactions2}${actions}`;
21235
21398
  }
21236
21399
  renderAddressQrPanelContent(session) {
21237
21400
  const messages = this.messages();
@@ -21248,6 +21411,94 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21248
21411
  const messages = this.messages();
21249
21412
  return `<button class="xwk-address-qr-trigger" type="button" data-xwk-address-qr aria-label="${this.escapeHtml(messages.showAddressQr)}" title="${this.escapeHtml(messages.showAddressQr)}">${this.qrIcon()}</button>`;
21250
21413
  }
21414
+ renderTransactionHistory(session) {
21415
+ if (!this.options.showRecentTransactions)
21416
+ return "";
21417
+ const transactions2 = this.getVisibleTransactions(session);
21418
+ if (!transactions2.length)
21419
+ return "";
21420
+ const messages = this.messages();
21421
+ const count = transactions2.length > 9 ? "9+" : String(transactions2.length);
21422
+ const chevronClass = this.txSectionOpen ? "open" : "closed";
21423
+ const list = this.txSectionOpen ? `<div class="xwk-tx-list" role="list">${transactions2.map((transaction2) => this.renderTransactionRow(transaction2)).join("")}</div>` : "";
21424
+ return `<section class="xwk-tx-section" aria-label="${this.escapeHtml(messages.recentTransactions)}"><button class="xwk-tx-header" type="button" data-xwk-tx-toggle aria-expanded="${this.txSectionOpen ? "true" : "false"}"><span>${this.escapeHtml(messages.recentTransactions)}</span><span class="xwk-tx-count">${this.escapeHtml(count)}</span><span class="xwk-tx-chevron ${chevronClass}" aria-hidden="true">${this.chevronUpIcon()}</span></button>${list}</section>`;
21425
+ }
21426
+ renderTransactionRow(transaction2) {
21427
+ const messages = this.messages();
21428
+ const label = this.transactionStatusLabel(transaction2);
21429
+ const explorerUrl = this.getTransactionExplorerUrl(transaction2);
21430
+ const link = explorerUrl ? `<a class="xwk-tx-link" href="${this.escapeHtml(explorerUrl)}" target="_blank" rel="noreferrer">${this.escapeHtml(messages.view)}${this.externalIcon()}</a>` : "";
21431
+ return `<div class="xwk-tx-row xwk-tx-row-${this.escapeHtml(transaction2.status)}" role="listitem"><span class="xwk-tx-status" aria-hidden="true">${this.transactionStatusIcon(transaction2.status)}</span><div class="xwk-tx-main"><span class="xwk-tx-label">${this.escapeHtml(label)}</span><span class="xwk-tx-hash">${this.escapeHtml(this.formatHash(transaction2.hash))} &middot; ${this.escapeHtml(this.formatRelativeTime(transaction2))}</span></div>${link}</div>`;
21432
+ }
21433
+ transactionStatusLabel(transaction2) {
21434
+ const messages = this.messages();
21435
+ if (transaction2.status === "confirmed")
21436
+ return messages.transactionConfirmed;
21437
+ if (transaction2.status === "failed")
21438
+ return messages.transactionFailed;
21439
+ if (transaction2.status === "unknown")
21440
+ return messages.transactionUnknown;
21441
+ return messages.transactionSubmitted;
21442
+ }
21443
+ transactionStatusIcon(status) {
21444
+ if (status === "confirmed")
21445
+ return this.checkIcon();
21446
+ if (status === "failed")
21447
+ return this.closeIcon();
21448
+ if (status === "unknown")
21449
+ return this.questionIcon();
21450
+ return `<span class="xwk-tx-spinner" aria-hidden="true"></span>`;
21451
+ }
21452
+ getVisibleTransactions(session) {
21453
+ const address = this.getSessionAddress(session);
21454
+ const max = Math.max(1, Math.floor(this.options.maxVisibleTransactions));
21455
+ return this.getRecentTransactions(session).filter((transaction2) => {
21456
+ var _a2;
21457
+ return !address || !((_a2 = transaction2.account) == null ? void 0 : _a2.address) || transaction2.account.address === address;
21458
+ }).slice(0, max);
21459
+ }
21460
+ getRecentTransactions(session) {
21461
+ var _a2, _b, _c;
21462
+ const transactions2 = ((_b = (_a2 = this.options.manager).getTransactions) == null ? void 0 : _b.call(_a2)) ?? [];
21463
+ const networkId = (_c = session == null ? void 0 : session.account.network) == null ? void 0 : _c.id;
21464
+ return [...transactions2].sort((a2, b2) => this.transactionTimestamp(b2) - this.transactionTimestamp(a2)).filter((transaction2) => {
21465
+ var _a3, _b2;
21466
+ return !networkId || !((_b2 = (_a3 = transaction2.account) == null ? void 0 : _a3.network) == null ? void 0 : _b2.id) || transaction2.account.network.id === networkId;
21467
+ });
21468
+ }
21469
+ getPendingTransactionCount() {
21470
+ return this.getRecentTransactions(this.options.manager.getSession()).filter((transaction2) => transaction2.status === "submitted").length;
21471
+ }
21472
+ transactionTimestamp(transaction2) {
21473
+ return transaction2.confirmedAt ?? transaction2.failedAt ?? transaction2.submittedAt ?? 0;
21474
+ }
21475
+ getTransactionExplorerUrl(transaction2) {
21476
+ var _a2, _b, _c, _d;
21477
+ const custom = (_c = (_b = this.options).transactionExplorerUrl) == null ? void 0 : _c.call(_b, transaction2.hash, (_a2 = transaction2.account) == null ? void 0 : _a2.network);
21478
+ if (custom)
21479
+ return custom;
21480
+ return getExplorerTxUrl((_d = transaction2.account) == null ? void 0 : _d.network, transaction2.hash);
21481
+ }
21482
+ formatHash(hash2) {
21483
+ return hash2.length > 12 ? `${hash2.slice(0, 6)}...${hash2.slice(-6)}` : hash2;
21484
+ }
21485
+ formatRelativeTime(transaction2) {
21486
+ const timestamp = this.transactionTimestamp(transaction2);
21487
+ if (!timestamp)
21488
+ return "";
21489
+ const seconds = Math.max(0, Math.floor((Date.now() - timestamp) / 1e3));
21490
+ if (seconds < 60)
21491
+ return "just now";
21492
+ const minutes = Math.floor(seconds / 60);
21493
+ if (minutes < 60)
21494
+ return `${minutes} min ago`;
21495
+ const hours = Math.floor(minutes / 60);
21496
+ if (hours < 24)
21497
+ return `${hours} hr ago`;
21498
+ if (hours < 48)
21499
+ return "yesterday";
21500
+ return `${Math.floor(hours / 24)} days ago`;
21501
+ }
21251
21502
  getAccountLabel(session) {
21252
21503
  var _a2, _b;
21253
21504
  if (this.shouldShowWeb3Name() && this.identityName)
@@ -21417,6 +21668,18 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21417
21668
  chevronIcon() {
21418
21669
  return `<svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="m6 9 6 6 6-6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
21419
21670
  }
21671
+ chevronUpIcon() {
21672
+ return `<svg width="14" height="14" viewBox="0 0 24 24" fill="none"><path d="m18 15-6-6-6 6" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
21673
+ }
21674
+ checkIcon() {
21675
+ return `<svg width="15" height="15" viewBox="0 0 24 24" fill="none"><path d="m5 12.5 4.2 4.2L19 7" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
21676
+ }
21677
+ closeIcon() {
21678
+ return `<svg width="15" height="15" viewBox="0 0 24 24" fill="none"><path d="m7 7 10 10M17 7 7 17" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg>`;
21679
+ }
21680
+ questionIcon() {
21681
+ return `<svg width="15" height="15" viewBox="0 0 24 24" fill="none"><path d="M9.7 9a2.4 2.4 0 1 1 3.8 2c-.9.6-1.5 1.1-1.5 2.4" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/><path d="M12 17h.01" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg>`;
21682
+ }
21420
21683
  copyIcon() {
21421
21684
  return `<svg width="17" height="17" viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="8" y="8" width="11" height="11" rx="2" stroke="currentColor" stroke-width="2"/><path d="M5 15H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>`;
21422
21685
  }
@@ -21452,7 +21715,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21452
21715
  const fallbackIconBackground = theme.fallbackIconBackground;
21453
21716
  const fallbackIconColor = theme.fallbackIconColor;
21454
21717
  const overlayBlur = theme.overlayBlur > 0 ? `blur(${theme.overlayBlur}px)` : "none";
21455
- return `.xwk-button-root{display:inline-block;max-width:100%;position:relative;font-family:${theme.fontFamily};font-size:14px}.xwk-account-button{align-items:center;background:${background};border:1px solid ${border};border-radius:${radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;gap:8px;font:inherit;font-weight:560;max-width:100%;min-height:${height};overflow:hidden;padding:0 12px 0 10px;touch-action:manipulation;transition:background-color .16s ease,border-color .16s ease;white-space:nowrap;-webkit-tap-highlight-color:transparent;transform:none}.xwk-account-button:hover{background:${hoverBackground};box-shadow:none;opacity:1;transform:none}.xwk-account-button:active{background:${hoverBackground};opacity:1;transform:none}.xwk-account-button:focus-visible,.xwk-button-chevron:focus-visible,.xwk-account-panel-actions button:focus-visible,.xwk-account-panel-actions a:focus-visible,.xwk-address-qr-trigger:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px;text-decoration:none}.xwk-button-icon{background:${theme.background};border:1px solid ${iconBorder};border-radius:10px;box-sizing:border-box;display:inline-flex;flex:0 0 28px;height:28px;isolation:isolate;line-height:0;max-width:28px;min-width:28px;object-fit:contain;overflow:hidden;position:relative;width:28px}.xwk-button-icon-fallback{align-items:center;background:${fallbackIconBackground};color:${fallbackIconColor};justify-content:center}.xwk-button-icon-initial{font-size:12px;line-height:1}.xwk-button-icon-svg-fallback{font-size:0}.xwk-button-icon-svg-fallback svg{display:block;flex:0 0 17px;height:17px;max-height:17px;max-width:17px;min-height:17px;min-width:17px;width:17px}.xwk-button-label{display:inline-block;flex:1 1 0;font-size:13px;font-weight:560;line-height:1.1;max-width:220px;min-width:0;overflow:hidden;padding-right:2px;text-overflow:ellipsis;white-space:nowrap}.xwk-button-balance{color:${theme.muted};font-weight:500;margin-left:4px}.xwk-button-balance-loading{display:inline-flex;vertical-align:-2px}.xwk-balance-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;flex:0 0 13px;height:13px;width:13px}.xwk-button-chevron{align-items:center;background:${theme.background};border:1px solid ${iconBorder};border-radius:999px;color:${theme.muted};display:inline-flex;flex:0 0 26px;height:26px;justify-content:center;line-height:1;touch-action:manipulation;width:26px}.xwk-button-chevron:hover{background:${theme.surfaceHover};color:${theme.foreground}}.xwk-account-overlay{align-items:center;background:${theme.overlay};-webkit-backdrop-filter:${overlayBlur};backdrop-filter:${overlayBlur};display:flex;inset:0;justify-content:center;overscroll-behavior:contain;padding:max(24px,env(safe-area-inset-top)) max(24px,env(safe-area-inset-right)) max(24px,env(safe-area-inset-bottom)) max(24px,env(safe-area-inset-left));position:fixed;z-index:2147483647}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay{animation:xwk-account-overlay-in .18s ease-out}.xwk-account-panel{background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:${theme.shadow};box-sizing:border-box;color:${theme.foreground};display:grid;gap:12px;overflow:hidden;z-index:2147483647}.xwk-account-panel:focus{outline:none}.xwk-account-panel-dropdown{box-shadow:none;justify-items:center;margin-top:10px;min-width:320px;padding:18px;position:absolute;right:0;top:100%;width:min(360px,calc(100vw - 32px))}.xwk-account-panel-modal{gap:0;grid-template-rows:auto minmax(0,1fr);height:min(527px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));max-width:520px;position:relative;transform-origin:center bottom;width:min(520px,100%)}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-panel-in .22s cubic-bezier(.22,1,.36,1)}.xwk-account-modal-header{align-items:center;background:${theme.headerBackground};border-bottom:1px solid ${theme.border};display:grid;grid-template-columns:44px minmax(0,1fr) 44px;column-gap:8px;padding:8px 18px}.xwk-account-modal-header h2{color:${theme.foreground};font-size:16px;font-weight:500;line-height:1.2;margin:0;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-modal-body{-webkit-overflow-scrolling:touch;display:grid;gap:12px;justify-items:center;min-height:0;overflow:auto;overscroll-behavior:contain;padding:22px 28px 28px}.xwk-account-close,.xwk-account-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent!important;border:0!important;border-radius:999px;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:inline-flex;font:inherit;font-size:26px;font-weight:500;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none!important;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-account-back{font-size:0;justify-self:start}.xwk-account-close{justify-self:end}.xwk-account-close:hover,.xwk-account-back:hover{background:${theme.surfaceHover}!important;box-shadow:none!important;color:${theme.foreground};transform:none}.xwk-account-close:focus-visible,.xwk-account-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}.xwk-account-hero{height:154px;margin-top:4px;position:relative;width:180px}.xwk-account-panel-dropdown .xwk-account-hero{height:132px;width:160px}.xwk-account-art,.xwk-account-avatar{border-radius:999px;height:118px;left:31px;position:absolute;top:8px;width:118px}.xwk-account-panel-dropdown .xwk-account-art,.xwk-account-panel-dropdown .xwk-account-avatar{height:104px;left:28px;width:104px}.xwk-account-art{align-items:center;background:radial-gradient(circle at 58% 38%,var(--xwk-avatar-spot),transparent 0 22%,transparent 23%),linear-gradient(160deg,var(--xwk-avatar-from),var(--xwk-avatar-to));display:flex;justify-content:center}.xwk-account-art span{background:rgba(255,255,255,.18);border-radius:999px;height:50px;width:50px}.xwk-account-panel-dropdown .xwk-account-art span{height:42px;width:42px}.xwk-account-avatar{background:${theme.surface};border:1px solid ${iconBorder};box-sizing:border-box;display:block;object-fit:cover;overflow:hidden}.xwk-account-name{color:${theme.foreground};font-size:21px;font-weight:650;line-height:1.2;max-width:100%;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-dropdown .xwk-account-name{font-size:18px}.xwk-account-name-with-qr,.xwk-account-address{align-items:center;display:inline-flex;gap:6px;justify-content:center}.xwk-account-name-with-qr span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-name-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;color:${theme.muted};font-size:16px;font-weight:600;line-height:1.2;max-width:min(260px,100%);padding:7px 6px 7px 14px}.xwk-account-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;color:${theme.muted};font-size:14px;font-weight:520;line-height:1.25;max-width:100%;overflow:hidden;padding:8px 8px 8px 12px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-address-qr-trigger{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:0;border-radius:10px;box-shadow:none;color:currentColor;cursor:pointer;display:inline-flex;flex:0 0 34px;height:34px;justify-content:center;margin:-4px -3px -4px 0;min-height:0;outline:none;overflow:visible;padding:0;touch-action:manipulation;transform:none;width:34px}.xwk-address-qr-trigger svg{display:block;height:17px;overflow:visible;width:17px}.xwk-address-qr-trigger:hover{background:${theme.surfaceHover};box-shadow:none;transform:none}.xwk-account-balance{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:13px;font-weight:560;height:42px;justify-content:center;letter-spacing:0;line-height:1;padding:0 14px;text-align:center}.xwk-account-balance-loading{align-items:center;display:inline-flex;gap:6px}.xwk-account-warning{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:12px;box-sizing:border-box;color:${theme.muted};display:flex;font-size:13px;font-weight:520;justify-content:center;line-height:1.25;min-height:54px;padding:0 14px;text-align:center;width:100%}.xwk-address-qr-content{align-content:center;display:grid;gap:14px;justify-items:center;min-height:100%;width:100%}.xwk-address-qr-code{aspect-ratio:1/1;background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;box-sizing:border-box;display:grid;max-width:304px;padding:12px;place-items:center;width:min(304px,100%)}.xwk-address-qr-code svg,.xwk-address-qr-code canvas,.xwk-address-qr-code img{aspect-ratio:1/1;display:block;height:auto;max-width:100%;width:100%}.xwk-address-qr-chip{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;box-sizing:border-box;color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;font-weight:520;line-height:1.45;max-width:100%;overflow-wrap:anywhere;padding:9px 11px;text-align:center;width:100%}.xwk-address-qr-fallback{color:${theme.muted};font-size:12px;line-height:1.45;overflow-wrap:anywhere}.xwk-account-panel-actions{display:grid;gap:10px;grid-template-columns:1fr;width:100%}.xwk-account-modal-body .xwk-account-panel-actions{margin-top:auto}.xwk-account-panel-actions button,.xwk-account-panel-actions a{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:flex;font:inherit;font-size:14px;font-weight:560;gap:8px;justify-content:center;line-height:1.2;min-height:46px;min-width:0;outline:none;overflow:hidden;padding:0 12px;text-decoration:none;touch-action:manipulation;transform:none;transition:background-color .16s ease,border-color .16s ease;width:100%}.xwk-account-panel-actions button:disabled{cursor:wait;opacity:1}.xwk-account-panel-actions svg{flex:0 0 auto;opacity:.58}.xwk-account-panel-actions span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-actions button:hover,.xwk-account-panel-actions a:hover{background:${theme.surfaceHover};border-color:${actionBorder};box-shadow:none;text-decoration:none;transform:none}.xwk-account-panel-actions button:active,.xwk-account-panel-actions a:active{background:${theme.surfaceHover};opacity:1;text-decoration:none;transform:none}.xwk-copied-icon{color:${theme.success};opacity:1!important}.xwk-action-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;height:17px;width:17px}@keyframes xwk-action-spin{to{transform:rotate(360deg)}}@keyframes xwk-account-overlay-in{from{opacity:0}to{opacity:1}}@keyframes xwk-account-panel-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.xwk-account-button,.xwk-account-panel-actions button,.xwk-account-panel-actions a{transition:none}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay,.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation-duration:1ms!important}.xwk-action-spinner,.xwk-balance-spinner{animation:none}}@media(max-width:520px){.xwk-account-panel-dropdown{bottom:0;left:0;margin-top:0;min-width:0;position:fixed;right:0;top:auto;width:100vw}.xwk-account-overlay{align-items:flex-end;padding:max(12px,env(safe-area-inset-top)) 0 0}.xwk-account-panel-modal{align-self:flex-end;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-left:0;border-right:0;border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};height:min(527px,calc(100dvh - env(safe-area-inset-top)));max-width:none;width:100vw}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-sheet-in .28s cubic-bezier(.32,.72,0,1)}.xwk-account-modal-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};grid-template-columns:44px minmax(0,1fr) 44px;padding:10px 16px}.xwk-account-modal-body{min-height:0;padding:18px 20px max(22px,calc(22px + env(safe-area-inset-bottom)))}.xwk-button-label{max-width:min(150px,calc(100vw - 140px))}}@keyframes xwk-account-sheet-in{from{opacity:1;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}`;
21718
+ return `.xwk-button-root{display:inline-block;max-width:100%;position:relative;font-family:${theme.fontFamily};font-size:14px}.xwk-account-button{align-items:center;background:${background};border:1px solid ${border};border-radius:${radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;gap:8px;font:inherit;font-weight:560;max-width:100%;min-height:${height};overflow:hidden;padding:0 12px 0 10px;touch-action:manipulation;transition:background-color .16s ease,border-color .16s ease;white-space:nowrap;-webkit-tap-highlight-color:transparent;transform:none}.xwk-account-button:hover{background:${hoverBackground};box-shadow:none;opacity:1;transform:none}.xwk-account-button:active{background:${hoverBackground};opacity:1;transform:none}.xwk-account-button:focus-visible,.xwk-button-chevron:focus-visible,.xwk-account-panel-actions button:focus-visible,.xwk-account-panel-actions a:focus-visible,.xwk-address-qr-trigger:focus-visible,.xwk-tx-header:focus-visible,.xwk-tx-link:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px;text-decoration:none}.xwk-button-icon{background:${theme.background};border:1px solid ${iconBorder};border-radius:10px;box-sizing:border-box;display:inline-flex;flex:0 0 28px;height:28px;isolation:isolate;line-height:0;max-width:28px;min-width:28px;object-fit:contain;overflow:hidden;position:relative;width:28px}.xwk-button-icon-fallback{align-items:center;background:${fallbackIconBackground};color:${fallbackIconColor};justify-content:center}.xwk-button-icon-initial{font-size:12px;line-height:1}.xwk-button-icon-svg-fallback{font-size:0}.xwk-button-icon-svg-fallback svg{display:block;flex:0 0 17px;height:17px;max-height:17px;max-width:17px;min-height:17px;min-width:17px;width:17px}.xwk-button-pending-dot{background:${theme.accent};border:2px solid ${background};border-radius:999px;box-sizing:border-box;flex:0 0 9px;height:9px;margin-left:-13px;margin-right:4px;position:relative;width:9px;z-index:1}.xwk-button-label{display:inline-block;flex:1 1 0;font-size:13px;font-weight:560;line-height:1.1;max-width:220px;min-width:0;overflow:hidden;padding-right:2px;text-overflow:ellipsis;white-space:nowrap}.xwk-button-balance{color:${theme.muted};font-weight:500;margin-left:4px}.xwk-button-balance-loading{display:inline-flex;vertical-align:-2px}.xwk-balance-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;flex:0 0 13px;height:13px;width:13px}.xwk-button-chevron{align-items:center;background:${theme.background};border:1px solid ${iconBorder};border-radius:999px;color:${theme.muted};display:inline-flex;flex:0 0 26px;height:26px;justify-content:center;line-height:1;touch-action:manipulation;width:26px}.xwk-button-chevron:hover{background:${theme.surfaceHover};color:${theme.foreground}}.xwk-account-overlay{align-items:center;background:${theme.overlay};-webkit-backdrop-filter:${overlayBlur};backdrop-filter:${overlayBlur};display:flex;inset:0;justify-content:center;overscroll-behavior:contain;padding:max(24px,env(safe-area-inset-top)) max(24px,env(safe-area-inset-right)) max(24px,env(safe-area-inset-bottom)) max(24px,env(safe-area-inset-left));position:fixed;z-index:2147483647}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay{animation:xwk-account-overlay-in .18s ease-out}.xwk-account-panel{background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:${theme.shadow};box-sizing:border-box;color:${theme.foreground};display:grid;gap:12px;overflow:hidden;z-index:2147483647}.xwk-account-panel:focus{outline:none}.xwk-account-panel-dropdown{box-shadow:none;justify-items:center;margin-top:10px;min-width:320px;padding:18px;position:absolute;right:0;top:100%;width:min(360px,calc(100vw - 32px))}.xwk-account-panel-modal{gap:0;grid-template-rows:auto minmax(0,1fr);height:min(527px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)));max-width:520px;position:relative;transform-origin:center bottom;width:min(520px,100%)}.xwk-account-panel-modal.xwk-account-panel-with-transactions{height:min(650px,calc(100dvh - 48px - env(safe-area-inset-top) - env(safe-area-inset-bottom)))}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-panel-in .22s cubic-bezier(.22,1,.36,1)}.xwk-account-modal-header{align-items:center;background:${theme.headerBackground};border-bottom:1px solid ${theme.border};display:grid;grid-template-columns:44px minmax(0,1fr) 44px;column-gap:8px;padding:8px 18px}.xwk-account-modal-header h2{color:${theme.foreground};font-size:16px;font-weight:500;line-height:1.2;margin:0;min-width:0;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-modal-body{-webkit-overflow-scrolling:touch;align-items:center;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden;overscroll-behavior:contain;padding:22px 28px 28px}.xwk-account-panel-with-transactions .xwk-account-modal-body{overflow:auto;padding-top:14px}.xwk-account-modal-body>.xwk-account-hero,.xwk-account-modal-body>.xwk-account-name,.xwk-account-modal-body>.xwk-account-address,.xwk-account-modal-body>.xwk-account-meta-row,.xwk-account-modal-body>.xwk-account-warning,.xwk-account-modal-body>.xwk-tx-section,.xwk-account-modal-body>.xwk-account-panel-actions{flex-shrink:0}.xwk-account-close,.xwk-account-back{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent!important;border:0!important;border-radius:999px;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:inline-flex;font:inherit;font-size:26px;font-weight:500;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none!important;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-account-back{font-size:0;justify-self:start}.xwk-account-close{justify-self:end}.xwk-account-close:hover,.xwk-account-back:hover{background:${theme.surfaceHover}!important;box-shadow:none!important;color:${theme.foreground};transform:none}.xwk-account-close:focus-visible,.xwk-account-back:focus-visible{outline:2px solid ${theme.accent}!important;outline-offset:0}.xwk-account-hero{height:154px;margin-top:4px;position:relative;width:180px}.xwk-account-panel-with-transactions .xwk-account-hero{height:126px;margin-bottom:0}.xwk-account-panel-with-transactions .xwk-account-art,.xwk-account-panel-with-transactions .xwk-account-avatar{top:0}.xwk-account-panel-dropdown .xwk-account-hero{height:132px;width:160px}.xwk-account-art,.xwk-account-avatar{border-radius:999px;height:118px;left:31px;position:absolute;top:8px;width:118px}.xwk-account-panel-dropdown .xwk-account-art,.xwk-account-panel-dropdown .xwk-account-avatar{height:104px;left:28px;width:104px}.xwk-account-art{align-items:center;background:radial-gradient(circle at 58% 38%,var(--xwk-avatar-spot),transparent 0 22%,transparent 23%),linear-gradient(160deg,var(--xwk-avatar-from),var(--xwk-avatar-to));display:flex;justify-content:center}.xwk-account-art span{background:rgba(255,255,255,.18);border-radius:999px;height:50px;width:50px}.xwk-account-panel-dropdown .xwk-account-art span{height:42px;width:42px}.xwk-account-avatar{background:${theme.surface};border:1px solid ${iconBorder};box-sizing:border-box;display:block;object-fit:cover;overflow:hidden}.xwk-account-panel-with-transactions .xwk-account-name{position:relative;z-index:1}.xwk-account-name{color:${theme.foreground};font-size:21px;font-weight:650;line-height:1.2;max-width:100%;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-dropdown .xwk-account-name{font-size:18px}.xwk-account-name-with-qr,.xwk-account-address{align-items:center;display:inline-flex;gap:6px;justify-content:center}.xwk-account-name-with-qr span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-name-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;color:${theme.muted};font-size:16px;font-weight:600;line-height:1.2;max-width:min(260px,100%);padding:7px 6px 7px 14px}.xwk-account-address{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;color:${theme.muted};font-size:14px;font-weight:520;line-height:1.25;max-width:100%;overflow:hidden;padding:8px 8px 8px 12px;text-align:center;text-overflow:ellipsis;white-space:nowrap}.xwk-address-qr-trigger{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:0;border-radius:10px;box-shadow:none;color:currentColor;cursor:pointer;display:inline-flex;flex:0 0 34px;height:34px;justify-content:center;margin:-4px -3px -4px 0;min-height:0;outline:none;overflow:visible;padding:0;touch-action:manipulation;transform:none;width:34px}.xwk-address-qr-trigger svg{display:block;height:17px;overflow:visible;width:17px}.xwk-address-qr-trigger:hover{background:${theme.surfaceHover};box-shadow:none;transform:none}.xwk-account-meta-row{align-items:center;display:flex;gap:8px;justify-content:center;max-width:100%;min-height:42px}.xwk-account-balance{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:13px;font-weight:560;height:42px;justify-content:center;letter-spacing:0;line-height:1;padding:0 14px;text-align:center}.xwk-account-balance-loading{align-items:center;display:inline-flex;gap:6px}.xwk-account-warning{align-items:center;background:${theme.surface};border:1px solid ${actionBorder};border-radius:12px;box-sizing:border-box;color:${theme.muted};display:flex;font-size:13px;font-weight:520;justify-content:center;line-height:1.25;min-height:54px;padding:0 14px;text-align:center;width:100%}.xwk-address-qr-content{align-content:center;display:grid;gap:14px;justify-items:center;min-height:100%;width:100%}.xwk-address-qr-code{aspect-ratio:1/1;background:${theme.surface};border:1px solid ${theme.border};border-radius:14px;box-sizing:border-box;display:grid;max-width:304px;padding:12px;place-items:center;width:min(304px,100%)}.xwk-address-qr-code svg,.xwk-address-qr-code canvas,.xwk-address-qr-code img{aspect-ratio:1/1;display:block;height:auto;max-width:100%;width:100%}.xwk-address-qr-chip{background:${theme.surface};border:1px solid ${theme.border};border-radius:12px;box-sizing:border-box;color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;font-weight:520;line-height:1.45;max-width:100%;overflow-wrap:anywhere;padding:9px 11px;text-align:center;width:100%}.xwk-address-qr-fallback{color:${theme.muted};font-size:12px;line-height:1.45;overflow-wrap:anywhere}.xwk-tx-section{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;display:grid;overflow:hidden;width:100%}.xwk-tx-header{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface}!important;border:0!important;box-shadow:none!important;color:${theme.muted};cursor:pointer;display:flex;font:inherit;font-size:10px;font-weight:650;gap:6px;letter-spacing:.07em;line-height:1.2;margin:0;min-height:34px;outline:none;padding:0 12px;text-align:left;text-transform:uppercase;touch-action:manipulation;transform:none;transition:background-color .16s ease,color .16s ease;width:100%}.xwk-tx-header:hover,.xwk-tx-header:active{background:${theme.surfaceHover}!important;border:0!important;box-shadow:none!important;color:${theme.foreground};opacity:1;text-decoration:none;transform:none}.xwk-tx-count{align-items:center;background:${theme.background};border:1px solid ${actionBorder};border-radius:999px;box-sizing:border-box;color:${theme.muted};display:inline-flex;font-size:10px;font-weight:650;height:16px;justify-content:center;letter-spacing:0;line-height:1;min-width:18px;padding:0 5px;text-transform:none}.xwk-tx-chevron{align-items:center;color:${theme.muted};display:inline-flex;flex:0 0 16px;height:16px;justify-content:center;margin-left:auto;transition:transform .18s ease;width:16px}.xwk-tx-chevron.closed{transform:rotate(-90deg)}.xwk-tx-chevron svg{display:block;height:12px;width:12px}.xwk-tx-list{-webkit-overflow-scrolling:touch;display:grid;gap:0;max-height:86px;overflow:auto;overscroll-behavior:contain;scrollbar-color:${theme.muted} transparent;scrollbar-width:thin}.xwk-tx-list::-webkit-scrollbar{width:6px}.xwk-tx-list::-webkit-scrollbar-track{background:transparent}.xwk-tx-list::-webkit-scrollbar-thumb{background:${theme.muted};border-radius:999px}.xwk-tx-row{align-items:center;background:${theme.surface};border-top:1px solid ${actionBorder};box-sizing:border-box;display:grid;gap:8px;grid-template-columns:24px minmax(0,1fr) auto;min-height:42px;padding:7px 10px;transition:background-color .16s ease}.xwk-tx-row:hover{background:${theme.surface};box-shadow:none;transform:none}.xwk-tx-row:first-child{border-top:0}.xwk-tx-status{align-items:center;background:${theme.background};border-radius:999px;color:${theme.accent};display:inline-flex;height:24px;justify-content:center;width:24px}.xwk-tx-row-confirmed .xwk-tx-status{color:${theme.success}}.xwk-tx-row-failed .xwk-tx-status{color:${theme.error}}.xwk-tx-row-unknown .xwk-tx-status{color:${theme.muted}}.xwk-tx-main{display:grid;gap:2px;min-width:0}.xwk-tx-label{color:${theme.foreground};font-size:12px;font-weight:600;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-hash{color:${theme.muted};font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-tx-link{align-items:center;border-radius:9px;color:${theme.accent};display:inline-flex;font:inherit;font-size:12px;font-weight:650;gap:3px;line-height:1.2;min-height:28px;padding:0 6px;text-decoration:none}.xwk-tx-link:hover{background:${theme.surfaceHover};box-shadow:none;text-decoration:none;transform:none}.xwk-tx-link svg{height:12px;width:12px}.xwk-tx-empty{background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-sizing:border-box;color:${theme.muted};font-size:13px;line-height:1.35;padding:14px;text-align:center;width:100%}.xwk-tx-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.accent};border-radius:999px;box-sizing:border-box;display:block;height:14px;width:14px}.xwk-account-panel-actions{display:grid;gap:10px;grid-template-columns:1fr;width:100%}.xwk-account-modal-body .xwk-account-panel-actions{margin-top:auto}.xwk-account-panel-with-transactions .xwk-account-modal-body .xwk-account-panel-actions{margin-top:0}.xwk-account-panel-actions button,.xwk-account-panel-actions a{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:${theme.surface};border:1px solid ${actionBorder};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:flex;font:inherit;font-size:14px;font-weight:560;gap:8px;justify-content:center;line-height:1.2;min-height:46px;min-width:0;outline:none;overflow:hidden;padding:0 12px;text-decoration:none;touch-action:manipulation;transform:none;transition:background-color .16s ease,border-color .16s ease;width:100%}.xwk-account-panel-actions button:disabled{cursor:wait;opacity:1}.xwk-account-panel-actions svg{flex:0 0 auto;opacity:.58}.xwk-account-panel-actions span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-account-panel-actions button:hover,.xwk-account-panel-actions a:hover{background:${theme.surfaceHover};border-color:${actionBorder};box-shadow:none;text-decoration:none;transform:none}.xwk-account-panel-actions button:active,.xwk-account-panel-actions a:active{background:${theme.surfaceHover};opacity:1;text-decoration:none;transform:none}.xwk-copied-icon{color:${theme.success};opacity:1!important}.xwk-action-spinner{animation:xwk-action-spin .8s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.muted};border-radius:999px;box-sizing:border-box;display:inline-block;height:17px;width:17px}@keyframes xwk-action-spin{to{transform:rotate(360deg)}}@keyframes xwk-account-overlay-in{from{opacity:0}to{opacity:1}}@keyframes xwk-account-panel-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(prefers-reduced-motion:reduce){.xwk-account-button,.xwk-tx-chevron,.xwk-account-panel-actions button,.xwk-account-panel-actions a{transition:none}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-overlay,.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation-duration:1ms!important}.xwk-action-spinner,.xwk-balance-spinner,.xwk-tx-spinner{animation:none}}@media(max-width:520px){.xwk-account-panel-dropdown{bottom:0;left:0;margin-top:0;min-width:0;position:fixed;right:0;top:auto;width:100vw}.xwk-account-overlay{align-items:flex-end;padding:max(12px,env(safe-area-inset-top)) 0 0}.xwk-account-panel-modal{align-self:flex-end;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;border-left:0;border-right:0;border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};height:min(527px,calc(100dvh - env(safe-area-inset-top)));max-width:none;width:100vw}.xwk-account-portal[data-xwk-entering="true"] .xwk-account-panel-modal{animation:xwk-account-sheet-in .28s cubic-bezier(.32,.72,0,1)}.xwk-account-modal-header{border-top-left-radius:${theme.radius};border-top-right-radius:${theme.radius};grid-template-columns:44px minmax(0,1fr) 44px;padding:10px 16px}.xwk-account-modal-body{min-height:0;padding:18px 20px max(22px,calc(22px + env(safe-area-inset-bottom)))}.xwk-button-label{max-width:min(150px,calc(100vw - 140px))}}@keyframes xwk-account-sheet-in{from{opacity:1;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}`;
21456
21719
  }
21457
21720
  resolveTheme() {
21458
21721
  return resolveWalletTheme({
@@ -21554,7 +21817,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21554
21817
  if (!response.ok)
21555
21818
  return void 0;
21556
21819
  const json = await response.json();
21557
- return findAvatarUrl(json);
21820
+ return normalizeAvatarUrl(findAvatarUrl(json), endpoint);
21558
21821
  } catch {
21559
21822
  return void 0;
21560
21823
  }
@@ -21578,6 +21841,25 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21578
21841
  return resultAvatar;
21579
21842
  return void 0;
21580
21843
  }
21844
+ function normalizeAvatarUrl(value, endpoint) {
21845
+ if (!value)
21846
+ return void 0;
21847
+ if (/^(?:https?:|data:|blob:|ipfs:|ar:)/i.test(value))
21848
+ return value;
21849
+ if (value.startsWith("//")) {
21850
+ try {
21851
+ return `${new URL(endpoint).protocol}${value}`;
21852
+ } catch {
21853
+ return value;
21854
+ }
21855
+ }
21856
+ try {
21857
+ const base3 = new URL(endpoint);
21858
+ return new URL(value.replace(/^\/+/, ""), `${base3.origin}/`).toString();
21859
+ } catch {
21860
+ return value;
21861
+ }
21862
+ }
21581
21863
  function createWalletButton(options) {
21582
21864
  const button = new WalletButtonController(options);
21583
21865
  if (options.target)
@@ -21692,7 +21974,7 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21692
21974
  const messages = this.messages();
21693
21975
  const hash2 = transaction2.hash;
21694
21976
  const hashLabel = this.formatHash(hash2);
21695
- const label = transaction2.status === "confirmed" ? "Transaction confirmed" : transaction2.status === "failed" ? "Transaction failed" : "Transaction submitted";
21977
+ const label = transaction2.status === "confirmed" ? "Transaction confirmed" : transaction2.status === "failed" ? "Transaction failed" : transaction2.status === "unknown" ? "Transaction status unknown" : "Transaction submitted";
21696
21978
  const explorerUrl = this.getExplorerUrl(hash2, (_a2 = transaction2.account) == null ? void 0 : _a2.network);
21697
21979
  const link = explorerUrl ? `<a class="xwk-toast-link" href="${this.escapeHtml(explorerUrl)}" target="_blank" rel="noopener">View ${this.externalIcon()}</a>` : "";
21698
21980
  return `<div class="xwk-toast xwk-toast--${transaction2.status}" data-hash="${this.escapeHtml(hash2)}" role="status"><div class="xwk-toast-icon">${this.renderStatusIcon(transaction2.status)}</div><div class="xwk-toast-body"><span class="xwk-toast-label">${this.escapeHtml(label)}</span><span class="xwk-toast-hash">${this.escapeHtml(hashLabel)}</span></div>${link}<button class="xwk-toast-dismiss" data-xwk-toast-dismiss="${this.escapeHtml(hash2)}" aria-label="${this.escapeHtml(messages.close)}" type="button">&times;</button></div>`;
@@ -21702,11 +21984,13 @@ ${new this._window.XMLSerializer().serializeToString(e4)}`;
21702
21984
  return `<span class="xwk-toast-icon-mark" aria-hidden="true">${this.checkIcon()}</span>`;
21703
21985
  if (status === "failed")
21704
21986
  return `<span class="xwk-toast-icon-mark" aria-hidden="true">${this.closeIcon()}</span>`;
21987
+ if (status === "unknown")
21988
+ return `<span class="xwk-toast-icon-mark" aria-hidden="true">?</span>`;
21705
21989
  return `<span class="xwk-toast-spinner" aria-hidden="true"></span>`;
21706
21990
  }
21707
21991
  renderStyles() {
21708
21992
  const theme = this.resolveTheme();
21709
- return `.xwk-toast-root{bottom:24px;display:flex;flex-direction:column-reverse;font-family:${theme.fontFamily};gap:10px;pointer-events:none;position:fixed;z-index:2147483646}.xwk-toast-root--bottom-right{right:24px}.xwk-toast-root--bottom-left{left:24px}.xwk-toast-root--bottom-center{left:50%;transform:translateX(-50%)}.xwk-toast{align-items:center;animation:xwk-toast-in .18s ease-out both;background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};display:flex;gap:12px;max-width:420px;min-width:330px;padding:12px 12px 12px 16px;pointer-events:auto}.xwk-toast-icon{align-items:center;border-radius:999px;display:flex;flex:0 0 32px;height:32px;justify-content:center;width:32px}.xwk-toast-spinner{animation:xwk-spin .9s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.accent};border-radius:999px;display:block;height:18px;width:18px}.xwk-toast--submitted .xwk-toast-icon{background:${theme.surface};color:${theme.accent}}.xwk-toast--confirmed .xwk-toast-icon{background:${theme.surface};color:${theme.success}}.xwk-toast--failed .xwk-toast-icon{background:${theme.surface};color:${theme.error}}.xwk-toast-icon-mark{display:inline-flex}.xwk-toast-body{display:flex;flex:1 1 auto;flex-direction:column;gap:2px;min-width:0}.xwk-toast-label{color:${theme.foreground};font-size:13px;font-weight:600;white-space:nowrap}.xwk-toast-hash{color:${theme.muted};font-family:ui-monospace,"Cascadia Code",monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-toast-link{-webkit-tap-highlight-color:transparent;align-items:center;border-radius:${theme.walletRadius};box-sizing:border-box;color:${theme.accent};display:inline-flex;flex:0 0 auto;font:inherit;font-size:12px;font-weight:600;gap:4px;line-height:1.2;min-height:32px;outline:none;overflow:hidden;padding:0 6px;text-decoration:none;touch-action:manipulation;transform:none;white-space:nowrap}.xwk-toast-link:hover{background:${theme.surfaceHover};text-decoration:none}.xwk-toast-link svg{height:13px;width:13px}.xwk-toast-dismiss{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:1px solid ${theme.border};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;flex:0 0 44px;font:inherit;font-size:24px;font-weight:400;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none;overflow:hidden;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-toast-dismiss:hover{background:${theme.surfaceHover};border-color:${theme.border};box-shadow:none;color:${theme.foreground};transform:none}.xwk-toast-dismiss:focus-visible,.xwk-toast-link:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px}@keyframes xwk-toast-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes xwk-spin{to{transform:rotate(360deg)}}@media(max-width:480px){.xwk-toast-root{bottom:max(12px,env(safe-area-inset-bottom));left:12px;right:12px;transform:none}.xwk-toast{max-width:100%;min-width:0;width:100%}}@media(prefers-reduced-motion:reduce){.xwk-toast,.xwk-toast-spinner{animation:none}}`;
21993
+ return `.xwk-toast-root{bottom:24px;display:flex;flex-direction:column-reverse;font-family:${theme.fontFamily};gap:10px;pointer-events:none;position:fixed;z-index:2147483646}.xwk-toast-root--bottom-right{right:24px}.xwk-toast-root--bottom-left{left:24px}.xwk-toast-root--bottom-center{left:50%;transform:translateX(-50%)}.xwk-toast{align-items:center;animation:xwk-toast-in .18s ease-out both;background:${theme.background};border:1px solid ${theme.border};border-radius:${theme.radius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};display:flex;gap:12px;max-width:420px;min-width:330px;padding:12px 12px 12px 16px;pointer-events:auto}.xwk-toast-icon{align-items:center;border-radius:999px;display:flex;flex:0 0 32px;height:32px;justify-content:center;width:32px}.xwk-toast-spinner{animation:xwk-spin .9s linear infinite;border:2px solid ${theme.spinnerTrail};border-top-color:${theme.accent};border-radius:999px;display:block;height:18px;width:18px}.xwk-toast--submitted .xwk-toast-icon{background:${theme.surface};color:${theme.accent}}.xwk-toast--confirmed .xwk-toast-icon{background:${theme.surface};color:${theme.success}}.xwk-toast--failed .xwk-toast-icon{background:${theme.surface};color:${theme.error}}.xwk-toast--unknown .xwk-toast-icon{background:${theme.surface};color:${theme.muted}}.xwk-toast-icon-mark{display:inline-flex}.xwk-toast-body{display:flex;flex:1 1 auto;flex-direction:column;gap:2px;min-width:0}.xwk-toast-label{color:${theme.foreground};font-size:13px;font-weight:600;white-space:nowrap}.xwk-toast-hash{color:${theme.muted};font-family:ui-monospace,"Cascadia Code",monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xwk-toast-link{-webkit-tap-highlight-color:transparent;align-items:center;border-radius:${theme.walletRadius};box-sizing:border-box;color:${theme.accent};display:inline-flex;flex:0 0 auto;font:inherit;font-size:12px;font-weight:600;gap:4px;line-height:1.2;min-height:32px;outline:none;overflow:hidden;padding:0 6px;text-decoration:none;touch-action:manipulation;transform:none;white-space:nowrap}.xwk-toast-link:hover{background:${theme.surfaceHover};text-decoration:none}.xwk-toast-link svg{height:13px;width:13px}.xwk-toast-dismiss{-webkit-appearance:none;-webkit-tap-highlight-color:transparent;align-items:center;appearance:none;background:transparent;border:1px solid ${theme.border};border-radius:${theme.walletRadius};box-shadow:none;box-sizing:border-box;color:${theme.foreground};cursor:pointer;display:inline-flex;flex:0 0 44px;font:inherit;font-size:24px;font-weight:400;height:44px;justify-content:center;line-height:1;margin:0;min-height:0;outline:none;overflow:hidden;padding:0;touch-action:manipulation;transform:none;width:44px}.xwk-toast-dismiss:hover{background:${theme.surfaceHover};border-color:${theme.border};box-shadow:none;color:${theme.foreground};transform:none}.xwk-toast-dismiss:focus-visible,.xwk-toast-link:focus-visible{outline:2px solid ${theme.accent};outline-offset:2px}@keyframes xwk-toast-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes xwk-spin{to{transform:rotate(360deg)}}@media(max-width:480px){.xwk-toast-root{bottom:max(12px,env(safe-area-inset-bottom));left:12px;right:12px;transform:none}.xwk-toast{max-width:100%;min-width:0;width:100%}}@media(prefers-reduced-motion:reduce){.xwk-toast,.xwk-toast-spinner{animation:none}}`;
21710
21994
  }
21711
21995
  ensureStyles() {
21712
21996
  const styles2 = this.renderStyles();
@@ -77269,6 +77553,7 @@ ${e2.length}`, n2 = new TextEncoder().encode(t2 + e2);
77269
77553
  exports.WalletManager = WalletManager;
77270
77554
  exports.WalletModal = WalletModal;
77271
77555
  exports.WalletToast = WalletToast;
77556
+ exports.WalletTransactionStore = WalletTransactionStore;
77272
77557
  exports.XAMAN_ICON = XAMAN_ICON;
77273
77558
  exports.XRPLSNAP_ICON = XRPLSNAP_ICON;
77274
77559
  exports.XRPL_DEVNET = XRPL_DEVNET;