@avail-project/widgets 0.0.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/common/utils/token-pricing.d.ts +1 -1
  2. package/dist/common/utils/token-pricing.d.ts.map +1 -1
  3. package/dist/common/utils/token-pricing.js +4 -1
  4. package/dist/nexus/NexusProvider.d.ts +4 -2
  5. package/dist/nexus/NexusProvider.d.ts.map +1 -1
  6. package/dist/nexus/NexusProvider.js +216 -39
  7. package/dist/nexus-widget/components/deposit-idle-form.d.ts +2 -1
  8. package/dist/nexus-widget/components/deposit-idle-form.d.ts.map +1 -1
  9. package/dist/nexus-widget/components/deposit-idle-form.js +26 -10
  10. package/dist/nexus-widget/components/nexus-widget-progress-screen.d.ts.map +1 -1
  11. package/dist/nexus-widget/components/nexus-widget-progress-screen.js +21 -5
  12. package/dist/nexus-widget/components/pay-with-sources.d.ts.map +1 -1
  13. package/dist/nexus-widget/components/pay-with-sources.js +43 -54
  14. package/dist/nexus-widget/components/send-idle-form.d.ts +2 -1
  15. package/dist/nexus-widget/components/send-idle-form.d.ts.map +1 -1
  16. package/dist/nexus-widget/components/send-idle-form.js +26 -10
  17. package/dist/nexus-widget/components/swap-asset-selector.d.ts +1 -1
  18. package/dist/nexus-widget/components/swap-asset-selector.d.ts.map +1 -1
  19. package/dist/nexus-widget/components/swap-asset-selector.js +198 -140
  20. package/dist/nexus-widget/components/swap-idle-form.d.ts +2 -1
  21. package/dist/nexus-widget/components/swap-idle-form.d.ts.map +1 -1
  22. package/dist/nexus-widget/components/swap-idle-form.js +3 -3
  23. package/dist/nexus-widget/components/swap-intent-preview.d.ts +5 -1
  24. package/dist/nexus-widget/components/swap-intent-preview.d.ts.map +1 -1
  25. package/dist/nexus-widget/components/swap-intent-preview.js +50 -35
  26. package/dist/nexus-widget/nexus-widget.d.ts.map +1 -1
  27. package/dist/nexus-widget/nexus-widget.js +1311 -617
  28. package/dist/nexus-widget/types.d.ts +1 -1
  29. package/dist/nexus-widget/types.d.ts.map +1 -1
  30. package/dist/nexus-widget/utils/deposit-source-selection.d.ts.map +1 -1
  31. package/dist/nexus-widget/utils/deposit-source-selection.js +68 -4
  32. package/package.json +6 -5
@@ -1,7 +1,7 @@
1
1
  import type { SupportedChainsAndTokensResult } from "@avail-project/nexus-core";
2
2
  export declare const DEFAULT_COINBASE_PRICE_REQUEST_TIMEOUT_MS = 4000;
3
3
  export declare const USD_PEGGED_FALLBACK_RATE = 1;
4
- export declare const DEFAULT_USD_PEGGED_TOKEN_SYMBOLS: readonly ["USDT", "USDC", "USDC.E", "USDT.E", "USDS", "DAI", "CTUSD", "JUSD", "USDM", "FDUSD", "BUSD", "TUSD", "PYUSD", "GUSD", "SVJUSD", "LUSD", "USDE", "USDP"];
4
+ export declare const DEFAULT_USD_PEGGED_TOKEN_SYMBOLS: readonly ["USDT", "USDT0", "USDC", "USDC.E", "USDT.E", "USDS", "DAI", "CTUSD", "JUSD", "USDM", "FDUSD", "BUSD", "TUSD", "PYUSD", "GUSD", "SVJUSD", "LUSD", "USDE", "USDP"];
5
5
  /**
6
6
  * Wrapped / derivative token → base token pegging map.
7
7
  * When Coinbase has no direct price for a token, we resolve the price
@@ -1 +1 @@
1
- {"version":3,"file":"token-pricing.d.ts","sourceRoot":"","sources":["../../../.build-src/common/utils/token-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAShF,eAAO,MAAM,yCAAyC,OAAQ,CAAC;AAC/D,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,gCAAgC,mKAmBnC,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6CpD,CAAC;AAEX;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,WAAW,EAAE,MAAM;CAKhC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAuCD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAeD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMpE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBzE;AA8CD,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,8BAA8B,GAAG,IAAI,EACtD,WAAW,GAAE,QAAQ,CAAC,MAAM,CAAoC,GAC/D,GAAG,CAAC,MAAM,CAAC,CAqBb;AAqBD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,gBAAgB,SAA4C,GAC3D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAuBD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,gBAAgB,SAA4C,GAC3D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB"}
1
+ {"version":3,"file":"token-pricing.d.ts","sourceRoot":"","sources":["../../../.build-src/common/utils/token-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAShF,eAAO,MAAM,yCAAyC,OAAQ,CAAC;AAC/D,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,gCAAgC,4KAoBnC,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8CpD,CAAC;AAEX;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,WAAW,EAAE,MAAM;CAKhC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAuCD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEhE;AAgBD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMpE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBzE;AA8CD,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,8BAA8B,GAAG,IAAI,EACtD,WAAW,GAAE,QAAQ,CAAC,MAAM,CAAoC,GAC/D,GAAG,CAAC,MAAM,CAAC,CAqBb;AAqBD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,gBAAgB,SAA4C,GAC3D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAuBD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,gBAAgB,SAA4C,GAC3D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB"}
@@ -6,6 +6,7 @@ export const DEFAULT_COINBASE_PRICE_REQUEST_TIMEOUT_MS = 4_000;
6
6
  export const USD_PEGGED_FALLBACK_RATE = 1;
7
7
  export const DEFAULT_USD_PEGGED_TOKEN_SYMBOLS = [
8
8
  "USDT",
9
+ "USDT0",
9
10
  "USDC",
10
11
  "USDC.E",
11
12
  "USDT.E",
@@ -67,6 +68,7 @@ export const TOKEN_PRICE_PEGS = {
67
68
  // --- Stablecoin variants ---
68
69
  "USDC.E": "USDC",
69
70
  "USDT.E": "USDT",
71
+ USDT0: "USDT",
70
72
  GUSD: "USD",
71
73
  JUSD: "USD",
72
74
  SVJUSD: "USD",
@@ -92,7 +94,7 @@ export function resolveBaseSymbol(tokenSymbol) {
92
94
  return TOKEN_PRICE_PEGS[normalized] ?? null;
93
95
  }
94
96
  export function normalizeTokenSymbol(tokenSymbol) {
95
- return tokenSymbol.trim().toUpperCase();
97
+ return tokenSymbol.trim().toUpperCase().replaceAll("\u20ae", "T");
96
98
  }
97
99
  const USD_RATE_PEG_SYMBOLS = {
98
100
  CBTC: "BTC",
@@ -103,6 +105,7 @@ const USD_RATE_PEG_SYMBOLS = {
103
105
  SYBTC: "BTC",
104
106
  "USDC.E": "USDC",
105
107
  "USDT.E": "USDT",
108
+ USDT0: "USDT",
106
109
  "WBTC.E": "BTC",
107
110
  WCBTC: "BTC",
108
111
  };
@@ -16,13 +16,14 @@ interface NexusContextType {
16
16
  allowance: RefObject<OnAllowanceHookData | null>;
17
17
  attachEventHooks: () => void;
18
18
  bridgableBalance: UserAsset[] | null;
19
+ bridgableBalanceLoading: boolean;
19
20
  deinitializeNexus: () => Promise<void>;
20
21
  exchangeRate: Record<string, number> | null;
21
22
  fetchBridgableBalance: () => Promise<void>;
22
23
  fetchSwapBalance: () => Promise<UserAsset[] | null>;
23
24
  getFiatValue: (amount: number, token: string) => number;
24
- handleInit: (provider: EthereumProvider) => Promise<void>;
25
- initializeNexus: (provider: EthereumProvider) => Promise<void>;
25
+ handleInit: (provider: EthereumProvider, accountAddress?: string) => Promise<void>;
26
+ initializeNexus: (provider: EthereumProvider, accountAddress?: string) => Promise<void>;
26
27
  intent: RefObject<OnIntentHookData | null>;
27
28
  loading: boolean;
28
29
  network?: NexusNetwork;
@@ -32,6 +33,7 @@ interface NexusContextType {
32
33
  setIntent: (data: OnIntentHookData | null) => void;
33
34
  supportedChainsAndTokens: SupportedChainsAndTokensResult | null;
34
35
  swapBalance: UserAsset[] | null;
36
+ swapBalanceLoading: boolean;
35
37
  swapIntent: RefObject<OnSwapIntentHookData | null>;
36
38
  swapSupportedChainsAndTokens: SupportedChainsResult | null;
37
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NexusProvider.d.ts","sourceRoot":"","sources":["../../.build-src/nexus/NexusProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AAGnC,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG;IACrC,SAAS,EAAE,CAAC,YAAY,GAAG;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,EAAE,CAAC;IACL,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,qBAAqB,GAAG,8BAA8B,CAAC;AAE5D,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAoBf,UAAU,gBAAgB;IACxB,SAAS,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACjD,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,gBAAgB,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,gBAAgB,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACpD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,eAAe,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrE,YAAY,EAAE,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,SAAS,EAAE,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,wBAAwB,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAChE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,SAAS,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACnD,4BAA4B,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,YAAY,uDAExB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,YAAY,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;KACpC,CAAC;CACH,CAAC;AAiEF,QAAA,MAAM,aAAa,GAAI,uBAGpB,kBAAkB,4CA4qBpB,CAAC;AAEF,wBAAgB,QAAQ,qBAMvB;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"NexusProvider.d.ts","sourceRoot":"","sources":["../../.build-src/nexus/NexusProvider.tsx"],"names":[],"mappings":"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"}
@@ -17,6 +17,10 @@ const sumSourceBalances = (sources) => sources.reduce((sum, source) => {
17
17
  return Number.isFinite(balance) && balance > 0 ? sum + balance : sum;
18
18
  }, 0);
19
19
  const getSourceBalanceChainId = (source) => source.chain?.id ?? source.chainId;
20
+ const normalizeAccountAddress = (address) => {
21
+ const normalized = address?.trim().toLowerCase();
22
+ return normalized || null;
23
+ };
20
24
  const filterUnsupportedSwapSources = (assets, swapSupportedChains) => {
21
25
  if (!assets) {
22
26
  return null;
@@ -55,20 +59,71 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
55
59
  const [supportedChainsAndTokensState, setSupportedChainsAndTokensState] = useState(null);
56
60
  const [swapSupportedChainsAndTokensState, setSwapSupportedChainsAndTokensState,] = useState(null);
57
61
  const [bridgableBalance, setBridgableBalance] = useState(null);
62
+ const [bridgableBalanceLoading, setBridgableBalanceLoading] = useState(false);
58
63
  const [swapBalance, setSwapBalance] = useState(null);
64
+ const [swapBalanceLoading, setSwapBalanceLoading] = useState(false);
59
65
  const swapBalanceRef = useRef(null);
60
66
  const [exchangeRateState, setExchangeRateState] = useState(null);
61
67
  const exchangeRate = useRef(null);
62
68
  const coinbaseUsdRateCache = useRef({});
63
69
  const coinbaseUsdRateRequests = useRef({});
64
70
  const initRequest = useRef(null);
71
+ const initializedAccountAddress = useRef(null);
65
72
  const bridgableBalanceRequest = useRef(null);
66
73
  const swapBalanceRequest = useRef(null);
67
74
  const lastSwapBalanceFetchAt = useRef(0);
75
+ const balanceFetchRunId = useRef(0);
76
+ const latestBalanceFetchRunId = useRef(0);
68
77
  const usdPeggedSymbols = useRef(new Set(DEFAULT_USD_PEGGED_TOKEN_SYMBOLS));
69
78
  const intent = useRef(null);
70
79
  const allowance = useRef(null);
71
80
  const swapIntent = useRef(null);
81
+ const initializedRef = useRef(false);
82
+ const startBalanceFetchTiming = useCallback((source) => {
83
+ const runId = balanceFetchRunId.current + 1;
84
+ balanceFetchRunId.current = runId;
85
+ latestBalanceFetchRunId.current = runId;
86
+ const walletAddress = initializedAccountAddress.current;
87
+ const startTimeMs = Date.now();
88
+ const timing = {
89
+ runId,
90
+ source,
91
+ startTimeMs,
92
+ walletAddress,
93
+ };
94
+ console.log("[NexusProvider] balance fetch start", {
95
+ runId,
96
+ walletAddress,
97
+ source,
98
+ dateNow: startTimeMs,
99
+ date: new Date(startTimeMs),
100
+ });
101
+ return timing;
102
+ }, []);
103
+ const finishBalanceFetchTiming = useCallback((timing, status = "resolved") => {
104
+ if (latestBalanceFetchRunId.current !== timing.runId) {
105
+ return;
106
+ }
107
+ const endTimeMs = Date.now();
108
+ const fetchDurationMs = endTimeMs - timing.startTimeMs;
109
+ console.log("[NexusProvider] balance fetch end", {
110
+ runId: timing.runId,
111
+ walletAddress: timing.walletAddress,
112
+ source: timing.source,
113
+ status,
114
+ dateNow: endTimeMs,
115
+ date: new Date(endTimeMs),
116
+ });
117
+ console.log("[NexusProvider] balance fetch total", {
118
+ runId: timing.runId,
119
+ walletAddress: timing.walletAddress,
120
+ source: timing.source,
121
+ status,
122
+ totalTimeSeconds: fetchDurationMs / 1000,
123
+ elapsedMs: fetchDurationMs,
124
+ dateNow: endTimeMs,
125
+ });
126
+ }, []);
72
127
  useEffect(() => {
73
128
  let cancelled = false;
74
129
  console.log("NEXUS CONFIG", stableConfig);
@@ -82,6 +137,10 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
82
137
  if (cancelled) {
83
138
  return;
84
139
  }
140
+ if (initializedRef.current) {
141
+ nextSdk.destroy();
142
+ return;
143
+ }
85
144
  sdkRef.current = nextSdk;
86
145
  setSdk(nextSdk);
87
146
  console.log("ChainList", nextSdk.chainList.chains);
@@ -333,7 +392,6 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
333
392
  delete coinbaseUsdRateRequests.current[normalizedSymbol];
334
393
  }
335
394
  }, [cacheUsdRate]);
336
- const initializedRef = useRef(false);
337
395
  const setIntent = useCallback((data) => {
338
396
  intent.current = data;
339
397
  }, []);
@@ -345,6 +403,9 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
345
403
  if (!activeSdk) {
346
404
  return;
347
405
  }
406
+ const activeAccountAddress = initializedAccountAddress.current;
407
+ const isCurrentSdkRun = () => sdkRef.current === activeSdk &&
408
+ initializedAccountAddress.current === activeAccountAddress;
348
409
  const list = activeSdk.getSupportedChains();
349
410
  supportedChainsAndTokens.current = list ?? null;
350
411
  setSupportedChainsAndTokensState(list ?? null);
@@ -352,52 +413,86 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
352
413
  const swapList = activeSdk.getSupportedChains();
353
414
  swapSupportedChainsAndTokens.current = swapList ?? null;
354
415
  setSwapSupportedChainsAndTokensState(swapList ?? null);
355
- const [bridgeAbleBalanceResult, swapBalanceResult, rates] = await Promise.allSettled([
356
- activeSdk.getBalancesForBridge(),
357
- activeSdk.getBalancesForSwap(),
358
- getCoinbaseRates(),
359
- ]);
360
- if (rates?.status === "fulfilled") {
361
- const usdPerUnit = {};
362
- for (const [symbol, value] of Object.entries(rates.value)) {
363
- const normalized = normalizeTokenSymbol(symbol);
364
- // Skip tokens with an explicit peg (e.g. WCBTC→BTC) — the SDK
365
- // may return a bogus 1:1 USD rate for these. Our pegging map
366
- // will resolve them correctly via their base symbol.
367
- if (TOKEN_PRICE_PEGS[normalized])
368
- continue;
369
- const unitsPerUsd = Number.parseFloat(String(value));
370
- if (Number.isFinite(unitsPerUsd) && unitsPerUsd > 0) {
371
- usdPerUnit[normalized] = 1 / unitsPerUsd;
416
+ setBridgableBalanceLoading(true);
417
+ setSwapBalanceLoading(true);
418
+ const balanceTiming = startBalanceFetchTiming("setup");
419
+ let balanceTimingStatus = "resolved";
420
+ try {
421
+ const [bridgeAbleBalanceResult, swapBalanceResult, rates] = await Promise.allSettled([
422
+ activeSdk.getBalancesForBridge(),
423
+ activeSdk.getBalancesForSwap(),
424
+ getCoinbaseRates(),
425
+ ]);
426
+ if (rates?.status === "fulfilled") {
427
+ const usdPerUnit = {};
428
+ for (const [symbol, value] of Object.entries(rates.value)) {
429
+ const normalized = normalizeTokenSymbol(symbol);
430
+ // Skip tokens with an explicit peg (e.g. WCBTC→BTC) — the SDK
431
+ // may return a bogus 1:1 USD rate for these. Our pegging map
432
+ // will resolve them correctly via their base symbol.
433
+ if (TOKEN_PRICE_PEGS[normalized])
434
+ continue;
435
+ const unitsPerUsd = Number.parseFloat(String(value));
436
+ if (Number.isFinite(unitsPerUsd) && unitsPerUsd > 0) {
437
+ usdPerUnit[normalized] = 1 / unitsPerUsd;
438
+ }
372
439
  }
440
+ exchangeRate.current = usdPerUnit;
441
+ setExchangeRateState(usdPerUnit);
442
+ }
443
+ if (!isCurrentSdkRun()) {
444
+ return;
445
+ }
446
+ if (bridgeAbleBalanceResult.status === "fulfilled") {
447
+ setBridgableBalance(normalizeUserAssetFiatValues(bridgeAbleBalanceResult.value));
448
+ }
449
+ if (swapBalanceResult.status === "fulfilled") {
450
+ const rawSwapBalance = swapBalanceResult.value;
451
+ const filteredSwapBalance = filterUnsupportedSwapSources(rawSwapBalance, swapList);
452
+ const normalizedSwapBalance = normalizeUserAssetFiatValues(filteredSwapBalance);
453
+ console.log("[NexusProvider] getBalancesForSwap:init raw", rawSwapBalance);
454
+ setSwapBalance(normalizedSwapBalance);
373
455
  }
374
- exchangeRate.current = usdPerUnit;
375
- setExchangeRateState(usdPerUnit);
376
456
  }
377
- if (bridgeAbleBalanceResult.status === "fulfilled") {
378
- setBridgableBalance(normalizeUserAssetFiatValues(bridgeAbleBalanceResult.value));
457
+ catch (error) {
458
+ balanceTimingStatus = "failed";
459
+ throw error;
379
460
  }
380
- if (swapBalanceResult.status === "fulfilled") {
381
- const rawSwapBalance = swapBalanceResult.value;
382
- const filteredSwapBalance = filterUnsupportedSwapSources(rawSwapBalance, swapList);
383
- const normalizedSwapBalance = normalizeUserAssetFiatValues(filteredSwapBalance);
384
- console.log("[NexusProvider] getBalancesForSwap:init raw", rawSwapBalance);
385
- setSwapBalance(normalizedSwapBalance);
461
+ finally {
462
+ finishBalanceFetchTiming(balanceTiming, balanceTimingStatus);
463
+ if (isCurrentSdkRun()) {
464
+ setBridgableBalanceLoading(false);
465
+ setSwapBalanceLoading(false);
466
+ }
386
467
  }
387
- }, [config?.network, normalizeUserAssetFiatValues]);
388
- const initializeNexus = useCallback(async (provider) => {
468
+ }, [
469
+ config?.network,
470
+ finishBalanceFetchTiming,
471
+ normalizeUserAssetFiatValues,
472
+ startBalanceFetchTiming,
473
+ ]);
474
+ const initializeNexus = useCallback(async (provider, accountAddress) => {
389
475
  setLoading(true);
390
476
  try {
391
477
  console.log("INITIALIZE NEXUS CONFIG", stableConfig);
478
+ const previousSdk = sdkRef.current;
479
+ const shouldDestroyPreviousSdk = Boolean(previousSdk);
392
480
  const nextSdk = createNexusClient({
393
481
  network: stableConfig.network,
394
482
  debug: stableConfig.debug,
395
483
  });
396
484
  await nextSdk.initialize();
397
485
  await nextSdk.setEVMProvider(provider);
486
+ if (shouldDestroyPreviousSdk &&
487
+ previousSdk &&
488
+ previousSdk !== nextSdk) {
489
+ previousSdk.destroy();
490
+ }
398
491
  sdkRef.current = nextSdk;
399
492
  setSdk(nextSdk);
400
493
  initializedRef.current = true;
494
+ initializedAccountAddress.current =
495
+ normalizeAccountAddress(accountAddress);
401
496
  setNexusSDK(nextSdk);
402
497
  }
403
498
  catch (error) {
@@ -415,7 +510,12 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
415
510
  return Promise.resolve();
416
511
  }
417
512
  activeSdk.destroy();
513
+ if (sdkRef.current === activeSdk) {
514
+ sdkRef.current = null;
515
+ }
418
516
  initializedRef.current = false;
517
+ initializedAccountAddress.current = null;
518
+ setSdk(null);
419
519
  setNexusSDK(null);
420
520
  setBridgableBalance(null);
421
521
  swapBalanceRef.current = null;
@@ -423,7 +523,12 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
423
523
  intent.current = null;
424
524
  swapIntent.current = null;
425
525
  allowance.current = null;
526
+ const invalidatedRunId = balanceFetchRunId.current + 1;
527
+ balanceFetchRunId.current = invalidatedRunId;
528
+ latestBalanceFetchRunId.current = invalidatedRunId;
426
529
  setLoading(false);
530
+ setBridgableBalanceLoading(false);
531
+ setSwapBalanceLoading(false);
427
532
  }
428
533
  catch (error) {
429
534
  console.error("Error deinitializing Nexus:", error);
@@ -433,15 +538,39 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
433
538
  const attachEventHooks = useCallback(() => {
434
539
  // Dummy signature for backward compatibility, hooks are now per-call
435
540
  }, []);
436
- const handleInit = useCallback(async (provider) => {
437
- if (initializedRef.current || loading) {
541
+ const handleInit = useCallback(async (provider, accountAddress) => {
542
+ const nextAccountAddress = normalizeAccountAddress(accountAddress);
543
+ const currentAccountAddress = initializedAccountAddress.current;
544
+ const isAccountChange = Boolean(currentAccountAddress && nextAccountAddress) &&
545
+ currentAccountAddress !== nextAccountAddress;
546
+ if (initializedRef.current &&
547
+ (!nextAccountAddress || currentAccountAddress === nextAccountAddress)) {
438
548
  return;
439
549
  }
550
+ if (loading && initRequest.current) {
551
+ await initRequest.current;
552
+ if (initializedRef.current &&
553
+ (!nextAccountAddress ||
554
+ initializedAccountAddress.current === nextAccountAddress)) {
555
+ return;
556
+ }
557
+ }
440
558
  if (!provider || typeof provider.request !== "function") {
441
559
  throw new Error("Invalid EIP-1193 provider");
442
560
  }
443
561
  const nextInitRequest = (async () => {
444
- await initializeNexus(provider);
562
+ if (initializedRef.current) {
563
+ if (isAccountChange) {
564
+ console.log("[NexusProvider] wallet address changed; reinitializing Nexus", {
565
+ previousWalletAddress: currentAccountAddress,
566
+ nextWalletAddress: nextAccountAddress,
567
+ dateNow: Date.now(),
568
+ date: new Date(),
569
+ });
570
+ }
571
+ await deinitializeNexus();
572
+ }
573
+ await initializeNexus(provider, nextAccountAddress ?? undefined);
445
574
  await setupNexus();
446
575
  attachEventHooks();
447
576
  })();
@@ -458,33 +587,65 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
458
587
  initRequest.current = null;
459
588
  }
460
589
  }
461
- }, [loading, initializeNexus, setupNexus, attachEventHooks]);
590
+ }, [
591
+ loading,
592
+ initializeNexus,
593
+ deinitializeNexus,
594
+ setupNexus,
595
+ attachEventHooks,
596
+ ]);
462
597
  const fetchBridgableBalance = useCallback(async () => {
463
598
  let request = bridgableBalanceRequest.current;
599
+ let balanceTiming = null;
600
+ let balanceTimingStatus = "resolved";
464
601
  try {
465
602
  const activeSdk = sdkRef.current;
466
603
  if (!activeSdk) {
467
604
  return;
468
605
  }
606
+ const activeAccountAddress = initializedAccountAddress.current;
607
+ balanceTiming = startBalanceFetchTiming("bridge-refresh");
608
+ setBridgableBalanceLoading(true);
469
609
  const updatedBalance = await activeSdk.getBalancesForBridge();
610
+ if (sdkRef.current !== activeSdk ||
611
+ initializedAccountAddress.current !== activeAccountAddress) {
612
+ return;
613
+ }
470
614
  setBridgableBalance(normalizeUserAssetFiatValues(updatedBalance));
471
615
  }
472
616
  catch (error) {
617
+ balanceTimingStatus = "failed";
473
618
  console.error("Error fetching bridgable balance:", error);
474
619
  }
475
620
  finally {
621
+ if (balanceTiming) {
622
+ finishBalanceFetchTiming(balanceTiming, balanceTimingStatus);
623
+ }
624
+ setBridgableBalanceLoading(false);
476
625
  if (request && bridgableBalanceRequest.current === request) {
477
626
  bridgableBalanceRequest.current = null;
478
627
  }
479
628
  }
480
- }, [normalizeUserAssetFiatValues]);
629
+ }, [
630
+ finishBalanceFetchTiming,
631
+ normalizeUserAssetFiatValues,
632
+ startBalanceFetchTiming,
633
+ ]);
481
634
  const fetchSwapBalance = useCallback(async () => {
635
+ const activeSdk = sdkRef.current;
636
+ if (!activeSdk) {
637
+ return null;
638
+ }
639
+ const activeAccountAddress = initializedAccountAddress.current;
640
+ const balanceTiming = startBalanceFetchTiming("swap-refresh");
641
+ let balanceTimingStatus = "resolved";
482
642
  try {
483
- const activeSdk = sdkRef.current;
484
- if (!activeSdk) {
643
+ setSwapBalanceLoading(true);
644
+ const updatedBalance = await activeSdk.getBalancesForSwap();
645
+ if (sdkRef.current !== activeSdk ||
646
+ initializedAccountAddress.current !== activeAccountAddress) {
485
647
  return null;
486
648
  }
487
- const updatedBalance = await activeSdk.getBalancesForSwap();
488
649
  const filteredSwapBalance = filterUnsupportedSwapSources(updatedBalance, swapSupportedChainsAndTokens.current);
489
650
  const normalizedSwapBalance = normalizeUserAssetFiatValues(filteredSwapBalance);
490
651
  console.log("[NexusProvider] getBalancesForSwap:refresh raw", updatedBalance);
@@ -492,10 +653,22 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
492
653
  return normalizedSwapBalance;
493
654
  }
494
655
  catch (error) {
656
+ balanceTimingStatus = "failed";
495
657
  console.error("Error fetching swap balance:", error);
496
658
  return null;
497
659
  }
498
- }, [normalizeUserAssetFiatValues]);
660
+ finally {
661
+ finishBalanceFetchTiming(balanceTiming, balanceTimingStatus);
662
+ if (sdkRef.current === activeSdk &&
663
+ initializedAccountAddress.current === activeAccountAddress) {
664
+ setSwapBalanceLoading(false);
665
+ }
666
+ }
667
+ }, [
668
+ finishBalanceFetchTiming,
669
+ normalizeUserAssetFiatValues,
670
+ startBalanceFetchTiming,
671
+ ]);
499
672
  const getFiatValue = useCallback((amount, token) => {
500
673
  const rate = getUsdRateFromLocalSources(token);
501
674
  const normalized = normalizeTokenSymbol(token);
@@ -529,7 +702,9 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
529
702
  supportedChainsAndTokens: supportedChainsAndTokensState,
530
703
  swapSupportedChainsAndTokens: swapSupportedChainsAndTokensState,
531
704
  bridgableBalance,
705
+ bridgableBalanceLoading,
532
706
  swapBalance,
707
+ swapBalanceLoading,
533
708
  network: config?.network,
534
709
  loading,
535
710
  fetchBridgableBalance,
@@ -547,7 +722,9 @@ const NexusProvider = ({ children, config = defaultConfig, }) => {
547
722
  attachEventHooks,
548
723
  handleInit,
549
724
  bridgableBalance,
725
+ bridgableBalanceLoading,
550
726
  swapBalance,
727
+ swapBalanceLoading,
551
728
  stableConfig.network,
552
729
  loading,
553
730
  fetchBridgableBalance,
@@ -5,6 +5,7 @@ interface DepositIdleFormProps {
5
5
  calculatingPercent?: number | null;
6
6
  fromTokens: SwapTokenOption[];
7
7
  isAmountReadOnly?: boolean;
8
+ isBalanceLoading?: boolean;
8
9
  isCalculatingMax?: boolean;
9
10
  isQuoteRefreshing?: boolean;
10
11
  isSourcePickerDisabled?: boolean;
@@ -24,6 +25,6 @@ interface DepositIdleFormProps {
24
25
  totalBalance: string;
25
26
  usdValue: string;
26
27
  }
27
- export declare function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountModeToggle, toToken, totalBalance, usdValue, tokenValue, fromTokens, onOpenSourcePicker, onSetPercent, routeStatus, routeMessage, isAmountReadOnly, isCalculatingMax, calculatingPercent, isQuoteRefreshing, hideDestinationTokenDropdownIcon, showAutoBadge, isSourcePickerDisabled, isTokenPickerDisabled, onOpenTokenPicker, reserveSourceRows, }: DepositIdleFormProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountModeToggle, toToken, totalBalance, usdValue, tokenValue, fromTokens, onOpenSourcePicker, onSetPercent, routeStatus, routeMessage, isAmountReadOnly, isBalanceLoading, isCalculatingMax, calculatingPercent, isQuoteRefreshing, hideDestinationTokenDropdownIcon, showAutoBadge, isSourcePickerDisabled, isTokenPickerDisabled, onOpenTokenPicker, reserveSourceRows, }: DepositIdleFormProps): import("react/jsx-runtime").JSX.Element;
28
29
  export {};
29
30
  //# sourceMappingURL=deposit-idle-form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deposit-idle-form.d.ts","sourceRoot":"","sources":["../../../.build-src/nexus-widget/components/deposit-idle-form.tsx"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,KAAK,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmgBD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gCAAwC,EACxC,aAAoB,EACpB,sBAA8B,EAC9B,qBAA6B,EAC7B,iBAAiB,EACjB,iBAAyB,GAC1B,EAAE,oBAAoB,2CA2XtB"}
1
+ {"version":3,"file":"deposit-idle-form.d.ts","sourceRoot":"","sources":["../../../.build-src/nexus-widget/components/deposit-idle-form.tsx"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,KAAK,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gCAAgC,CAAC,EAAE,OAAO,CAAC;IAC3C,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkiBD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAwB,EACxB,gBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gCAAwC,EACxC,aAAoB,EACpB,sBAA8B,EAC9B,qBAA6B,EAC7B,iBAAiB,EACjB,iBAAyB,GAC1B,EAAE,oBAAoB,2CAmYtB"}
@@ -106,6 +106,11 @@ function SourceLogoPair({ token }) {
106
106
  } }))] }));
107
107
  }
108
108
  function ExactOutPercentButtons({ visible, onSelect, }) {
109
+ const [focusedPercent, setFocusedPercent] = useState(null);
110
+ React.useEffect(() => {
111
+ if (!visible)
112
+ setFocusedPercent(null);
113
+ }, [visible]);
109
114
  return (_jsx("div", { style: {
110
115
  alignItems: "center",
111
116
  boxSizing: "border-box",
@@ -117,18 +122,17 @@ function ExactOutPercentButtons({ visible, onSelect, }) {
117
122
  width: "100%",
118
123
  }, children: [25, 50, 75, 100].map((pct) => {
119
124
  const isMax = pct === 100;
125
+ const isFocused = focusedPercent === pct;
120
126
  return (_jsx("button", { onClick: (e) => {
121
127
  e.stopPropagation();
122
128
  onSelect(pct);
123
- }, onMouseDown: (e) => {
124
- e.preventDefault();
125
- }, style: {
129
+ }, onBlur: () => setFocusedPercent(null), onFocus: () => setFocusedPercent(pct), style: {
126
130
  alignItems: "center",
127
- backgroundColor: isMax ? "#E8F0FF" : "#F4F4F3",
131
+ backgroundColor: isFocused ? "#E8F0FF" : "#F4F4F3",
128
132
  border: "none",
129
133
  borderRadius: "8px",
130
134
  boxSizing: "border-box",
131
- color: isMax ? brand : "#363635",
135
+ color: isFocused ? brand : "#363635",
132
136
  cursor: "pointer",
133
137
  display: "flex",
134
138
  flex: "1 1 0%",
@@ -140,7 +144,7 @@ function ExactOutPercentButtons({ visible, onSelect, }) {
140
144
  minWidth: 0,
141
145
  paddingBlock: "5px",
142
146
  paddingInline: "10px",
143
- }, tabIndex: -1, type: "button", children: isMax ? "MAX" : `${pct}%` }, pct));
147
+ }, type: "button", children: isMax ? "MAX" : `${pct}%` }, pct));
144
148
  }) }));
145
149
  }
146
150
  function SkeletonRow() {
@@ -302,7 +306,19 @@ function PayWithSources({ fromTokens, onOpenSourcePicker, routeStatus, routeMess
302
306
  lineHeight: "20px",
303
307
  }, children: [_jsx(AlertCircle, { style: { flexShrink: 0, height: 15, width: 15 } }), routeMessage] }))] }));
304
308
  }
305
- export function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountModeToggle, toToken, totalBalance, usdValue, tokenValue, fromTokens, onOpenSourcePicker, onSetPercent, routeStatus, routeMessage, isAmountReadOnly = false, isCalculatingMax, calculatingPercent, isQuoteRefreshing, hideDestinationTokenDropdownIcon = false, showAutoBadge = true, isSourcePickerDisabled = false, isTokenPickerDisabled = false, onOpenTokenPicker, reserveSourceRows = false, }) {
309
+ function BalanceSkeleton({ height = "16px", width = "72px", }) {
310
+ return (_jsx("span", { "aria-hidden": "true", className: "animate-pulse", style: {
311
+ background: "linear-gradient(90deg, #F0F0EF 0%, #E6EEFF 48%, #F0F0EF 100%)",
312
+ backgroundSize: "200% 100%",
313
+ borderRadius: "6px",
314
+ display: "inline-block",
315
+ flexShrink: 0,
316
+ height,
317
+ maxWidth: "100%",
318
+ width,
319
+ } }));
320
+ }
321
+ export function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountModeToggle, toToken, totalBalance, usdValue, tokenValue, fromTokens, onOpenSourcePicker, onSetPercent, routeStatus, routeMessage, isAmountReadOnly = false, isBalanceLoading = false, isCalculatingMax, calculatingPercent, isQuoteRefreshing, hideDestinationTokenDropdownIcon = false, showAutoBadge = true, isSourcePickerDisabled = false, isTokenPickerDisabled = false, onOpenTokenPicker, reserveSourceRows = false, }) {
306
322
  const [pendingPercent, setPendingPercent] = useState(null);
307
323
  const [isAmountFocused, setIsAmountFocused] = useState(false);
308
324
  React.useEffect(() => {
@@ -367,13 +383,13 @@ export function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountMo
367
383
  fontFamily: uiFont,
368
384
  fontSize: "14px",
369
385
  lineHeight: "20px",
370
- }, children: "Total Balance:" }), _jsxs("span", { style: {
386
+ }, children: "Total Balance:" }), _jsx("span", { style: {
371
387
  color: primary,
372
388
  fontFamily: uiFont,
373
389
  fontSize: "14px",
374
390
  fontWeight: 600,
375
391
  lineHeight: "20px",
376
- }, children: ["$", totalBalance] })] })] }), _jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "10px" }, children: [_jsxs("div", { style: {
392
+ }, children: isBalanceLoading ? (_jsx(BalanceSkeleton, { width: "64px" })) : (`$${totalBalance}`) })] })] }), _jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "10px" }, children: [_jsxs("div", { style: {
377
393
  alignItems: "center",
378
394
  display: "flex",
379
395
  gap: "12px",
@@ -502,5 +518,5 @@ export function DepositIdleForm({ amount, amountMode, onAmountChange, onAmountMo
502
518
  fontWeight: 500,
503
519
  lineHeight: "20px",
504
520
  whiteSpace: "nowrap",
505
- }, children: destinationBalanceLabel })] })] }), _jsx(ExactOutPercentButtons, { onSelect: handlePercentSelect, visible: Boolean(toToken) && !isAmountReadOnly })] })] }), _jsx(SharedPayWithSources, { fromTokens: fromTokens, isSourcePickerDisabled: isSourcePickerDisabled, onOpenSourcePicker: onOpenSourcePicker, reserveSourceRows: reserveSourceRows, routeMessage: routeMessage, routeStatus: routeStatus, showAutoBadge: showAutoBadge })] }));
521
+ }, children: isBalanceLoading ? (_jsx(BalanceSkeleton, { width: "110px" })) : (destinationBalanceLabel) })] })] }), _jsx(ExactOutPercentButtons, { onSelect: handlePercentSelect, visible: Boolean(toToken) && !isAmountReadOnly })] })] }), _jsx(SharedPayWithSources, { fromTokens: fromTokens, isSourcePickerDisabled: isSourcePickerDisabled, onOpenSourcePicker: onOpenSourcePicker, reserveSourceRows: reserveSourceRows, routeMessage: routeMessage, routeStatus: routeStatus, showAutoBadge: showAutoBadge })] }));
506
522
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nexus-widget-progress-screen.d.ts","sourceRoot":"","sources":["../../../.build-src/nexus-widget/components/nexus-widget-progress-screen.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,KAAK,qCAAqC,EAC1C,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,eAAe,GAAG,YAAY,GAAG,cAAc,CAAC;AAErD,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,UAAU,8BAA8B;IACtC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,qCAAqC,CAAC;IACpD,cAAc,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkuBD,wBAAgB,yBAAyB,CAAC,EACxC,UAAe,EACf,OAAO,EACP,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,IAAI,EACJ,WAAW,EACX,KAAK,EACL,cAAmB,EACnB,UAAU,EACV,gBAAgB,GACjB,EAAE,8BAA8B,2CAwbhC"}
1
+ {"version":3,"file":"nexus-widget-progress-screen.d.ts","sourceRoot":"","sources":["../../../.build-src/nexus-widget/components/nexus-widget-progress-screen.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,KAAK,qCAAqC,EAC1C,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,eAAe,GAAG,YAAY,GAAG,cAAc,CAAC;AAErD,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;CAC3B,CAAC;AAEF,UAAU,8BAA8B;IACtC,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,qCAAqC,CAAC;IACpD,cAAc,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6vBD,wBAAgB,yBAAyB,CAAC,EACxC,UAAe,EACf,OAAO,EACP,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,UAAU,EACV,IAAI,EACJ,WAAW,EACX,KAAK,EACL,cAAmB,EACnB,UAAU,EACV,gBAAgB,GACjB,EAAE,8BAA8B,2CAwbhC"}