@rhinestone/deposit-modal 0.1.31 → 0.1.33

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 (35) hide show
  1. package/dist/{DepositModalReown-S7HER5HU.mjs → DepositModalReown-7ZO7HUN3.mjs} +9 -5
  2. package/dist/{DepositModalReown-N7GCYZF7.cjs → DepositModalReown-VNKZT5A7.cjs} +12 -8
  3. package/dist/{WithdrawModalReown-DMDRLYTE.mjs → WithdrawModalReown-PMPLUJBE.mjs} +9 -5
  4. package/dist/{WithdrawModalReown-DJCJ5U7E.cjs → WithdrawModalReown-YP4PEERJ.cjs} +12 -8
  5. package/dist/{chunk-SZ35G2DT.cjs → chunk-4WXSBBHQ.cjs} +101 -107
  6. package/dist/{chunk-3ICS43XC.mjs → chunk-C6I5TFSL.mjs} +4 -0
  7. package/dist/{chunk-EVU7M7A6.mjs → chunk-DLFUXLAM.mjs} +14 -13
  8. package/dist/{chunk-SLI5FHTT.mjs → chunk-ECLVABYN.mjs} +34 -40
  9. package/dist/{chunk-AWFJFSPH.mjs → chunk-HNDZ6G5K.mjs} +166 -249
  10. package/dist/{chunk-PE6OK3FH.cjs → chunk-S4UBVD3H.cjs} +5 -1
  11. package/dist/{chunk-MU2BOEDN.cjs → chunk-SIGTZB3C.cjs} +244 -327
  12. package/dist/{chunk-CS6UIMCF.mjs → chunk-SJEIKMVO.mjs} +10 -2
  13. package/dist/{chunk-VKQA3FO3.cjs → chunk-V7I5T4SW.cjs} +9 -1
  14. package/dist/{chunk-G2RDCQHL.cjs → chunk-YIHOACM3.cjs} +38 -37
  15. package/dist/constants.cjs +2 -2
  16. package/dist/constants.mjs +1 -1
  17. package/dist/deposit.cjs +4 -4
  18. package/dist/deposit.d.cts +2 -2
  19. package/dist/deposit.d.ts +2 -2
  20. package/dist/deposit.mjs +3 -3
  21. package/dist/index.cjs +5 -5
  22. package/dist/index.d.cts +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.mjs +4 -4
  25. package/dist/reown.cjs +5 -5
  26. package/dist/reown.d.cts +1 -1
  27. package/dist/reown.d.ts +1 -1
  28. package/dist/reown.mjs +4 -4
  29. package/dist/{types-DTBfMH0p.d.ts → types-Bp2n2RQ3.d.ts} +0 -1
  30. package/dist/{types-DELv717e.d.cts → types-CIaQPR6F.d.cts} +0 -1
  31. package/dist/withdraw.cjs +4 -4
  32. package/dist/withdraw.d.cts +2 -2
  33. package/dist/withdraw.d.ts +2 -2
  34. package/dist/withdraw.mjs +3 -3
  35. package/package.json +1 -1
@@ -21,7 +21,7 @@ import {
21
21
  portfolioToAssets,
22
22
  saveSessionOwnerToStorage,
23
23
  tokenFormatter
24
- } from "./chunk-EVU7M7A6.mjs";
24
+ } from "./chunk-DLFUXLAM.mjs";
25
25
  import {
26
26
  DEFAULT_BACKEND_URL,
27
27
  DEFAULT_SIGNER_ADDRESS,
@@ -35,14 +35,15 @@ import {
35
35
  getTargetTokenSymbolsForChain,
36
36
  getTokenAddress,
37
37
  getTokenIcon,
38
- getTokenSymbol
39
- } from "./chunk-3ICS43XC.mjs";
38
+ getTokenSymbol,
39
+ isStablecoinSymbol
40
+ } from "./chunk-C6I5TFSL.mjs";
40
41
 
41
42
  // src/DepositModal.tsx
42
43
  import {
43
- useMemo as useMemo7,
44
- useEffect as useEffect7,
45
- useRef as useRef5,
44
+ useMemo as useMemo6,
45
+ useEffect as useEffect8,
46
+ useRef as useRef6,
46
47
  useState as useState8,
47
48
  useCallback as useCallback4,
48
49
  lazy,
@@ -50,7 +51,7 @@ import {
50
51
  } from "react";
51
52
 
52
53
  // src/DepositFlow.tsx
53
- import { useState as useState7, useCallback as useCallback3, useMemo as useMemo6, useEffect as useEffect6, useRef as useRef4 } from "react";
54
+ import { useState as useState7, useCallback as useCallback3, useMemo as useMemo5, useEffect as useEffect7, useRef as useRef5 } from "react";
54
55
 
55
56
  // src/components/steps/SetupStep.tsx
56
57
  import { useState, useEffect, useRef, useCallback } from "react";
@@ -249,7 +250,8 @@ function AssetSelectStep({
249
250
  defaultSourceToken,
250
251
  service,
251
252
  onContinue,
252
- onTotalBalanceComputed
253
+ onTotalBalanceComputed,
254
+ onAssetsLoaded
253
255
  }) {
254
256
  const [assets, setAssets] = useState2([]);
255
257
  const [selectedAssetId, setSelectedAssetId] = useState2(null);
@@ -316,7 +318,8 @@ function AssetSelectStep({
316
318
  0
317
319
  );
318
320
  onTotalBalanceComputed?.(total);
319
- }, [assets, onTotalBalanceComputed]);
321
+ if (assets.length > 0) onAssetsLoaded?.(assets);
322
+ }, [assets, onTotalBalanceComputed, onAssetsLoaded]);
320
323
  const rows = useMemo(() => {
321
324
  return assets.filter((a) => {
322
325
  try {
@@ -507,9 +510,9 @@ function mergeAssets(existing, incoming) {
507
510
  }
508
511
 
509
512
  // src/components/steps/AmountStep.tsx
510
- import { useEffect as useEffect3, useMemo as useMemo2, useState as useState3, useRef as useRef2 } from "react";
513
+ import { useEffect as useEffect3, useMemo as useMemo2, useRef as useRef2, useState as useState3 } from "react";
511
514
  import { erc20Abi, formatUnits as formatUnits2, parseUnits } from "viem";
512
- import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
515
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
513
516
  function AmountStep({
514
517
  walletClient,
515
518
  publicClient,
@@ -533,6 +536,8 @@ function AmountStep({
533
536
  const chainMismatch = Boolean(
534
537
  walletClient?.chain?.id && walletClient.chain.id !== asset.chainId
535
538
  );
539
+ const targetSymbol = getTokenSymbol(targetToken, targetChain);
540
+ const isSourceStablecoin = isStablecoinSymbol(asset.symbol);
536
541
  const tokenPriceUsd = useMemo2(() => {
537
542
  if (tokenPriceUsdOverride !== void 0 && tokenPriceUsdOverride > 0)
538
543
  return tokenPriceUsdOverride;
@@ -581,26 +586,24 @@ function AmountStep({
581
586
  hasAttemptedSwitch.current = true;
582
587
  setIsSwitching(true);
583
588
  switchChain(asset.chainId).catch((err) => {
584
- const message = err instanceof Error ? err.message : "Failed to switch chain";
585
- setError(message);
589
+ const raw = err instanceof Error ? err.message : "Failed to switch chain";
590
+ setError(formatUserError(raw));
586
591
  }).finally(() => {
587
592
  setIsSwitching(false);
588
593
  });
589
594
  }
590
595
  }, [chainMismatch, switchChain, asset.chainId]);
596
+ useEffect3(() => {
597
+ hasAttemptedSwitch.current = false;
598
+ }, [asset.chainId]);
591
599
  useEffect3(() => {
592
600
  if (defaultAmount && !amount) {
593
601
  const parsed = Number(defaultAmount);
594
602
  if (Number.isFinite(parsed) && parsed > 0) {
595
- if (hasPricing) {
596
- const usdValue = parsed * tokenPriceUsd;
597
- setAmount(usdValue.toFixed(2));
598
- } else {
599
- setAmount(parsed.toString());
600
- }
603
+ setAmount(parsed.toString());
601
604
  }
602
605
  }
603
- }, [defaultAmount, tokenPriceUsd, hasPricing, amount]);
606
+ }, [defaultAmount, amount]);
604
607
  const balanceUsd = useMemo2(() => {
605
608
  if (balance === null || tokenPriceUsd === null) return null;
606
609
  try {
@@ -625,36 +628,24 @@ function AmountStep({
625
628
  return "...";
626
629
  }
627
630
  }, [balance, asset.decimals]);
628
- const tokenAmount = useMemo2(() => {
629
- if (!amount) return null;
630
- if (hasPricing) {
631
- const usd = Number(amount);
632
- if (!Number.isFinite(usd) || usd <= 0) return null;
633
- return usd / tokenPriceUsd;
634
- }
635
- const val = Number(amount);
636
- return Number.isFinite(val) && val > 0 ? val : null;
637
- }, [amount, tokenPriceUsd, hasPricing]);
638
- const formattedTokenAmount = useMemo2(() => {
639
- if (tokenAmount === null) return "0.00";
640
- return tokenFormatter.format(tokenAmount);
641
- }, [tokenAmount]);
642
- const targetSymbol = getTokenSymbol(targetToken, targetChain);
643
631
  const handlePresetClick = (percentage) => {
644
632
  if (balance === null) return;
645
- if (hasPricing && balanceUsd !== null) {
646
- const value = balanceUsd * percentage / 100;
647
- setAmount(value.toFixed(2));
648
- } else {
649
- try {
650
- const balanceUnits = Number(formatUnits2(balance, asset.decimals));
651
- if (Number.isFinite(balanceUnits)) {
652
- const value = balanceUnits * percentage / 100;
653
- setAmount(value.toString());
654
- }
655
- } catch {
656
- return;
633
+ try {
634
+ const balanceUnits = Number(formatUnits2(balance, asset.decimals));
635
+ if (!Number.isFinite(balanceUnits)) return;
636
+ let value;
637
+ if (isSourceStablecoin || !hasPricing) {
638
+ value = balanceUnits * percentage / 100;
639
+ } else {
640
+ value = (balanceUsd ?? 0) * percentage / 100;
657
641
  }
642
+ const maxDecimals = 3;
643
+ const factor = 10 ** maxDecimals;
644
+ const truncated = Math.floor(value * factor) / factor;
645
+ const formatted = truncated.toFixed(maxDecimals).replace(/\.?0+$/, "");
646
+ setAmount(formatted);
647
+ } catch {
648
+ return;
658
649
  }
659
650
  if (error) setError(null);
660
651
  };
@@ -664,24 +655,28 @@ function AmountStep({
664
655
  setError("Please enter a valid amount");
665
656
  return;
666
657
  }
667
- let tokenAmountStr;
658
+ let sourceAmount;
659
+ if (isSourceStablecoin || !hasPricing) {
660
+ sourceAmount = numericAmount;
661
+ } else {
662
+ sourceAmount = numericAmount / tokenPriceUsd;
663
+ }
668
664
  if (hasPricing) {
669
- if (uiConfig?.maxDepositUsd && numericAmount > uiConfig.maxDepositUsd) {
665
+ const usdValue = numericAmount;
666
+ if (uiConfig?.maxDepositUsd && usdValue > uiConfig.maxDepositUsd) {
670
667
  setError(
671
668
  `Maximum deposit is ${currencyFormatter.format(uiConfig.maxDepositUsd)}`
672
669
  );
673
670
  return;
674
671
  }
675
- if (uiConfig?.minDepositUsd && numericAmount < uiConfig.minDepositUsd) {
672
+ if (uiConfig?.minDepositUsd && usdValue < uiConfig.minDepositUsd) {
676
673
  setError(
677
674
  `Minimum deposit is ${currencyFormatter.format(uiConfig.minDepositUsd)}`
678
675
  );
679
676
  return;
680
677
  }
681
- tokenAmountStr = (numericAmount / tokenPriceUsd).toString();
682
- } else {
683
- tokenAmountStr = numericAmount.toString();
684
678
  }
679
+ const tokenAmountStr = sourceAmount.toString();
685
680
  let amountInUnits;
686
681
  try {
687
682
  amountInUnits = parseUnits(tokenAmountStr, asset.decimals);
@@ -694,24 +689,12 @@ function AmountStep({
694
689
  return;
695
690
  }
696
691
  setError(null);
697
- onContinue(tokenAmountStr, balance ?? void 0);
698
- };
699
- const handleSwitch = async () => {
700
- if (!asset.chainId || !switchChain) return;
701
- setIsSwitching(true);
702
- try {
703
- await switchChain(asset.chainId);
704
- } catch (err) {
705
- const message = err instanceof Error ? err.message : "Failed to switch chain";
706
- setError(message);
707
- } finally {
708
- setIsSwitching(false);
709
- }
692
+ onContinue(tokenAmountStr, amount, balance ?? void 0);
710
693
  };
711
694
  return /* @__PURE__ */ jsxs3("div", { className: "rs-step", children: [
712
695
  /* @__PURE__ */ jsxs3("div", { className: "rs-step-body", style: { paddingTop: 0 }, children: [
713
696
  /* @__PURE__ */ jsxs3("div", { className: "rs-amount-display", children: [
714
- /* @__PURE__ */ jsx3("div", { className: "rs-amount-input-wrapper", children: hasPricing ? /* @__PURE__ */ jsx3(
697
+ /* @__PURE__ */ jsx3("div", { className: "rs-amount-input-wrapper", children: /* @__PURE__ */ jsx3(
715
698
  "input",
716
699
  {
717
700
  type: "text",
@@ -728,50 +711,19 @@ function AmountStep({
728
711
  },
729
712
  autoFocus: true
730
713
  }
731
- ) : /* @__PURE__ */ jsx3(
732
- "input",
733
- {
734
- type: "text",
735
- inputMode: "decimal",
736
- className: "rs-amount-input-large",
737
- placeholder: `0.00 ${asset.symbol}`,
738
- value: amount,
739
- onChange: (e) => {
740
- const raw = e.target.value.replace(/[^0-9.]/g, "");
741
- const parts = raw.split(".");
742
- if (parts.length > 2) return;
743
- setAmount(raw);
744
- if (error) setError(null);
745
- },
746
- autoFocus: true
747
- }
748
714
  ) }),
749
- (uiConfig?.showTokenBalance ?? false) && /* @__PURE__ */ jsxs3(Fragment2, { children: [
750
- hasPricing ? /* @__PURE__ */ jsxs3("div", { className: "rs-amount-token-value", children: [
751
- formattedTokenAmount,
752
- " ",
753
- asset.symbol
754
- ] }) : /* @__PURE__ */ jsx3(
755
- "div",
756
- {
757
- className: "rs-amount-token-value",
758
- style: { color: "var(--rs-muted-foreground)" },
759
- children: "Price unavailable"
760
- }
761
- ),
762
- /* @__PURE__ */ jsx3("div", { className: "rs-amount-available", children: /* @__PURE__ */ jsxs3("span", { className: "rs-amount-available-value", children: [
763
- formattedBalance,
715
+ !isSourceStablecoin && /* @__PURE__ */ jsx3("div", { className: "rs-amount-available", children: /* @__PURE__ */ jsxs3("span", { className: "rs-amount-available-value", children: [
716
+ formattedBalance,
717
+ " ",
718
+ asset.symbol,
719
+ " available",
720
+ hasPricing && balanceUsd !== null && /* @__PURE__ */ jsxs3("span", { style: { color: "var(--rs-muted-foreground)" }, children: [
764
721
  " ",
765
- asset.symbol,
766
- " available",
767
- hasPricing && balanceUsd !== null && /* @__PURE__ */ jsxs3("span", { style: { color: "var(--rs-muted-foreground)" }, children: [
768
- " ",
769
- "(",
770
- currencyFormatter.format(balanceUsd),
771
- ")"
772
- ] })
773
- ] }) })
774
- ] })
722
+ "(",
723
+ currencyFormatter.format(balanceUsd),
724
+ ")"
725
+ ] })
726
+ ] }) })
775
727
  ] }),
776
728
  /* @__PURE__ */ jsx3(
777
729
  "div",
@@ -904,23 +856,7 @@ function AmountStep({
904
856
  }
905
857
  )
906
858
  ] }),
907
- chainMismatch && /* @__PURE__ */ jsxs3("div", { className: "rs-chain-switch", style: { marginTop: 16 }, children: [
908
- /* @__PURE__ */ jsxs3("div", { className: "rs-chain-switch-text", children: [
909
- "Switch your wallet to ",
910
- getChainName(asset.chainId),
911
- " to continue."
912
- ] }),
913
- switchChain && /* @__PURE__ */ jsx3(
914
- Button,
915
- {
916
- variant: "outline",
917
- size: "small",
918
- loading: isSwitching,
919
- onClick: handleSwitch,
920
- children: "Switch"
921
- }
922
- )
923
- ] }),
859
+ chainMismatch && /* @__PURE__ */ jsx3("div", { className: "rs-chain-switch", style: { marginTop: 16 }, children: /* @__PURE__ */ jsx3("div", { className: "rs-chain-switch-text", children: isSwitching ? `Switching to ${getChainName(asset.chainId)}...` : `Switch your wallet to ${getChainName(asset.chainId)} to continue.` }) }),
924
860
  error && /* @__PURE__ */ jsxs3("div", { className: "rs-amount-error", children: [
925
861
  /* @__PURE__ */ jsx3(
926
862
  "svg",
@@ -957,10 +893,9 @@ function AmountStep({
957
893
  }
958
894
 
959
895
  // src/components/steps/ConfirmStep.tsx
960
- import { useMemo as useMemo3, useState as useState4 } from "react";
961
- import { erc20Abi as erc20Abi2, formatUnits as formatUnits3, parseUnits as parseUnits2 } from "viem";
896
+ import { useEffect as useEffect4, useRef as useRef3, useState as useState4 } from "react";
897
+ import { erc20Abi as erc20Abi2, parseUnits as parseUnits2 } from "viem";
962
898
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
963
- var STABLECOIN_SYMBOLS = /* @__PURE__ */ new Set(["USDC", "USDT", "DAI"]);
964
899
  function ConfirmStep({
965
900
  walletClient,
966
901
  address,
@@ -968,6 +903,8 @@ function ConfirmStep({
968
903
  recipient,
969
904
  asset,
970
905
  amount,
906
+ targetAmount,
907
+ targetTokenPriceUsd,
971
908
  balance,
972
909
  targetChain,
973
910
  targetToken,
@@ -979,55 +916,37 @@ function ConfirmStep({
979
916
  const [isSubmitting, setIsSubmitting] = useState4(false);
980
917
  const [error, setError] = useState4(null);
981
918
  const [isSwitching, setIsSwitching] = useState4(false);
919
+ const hasAttemptedSwitch = useRef3(false);
982
920
  const chainMismatch = walletClient?.chain?.id && walletClient.chain.id !== asset.chainId;
983
921
  const sameRoute = targetChain === asset.chainId && targetToken.toLowerCase() === asset.token.toLowerCase();
984
922
  const targetSymbol = sameRoute ? asset.symbol : getTokenSymbol(targetToken, targetChain);
985
- const formattedAmount = amount && !Number.isNaN(Number(amount)) ? Number(amount).toLocaleString("en-US", { maximumFractionDigits: 6 }) : "0";
986
- const tokenPriceUsd = useMemo3(() => {
987
- if (asset.balanceUsd === void 0 || !asset.balance) return null;
988
- try {
989
- const balanceUnits = Number(
990
- formatUnits3(BigInt(asset.balance), asset.decimals)
991
- );
992
- if (!Number.isFinite(balanceUnits) || balanceUnits <= 0) return null;
993
- return asset.balanceUsd / balanceUnits;
994
- } catch {
995
- return null;
996
- }
997
- }, [asset.balanceUsd, asset.balance, asset.decimals]);
998
- const amountUsd = useMemo3(() => {
999
- if (!amount || tokenPriceUsd === null) return null;
1000
- const parsed = Number(amount);
1001
- if (!Number.isFinite(parsed) || parsed <= 0) return null;
1002
- return parsed * tokenPriceUsd;
1003
- }, [amount, tokenPriceUsd]);
1004
- const targetTokenPriceUsd = useMemo3(() => {
1005
- const targetSym = targetSymbol.toUpperCase();
1006
- const sourceSym = asset.symbol.toUpperCase();
1007
- if (STABLECOIN_SYMBOLS.has(targetSym)) return 1;
1008
- if (targetSym === sourceSym && tokenPriceUsd !== null) return tokenPriceUsd;
1009
- return null;
1010
- }, [targetSymbol, asset.symbol, tokenPriceUsd]);
1011
- const receiveAmountUsd = useMemo3(() => {
1012
- if (amountUsd === null) return null;
1013
- return sameRoute ? amountUsd : amountUsd * 0.99;
1014
- }, [amountUsd, sameRoute]);
1015
- const receiveTokenAmount = useMemo3(() => {
1016
- if (sameRoute) {
1017
- const parsed = Number(amount);
1018
- return Number.isFinite(parsed) ? parsed : null;
923
+ const formattedSendAmount = amount && !Number.isNaN(Number(amount)) ? Number(amount).toLocaleString("en-US", { maximumFractionDigits: 6 }) : "0";
924
+ const formattedReceiveAmount = (() => {
925
+ if (sameRoute) return formattedSendAmount;
926
+ const dollarValue = Number(targetAmount);
927
+ if (!Number.isFinite(dollarValue) || dollarValue <= 0) return formattedSendAmount;
928
+ if (targetTokenPriceUsd !== null && targetTokenPriceUsd > 0) {
929
+ const tokenAmount = dollarValue / targetTokenPriceUsd;
930
+ return tokenAmount.toLocaleString("en-US", { maximumFractionDigits: 6 });
1019
931
  }
1020
- if (receiveAmountUsd === null || targetTokenPriceUsd === null || targetTokenPriceUsd === 0)
1021
- return null;
1022
- return receiveAmountUsd / targetTokenPriceUsd;
1023
- }, [sameRoute, amount, receiveAmountUsd, targetTokenPriceUsd]);
1024
- const formattedReceiveAmount = useMemo3(() => {
1025
- if (receiveTokenAmount === null) return formattedAmount;
1026
- return receiveTokenAmount.toLocaleString("en-US", {
1027
- maximumFractionDigits: 6
1028
- });
1029
- }, [receiveTokenAmount, formattedAmount]);
932
+ return formattedSendAmount;
933
+ })();
1030
934
  const receiveAmount = sameRoute ? formattedReceiveAmount : `~ ${formattedReceiveAmount}`;
935
+ useEffect4(() => {
936
+ if (chainMismatch && switchChain && !hasAttemptedSwitch.current) {
937
+ hasAttemptedSwitch.current = true;
938
+ setIsSwitching(true);
939
+ switchChain(asset.chainId).catch((err) => {
940
+ const raw = err instanceof Error ? err.message : "Failed to switch chain";
941
+ setError(formatUserError(raw));
942
+ }).finally(() => {
943
+ setIsSwitching(false);
944
+ });
945
+ }
946
+ }, [chainMismatch, switchChain, asset.chainId]);
947
+ useEffect4(() => {
948
+ hasAttemptedSwitch.current = false;
949
+ }, [asset.chainId]);
1031
950
  const handleConfirm = async () => {
1032
951
  if (!address || !walletClient) {
1033
952
  setError("Wallet not connected");
@@ -1086,18 +1005,6 @@ function ConfirmStep({
1086
1005
  setIsSubmitting(false);
1087
1006
  }
1088
1007
  };
1089
- const handleSwitch = async () => {
1090
- if (!switchChain) return;
1091
- setIsSwitching(true);
1092
- try {
1093
- await switchChain(asset.chainId);
1094
- } catch (err) {
1095
- const raw = err instanceof Error ? err.message : "Failed to switch chain";
1096
- setError(formatUserError(raw));
1097
- } finally {
1098
- setIsSwitching(false);
1099
- }
1100
- };
1101
1008
  return /* @__PURE__ */ jsxs4("div", { className: "rs-step", children: [
1102
1009
  /* @__PURE__ */ jsx4("div", { style: { padding: "12px 12px 10px" }, children: /* @__PURE__ */ jsx4("div", { className: "rs-step-title", children: "Review order" }) }),
1103
1010
  /* @__PURE__ */ jsxs4("div", { className: "rs-step-body rs-space-y-3", style: { paddingTop: 0 }, children: [
@@ -1166,7 +1073,7 @@ function ConfirmStep({
1166
1073
  style: { width: 16, height: 16, borderRadius: "50%" }
1167
1074
  }
1168
1075
  ),
1169
- formattedAmount,
1076
+ formattedSendAmount,
1170
1077
  " ",
1171
1078
  asset.symbol
1172
1079
  ]
@@ -1195,29 +1102,9 @@ function ConfirmStep({
1195
1102
  ]
1196
1103
  }
1197
1104
  )
1198
- ] }),
1199
- receiveAmountUsd !== null && /* @__PURE__ */ jsxs4("div", { className: "rs-card-row", children: [
1200
- /* @__PURE__ */ jsx4("span", { className: "rs-card-label", children: "Value" }),
1201
- /* @__PURE__ */ jsx4("span", { className: "rs-card-value", children: currencyFormatter.format(receiveAmountUsd) })
1202
1105
  ] })
1203
1106
  ] }),
1204
- chainMismatch && /* @__PURE__ */ jsxs4("div", { className: "rs-chain-switch", children: [
1205
- /* @__PURE__ */ jsxs4("div", { className: "rs-chain-switch-text", children: [
1206
- "Switch your wallet to ",
1207
- getChainName(asset.chainId),
1208
- " to sign."
1209
- ] }),
1210
- switchChain && /* @__PURE__ */ jsx4(
1211
- Button,
1212
- {
1213
- variant: "outline",
1214
- size: "small",
1215
- loading: isSwitching,
1216
- onClick: handleSwitch,
1217
- children: "Switch"
1218
- }
1219
- )
1220
- ] }),
1107
+ chainMismatch && /* @__PURE__ */ jsx4("div", { className: "rs-chain-switch", children: /* @__PURE__ */ jsx4("div", { className: "rs-chain-switch-text", children: isSwitching ? `Switching to ${getChainName(asset.chainId)}...` : `Switch your wallet to ${getChainName(asset.chainId)} to sign.` }) }),
1221
1108
  error && /* @__PURE__ */ jsxs4("div", { className: "rs-alert rs-alert--error", children: [
1222
1109
  /* @__PURE__ */ jsx4(
1223
1110
  "svg",
@@ -1255,14 +1142,14 @@ function ConfirmStep({
1255
1142
  }
1256
1143
 
1257
1144
  // src/components/steps/DepositAddressStep.tsx
1258
- import { useState as useState6, useEffect as useEffect5, useCallback as useCallback2, useRef as useRef3, useMemo as useMemo5 } from "react";
1145
+ import { useState as useState6, useEffect as useEffect6, useCallback as useCallback2, useRef as useRef4, useMemo as useMemo4 } from "react";
1259
1146
 
1260
1147
  // src/components/ui/QRCode.tsx
1261
- import { useEffect as useEffect4, useMemo as useMemo4, useState as useState5 } from "react";
1262
- import { Fragment as Fragment3, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1148
+ import { useEffect as useEffect5, useMemo as useMemo3, useState as useState5 } from "react";
1149
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1263
1150
  function QRCode({ value, size = 200, iconSrc, className }) {
1264
1151
  const [createQrCode, setCreateQrCode] = useState5(null);
1265
- useEffect4(() => {
1152
+ useEffect5(() => {
1266
1153
  let mounted = true;
1267
1154
  void import("qrcode-generator").then((mod) => {
1268
1155
  if (mounted) {
@@ -1277,7 +1164,7 @@ function QRCode({ value, size = 200, iconSrc, className }) {
1277
1164
  mounted = false;
1278
1165
  };
1279
1166
  }, []);
1280
- const svgContent = useMemo4(() => {
1167
+ const svgContent = useMemo3(() => {
1281
1168
  if (!createQrCode) {
1282
1169
  return null;
1283
1170
  }
@@ -1317,7 +1204,7 @@ function QRCode({ value, size = 200, iconSrc, className }) {
1317
1204
  children: [
1318
1205
  /* @__PURE__ */ jsx5("rect", { width: size, height: size, fill: "white", rx: 4 }),
1319
1206
  svgContent ? /* @__PURE__ */ jsx5("path", { d: svgContent.paths, fill: "black" }) : /* @__PURE__ */ jsx5("rect", { x: 8, y: 8, width: size - 16, height: size - 16, fill: "#f1f5f9" }),
1320
- iconSrc && /* @__PURE__ */ jsxs5(Fragment3, { children: [
1207
+ iconSrc && /* @__PURE__ */ jsxs5(Fragment2, { children: [
1321
1208
  /* @__PURE__ */ jsx5(
1322
1209
  "rect",
1323
1210
  {
@@ -1395,17 +1282,17 @@ function DepositAddressStep({
1395
1282
  onDepositDetected,
1396
1283
  onError
1397
1284
  }) {
1398
- const supportedChainIds = useMemo5(() => getSupportedChainIds(), []);
1285
+ const supportedChainIds = useMemo4(() => getSupportedChainIds(), []);
1399
1286
  const BASE_CHAIN_ID = 8453;
1400
1287
  const defaultChainId = supportedChainIds.includes(BASE_CHAIN_ID) ? BASE_CHAIN_ID : supportedChainIds[0];
1401
1288
  const [sourceChainId, setSourceChainId] = useState6(defaultChainId);
1402
- const tokensForChain = useMemo5(
1289
+ const tokensForChain = useMemo4(
1403
1290
  () => getTargetTokenSymbolsForChain(sourceChainId),
1404
1291
  [sourceChainId]
1405
1292
  );
1406
1293
  const defaultToken = tokensForChain.includes("USDC") ? "USDC" : tokensForChain[0] ?? "USDC";
1407
1294
  const [sourceTokenSymbol, setSourceTokenSymbol] = useState6(defaultToken);
1408
- useEffect5(() => {
1295
+ useEffect6(() => {
1409
1296
  if (!tokensForChain.includes(sourceTokenSymbol)) {
1410
1297
  setSourceTokenSymbol(tokensForChain[0] ?? "USDC");
1411
1298
  }
@@ -1414,12 +1301,12 @@ function DepositAddressStep({
1414
1301
  const [pollingError, setPollingError] = useState6(null);
1415
1302
  const [chainDropdownOpen, setChainDropdownOpen] = useState6(false);
1416
1303
  const [tokenDropdownOpen, setTokenDropdownOpen] = useState6(false);
1417
- const depositHandledRef = useRef3(false);
1418
- const sourceSelectionRef = useRef3({
1304
+ const depositHandledRef = useRef4(false);
1305
+ const sourceSelectionRef = useRef4({
1419
1306
  chainId: defaultChainId,
1420
1307
  tokenSymbol: defaultToken
1421
1308
  });
1422
- useEffect5(() => {
1309
+ useEffect6(() => {
1423
1310
  sourceSelectionRef.current = {
1424
1311
  chainId: sourceChainId,
1425
1312
  tokenSymbol: sourceTokenSymbol
@@ -1443,7 +1330,7 @@ function DepositAddressStep({
1443
1330
  setTimeout(() => setCopied(false), 2e3);
1444
1331
  }
1445
1332
  }, [smartAccount]);
1446
- useEffect5(() => {
1333
+ useEffect6(() => {
1447
1334
  depositHandledRef.current = false;
1448
1335
  setPollingError(null);
1449
1336
  let timeoutId;
@@ -1695,6 +1582,7 @@ function DepositFlow({
1695
1582
  waitForFinalTx = true,
1696
1583
  reownWallet,
1697
1584
  onConnect,
1585
+ onDisconnect,
1698
1586
  onRequestConnect,
1699
1587
  connectButtonLabel,
1700
1588
  uiConfig,
@@ -1713,13 +1601,30 @@ function DepositFlow({
1713
1601
  const [totalBalanceUsd, setTotalBalanceUsd] = useState7(0);
1714
1602
  const [isConnectSelectionConfirmed, setIsConnectSelectionConfirmed] = useState7(false);
1715
1603
  const [selectedConnectAddress, setSelectedConnectAddress] = useState7(null);
1716
- const dappSwitchChain = useMemo6(() => {
1604
+ const portfolioAssetsRef = useRef5([]);
1605
+ const handleAssetsLoaded = useCallback3((assets) => {
1606
+ portfolioAssetsRef.current = assets;
1607
+ }, []);
1608
+ const getTokenPriceUsd = useCallback3((symbol) => {
1609
+ const sym = symbol.toLowerCase();
1610
+ for (const asset of portfolioAssetsRef.current) {
1611
+ if (asset.symbol.toLowerCase() === sym && asset.balanceUsd && asset.balance) {
1612
+ try {
1613
+ const balanceUnits = Number(asset.balance) / 10 ** asset.decimals;
1614
+ if (balanceUnits > 0) return asset.balanceUsd / balanceUnits;
1615
+ } catch {
1616
+ }
1617
+ }
1618
+ }
1619
+ return null;
1620
+ }, []);
1621
+ const dappSwitchChain = useMemo5(() => {
1717
1622
  if (!dappWalletClient?.switchChain) return void 0;
1718
1623
  return async (chainId) => {
1719
1624
  await dappWalletClient.switchChain?.({ id: chainId });
1720
1625
  };
1721
1626
  }, [dappWalletClient]);
1722
- const walletOptions = useMemo6(() => {
1627
+ const walletOptions = useMemo5(() => {
1723
1628
  const options = [];
1724
1629
  const seen = /* @__PURE__ */ new Set();
1725
1630
  if (dappWalletClient?.account && dappAddress) {
@@ -1730,7 +1635,7 @@ function DepositFlow({
1730
1635
  });
1731
1636
  seen.add(dappWalletClient.account.address.toLowerCase());
1732
1637
  }
1733
- if (reownWallet?.address && reownWallet.isConnected && !seen.has(reownWallet.address.toLowerCase())) {
1638
+ if (reownWallet?.address && reownWallet.isConnected && reownWallet.walletClient && reownWallet.publicClient && !seen.has(reownWallet.address.toLowerCase())) {
1734
1639
  options.push({
1735
1640
  address: reownWallet.address,
1736
1641
  label: "External Wallet",
@@ -1744,12 +1649,15 @@ function DepositFlow({
1744
1649
  dappAddress,
1745
1650
  reownWallet?.address,
1746
1651
  reownWallet?.isConnected,
1652
+ reownWallet?.walletClient,
1653
+ reownWallet?.publicClient,
1747
1654
  reownWallet?.icon
1748
1655
  ]);
1749
1656
  const canAutoLock = dappWalletClient?.account && dappAddress && !reownWallet;
1750
1657
  const hasWalletOptions = walletOptions.length > 0;
1658
+ const hasReownSession = Boolean(reownWallet?.isConnected || reownWallet?.address);
1751
1659
  const showConnectStep = !canAutoLock && !isConnectSelectionConfirmed;
1752
- const signerContext = useMemo6(() => {
1660
+ const signerContext = useMemo5(() => {
1753
1661
  if (flowMode === "deposit-address") {
1754
1662
  if (!dappAddress) return null;
1755
1663
  return {
@@ -1800,8 +1708,8 @@ function DepositFlow({
1800
1708
  targetChain
1801
1709
  ]);
1802
1710
  const sessionKeyAddress = dappAddress ?? signerContext?.ownerAddress ?? null;
1803
- const lastTargetRef = useRef4(null);
1804
- useEffect6(() => {
1711
+ const lastTargetRef = useRef5(null);
1712
+ useEffect7(() => {
1805
1713
  const prev = lastTargetRef.current;
1806
1714
  if (prev && (prev.chain !== targetChain || prev.token.toLowerCase() !== targetToken.toLowerCase())) {
1807
1715
  if (step.type !== "processing") {
@@ -1836,17 +1744,16 @@ function DepositFlow({
1836
1744
  return {
1837
1745
  type: "amount",
1838
1746
  smartAccount: prev.smartAccount,
1839
- asset: prev.asset,
1840
- amount: prev.amount
1747
+ asset: prev.asset
1841
1748
  };
1842
1749
  });
1843
1750
  }, []);
1844
1751
  const stepIndex = step.type === "setup" ? 0 : step.type === "deposit-address" ? 1 : step.type === "select-asset" ? 1 : step.type === "amount" ? 2 : step.type === "confirm" ? 3 : 4;
1845
1752
  const currentBackHandler = step.type === "deposit-address" ? handleBackFromDepositAddress : step.type === "select-asset" && signerContext && !canAutoLock ? handleBackFromSelectAsset : step.type === "amount" ? handleBackFromAmount : step.type === "confirm" ? handleBackFromConfirm : void 0;
1846
- useEffect6(() => {
1753
+ useEffect7(() => {
1847
1754
  onStepChange?.(stepIndex, currentBackHandler);
1848
1755
  }, [stepIndex, currentBackHandler, onStepChange]);
1849
- useEffect6(() => {
1756
+ useEffect7(() => {
1850
1757
  onTotalBalanceChange?.(totalBalanceUsd);
1851
1758
  }, [totalBalanceUsd, onTotalBalanceChange]);
1852
1759
  const isDepositAddressMode = flowMode === "deposit-address";
@@ -1910,7 +1817,10 @@ function DepositFlow({
1910
1817
  [defaultAmount]
1911
1818
  );
1912
1819
  const handleAmountContinue = useCallback3(
1913
- (amount, balance) => {
1820
+ (amount, targetAmount, balance) => {
1821
+ const targetSym = getTokenSymbol(targetToken, targetChain);
1822
+ const isTargetStable = isStablecoinSymbol(targetSym);
1823
+ const targetTokenPriceUsd = isTargetStable ? 1 : getTokenPriceUsd(targetSym);
1914
1824
  setStep((prev) => {
1915
1825
  if (prev.type !== "amount") return prev;
1916
1826
  return {
@@ -1918,11 +1828,13 @@ function DepositFlow({
1918
1828
  smartAccount: prev.smartAccount,
1919
1829
  asset: prev.asset,
1920
1830
  amount,
1831
+ targetAmount,
1832
+ targetTokenPriceUsd,
1921
1833
  balance
1922
1834
  };
1923
1835
  });
1924
1836
  },
1925
- []
1837
+ [targetToken, targetChain, getTokenPriceUsd]
1926
1838
  );
1927
1839
  const handleDepositSubmitted = useCallback3(
1928
1840
  (txHash, chainId, amount, token) => {
@@ -1968,22 +1880,22 @@ function DepositFlow({
1968
1880
  const handleTotalBalanceComputed = useCallback3((total) => {
1969
1881
  setTotalBalanceUsd(total);
1970
1882
  }, []);
1971
- const selectedConnectAddressEffective = useMemo6(() => {
1883
+ const selectedConnectAddressEffective = useMemo5(() => {
1972
1884
  if (selectedConnectAddress) return selectedConnectAddress;
1973
1885
  if (walletOptions.length === 1) {
1974
1886
  return walletOptions[0].address;
1975
1887
  }
1976
1888
  return null;
1977
1889
  }, [selectedConnectAddress, walletOptions]);
1978
- const walletOptionsKey = useMemo6(
1890
+ const walletOptionsKey = useMemo5(
1979
1891
  () => walletOptions.map((option) => option.address.toLowerCase()).join(","),
1980
1892
  [walletOptions]
1981
1893
  );
1982
- const hasNavigatedBackRef = useRef4(false);
1983
- useEffect6(() => {
1894
+ const hasNavigatedBackRef = useRef5(false);
1895
+ useEffect7(() => {
1984
1896
  setIsConnectSelectionConfirmed(false);
1985
1897
  }, [walletOptionsKey]);
1986
- useEffect6(() => {
1898
+ useEffect7(() => {
1987
1899
  if (hasNavigatedBackRef.current || isConnectSelectionConfirmed || flowMode) {
1988
1900
  return;
1989
1901
  }
@@ -1996,12 +1908,13 @@ function DepositFlow({
1996
1908
  return;
1997
1909
  }
1998
1910
  }
1999
- if (!hasWalletOptions && dappAddress) {
1911
+ if (!hasWalletOptions && dappAddress && !hasReownSession) {
2000
1912
  handleSelectTransferCrypto();
2001
1913
  setIsConnectSelectionConfirmed(true);
2002
1914
  }
2003
1915
  }, [
2004
1916
  hasWalletOptions,
1917
+ hasReownSession,
2005
1918
  isConnectSelectionConfirmed,
2006
1919
  flowMode,
2007
1920
  selectedConnectAddressEffective,
@@ -2022,6 +1935,7 @@ function DepositFlow({
2022
1935
  } : void 0,
2023
1936
  onRequestConnect,
2024
1937
  onConnect,
1938
+ onDisconnect,
2025
1939
  onContinue: () => {
2026
1940
  if (selectedConnectAddressEffective) {
2027
1941
  setSelectedConnectAddress(selectedConnectAddressEffective);
@@ -2069,7 +1983,6 @@ function DepositFlow({
2069
1983
  sourceChain: step.sourceChain,
2070
1984
  sourceToken: step.sourceToken,
2071
1985
  targetChain,
2072
- targetToken,
2073
1986
  amount: step.amount,
2074
1987
  waitForFinalTx,
2075
1988
  service,
@@ -2122,7 +2035,8 @@ function DepositFlow({
2122
2035
  defaultSourceToken,
2123
2036
  service,
2124
2037
  onContinue: handleAssetContinue,
2125
- onTotalBalanceComputed: handleTotalBalanceComputed
2038
+ onTotalBalanceComputed: handleTotalBalanceComputed,
2039
+ onAssetsLoaded: handleAssetsLoaded
2126
2040
  }
2127
2041
  ),
2128
2042
  step.type === "amount" && /* @__PURE__ */ jsx7(
@@ -2149,6 +2063,8 @@ function DepositFlow({
2149
2063
  recipient,
2150
2064
  asset: step.asset,
2151
2065
  amount: step.amount,
2066
+ targetAmount: step.targetAmount,
2067
+ targetTokenPriceUsd: step.targetTokenPriceUsd,
2152
2068
  balance: step.balance,
2153
2069
  targetChain,
2154
2070
  targetToken,
@@ -2166,7 +2082,6 @@ function DepositFlow({
2166
2082
  sourceChain: step.sourceChain,
2167
2083
  sourceToken: step.sourceToken,
2168
2084
  targetChain,
2169
- targetToken,
2170
2085
  amount: step.amount,
2171
2086
  waitForFinalTx,
2172
2087
  service,
@@ -2184,7 +2099,7 @@ function DepositFlow({
2184
2099
  // src/DepositModal.tsx
2185
2100
  import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
2186
2101
  var ReownDepositInner = lazy(
2187
- () => import("./DepositModalReown-S7HER5HU.mjs").then((m) => ({ default: m.DepositModalReown }))
2102
+ () => import("./DepositModalReown-7ZO7HUN3.mjs").then((m) => ({ default: m.DepositModalReown }))
2188
2103
  );
2189
2104
  function DepositModal(props) {
2190
2105
  const needsReown = !!props.reownAppId;
@@ -2214,6 +2129,7 @@ function DepositModalInner({
2214
2129
  waitForFinalTx = true,
2215
2130
  reownWallet,
2216
2131
  onConnect,
2132
+ onDisconnect,
2217
2133
  onRequestConnect,
2218
2134
  connectButtonLabel,
2219
2135
  theme,
@@ -2228,26 +2144,26 @@ function DepositModalInner({
2228
2144
  onError,
2229
2145
  debug
2230
2146
  }) {
2231
- const modalRef = useRef5(null);
2147
+ const modalRef = useRef6(null);
2232
2148
  const [currentStepIndex, setCurrentStepIndex] = useState8(0);
2233
2149
  const [totalBalanceUsd, setTotalBalanceUsd] = useState8(null);
2234
- const backHandlerRef = useRef5(void 0);
2150
+ const backHandlerRef = useRef6(void 0);
2235
2151
  const targetChain = getChainId(targetChainProp);
2236
2152
  const sourceChain = sourceChainProp ? getChainId(sourceChainProp) : void 0;
2237
- const service = useMemo7(() => createDepositService(backendUrl), [backendUrl]);
2238
- useEffect7(() => {
2153
+ const service = useMemo6(() => createDepositService(backendUrl), [backendUrl]);
2154
+ useEffect8(() => {
2239
2155
  if (isOpen && modalRef.current) {
2240
2156
  applyTheme(modalRef.current, theme);
2241
2157
  }
2242
2158
  }, [isOpen, theme]);
2243
- const hasCalledReady = useRef5(false);
2244
- useEffect7(() => {
2159
+ const hasCalledReady = useRef6(false);
2160
+ useEffect8(() => {
2245
2161
  if (isOpen && !hasCalledReady.current) {
2246
2162
  hasCalledReady.current = true;
2247
2163
  onReady?.();
2248
2164
  }
2249
2165
  }, [isOpen, onReady]);
2250
- useEffect7(() => {
2166
+ useEffect8(() => {
2251
2167
  if (!isOpen) {
2252
2168
  setCurrentStepIndex(0);
2253
2169
  }
@@ -2383,6 +2299,7 @@ function DepositModalInner({
2383
2299
  waitForFinalTx,
2384
2300
  reownWallet,
2385
2301
  onConnect,
2302
+ onDisconnect,
2386
2303
  onRequestConnect,
2387
2304
  connectButtonLabel,
2388
2305
  uiConfig,