@funkit/connect 6.9.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- import {
3
- darkTheme
4
- } from "./chunk-UOY5XFCR.js";
5
2
  import {
6
3
  lightTheme
7
4
  } from "./chunk-AYGZMDTC.js";
5
+ import {
6
+ darkTheme
7
+ } from "./chunk-UOY5XFCR.js";
8
8
  import {
9
9
  systemFontStack
10
10
  } from "./chunk-7HKC2KCK.js";
@@ -522,7 +522,7 @@ import React251, {
522
522
  useCallback as useCallback49,
523
523
  useContext as useContext17,
524
524
  useEffect as useEffect54,
525
- useMemo as useMemo40,
525
+ useMemo as useMemo41,
526
526
  useState as useState72
527
527
  } from "react";
528
528
  import { useConfig as useConfig6, useConnect as useConnect2, useDisconnect as useDisconnect2 } from "wagmi";
@@ -662,6 +662,15 @@ var FunLogger = class {
662
662
  console.error(title, data || "", error);
663
663
  }
664
664
  }
665
+ extractError(error) {
666
+ if (error instanceof Error) {
667
+ return error;
668
+ }
669
+ if (typeof error === "object" && error !== null && "error" in error && error.error instanceof Error) {
670
+ return error.error;
671
+ }
672
+ return null;
673
+ }
665
674
  /**========================
666
675
  * PUBLIC LOGGER FUNCTIONS
667
676
  *=========================*/
@@ -677,7 +686,17 @@ var FunLogger = class {
677
686
  warn(title, data) {
678
687
  this.onWarn({ title, data });
679
688
  }
680
- error(title, error, data) {
689
+ /**
690
+ * @param errorOrData -
691
+ * Previously was called "error" but since in the {@link Logger} interface, error is defined as object (which is the same thing as "any"), we treat it as of unknown type here for safety.
692
+ * In a lot of places it's actually being used as a "data" prop, which also usually has an `.error` property representing an actual {@link Error} object.
693
+ */
694
+ error(title, errorOrData, _data = {}) {
695
+ const error = this.extractError(errorOrData) ?? void 0;
696
+ const data = {
697
+ ..._data,
698
+ ...typeof errorOrData === "object" && errorOrData !== null ? errorOrData : {}
699
+ };
681
700
  this.onError({ title, error, data });
682
701
  }
683
702
  configure(apiKey, isDebug, sdkVersion) {
@@ -810,6 +829,7 @@ function useFunkitConfig() {
810
829
 
811
830
  // src/providers/provideFunkitConnectChains.ts
812
831
  import {
832
+ BITCOIN_MAINNET_CHAIN_ID,
813
833
  HYPERCORE_CHAIN_ID,
814
834
  HYPER_EVM_CHAIN_ID,
815
835
  KATANA_CHAIN_ID,
@@ -832,6 +852,10 @@ var baseIcon = {
832
852
  iconBackground: "#0052ff",
833
853
  iconUrl: "https://sdk-cdn.fun.xyz/images/base.svg"
834
854
  };
855
+ var bitcoinIcon = {
856
+ iconBackground: "#000000",
857
+ iconUrl: "https://sdk-cdn.fun.xyz/images/bitcoin.svg"
858
+ };
835
859
  var blastIcon = {
836
860
  iconBackground: "#000000",
837
861
  iconUrl: "https://sdk-cdn.fun.xyz/images/blast.svg"
@@ -978,6 +1002,12 @@ var chainMetadataByName = {
978
1002
  name: "HyperCore",
979
1003
  ...hyperCoreIcon
980
1004
  },
1005
+ // Non-evm -- Funkit Bitcoin support
1006
+ bitcoin: {
1007
+ chainId: BITCOIN_MAINNET_CHAIN_ID,
1008
+ name: "Bitcoin",
1009
+ ...bitcoinIcon
1010
+ },
981
1011
  xdc: { chainId: 50, name: "XinFin", ...xdcIcon },
982
1012
  xdcTestnet: { chainId: 51, name: "XinFin Testnet", ...xdcIcon },
983
1013
  zetachain: { chainId: 7e3, name: "ZetaChain", ...zetachainIcon },
@@ -1059,7 +1089,7 @@ import React250, {
1059
1089
  useCallback as useCallback48,
1060
1090
  useContext as useContext16,
1061
1091
  useEffect as useEffect53,
1062
- useMemo as useMemo39,
1092
+ useMemo as useMemo40,
1063
1093
  useState as useState71
1064
1094
  } from "react";
1065
1095
  import { useAccount as useAccount10, useAccountEffect as useAccountEffect2, useConfig as useConfig5 } from "wagmi";
@@ -2416,7 +2446,7 @@ import React37, {
2416
2446
  useCallback as useCallback2,
2417
2447
  useState as useState5
2418
2448
  } from "react";
2419
- import { FlagKey as FlagKey3 } from "@funkit/utils";
2449
+ import { FlagKey as FlagKey4 } from "@funkit/utils";
2420
2450
 
2421
2451
  // src/utils/safeJSON.ts
2422
2452
  import { safeParseJson } from "@funkit/utils";
@@ -2808,7 +2838,10 @@ var flagConfig = {
2808
2838
  56: ["*"],
2809
2839
  747474: ["*"],
2810
2840
  999: ["*"],
2811
- 2741: ["*"]
2841
+ 2741: ["*"],
2842
+ 8253038: ["*"]
2843
+ // No HyperCore
2844
+ // No Solana
2812
2845
  })
2813
2846
  },
2814
2847
  [FlagKey.RelayBypassTargetChainsAndAssets]: {
@@ -2823,6 +2856,7 @@ var flagConfig = {
2823
2856
  747474: ["*"],
2824
2857
  999: ["*"],
2825
2858
  2741: ["*"],
2859
+ 8253038: ["*"],
2826
2860
  // HyperCore
2827
2861
  1337: ["*"],
2828
2862
  // Solana
@@ -3084,6 +3118,43 @@ var flagConfig = {
3084
3118
  "10"
3085
3119
  // Optimism
3086
3120
  ])
3121
+ },
3122
+ [FlagKey.EnableBitcoin]: {
3123
+ type: "boolean",
3124
+ default_value: false,
3125
+ overrides: [
3126
+ {
3127
+ if_any: [
3128
+ {
3129
+ key: "userId",
3130
+ type: "pctRollout",
3131
+ pct: 10
3132
+ },
3133
+ {
3134
+ key: "userId",
3135
+ type: "isAnyOf",
3136
+ values: [
3137
+ "0x236c60C57a8B9ca563Fb0dA5199FDdCB686d91E8",
3138
+ "0x2e0Fa1cE3F0F6a85542c1E4F941116c0E885292E",
3139
+ "0x28b8848C6c3aaBF4669997563dc07888eb3B0960",
3140
+ "0x9C64fD7d9826E6d552dD8bc53e5C96F7C3F38528",
3141
+ "0xfe5AD22465dc20340bfFb641F4AbbcAA7a1BB2Ed",
3142
+ "0x9CB7F86F360459cC96C74a0F81aF2C4cC7a54bd2",
3143
+ "0x21b94a3E67c4a72d3D15f478A696c5175f036092",
3144
+ "0x2A8Bd916E85d98d8175258De99fc0ddbcC102eF6",
3145
+ "0x8a5505F1b274d8fC23986AF60Dd3Ca3857095BB8",
3146
+ "0x0B6E49e9D1528F59BaBF3C5337A4c96E987f81aa",
3147
+ "0x84Bc1AC5621d2B44C5D3e3E79b45C2885406026D",
3148
+ "0x0D0377aa9CCA769931821842aB0E1A75e7DD6dD6",
3149
+ "0x7B0195921183f7E04f0D331c1DAF7C1bB208CC4E",
3150
+ "0xda6b07Eb94f699F511a943e9bFC12B64B7fe3486",
3151
+ "0x3c937d73f7FE55b386c309C65087d9F5bdd1a780"
3152
+ ]
3153
+ }
3154
+ ],
3155
+ value: true
3156
+ }
3157
+ ]
3087
3158
  }
3088
3159
  };
3089
3160
 
@@ -3115,6 +3186,41 @@ var hashPct = (flag_key, value, pct) => {
3115
3186
  return cyrb53(hashKey) % 100 < pct;
3116
3187
  };
3117
3188
 
3189
+ // src/utils/flags/patches/enable-bitcoin-patch.ts
3190
+ import { FlagKey as FlagKey2, safeParseJson as safeParseJson2 } from "@funkit/utils";
3191
+ var BITCOIN_CHAIN_ID = 8253038;
3192
+ var enableBitcoin = (config) => {
3193
+ try {
3194
+ const tokenTransferNewTokensDefaultValue = safeParseJson2(config[FlagKey2.TokenTransferNewTokens].default_value) || {};
3195
+ const tokenTransferSourceChainsAndAssetsDefaultValue = safeParseJson2(
3196
+ config[FlagKey2.TokenTransferSourceChainsAndAssets].default_value
3197
+ ) || {};
3198
+ if (config[FlagKey2.EnableBitcoin]) {
3199
+ return config;
3200
+ }
3201
+ return {
3202
+ ...config,
3203
+ [FlagKey2.TokenTransferNewTokens]: {
3204
+ ...config[FlagKey2.TokenTransferNewTokens],
3205
+ default_value: JSON.stringify({
3206
+ ...tokenTransferNewTokensDefaultValue,
3207
+ [BITCOIN_CHAIN_ID]: ["BTC"]
3208
+ })
3209
+ },
3210
+ [FlagKey2.TokenTransferSourceChainsAndAssets]: {
3211
+ ...config[FlagKey2.TokenTransferSourceChainsAndAssets],
3212
+ default_value: JSON.stringify({
3213
+ ...tokenTransferSourceChainsAndAssetsDefaultValue,
3214
+ [BITCOIN_CHAIN_ID]: ["BTC"]
3215
+ })
3216
+ }
3217
+ };
3218
+ } catch (error) {
3219
+ logger.error("enableBitcoin:unexpected error", error);
3220
+ return config;
3221
+ }
3222
+ };
3223
+
3118
3224
  // src/utils/flags/impl.ts
3119
3225
  async function fetchWithTimeout(url, options = {}, timeout = 15e3) {
3120
3226
  const controller = new AbortController();
@@ -3137,7 +3243,8 @@ async function fetchConfigFromServer() {
3137
3243
  logger.log("flag_fetchConfigFromServer", {
3138
3244
  configData
3139
3245
  });
3140
- return configData.flags;
3246
+ const config = enableBitcoin(configData.flags);
3247
+ return config;
3141
3248
  }
3142
3249
  function deriveAllFlags(config, userContext) {
3143
3250
  return Object.fromEntries(
@@ -3211,7 +3318,7 @@ import React35, {
3211
3318
  useMemo as useMemo4,
3212
3319
  useState as useState4
3213
3320
  } from "react";
3214
- import { FlagKey as FlagKey2 } from "@funkit/utils";
3321
+ import { FlagKey as FlagKey3 } from "@funkit/utils";
3215
3322
 
3216
3323
  // src/consts/customers.ts
3217
3324
  import {
@@ -3333,7 +3440,7 @@ function useFunkitUserIp() {
3333
3440
  if (!userIpInfo) {
3334
3441
  return true;
3335
3442
  }
3336
- const blockedList = getFlag(FlagKey2.BlockedCountries, ALL_MATCH).split(",");
3443
+ const blockedList = getFlag(FlagKey3.BlockedCountries, ALL_MATCH).split(",");
3337
3444
  return isCountryBlocked(blockedList, userIpInfo);
3338
3445
  }, [
3339
3446
  getFlag,
@@ -3447,7 +3554,7 @@ function fetchDataMapFromCache(enableFrogProxyServer) {
3447
3554
  }
3448
3555
  }
3449
3556
  function FunkitMeshProvider({ children }) {
3450
- const enableFrogProxyServer = useFlag(FlagKey3.EnableFrogProxyServer);
3557
+ const enableFrogProxyServer = useFlag(FlagKey4.EnableFrogProxyServer);
3451
3558
  const [meshBrokerDataMap, setMeshBrokerDataMap] = useState5(
3452
3559
  fetchDataMapFromCache(enableFrogProxyServer)
3453
3560
  );
@@ -3916,7 +4023,7 @@ import {
3916
4023
  initializeCheckout as postApiInitializeCheckout
3917
4024
  } from "@funkit/api-base";
3918
4025
  import { FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO as FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO4 } from "@funkit/chains";
3919
- import { FlagKey as FlagKey6, isNotNullish as isNotNullish3 } from "@funkit/utils";
4026
+ import { FlagKey as FlagKey7, isNotNullish as isNotNullish3 } from "@funkit/utils";
3920
4027
  import React39, {
3921
4028
  createContext as createContext10,
3922
4029
  useCallback as useCallback8,
@@ -3949,7 +4056,7 @@ var WEB3_ACCOUNT_BALANCE_MESSAGE = {
3949
4056
  };
3950
4057
 
3951
4058
  // src/hooks/useRelayBypass.ts
3952
- import { FlagKey as FlagKey4, isTokenAddressEquivalent as isTokenAddressEquivalent2 } from "@funkit/utils";
4059
+ import { FlagKey as FlagKey5, isTokenAddressEquivalent as isTokenAddressEquivalent2 } from "@funkit/utils";
3953
4060
  import { useCallback as useCallback4, useMemo as useMemo7 } from "react";
3954
4061
  var isTokenFlagEnabled = (tokenList, tokenAddress) => {
3955
4062
  if (tokenList.includes("*")) {
@@ -3963,9 +4070,9 @@ var isTokenFlagEnabled = (tokenList, tokenAddress) => {
3963
4070
  );
3964
4071
  };
3965
4072
  function useSourceTokenRelayEnabled() {
3966
- const isRelayBypassEnabled = useFlag(FlagKey4.IsRelayBypassEnabled);
4073
+ const isRelayBypassEnabled = useFlag(FlagKey5.IsRelayBypassEnabled);
3967
4074
  const sourceTokensJsonString = useFlag(
3968
- FlagKey4.RelayBypassSourceChainsAndAssets
4075
+ FlagKey5.RelayBypassSourceChainsAndAssets
3969
4076
  );
3970
4077
  const sourceTokens = useMemo7(
3971
4078
  () => safeJSONParse(sourceTokensJsonString),
@@ -3984,12 +4091,12 @@ function useSourceTokenRelayEnabled() {
3984
4091
  }
3985
4092
  function useRelayBypass() {
3986
4093
  const { apiKey } = useFunkitConfig();
3987
- const isRelayBypassEnabled = useFlag(FlagKey4.IsRelayBypassEnabled);
4094
+ const isRelayBypassEnabled = useFlag(FlagKey5.IsRelayBypassEnabled);
3988
4095
  const sourceTokensJsonString = useFlag(
3989
- FlagKey4.RelayBypassSourceChainsAndAssets
4096
+ FlagKey5.RelayBypassSourceChainsAndAssets
3990
4097
  );
3991
4098
  const targetTokensJsonString = useFlag(
3992
- FlagKey4.RelayBypassTargetChainsAndAssets
4099
+ FlagKey5.RelayBypassTargetChainsAndAssets
3993
4100
  );
3994
4101
  const sourceTokens = safeJSONParse(
3995
4102
  sourceTokensJsonString
@@ -4262,7 +4369,7 @@ function useCheckoutDirectExecution() {
4262
4369
  import {
4263
4370
  initializeCheckoutTokenTransferAddress
4264
4371
  } from "@funkit/api-base";
4265
- import { FlagKey as FlagKey5 } from "@funkit/utils";
4372
+ import { FlagKey as FlagKey6 } from "@funkit/utils";
4266
4373
  import { useQuery as useQuery3 } from "@tanstack/react-query";
4267
4374
  import { useCallback as useCallback6 } from "react";
4268
4375
 
@@ -4337,7 +4444,7 @@ var useCheckoutTransferInit = () => {
4337
4444
  const checkoutConfig = checkoutItem?.initSettings.config;
4338
4445
  const { walletAddress, userInfo } = useGeneralWallet();
4339
4446
  const { apiKey } = useFunkitConfig();
4340
- const isQrCodeEnabled = useFlag(FlagKey5.EnableTokenTransfer, false);
4447
+ const isQrCodeEnabled = useFlag(FlagKey6.EnableTokenTransfer, false);
4341
4448
  const recipientAddr = checkoutConfig?.customRecipient || walletAddress || "0x";
4342
4449
  const queryKey = {
4343
4450
  userId: userInfo.id || "",
@@ -4862,7 +4969,7 @@ function useFunkitCheckout(props) {
4862
4969
  const { openWithdrawalModal } = useWithdrawalModal();
4863
4970
  const { connectModalOpen, openConnectModal } = useConnectModal();
4864
4971
  const { isUserLoggedIn } = useGeneralWallet();
4865
- const isCheckoutActivated = useFlag(FlagKey6.IsCheckoutActivated);
4972
+ const isCheckoutActivated = useFlag(FlagKey7.IsCheckoutActivated);
4866
4973
  const onErrorWrapper = useCallback8(
4867
4974
  (payload) => {
4868
4975
  logger.warn(payload.message, payload);
@@ -7022,6 +7129,7 @@ var ASSET_LOGO_SRCS = {
7022
7129
  BLERF: "https://sdk-cdn.fun.xyz/images/blerf.png",
7023
7130
  BRETT: "https://sdk-cdn.fun.xyz/images/brett.svg",
7024
7131
  BSHIB: "https://sdk-cdn.fun.xyz/images/bshib.png",
7132
+ BTC: "https://sdk-cdn.fun.xyz/images/btc.svg",
7025
7133
  CBBTC: "https://sdk-cdn.fun.xyz/images/cbbtc.svg",
7026
7134
  CBETH: "https://sdk-cdn.fun.xyz/images/cbeth.png",
7027
7135
  CRO: "https://sdk-cdn.fun.xyz/images/cro.svg",
@@ -7397,7 +7505,7 @@ var ErrorFallback = () => /* @__PURE__ */ React57.createElement(
7397
7505
  );
7398
7506
 
7399
7507
  // src/components/FunBottomBar/FunBottomBar.tsx
7400
- import { FlagKey as FlagKey7, isMobile } from "@funkit/utils";
7508
+ import { FlagKey as FlagKey8, isMobile } from "@funkit/utils";
7401
7509
  import React61 from "react";
7402
7510
 
7403
7511
  // src/components/FunButton/FunButton.tsx
@@ -7685,7 +7793,7 @@ var FunBottomBar = ({
7685
7793
  onClose
7686
7794
  }) => {
7687
7795
  const { uiCustomizations } = useFunkitConfig();
7688
- const showTagline = useFlag(FlagKey7.ShowPoweredTagline);
7796
+ const showTagline = useFlag(FlagKey8.ShowPoweredTagline);
7689
7797
  const defaultBottomSection = showTagline ? /* @__PURE__ */ React61.createElement(FunPoweredTagline, null) : void 0;
7690
7798
  const bottomSectionComponent = bottomSection ?? defaultBottomSection;
7691
7799
  const hasMultipleButtons = !!onClose;
@@ -8571,11 +8679,11 @@ Dialog.BottomBar = FunBottomBar;
8571
8679
  // src/modals/WithdrwalModal/WithdrawalContent.tsx
8572
8680
  import { FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO as FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO8 } from "@funkit/chains";
8573
8681
  import {
8574
- FlagKey as FlagKey14,
8682
+ FlagKey as FlagKey15,
8575
8683
  formatCryptoAndStringify as formatCryptoAndStringify2,
8576
8684
  formatCurrencyAndStringify as formatCurrencyAndStringify3
8577
8685
  } from "@funkit/utils";
8578
- import React93, { useEffect as useEffect27, useState as useState27 } from "react";
8686
+ import React93, { useEffect as useEffect27, useMemo as useMemo13, useState as useState27 } from "react";
8579
8687
  import { createPortal as createPortal2 } from "react-dom";
8580
8688
  import { useDebounce } from "use-debounce";
8581
8689
  import { useAccount as useAccount3 } from "wagmi";
@@ -8751,7 +8859,7 @@ var getRemoteImageStyles = (isRemoteImage, isRemoteImageLoaded, src) => {
8751
8859
  import React85 from "react";
8752
8860
 
8753
8861
  // src/components/Dropdown/ChainDropdown.tsx
8754
- import { FlagKey as FlagKey8 } from "@funkit/utils";
8862
+ import { FlagKey as FlagKey9 } from "@funkit/utils";
8755
8863
  import React82 from "react";
8756
8864
 
8757
8865
  // src/components/Dropdown/BaseDropdown.tsx
@@ -9660,9 +9768,9 @@ var ChainDropdown = ({
9660
9768
  maxDropdownHeight,
9661
9769
  tagComponent
9662
9770
  }) => {
9663
- const defaultChainIdJson = useFlag(FlagKey8.TokenTransferDefaultChainId);
9771
+ const defaultChainIdJson = useFlag(FlagKey9.TokenTransferDefaultChainId);
9664
9772
  const defaultChainId = safeJSONParse(defaultChainIdJson);
9665
- const chainSortOrderJson = useFlag(FlagKey8.ChainIdSortOrder);
9773
+ const chainSortOrderJson = useFlag(FlagKey9.ChainIdSortOrder);
9666
9774
  const chainSortOrder = safeJSONParse(chainSortOrderJson) || [];
9667
9775
  const chainIds = getSortedChainIds();
9668
9776
  const options = allowUnselect ? [DEFAULT_VALUE, ...chainIds] : chainIds;
@@ -9769,7 +9877,7 @@ var ChainDropdown = ({
9769
9877
  };
9770
9878
 
9771
9879
  // src/components/Dropdown/TokenDropdown.tsx
9772
- import { FlagKey as FlagKey9, safeParseJson as safeParseJson2 } from "@funkit/utils";
9880
+ import { FlagKey as FlagKey10, safeParseJson as safeParseJson3 } from "@funkit/utils";
9773
9881
  import React84, { useState as useState20 } from "react";
9774
9882
 
9775
9883
  // src/utils/tokenIconUrl.ts
@@ -9868,10 +9976,10 @@ var NewTokenBadge = ({ iconSymbol }) => {
9868
9976
  // src/components/Dropdown/TokenDropdown.tsx
9869
9977
  var TOKEN_ICON_SIZE = 16;
9870
9978
  var useNewTokens = () => {
9871
- const bannerJson = useFlag(FlagKey9.NewTokenAssetSelectionBanner);
9872
- const bannerData = safeParseJson2(bannerJson);
9873
- const newBadgeTokensJson = useFlag(FlagKey9.TokenTransferNewTokens);
9874
- const newBadgeData = safeParseJson2(newBadgeTokensJson);
9979
+ const bannerJson = useFlag(FlagKey10.NewTokenAssetSelectionBanner);
9980
+ const bannerData = safeParseJson3(bannerJson);
9981
+ const newBadgeTokensJson = useFlag(FlagKey10.TokenTransferNewTokens);
9982
+ const newBadgeData = safeParseJson3(newBadgeTokensJson);
9875
9983
  const newTokens = newBadgeData && Object.values(newBadgeData).flat();
9876
9984
  const newUniqueTokens = new Set(newTokens);
9877
9985
  const newSymbol = bannerData && newUniqueTokens.has(bannerData.symbol) ? bannerData.symbol : newTokens?.[0];
@@ -9886,7 +9994,7 @@ var TokenDropdown = ({
9886
9994
  alwaysOpenToTop,
9887
9995
  maxDropdownHeight
9888
9996
  }) => {
9889
- const defaultTokensJson = useFlag(FlagKey9.TokenTransferDefaultTokens);
9997
+ const defaultTokensJson = useFlag(FlagKey10.TokenTransferDefaultTokens);
9890
9998
  const defaultTokens = safeJSONParse(defaultTokensJson);
9891
9999
  const enabledTokens = assets[selectedChainId];
9892
10000
  const allTokens = getSortedTokens();
@@ -11469,20 +11577,21 @@ var useAssetSymbolPrice = ({
11469
11577
  refetchInterval
11470
11578
  });
11471
11579
  return {
11472
- ...priceQuery,
11473
11580
  asset: assetQuery.data,
11474
- isLoading: priceQuery.isLoading || assetQuery.isLoading
11581
+ error: assetQuery.error || priceQuery.error,
11582
+ isLoading: priceQuery.isLoading || assetQuery.isLoading,
11583
+ price: priceQuery.price
11475
11584
  };
11476
11585
  };
11477
11586
 
11478
11587
  // src/hooks/useTokenChain.ts
11479
- import { FlagKey as FlagKey11 } from "@funkit/utils";
11588
+ import { FlagKey as FlagKey12 } from "@funkit/utils";
11480
11589
  import { useEffect as useEffect24, useState as useState22 } from "react";
11481
11590
  import { polygon as polygon3 } from "viem/chains";
11482
11591
 
11483
11592
  // src/hooks/useEnabledTokenTransferChainTokens.ts
11484
- import { solanaChain as solanaChain3 } from "@funkit/chains";
11485
- import { FlagKey as FlagKey10 } from "@funkit/utils";
11593
+ import { bitcoinChain, solanaChain as solanaChain3 } from "@funkit/chains";
11594
+ import { FlagKey as FlagKey11 } from "@funkit/utils";
11486
11595
  import { base as base4 } from "viem/chains";
11487
11596
 
11488
11597
  // src/hooks/useIsUsUser.ts
@@ -11504,14 +11613,15 @@ function useIsUsKatanaUser() {
11504
11613
  // src/hooks/useEnabledTokenTransferChainTokens.ts
11505
11614
  function useEnabledTokenTransferChainTokens(transferInit, isWithdrawal) {
11506
11615
  const isBankrUsUser = useIsUsBankrUser();
11507
- const depositAssets = useFlag(FlagKey10.TokenTransferSourceChainsAndAssets);
11508
- const withdrawalAssets = useFlag(FlagKey10.WithdrawalChainsAndAssets);
11616
+ const depositAssets = useFlag(FlagKey11.TokenTransferSourceChainsAndAssets);
11617
+ const withdrawalAssets = useFlag(FlagKey11.WithdrawalChainsAndAssets);
11509
11618
  const assetsJsonString = isWithdrawal ? withdrawalAssets : depositAssets;
11510
11619
  const assets = safeJSONParse(assetsJsonString);
11511
11620
  if (!assets) {
11512
11621
  return {};
11513
11622
  }
11514
11623
  const hasSolanaAddress = !!transferInit?.solanaAddr;
11624
+ const hasBitcoinAddress = !!transferInit?.btcAddrSegwit;
11515
11625
  return Object.keys(assets).reduce(
11516
11626
  (acc, curChainIdString) => {
11517
11627
  const chainId = Number(curChainIdString);
@@ -11519,6 +11629,10 @@ function useEnabledTokenTransferChainTokens(transferInit, isWithdrawal) {
11519
11629
  if (isSolana && !hasSolanaAddress && !isWithdrawal) {
11520
11630
  return acc;
11521
11631
  }
11632
+ const isBitcoin = chainId === bitcoinChain.id;
11633
+ if (isBitcoin && !hasBitcoinAddress && !isWithdrawal) {
11634
+ return acc;
11635
+ }
11522
11636
  if (isBankrUsUser && chainId !== base4.id) {
11523
11637
  return acc;
11524
11638
  }
@@ -11537,7 +11651,7 @@ var useTokenAndChainSelection = (transferInit, defaultValues, isWithdrawal) => {
11537
11651
  transferInit ?? null,
11538
11652
  isWithdrawal
11539
11653
  );
11540
- const defaultChainIdFlag = useFlag(FlagKey11.TokenTransferDefaultChainId);
11654
+ const defaultChainIdFlag = useFlag(FlagKey12.TokenTransferDefaultChainId);
11541
11655
  const defaultChainId = defaultValues?.chainId ?? Number(defaultChainIdFlag);
11542
11656
  const validDefaultChainId = filteredAssets[defaultChainId] !== void 0 ? defaultChainId : polygon3.id;
11543
11657
  const [selectedChainId, setSelectedChainId] = useState22(validDefaultChainId);
@@ -11623,10 +11737,10 @@ import { ClientError as ClientError2 } from "@funkit/utils";
11623
11737
  import { useState as useState25 } from "react";
11624
11738
 
11625
11739
  // src/hooks/useIsBlacklisted.ts
11626
- import { FlagKey as FlagKey12 } from "@funkit/utils";
11740
+ import { FlagKey as FlagKey13 } from "@funkit/utils";
11627
11741
  import { useMemo as useMemo12 } from "react";
11628
11742
  var useIsBlacklisted = (walletAddress, customRecipient) => {
11629
- const flagStr = useFlag(FlagKey12.AddressBlacklist);
11743
+ const flagStr = useFlag(FlagKey13.AddressBlacklist);
11630
11744
  const blacklist = useMemo12(
11631
11745
  () => safeJSONParse(flagStr)?.map((addr) => addr.toLowerCase()) || [],
11632
11746
  [flagStr]
@@ -11638,7 +11752,7 @@ var useIsBlacklisted = (walletAddress, customRecipient) => {
11638
11752
  };
11639
11753
 
11640
11754
  // src/providers/FunkitQuoteContext.tsx
11641
- import { FlagKey as FlagKey13, isNotNullish as isNotNullish5 } from "@funkit/utils";
11755
+ import { FlagKey as FlagKey14, isNotNullish as isNotNullish5 } from "@funkit/utils";
11642
11756
  import React92, {
11643
11757
  createContext as createContext14,
11644
11758
  useCallback as useCallback16,
@@ -11739,7 +11853,7 @@ function FunkitQuoteProvider({ children }) {
11739
11853
  const funkitConfig = useFunkitConfig();
11740
11854
  const wagmiConfig = useConfig3();
11741
11855
  const { walletAddress, logoutSymbol, loginType, userInfo } = useGeneralWallet();
11742
- const enableFrogProxyServer = useFlag(FlagKey13.EnableFrogProxyServer);
11856
+ const enableFrogProxyServer = useFlag(FlagKey14.EnableFrogProxyServer);
11743
11857
  const { getDirectExecutionInfo } = useCheckoutDirectExecution();
11744
11858
  const [latestQuote, setLatestQuote] = useState24(null);
11745
11859
  const [isQuoting, setIsQuoting] = useState24(false);
@@ -12179,7 +12293,7 @@ function useWithdrawalAssets(config) {
12179
12293
  },
12180
12294
  true
12181
12295
  );
12182
- const excludedTokenStr = useFlag(FlagKey14.WithdrawalExcludeTokens);
12296
+ const excludedTokenStr = useFlag(FlagKey15.WithdrawalExcludeTokens);
12183
12297
  const excludedTokens = safeJSONParse(excludedTokenStr);
12184
12298
  if (excludedTokens) {
12185
12299
  for (const chainIdStr of Object.keys(excludedTokens)) {
@@ -12220,7 +12334,6 @@ var WithdrawContent = ({
12220
12334
  onContinue,
12221
12335
  config,
12222
12336
  withdrawalItem
12223
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>
12224
12337
  }) => {
12225
12338
  const sourceTokenBalance = withdrawalItem?.withdrawalSourceTokenBalance?.() || 0;
12226
12339
  const token = config.sourceTokenSymbol;
@@ -12244,30 +12357,33 @@ var WithdrawContent = ({
12244
12357
  handleTokenChange,
12245
12358
  selectedChainName
12246
12359
  } = useWithdrawalAssets(config);
12247
- const assetInfo = useAssetSymbolPrice({
12360
+ const {
12361
+ asset: targetAssetInfo,
12362
+ error: targetAssetFetchError,
12363
+ price: targetUnitPrice
12364
+ } = useAssetSymbolPrice({
12248
12365
  chainId: selectedChainId.toString(),
12249
12366
  symbol: selectedToken,
12250
12367
  refetchInterval: PRICE_REFRESH_INTERVAL
12251
12368
  });
12252
- const targetAssetAmount = assetInfo?.price ? Number(debouncedAmount) / assetInfo?.price : void 0;
12369
+ const targetAssetAmount = targetUnitPrice ? Number(debouncedAmount) / targetUnitPrice : void 0;
12253
12370
  useEffect27(() => {
12254
12371
  setTimeout(() => {
12255
12372
  updateTargetAssetAmount(targetAssetAmount ?? 0);
12256
12373
  }, 0);
12257
12374
  }, [targetAssetAmount, updateTargetAssetAmount]);
12258
12375
  useEffect27(() => {
12259
- const asset = assetInfo?.asset;
12260
- if (!asset) {
12376
+ if (!targetAssetInfo) {
12261
12377
  return;
12262
12378
  }
12263
12379
  updateTargetAsset({
12264
- targetAsset: asset.address,
12380
+ targetAsset: targetAssetInfo.address,
12265
12381
  targetChain: selectedChainId.toString(),
12266
- targetAssetTicker: asset.symbol,
12382
+ targetAssetTicker: targetAssetInfo.symbol,
12267
12383
  targetAssetMinAmount: 0,
12268
12384
  iconSrc: getTokenIconUrl(selectedToken)
12269
12385
  });
12270
- }, [assetInfo.asset, updateTargetAsset, selectedChainId, selectedToken]);
12386
+ }, [targetAssetInfo, updateTargetAsset, selectedChainId, selectedToken]);
12271
12387
  const {
12272
12388
  isLoading: isQuoteLoading,
12273
12389
  data: quote,
@@ -12281,7 +12397,7 @@ var WithdrawContent = ({
12281
12397
  sourceAmount: Number(debouncedAmount),
12282
12398
  chainId: selectedChainId.toString(),
12283
12399
  symbol: selectedToken,
12284
- targetAsset: assetInfo?.asset?.address
12400
+ targetAsset: targetAssetInfo?.address
12285
12401
  });
12286
12402
  const {
12287
12403
  isConnected,
@@ -12400,7 +12516,7 @@ var WithdrawContent = ({
12400
12516
  const bottomSectionRef = useBottomSectionRef("withdrawal");
12401
12517
  const showAddressError = addressInputTouched && !isValidAddress && recipientAddress !== "";
12402
12518
  const showAmountError = amountInputTouched && amount !== "" && !isWithdrawAmountValid;
12403
- const canContinue = recipientAddress && amount && token && selectedChainId && (!isQuoteLoading || isInstantQuoting) && !showAmountError && !showAddressError && !isCheckingAddressRisk && !addressAssessment && isValidAddressAndChain && amount === debouncedAmount;
12519
+ const canContinue = recipientAddress && amount && token && selectedChainId && (quote || isPlaceholderData || isQuoteLoading && isInstantQuoting) && !showAmountError && !showAddressError && !isCheckingAddressRisk && !addressAssessment && isValidAddressAndChain && amount === debouncedAmount;
12404
12520
  const { totalImpactUsd, gasUsd } = extractRelayFeeInfo(
12405
12521
  quote?.baseQuote?.metadata
12406
12522
  );
@@ -12408,6 +12524,24 @@ var WithdrawContent = ({
12408
12524
  const receiveAmountFiat = quote || isInstantQuoting ? Number(debouncedAmount || 0) : 0;
12409
12525
  const receiveAmountFiatTotal = receiveAmountFiat - totalImpactUsd - gasUsd;
12410
12526
  const withdrawButtonText = getWithdrawButtonText();
12527
+ const errorNotification = useMemo13(() => {
12528
+ if (quoteErrorObject) {
12529
+ return {
12530
+ message: getRelayQuoteErrorDisplayMessage(quoteErrorObject.message),
12531
+ type: "default"
12532
+ };
12533
+ }
12534
+ if (withdrawalError) {
12535
+ return withdrawalError;
12536
+ }
12537
+ if (targetAssetFetchError) {
12538
+ return {
12539
+ message: "Failed to fetch asset price",
12540
+ type: "default"
12541
+ };
12542
+ }
12543
+ return null;
12544
+ }, [quoteErrorObject, targetAssetFetchError, withdrawalError]);
12411
12545
  return /* @__PURE__ */ React93.createElement(Box, { id: "withdrawal-flow", display: "flex", flexDirection: "column", gap: "18" }, /* @__PURE__ */ React93.createElement(Box, { display: "flex", flexDirection: "column", gap: "8" }, /* @__PURE__ */ React93.createElement(Box, { display: "flex", flexDirection: "column", gap: "4" }, /* @__PURE__ */ React93.createElement(Text, { size: "12", weight: "medium" }, "Recipient address"), /* @__PURE__ */ React93.createElement(
12412
12546
  FunInput,
12413
12547
  {
@@ -12552,9 +12686,9 @@ var WithdrawContent = ({
12552
12686
  topSection: /* @__PURE__ */ React93.createElement(
12553
12687
  FunNotification,
12554
12688
  {
12555
- description: quoteErrorObject ? getRelayQuoteErrorDisplayMessage(quoteErrorObject.message) : withdrawalError?.message,
12556
- type: withdrawalError?.type,
12557
- isVisible: !!withdrawalError || !!quoteErrorObject
12689
+ description: errorNotification?.message,
12690
+ type: errorNotification?.type,
12691
+ isVisible: !!errorNotification
12558
12692
  }
12559
12693
  ),
12560
12694
  actionButtonProps: {
@@ -12594,7 +12728,7 @@ function getCheckoutCompletionTime(checkout) {
12594
12728
  }
12595
12729
 
12596
12730
  // src/components/FunCheckoutHistory/FunCheckoutHistoryDetail.tsx
12597
- import React215, { useCallback as useCallback42, useMemo as useMemo34, useState as useState61 } from "react";
12731
+ import React215, { useCallback as useCallback42, useMemo as useMemo35, useState as useState61 } from "react";
12598
12732
  import { createPortal as createPortal14 } from "react-dom";
12599
12733
 
12600
12734
  // src/components/HelpAlert/HelpAlert.tsx
@@ -12944,10 +13078,10 @@ import { useAccount as useAccount6 } from "wagmi";
12944
13078
  // src/components/FunPayments/FunPaymentMethods.tsx
12945
13079
  import { BridgeCustomerStatus as BridgeCustomerStatus3 } from "@funkit/api-base";
12946
13080
  import {
12947
- FlagKey as FlagKey17,
13081
+ FlagKey as FlagKey18,
12948
13082
  formatCurrencyAndStringify as formatCurrencyAndStringify4,
12949
13083
  formatSecondsToReadableForm,
12950
- safeParseJson as safeParseJson3
13084
+ safeParseJson as safeParseJson4
12951
13085
  } from "@funkit/utils";
12952
13086
  import React103 from "react";
12953
13087
 
@@ -13031,9 +13165,9 @@ var isSoftRejected = (customer) => customer && isKycUninitialized(customer.statu
13031
13165
  var FIAT_PROCESSING_TIME = "1-2 business days";
13032
13166
 
13033
13167
  // src/hooks/useCheckoutTimeEstimate.ts
13034
- import { FlagKey as FlagKey15 } from "@funkit/utils";
13168
+ import { FlagKey as FlagKey16 } from "@funkit/utils";
13035
13169
  function useCheckoutTimeEstimate(originalTimeEstimationMs, paymentMethod = "card" /* CARD */, bypassFlag = false) {
13036
- const timeEstimatesJsonString = useFlag(FlagKey15.CheckoutTimeEstimateOverrides);
13170
+ const timeEstimatesJsonString = useFlag(FlagKey16.CheckoutTimeEstimateOverrides);
13037
13171
  const timeEstimates = safeJSONParse(
13038
13172
  timeEstimatesJsonString
13039
13173
  );
@@ -13050,7 +13184,7 @@ import {
13050
13184
  getBridgeKycLink
13051
13185
  } from "@funkit/api-base";
13052
13186
  import { FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO as FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO11 } from "@funkit/chains";
13053
- import { FlagKey as FlagKey16 } from "@funkit/utils";
13187
+ import { FlagKey as FlagKey17 } from "@funkit/utils";
13054
13188
  import { useQuery as useQuery11, useQueryClient } from "@tanstack/react-query";
13055
13189
  import { useCallback as useCallback18 } from "react";
13056
13190
  var sepaCountryCode = [
@@ -13130,8 +13264,8 @@ function useFiatEnabled() {
13130
13264
  const isEuSepaUser = sepaCountryCode.includes(
13131
13265
  userIpInfo?.alpha2 || "PLACEHOLDER"
13132
13266
  );
13133
- const isTokenTransferEnabled = useFlag(FlagKey16.EnableTokenTransfer);
13134
- const isFiatEnabled = useFlag(FlagKey16.EnableFiatDeposit);
13267
+ const isTokenTransferEnabled = useFlag(FlagKey17.EnableTokenTransfer);
13268
+ const isFiatEnabled = useFlag(FlagKey17.EnableFiatDeposit);
13135
13269
  return isEuSepaUser && isTokenTransferEnabled && isFiatEnabled;
13136
13270
  }
13137
13271
  function useFrogAccounts() {
@@ -13282,7 +13416,7 @@ import {
13282
13416
  FUNKIT_CONNECT_CHECKOUT_NATIVE_CURRENCY_ADDRESS as FUNKIT_CONNECT_CHECKOUT_NATIVE_CURRENCY_ADDRESS3,
13283
13417
  FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO as FUNKIT_CONNECT_SUPPORTED_CHAINS_INFO12
13284
13418
  } from "@funkit/chains";
13285
- import { useMemo as useMemo13 } from "react";
13419
+ import { useMemo as useMemo14 } from "react";
13286
13420
 
13287
13421
  // src/utils/assets.ts
13288
13422
  import { formatUnits } from "viem";
@@ -13340,7 +13474,7 @@ var processWalletAssets = (walletAssets, targetChain) => {
13340
13474
  };
13341
13475
  function useWalletAssetHoldings(targetChain) {
13342
13476
  const { walletAssets, isLoading, totalWalletAssetsUsd } = useWalletAssets();
13343
- const processedAssets = useMemo13(
13477
+ const processedAssets = useMemo14(
13344
13478
  () => processWalletAssets(walletAssets, targetChain),
13345
13479
  [targetChain, walletAssets]
13346
13480
  );
@@ -14610,9 +14744,9 @@ var TransferPaymentMethodItem = ({
14610
14744
  paymentIcon
14611
14745
  }) => {
14612
14746
  const { textCustomizations } = useFunkitConfig();
14613
- const bannerJson = useFlag(FlagKey17.NewTokenAssetSelectionBanner);
14614
- const bannerData = safeParseJson3(bannerJson);
14615
- const depositAssetsJson = useFlag(FlagKey17.TokenTransferSourceChainsAndAssets);
14747
+ const bannerJson = useFlag(FlagKey18.NewTokenAssetSelectionBanner);
14748
+ const bannerData = safeParseJson4(bannerJson);
14749
+ const depositAssetsJson = useFlag(FlagKey18.TokenTransferSourceChainsAndAssets);
14616
14750
  const depositAssetsData = safeJSONParse(depositAssetsJson);
14617
14751
  const getTokenTransferIcon = () => {
14618
14752
  const uniqueChainIds = new Set(Object.keys(depositAssetsData ?? {}));
@@ -14827,7 +14961,7 @@ var BankIconActive = ({ size = 20 }) => {
14827
14961
 
14828
14962
  // src/components/FunConnectOptions/FunSignInStep.tsx
14829
14963
  import { groupBy, isMobile as isMobile8, isSafari as isSafari3, redirectInMobile as redirectInMobile2 } from "@funkit/utils";
14830
- import React209, { Fragment as Fragment2, useCallback as useCallback41, useMemo as useMemo33, useState as useState59 } from "react";
14964
+ import React209, { Fragment as Fragment2, useCallback as useCallback41, useMemo as useMemo34, useState as useState59 } from "react";
14831
14965
 
14832
14966
  // src/providers/walletConnectDeepLink.ts
14833
14967
  var storageKey2 = "WALLETCONNECT_DEEPLINK_CHOICE";
@@ -15245,7 +15379,7 @@ var SocialsIcon = () => {
15245
15379
  };
15246
15380
 
15247
15381
  // src/components/FunConnectOptions/FunConnectOptions.tsx
15248
- import React208, { useCallback as useCallback40, useMemo as useMemo32, useState as useState58 } from "react";
15382
+ import React208, { useCallback as useCallback40, useMemo as useMemo33, useState as useState58 } from "react";
15249
15383
 
15250
15384
  // src/hooks/useAnimatedNavigation.ts
15251
15385
  import { useCallback as useCallback19, useState as useState29 } from "react";
@@ -15325,11 +15459,11 @@ import {
15325
15459
  } from "react";
15326
15460
 
15327
15461
  // src/hooks/useCheckoutQuoteNotification.ts
15328
- import { useMemo as useMemo14 } from "react";
15462
+ import { useMemo as useMemo15 } from "react";
15329
15463
  function useCheckoutQuoteNotification() {
15330
15464
  const { clearCheckoutQuoteMessages } = useQuoteContext();
15331
15465
  const { quoteErrorMessage, quoteStepMessage } = useQuoteContext();
15332
- const quoteNotification = useMemo14(() => {
15466
+ const quoteNotification = useMemo15(() => {
15333
15467
  if (quoteErrorMessage !== "") {
15334
15468
  return {
15335
15469
  messageType: "error",
@@ -16827,7 +16961,7 @@ function CheckoutHelp({
16827
16961
  }
16828
16962
 
16829
16963
  // src/modals/CheckoutModal/ConfirmationStep/ConfirmationStep.tsx
16830
- import React149, { useEffect as useEffect34, useMemo as useMemo19, useState as useState40 } from "react";
16964
+ import React149, { useEffect as useEffect34, useMemo as useMemo20, useState as useState40 } from "react";
16831
16965
  import { createPortal as createPortal7 } from "react-dom";
16832
16966
 
16833
16967
  // src/providers/UserPresenceContext.tsx
@@ -16868,7 +17002,7 @@ import { DirectExecutionType as DirectExecutionType2 } from "@funkit/api-base";
16868
17002
 
16869
17003
  // src/components/FunInfoBanner/FunInfoBanner.tsx
16870
17004
  import React136 from "react";
16871
- import { FlagKey as FlagKey18, safeParseJson as safeParseJson4 } from "@funkit/utils";
17005
+ import { FlagKey as FlagKey19, safeParseJson as safeParseJson5 } from "@funkit/utils";
16872
17006
 
16873
17007
  // src/components/FunInfoBanner/EphemeralInfoBanner.tsx
16874
17008
  import React135, { useState as useState33 } from "react";
@@ -16906,8 +17040,8 @@ var EphemeralInfoBanner = ({
16906
17040
 
16907
17041
  // src/components/FunInfoBanner/FunInfoBanner.tsx
16908
17042
  var FunInfoBanner = () => {
16909
- const bannerJson = useFlag(FlagKey18.ShowInfoBanner);
16910
- const bannerData = safeParseJson4(bannerJson);
17043
+ const bannerJson = useFlag(FlagKey19.ShowInfoBanner);
17044
+ const bannerData = safeParseJson5(bannerJson);
16911
17045
  if (!bannerData || !bannerData.message) {
16912
17046
  return null;
16913
17047
  }
@@ -16929,7 +17063,7 @@ import {
16929
17063
  } from "@funkit/utils";
16930
17064
  import NumberFlow from "@number-flow/react";
16931
17065
  import { motion as motion7 } from "motion/react";
16932
- import React138, { useMemo as useMemo16 } from "react";
17066
+ import React138, { useMemo as useMemo17 } from "react";
16933
17067
 
16934
17068
  // src/consts/design.ts
16935
17069
  var mapFontLineHeightToNumberFlowHeight = {
@@ -16948,7 +17082,7 @@ function useReceiveAmountLabel(_) {
16948
17082
  // src/components/FunAssetAvatar/FunAssetAvatar.tsx
16949
17083
  import { isNotNullish as isNotNullish6 } from "@funkit/utils";
16950
17084
  import clsx16 from "clsx";
16951
- import React137, { useMemo as useMemo15 } from "react";
17085
+ import React137, { useMemo as useMemo16 } from "react";
16952
17086
 
16953
17087
  // src/components/FunAssetAvatar/FunAssetAvatar.css.ts
16954
17088
  var chainContainerStyle = "uwrdc22 _1rsrm2f18 _1rsrm2fa _1rsrm2f4 _1rsrm2f4g";
@@ -16968,7 +17102,7 @@ function FunAssetAvatar({
16968
17102
  largeChainIcon = false
16969
17103
  }) {
16970
17104
  const chainMetadata = chainMetadataById[Number.parseInt((chainId || "").toString())] || null;
16971
- const finalAssetSrc = useMemo15(() => {
17105
+ const finalAssetSrc = useMemo16(() => {
16972
17106
  const normalizedTicker = assetTicker?.toUpperCase() || "";
16973
17107
  const defaultSrc = ASSET_LOGO_SRCS[normalizedTicker];
16974
17108
  if (prioritizeDefaults) {
@@ -17068,7 +17202,7 @@ function PaymentAmountSummary({
17068
17202
  })
17069
17203
  });
17070
17204
  const sourceTokenAmount = quote?.finalPaymentTokenAmount ? Number.parseFloat(quote.finalPaymentTokenAmount) : void 0;
17071
- const paymentTokenUsdAmount = useMemo16(() => {
17205
+ const paymentTokenUsdAmount = useMemo17(() => {
17072
17206
  if (!quote) {
17073
17207
  return void 0;
17074
17208
  }
@@ -17076,7 +17210,7 @@ function PaymentAmountSummary({
17076
17210
  quote.baseQuote.estSubtotalUsd + Number.parseFloat(quote.finalPaymentFeeUsd) - Number.parseFloat(quote.finalSpreadUsd)
17077
17211
  );
17078
17212
  }, [quote]);
17079
- const receiveTokenUsdAmount = useMemo16(() => {
17213
+ const receiveTokenUsdAmount = useMemo17(() => {
17080
17214
  if (!quote) {
17081
17215
  return void 0;
17082
17216
  }
@@ -17395,7 +17529,7 @@ var DirectExecutionBrokerageAndCardAlert = () => {
17395
17529
  };
17396
17530
 
17397
17531
  // src/modals/CheckoutModal/ConfirmationStep/DisclaimerText.tsx
17398
- import React144, { useMemo as useMemo17 } from "react";
17532
+ import React144, { useMemo as useMemo18 } from "react";
17399
17533
  var DisclaimerText = ({
17400
17534
  continueText,
17401
17535
  isCardPayment,
@@ -17430,7 +17564,7 @@ var DisclaimerText = ({
17430
17564
  ), ", and the ", /* @__PURE__ */ React144.createElement(FunLinkButton, { href: "https://morpho.org/", inline: true, text: "terms" }), " applicable to third-party Morpho vaults", ".") : /* @__PURE__ */ React144.createElement(React144.Fragment, null, showCardDisclaimer && `${cardDisclaimer} `, "By clicking on ", continueText, ", you agree to our", " ", /* @__PURE__ */ React144.createElement(FunLinkButton, { href: FUN_TERMS_URL, inline: true, text: "terms" }), ".");
17431
17565
  };
17432
17566
  function useCardDisclaimer(checkoutItem, finalConvertedAssetName) {
17433
- const cardDisclaimer = useMemo17(() => {
17567
+ const cardDisclaimer = useMemo18(() => {
17434
17568
  if (!checkoutItem || !finalConvertedAssetName) {
17435
17569
  return null;
17436
17570
  }
@@ -18013,7 +18147,7 @@ function usePostCheckout({
18013
18147
  }
18014
18148
 
18015
18149
  // src/modals/CheckoutModal/ConfirmationStep/useQuoteRefresh.ts
18016
- import { useCallback as useCallback26, useEffect as useEffect33, useMemo as useMemo18, useRef as useRef15, useState as useState39 } from "react";
18150
+ import { useCallback as useCallback26, useEffect as useEffect33, useMemo as useMemo19, useRef as useRef15, useState as useState39 } from "react";
18017
18151
 
18018
18152
  // src/hooks/useCountdown.tsx
18019
18153
  import React148 from "react";
@@ -18276,7 +18410,7 @@ function useQuoteRefresh({
18276
18410
  },
18277
18411
  [isOnHold, restartCountdown, setCheckoutQuote, triggerAssetConfirm]
18278
18412
  );
18279
- const quoteError = useMemo18(() => {
18413
+ const quoteError = useMemo19(() => {
18280
18414
  if (quoteErrorMessage && !isQuoting) {
18281
18415
  return {
18282
18416
  message: quoteErrorMessage,
@@ -18409,7 +18543,7 @@ function ConfirmationStep({
18409
18543
  refreshIntervalSeconds: directExecutionType === DirectExecutionType2.RELAY ? RELAY_ESTIMATE_REFRESH_INTERVAL_SEC : DEFAULT_ESTIMATE_REFRESH_INTERVAL_SEC
18410
18544
  })
18411
18545
  );
18412
- const error = useMemo19(() => {
18546
+ const error = useMemo20(() => {
18413
18547
  if (!isInitialQuoting && moonpayAmountCheck?.isInvalid) {
18414
18548
  return {
18415
18549
  message: moonpayAmountCheck.message,
@@ -18424,7 +18558,7 @@ function ConfirmationStep({
18424
18558
  quoteError,
18425
18559
  isInitialQuoting
18426
18560
  ]);
18427
- const stepMessage = useMemo19(() => {
18561
+ const stepMessage = useMemo20(() => {
18428
18562
  if (initialQuoteStep) {
18429
18563
  return initialQuoteStep;
18430
18564
  }
@@ -18481,7 +18615,7 @@ function ConfirmationStep({
18481
18615
  const isStepLoading = isInitialQuoting || isContinuing || isRefreshing;
18482
18616
  const uiCustomizations = funkitConfig.uiCustomizations?.confirmationScreen;
18483
18617
  const customRecipient = checkoutItem?.initSettings.config.customRecipient;
18484
- const showKatanaBridgeAlert = useMemo19(() => {
18618
+ const showKatanaBridgeAlert = useMemo20(() => {
18485
18619
  const relayQuoteMetadata = latestQuote?.baseQuote?.metadata;
18486
18620
  if (!relayQuoteMetadata) {
18487
18621
  return false;
@@ -18495,7 +18629,7 @@ function ConfirmationStep({
18495
18629
  // https://fun-xyz.slack.com/archives/C08PVUDA1M2/p1752179735981389?thread_ts=1752176009.628309&cid=C08PVUDA1M2
18496
18630
  swapImpact + appFeePercent > KATANA_BRIDGE_ALERT_THRESHOLD_PERCENT;
18497
18631
  }, [funkitConfig.apiKey, latestQuote, checkoutItem]);
18498
- const showDirectExecutionNotificationBanner = useMemo19(() => {
18632
+ const showDirectExecutionNotificationBanner = useMemo20(() => {
18499
18633
  const isRelayEnabled = checkoutItem !== null && getIsRelayEnabled({
18500
18634
  fromChainId: checkoutItem.selectedSourceAssetInfo.chainId,
18501
18635
  fromTokenAddress: checkoutItem.selectedSourceAssetInfo.address || "",
@@ -18747,7 +18881,7 @@ import { getMeldDefaultFiat } from "@funkit/api-base";
18747
18881
  import { useQuery as useQuery13 } from "@tanstack/react-query";
18748
18882
 
18749
18883
  // src/hooks/queries/useMeldCryptoCurrencyCode.ts
18750
- import { FlagKey as FlagKey19 } from "@funkit/utils";
18884
+ import { FlagKey as FlagKey20 } from "@funkit/utils";
18751
18885
  import { arbitrum as arbitrum3, base as base6, polygon as polygon5 } from "viem/chains";
18752
18886
  var ARB_USDC = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831".toLowerCase();
18753
18887
  var POLYGON_USDC = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359".toLowerCase();
@@ -18780,7 +18914,7 @@ function useMeldCryptoCurrencyCode() {
18780
18914
  return mappedCurrency;
18781
18915
  }
18782
18916
  function useIsMeldEnabled() {
18783
- const meldEnabled = useFlag(FlagKey19.EnableMeldPayment);
18917
+ const meldEnabled = useFlag(FlagKey20.EnableMeldPayment);
18784
18918
  const meldCurrencyCode = useMeldCryptoCurrencyCode();
18785
18919
  return meldEnabled && !!meldCurrencyCode;
18786
18920
  }
@@ -18892,16 +19026,35 @@ var useMeldLimitError = (amount, fiatCurrency) => {
18892
19026
  return void 0;
18893
19027
  };
18894
19028
 
19029
+ // src/hooks/useFiatExchangeRates.ts
19030
+ import { getFiatExchangeRates } from "@funkit/api-base";
19031
+ import { useQuery as useQuery15 } from "@tanstack/react-query";
19032
+ function useFiatExchangeRates(enabled = true) {
19033
+ const { data, isLoading, error } = useQuery15({
19034
+ queryKey: ["fiatExchangeRates"],
19035
+ queryFn: () => getFiatExchangeRates(),
19036
+ refetchOnMount: false,
19037
+ refetchOnReconnect: false,
19038
+ refetchOnWindowFocus: false,
19039
+ gcTime: 1e3 * 60 * 60,
19040
+ // 1 hour
19041
+ enabled
19042
+ });
19043
+ return { data, isLoading, error };
19044
+ }
19045
+
18895
19046
  // src/modals/CheckoutModal/InputAmount/InputAmountLoaded.tsx
18896
- import { MeldServiceProvider as MeldServiceProvider2 } from "@funkit/api-base";
18897
19047
  import {
18898
- FlagKey as FlagKey22,
19048
+ MeldServiceProvider as MeldServiceProvider2
19049
+ } from "@funkit/api-base";
19050
+ import {
19051
+ FlagKey as FlagKey23,
18899
19052
  formatCryptoAndStringify as formatCryptoAndStringify4,
18900
19053
  formatCurrencyAndStringify as formatCurrencyAndStringify9,
18901
19054
  isTokenEquivalent as isTokenEquivalent5,
18902
19055
  round as round4
18903
19056
  } from "@funkit/utils";
18904
- import React163, { useMemo as useMemo21 } from "react";
19057
+ import React163, { useMemo as useMemo22 } from "react";
18905
19058
 
18906
19059
  // src/components/CurrencySelector/CurrencySelector.tsx
18907
19060
  import React152 from "react";
@@ -19167,7 +19320,7 @@ var MeldProviderLabel = ({
19167
19320
  };
19168
19321
 
19169
19322
  // src/components/SourcePaymentMethodItem/SourcePaymentMethodItem.tsx
19170
- import { FlagKey as FlagKey20 } from "@funkit/utils";
19323
+ import { FlagKey as FlagKey21 } from "@funkit/utils";
19171
19324
  import clsx17 from "clsx";
19172
19325
  import { useAnimate as useAnimate2 } from "motion/react";
19173
19326
  import React157 from "react";
@@ -19772,8 +19925,8 @@ var SourcePaymentMethodItem = ({
19772
19925
  icon: /* @__PURE__ */ React157.createElement(MasterCardPillIcon, { key: "mastercard", backdropColor })
19773
19926
  }
19774
19927
  ];
19775
- const isCardEnabled = useFlag(FlagKey20.EnableCard);
19776
- const isBrokerageEnabled = useFlag(FlagKey20.EnableBrokerage);
19928
+ const isCardEnabled = useFlag(FlagKey21.EnableCard);
19929
+ const isBrokerageEnabled = useFlag(FlagKey21.EnableBrokerage);
19777
19930
  const usableAlternativeIcons = icons.filter(({ paymentMethod }) => {
19778
19931
  if (paymentMethod === type || paymentMethod === "card" /* CARD */ && !isCardEnabled || paymentMethod === "brokerage" /* BROKERAGE */ && !isBrokerageEnabled) {
19779
19932
  return false;
@@ -20082,7 +20235,7 @@ var useMeldLink = (sourceAmount, sourceCurrencyCode = "USD") => {
20082
20235
 
20083
20236
  // src/modals/CheckoutModal/MeldQuotes/useMeldQuotes.tsx
20084
20237
  import { getMeldQuotes } from "@funkit/api-base";
20085
- import { useQuery as useQuery15 } from "@tanstack/react-query";
20238
+ import { useQuery as useQuery16 } from "@tanstack/react-query";
20086
20239
  import { useDebounce as useDebounce2 } from "use-debounce";
20087
20240
  var DEBOUNCE_DELAY = 500;
20088
20241
  var COUNTDOWN_INTERVAL_SEC = 60;
@@ -20095,7 +20248,7 @@ var useMeldQuotes = (sourceAmount, fiatCurrency) => {
20095
20248
  const destinationCurrencyCode = useMeldCryptoCurrencyCode();
20096
20249
  const isPolymarket = isPolymarketCustomer(apiKey);
20097
20250
  const sourceCurrencyCode = fiatCurrency || "USD";
20098
- const query = useQuery15({
20251
+ const query = useQuery16({
20099
20252
  queryKey: [
20100
20253
  "meld",
20101
20254
  "quotes",
@@ -20148,6 +20301,22 @@ var useMeldQuotes = (sourceAmount, fiatCurrency) => {
20148
20301
  };
20149
20302
  };
20150
20303
 
20304
+ // src/utils/getExchangeRate.ts
20305
+ var DEFAULT_BIPS_MARKUP = 500;
20306
+ var getExchangeRate = (currency, currencyExchangeRates, bipsMarkup = DEFAULT_BIPS_MARKUP) => {
20307
+ if (!currency || !currencyExchangeRates) {
20308
+ return void 0;
20309
+ }
20310
+ if (currency === "USD") {
20311
+ return 1;
20312
+ }
20313
+ const exchangeRate = currency in currencyExchangeRates ? currencyExchangeRates[currency] : void 0;
20314
+ if (!exchangeRate) {
20315
+ return void 0;
20316
+ }
20317
+ return exchangeRate * (1 + bipsMarkup / 1e4);
20318
+ };
20319
+
20151
20320
  // src/components/Icons/SwitchIcon.tsx
20152
20321
  import React160 from "react";
20153
20322
  var SwitchIcon = () => {
@@ -20363,7 +20532,7 @@ function InputAmountLayout({
20363
20532
  }
20364
20533
 
20365
20534
  // src/modals/CheckoutModal/InputAmount/QuickOptions.tsx
20366
- import { FlagKey as FlagKey21, clamp as clamp2, formatCurrencyAndStringify as formatCurrencyAndStringify8 } from "@funkit/utils";
20535
+ import { FlagKey as FlagKey22, clamp as clamp2, formatCurrencyAndStringify as formatCurrencyAndStringify8 } from "@funkit/utils";
20367
20536
  import React162 from "react";
20368
20537
  var USD_AMOUNT_OPTIONS_PCT = [25, 50, 75, 100];
20369
20538
  function deduplicateArray(arr) {
@@ -20371,7 +20540,7 @@ function deduplicateArray(arr) {
20371
20540
  }
20372
20541
  function useFiatAmountOptions(currency) {
20373
20542
  const isMeldEnabled = useIsMeldEnabled();
20374
- const currencyQuickOptionStr = useFlag(FlagKey21.MeldQuickOptions);
20543
+ const currencyQuickOptionStr = useFlag(FlagKey22.MeldQuickOptions);
20375
20544
  const currencyQuickOption = safeJSONParse(
20376
20545
  currencyQuickOptionStr
20377
20546
  );
@@ -20439,7 +20608,7 @@ var QuickOptions = ({
20439
20608
  import {
20440
20609
  useCallback as useCallback29,
20441
20610
  useEffect as useEffect35,
20442
- useMemo as useMemo20,
20611
+ useMemo as useMemo21,
20443
20612
  useReducer as useReducer3,
20444
20613
  useRef as useRef17,
20445
20614
  useState as useState42
@@ -20508,9 +20677,11 @@ function initializeState({
20508
20677
  paymentMethod,
20509
20678
  quickOptions,
20510
20679
  sourceHolding,
20511
- unitPrice: realUnitPrice
20680
+ unitPrice: realUnitPrice,
20681
+ fiatCurrencyExchangeRate,
20682
+ meldEnabled
20512
20683
  }) {
20513
- const { targetAssetAmount, targetChain, targetAssetTicker } = checkoutConfig;
20684
+ const { targetAssetAmount, targetChain, targetAssetTicker, isDefiMode } = checkoutConfig;
20514
20685
  const isInputInFiat = true;
20515
20686
  const unitPrice = isStablecoin(targetAssetTicker) ? 1 : realUnitPrice;
20516
20687
  const usdAvailableAmount = getUsdAvailableAmount(
@@ -20542,14 +20713,24 @@ function initializeState({
20542
20713
  if (defaultAmount !== void 0) {
20543
20714
  return defaultAmount;
20544
20715
  }
20716
+ const targetAssetFiat = typeof targetAssetAmount !== "undefined" ? targetAssetAmount * unitPrice : void 0;
20545
20717
  if (paymentMethod === "balance" /* ACCOUNT_BALANCE */) {
20718
+ if (isDefiMode && typeof targetAssetFiat !== "undefined" && usdAvailableAmount !== null && usdAvailableAmount >= targetAssetFiat) {
20719
+ return targetAssetFiat;
20720
+ }
20546
20721
  return calcInitialFiatAmount(usdAvailableAmount ?? 0);
20547
20722
  }
20723
+ if (isDefiMode && !meldEnabled && typeof targetAssetFiat !== "undefined") {
20724
+ return targetAssetFiat;
20725
+ }
20726
+ if (typeof targetAssetFiat !== "undefined" && typeof fiatCurrencyExchangeRate !== "undefined" && isDefiMode) {
20727
+ return targetAssetFiat * fiatCurrencyExchangeRate;
20728
+ }
20548
20729
  if (paymentMethod === "card" /* CARD */) {
20549
20730
  return getDefaultAmountFromQuickOptions(quickOptions);
20550
20731
  }
20551
- if (targetAssetAmount !== void 0) {
20552
- return targetAssetAmount * unitPrice;
20732
+ if (typeof targetAssetFiat !== "undefined") {
20733
+ return targetAssetFiat;
20553
20734
  }
20554
20735
  return USD_INITIAL_AMOUNT;
20555
20736
  }
@@ -20562,7 +20743,9 @@ function initializeState({
20562
20743
  locale,
20563
20744
  usdAvailableAmount,
20564
20745
  usdMaxAmount,
20565
- usdMinAmount
20746
+ usdMinAmount,
20747
+ fiatCurrencyExchangeRate,
20748
+ meldEnabled
20566
20749
  };
20567
20750
  }
20568
20751
  function reduceState(state, action) {
@@ -20686,7 +20869,7 @@ var MAX_WIDTH = 310;
20686
20869
  function useAmountInput(options) {
20687
20870
  const isMeldEnabled = useIsMeldEnabled();
20688
20871
  const [state, dispatch] = useReducer3(reduceState, options, initializeState);
20689
- const derivedState = useMemo20(() => getDerivedState(state), [state]);
20872
+ const derivedState = useMemo21(() => getDerivedState(state), [state]);
20690
20873
  const inputRef = useRef17(null);
20691
20874
  const { inputValue, locale } = state;
20692
20875
  const { inputDecimals, inputPrefix, placeholder } = derivedState;
@@ -21018,22 +21201,26 @@ function InputAmountLoaded({
21018
21201
  onClose,
21019
21202
  sourceHolding,
21020
21203
  unitPrice,
21204
+ currencyExchangeRates,
21021
21205
  defaultFiatCurrency,
21022
21206
  textCustomizations
21023
21207
  }) {
21024
- const maxCheckoutUsdString = useFlag(FlagKey22.MaxCheckoutUsd);
21208
+ const maxCheckoutUsdString = useFlag(FlagKey23.MaxCheckoutUsd);
21025
21209
  const isSourceNavWidgetEnabled = modalState.startingStep === "select_asset" /* SELECT_ASSET */;
21026
21210
  const { paymentMethod } = modalState.paymentMethodInfo;
21027
21211
  const { quote: manuallySelectedQuote } = modalState;
21028
21212
  const isCardCheckout = paymentMethod === "card" /* CARD */;
21029
21213
  const meldEnabled = useIsMeldEnabled() && isCardCheckout;
21030
21214
  const { targetAssetTicker, targetAssetMinAmount } = checkoutConfig;
21031
- const { updateTargetAssetAmount } = useCheckoutContext();
21215
+ const { updateTargetAssetAmount, checkoutItem } = useCheckoutContext();
21032
21216
  const { apiKey } = useFunkitConfig();
21033
- const { checkoutItem } = useCheckoutContext();
21034
21217
  const minUsd = targetAssetMinAmount && unitPrice ? Math.ceil(targetAssetMinAmount * unitPrice * 100) / 100 : void 0;
21035
21218
  const fiatCurrency = modalState.fiatCurrency ?? defaultFiatCurrency;
21036
21219
  const quickOptions = useFiatAmountOptions(fiatCurrency);
21220
+ const fiatCurrencyExchangeRate = getExchangeRate(
21221
+ fiatCurrency,
21222
+ currencyExchangeRates
21223
+ );
21037
21224
  const {
21038
21225
  assetAmount,
21039
21226
  fiatAmount,
@@ -21062,7 +21249,9 @@ function InputAmountLoaded({
21062
21249
  paymentMethod,
21063
21250
  quickOptions,
21064
21251
  sourceHolding,
21065
- unitPrice
21252
+ unitPrice,
21253
+ fiatCurrencyExchangeRate,
21254
+ meldEnabled
21066
21255
  });
21067
21256
  const {
21068
21257
  meldQuotesQuery,
@@ -21073,7 +21262,7 @@ function InputAmountLoaded({
21073
21262
  selectedQuote,
21074
21263
  isSelectedQuoteUnavailable
21075
21264
  } = useMeld(manuallySelectedQuote, fiatAmount, fiatCurrency);
21076
- const error = useMemo21(() => {
21265
+ const error = useMemo22(() => {
21077
21266
  if (isCardCheckout) {
21078
21267
  if (isSelectedQuoteUnavailable) {
21079
21268
  return {
@@ -21118,8 +21307,8 @@ function InputAmountLoaded({
21118
21307
  if (assetAmount2 === void 0) {
21119
21308
  return;
21120
21309
  }
21121
- updateTargetAssetAmount(assetAmount2);
21122
21310
  if (!meldEnabled) {
21311
+ updateTargetAssetAmount(assetAmount2);
21123
21312
  onNext({});
21124
21313
  return;
21125
21314
  }
@@ -21358,7 +21547,7 @@ function YouPayYouReceiveWrapper({
21358
21547
 
21359
21548
  // src/modals/CheckoutModal/InputAmount/InputAmountLoading.tsx
21360
21549
  import { formatCryptoAndStringify as formatCryptoAndStringify5 } from "@funkit/utils";
21361
- import React164, { useMemo as useMemo22 } from "react";
21550
+ import React164, { useMemo as useMemo23 } from "react";
21362
21551
  function InputAmountLoading({
21363
21552
  modalState,
21364
21553
  sourceHoldingError,
@@ -21370,7 +21559,7 @@ function InputAmountLoading({
21370
21559
  const isSourceNavWidgetEnabled = modalState.startingStep === "select_asset" /* SELECT_ASSET */;
21371
21560
  const targetAssetAmount = checkoutItem?.initSettings.config.targetAssetAmount;
21372
21561
  const targetAssetTicker = checkoutItem?.initSettings.config.targetAssetTicker;
21373
- const error = useMemo22(() => {
21562
+ const error = useMemo23(() => {
21374
21563
  if (sourceHoldingError) {
21375
21564
  return {
21376
21565
  message: /* @__PURE__ */ React164.createElement("div", null, "Unable to retrieve your account balance. Please try re-linking your account.", " "),
@@ -21450,7 +21639,7 @@ function InputAmountLoading({
21450
21639
  }
21451
21640
 
21452
21641
  // src/modals/CheckoutModal/InputAmount/useAvailableBalanceForCheckout.ts
21453
- import { useMemo as useMemo23 } from "react";
21642
+ import { useMemo as useMemo24 } from "react";
21454
21643
  function useAvailableBalanceForCheckout(paymentMethodInfo, targetChainId, assetChainId, assetSymbol) {
21455
21644
  const { data: walletAssetHoldings, isLoading: isLoadingWalletAssetHoldings } = useWalletAssetHoldings(targetChainId);
21456
21645
  const holdings = {
@@ -21460,7 +21649,7 @@ function useAvailableBalanceForCheckout(paymentMethodInfo, targetChainId, assetC
21460
21649
  ["token_transfer" /* TOKEN_TRANSFER */]: null,
21461
21650
  ["virtual_bank" /* VIRTUAL_BANK */]: null
21462
21651
  }[paymentMethodInfo.paymentMethod];
21463
- const holdingItem = useMemo23(() => {
21652
+ const holdingItem = useMemo24(() => {
21464
21653
  if (!assetSymbol || !holdings) {
21465
21654
  return;
21466
21655
  }
@@ -21519,7 +21708,7 @@ var InputAmountInfo = {
21519
21708
  disableBack: ({ state, isSourceNavWidgetEnabled }) => state.paymentMethodInfo?.paymentMethod === "card" /* CARD */ && isSourceNavWidgetEnabled
21520
21709
  };
21521
21710
  function InputAmount(props) {
21522
- const { paymentMethodInfo } = props.modalState;
21711
+ const { paymentMethodInfo, isDefiMode } = props.modalState;
21523
21712
  const { textCustomizations } = useFunkitConfig();
21524
21713
  const { setCheckoutQuote } = useQuoteContext();
21525
21714
  const { checkoutItem } = useCheckoutContext();
@@ -21533,6 +21722,10 @@ function InputAmount(props) {
21533
21722
  checkoutItem?.selectedSourceAssetInfo.chainId ?? "",
21534
21723
  checkoutItem?.selectedSourceAssetInfo.symbol ?? null
21535
21724
  );
21725
+ const {
21726
+ data: currencyExchangeRates,
21727
+ isLoading: isCurrencyExchangeRatesLoading
21728
+ } = useFiatExchangeRates(!!isDefiMode);
21536
21729
  const { data: defaultCurrency, isLoading: isMeldDefaultCurrencyLoading } = useMeldDefaultCurrency(paymentMethodInfo.paymentMethod);
21537
21730
  const isMeld = paymentMethodInfo.paymentMethod === "card" /* CARD */;
21538
21731
  useMeldCurrencies(isMeld);
@@ -21541,7 +21734,9 @@ function InputAmount(props) {
21541
21734
  chainId: checkoutItem?.initSettings.config.targetChain,
21542
21735
  assetTokenAddress: checkoutItem?.initSettings.config.targetAsset
21543
21736
  });
21544
- const isLoaded = checkoutItem && unitPrice && !sourceHoldingError && !isLoadingSourceHolding && !isMeldDefaultCurrencyLoading;
21737
+ const skipExchangeRates = paymentMethodInfo.paymentMethod !== "card" /* CARD */ || !isDefiMode;
21738
+ const exchangeRatesLoaded = !isCurrencyExchangeRatesLoading && !!currencyExchangeRates;
21739
+ const isLoaded = !!(checkoutItem && unitPrice && !sourceHoldingError && !isLoadingSourceHolding && !isMeldDefaultCurrencyLoading && (skipExchangeRates || exchangeRatesLoaded));
21545
21740
  useEffect36(() => setCheckoutQuote(null), []);
21546
21741
  if (isLoaded) {
21547
21742
  return /* @__PURE__ */ React165.createElement(
@@ -21551,6 +21746,7 @@ function InputAmount(props) {
21551
21746
  checkoutConfig: checkoutItem.initSettings.config,
21552
21747
  sourceHolding: sourceHolding ?? null,
21553
21748
  unitPrice,
21749
+ currencyExchangeRates,
21554
21750
  defaultFiatCurrency: defaultCurrency,
21555
21751
  textCustomizations: textCustomizations.confirmationScreen
21556
21752
  }
@@ -21576,14 +21772,14 @@ import { mainnet as mainnet8, polygon as polygon6 } from "viem/chains";
21576
21772
  var ASSETS_LOW_VALUE_THRESHOLD2 = 0.1;
21577
21773
 
21578
21774
  // src/hooks/usePaymentSources.ts
21579
- import { FlagKey as FlagKey23, isNotNullish as isNotNullish8 } from "@funkit/utils";
21775
+ import { FlagKey as FlagKey24, isNotNullish as isNotNullish8 } from "@funkit/utils";
21580
21776
  function usePaymentMethodEnablement({
21581
21777
  checkoutConfig
21582
21778
  }) {
21583
21779
  const { apiKey } = useFunkitConfig();
21584
- const isTokenTransferFlagEnabled = useFlag(FlagKey23.EnableTokenTransfer);
21780
+ const isTokenTransferFlagEnabled = useFlag(FlagKey24.EnableTokenTransfer);
21585
21781
  const isFiatFlagEnabled = useFiatEnabled();
21586
- const isCardFlagEnabled = useFlag(FlagKey23.EnableCard);
21782
+ const isCardFlagEnabled = useFlag(FlagKey24.EnableCard);
21587
21783
  const isKatanaEarnFlowAction = isKatanaEarnFlow({ apiKey, checkoutConfig });
21588
21784
  const isUsKatanaUser = useIsUsKatanaUser();
21589
21785
  const isFiatEnabled = isFiatFlagEnabled && !isKatanaEarnFlowAction;
@@ -21959,7 +22155,7 @@ function LoadingAccount({
21959
22155
 
21960
22156
  // src/modals/CheckoutModal/MeldCurrencySelect/MeldCurrencySelect.tsx
21961
22157
  import clsx18 from "clsx";
21962
- import React169, { useMemo as useMemo24, useState as useState43 } from "react";
22158
+ import React169, { useMemo as useMemo25, useState as useState43 } from "react";
21963
22159
 
21964
22160
  // src/css/scrollStyles.css.ts
21965
22161
  var hideScrollBar = "_163ehmk0";
@@ -22015,7 +22211,7 @@ function MeldCurrencySelect({
22015
22211
  const [selectedCurrency, setSelectedCurrency] = useState43(
22016
22212
  defaultCurrency
22017
22213
  );
22018
- const filteredOptions = useMemo24(() => {
22214
+ const filteredOptions = useMemo25(() => {
22019
22215
  const newOptions = data?.filter(
22020
22216
  ({ name, currencyCode }) => currencyCode.toLowerCase().includes(query.toLowerCase()) || name.toLowerCase().includes(query.toLowerCase())
22021
22217
  ) ?? [];
@@ -22151,7 +22347,7 @@ function MeldQuotes({
22151
22347
  }
22152
22348
 
22153
22349
  // src/modals/CheckoutModal/MoonpaySetup.tsx
22154
- import React172, { useCallback as useCallback30, useMemo as useMemo26, useState as useState45 } from "react";
22350
+ import React172, { useCallback as useCallback30, useMemo as useMemo27, useState as useState45 } from "react";
22155
22351
 
22156
22352
  // src/components/FunPayments/FunPaymentMoonpayType.css.ts
22157
22353
  var mpClass = "_1kmpeyf0";
@@ -22160,7 +22356,7 @@ var stretchStyle = "_1kmpeyf1";
22160
22356
  // src/components/FunPayments/FunPaymentMoonpayType.tsx
22161
22357
  import { getMoonpayUrlSignature } from "@funkit/api-base";
22162
22358
  import { colorToHex } from "@funkit/utils";
22163
- import React171, { Fragment, useEffect as useEffect38, useMemo as useMemo25, useState as useState44 } from "react";
22359
+ import React171, { Fragment, useEffect as useEffect38, useMemo as useMemo26, useState as useState44 } from "react";
22164
22360
  var LazyMoonPayBuyWidget = (props) => {
22165
22361
  const [MoonPayBuyWidget, setMoonPayBuyWidget] = useState44(null);
22166
22362
  useEffect38(() => {
@@ -22191,7 +22387,7 @@ function FunPaymentMoonpayType({
22191
22387
  const isSandboxMode = useIsFunkitSandboxMode();
22192
22388
  const funkitConfig = useFunkitConfig();
22193
22389
  const { userInfo } = useGeneralWallet();
22194
- const currencyCode = useMemo25(() => {
22390
+ const currencyCode = useMemo26(() => {
22195
22391
  return generateMoonpayCurrencyCode(depositToken, depositTokenChainId);
22196
22392
  }, [depositToken, depositTokenChainId]);
22197
22393
  const depositTokenAmountStringFormatted = formatTokenAmountForMoonpay(
@@ -22214,7 +22410,7 @@ function FunPaymentMoonpayType({
22214
22410
  });
22215
22411
  return signature || "";
22216
22412
  };
22217
- const moonpayButtonColor = useMemo25(() => {
22413
+ const moonpayButtonColor = useMemo26(() => {
22218
22414
  const primaryButtonHex = colorToHex(activeTheme.colors.buttonPrimary);
22219
22415
  if (["#FFF", "#FFFF", "#FFFFFF", "#FFFFFFFF"].includes(primaryButtonHex)) {
22220
22416
  return void 0;
@@ -22277,7 +22473,7 @@ function MoonpaySetup({
22277
22473
  depositAddress: paymentAddress
22278
22474
  });
22279
22475
  }, [onNext, paymentAddress]);
22280
- const MoonpayWidget = useMemo26(() => {
22476
+ const MoonpayWidget = useMemo27(() => {
22281
22477
  return /* @__PURE__ */ React172.createElement(
22282
22478
  FunPaymentMoonpayType,
22283
22479
  {
@@ -22308,7 +22504,7 @@ function MoonpaySetup({
22308
22504
  // src/modals/CheckoutModal/SelectAsset.tsx
22309
22505
  import { FUNKIT_CONNECT_SUPPORTED_CHECKOUT_CHAINS_INFO_LIST as FUNKIT_CONNECT_SUPPORTED_CHECKOUT_CHAINS_INFO_LIST2 } from "@funkit/chains";
22310
22506
  import { formatCurrencyAndStringify as formatCurrencyAndStringify11, isTokenEquivalent as isTokenEquivalent6 } from "@funkit/utils";
22311
- import React175, { useEffect as useEffect39, useMemo as useMemo28, useState as useState46 } from "react";
22507
+ import React175, { useEffect as useEffect39, useMemo as useMemo29, useState as useState46 } from "react";
22312
22508
  import { createPortal as createPortal11 } from "react-dom";
22313
22509
 
22314
22510
  // src/components/Dropdown/ReceiveTokenDropdown.tsx
@@ -22404,13 +22600,13 @@ var ReceiveTokenDropdown = ({
22404
22600
 
22405
22601
  // src/components/NewTokenDepositAlert/NewTokenDepositAlert.tsx
22406
22602
  import React174 from "react";
22407
- import { FlagKey as FlagKey24, safeParseJson as safeParseJson5 } from "@funkit/utils";
22603
+ import { FlagKey as FlagKey25, safeParseJson as safeParseJson6 } from "@funkit/utils";
22408
22604
  var NewTokenDepositAlert = ({
22409
22605
  onClick
22410
22606
  }) => {
22411
- const alertJson = useFlag(FlagKey24.NewTokenAssetSelectionBanner);
22412
- const alertData = safeParseJson5(alertJson);
22413
- const isTokenTransferEnabled = useFlag(FlagKey24.EnableTokenTransfer);
22607
+ const alertJson = useFlag(FlagKey25.NewTokenAssetSelectionBanner);
22608
+ const alertData = safeParseJson6(alertJson);
22609
+ const isTokenTransferEnabled = useFlag(FlagKey25.EnableTokenTransfer);
22414
22610
  if (!alertData || !isTokenTransferEnabled) {
22415
22611
  return null;
22416
22612
  }
@@ -22437,13 +22633,13 @@ var NewTokenDepositAlert = ({
22437
22633
 
22438
22634
  // src/hooks/useAllowedAssets.ts
22439
22635
  import { getAllowedAssets } from "@funkit/api-base";
22440
- import { useQuery as useQuery16 } from "@tanstack/react-query";
22441
- import { useCallback as useCallback31, useMemo as useMemo27 } from "react";
22636
+ import { useQuery as useQuery17 } from "@tanstack/react-query";
22637
+ import { useCallback as useCallback31, useMemo as useMemo28 } from "react";
22442
22638
  function useAllowedAssets() {
22443
22639
  const { apiKey } = useFunkitConfig();
22444
22640
  const { checkoutItem } = useCheckoutContext();
22445
22641
  const isRelayEnabled = useSourceTokenRelayEnabled();
22446
- const { data: allowedAssets, isLoading } = useQuery16({
22642
+ const { data: allowedAssets, isLoading } = useQuery17({
22447
22643
  queryKey: ["getAllowedAssets", apiKey],
22448
22644
  queryFn: () => getAllowedAssets({ apiKey, logger }),
22449
22645
  refetchOnMount: false,
@@ -22452,7 +22648,7 @@ function useAllowedAssets() {
22452
22648
  staleTime: 5 * 60 * 1e3,
22453
22649
  gcTime: Number.POSITIVE_INFINITY
22454
22650
  });
22455
- const tokens = useMemo27(() => {
22651
+ const tokens = useMemo28(() => {
22456
22652
  if (!allowedAssets) {
22457
22653
  return {};
22458
22654
  }
@@ -22529,13 +22725,7 @@ function useEnrichedAccountHoldings({
22529
22725
  }) {
22530
22726
  const { isAllowed, isLoading } = useAllowedAssets();
22531
22727
  const { loginType, walletAddress } = useGeneralWallet();
22532
- const { price: targetAssetUsdAmount } = useAssetAddressPrice({
22533
- chainId: checkoutConfig?.targetChain,
22534
- assetTokenAddress: checkoutConfig?.targetAsset,
22535
- amount: checkoutConfig?.targetAssetAmount
22536
- });
22537
- const minValueThreshold = checkoutConfig?.isDefiMode ? targetAssetUsdAmount : void 0;
22538
- const enrichedAccountHoldings = useMemo28(() => {
22728
+ const enrichedAccountHoldings = useMemo29(() => {
22539
22729
  if (!checkoutConfig) {
22540
22730
  return [];
22541
22731
  }
@@ -22553,14 +22743,12 @@ function useEnrichedAccountHoldings({
22553
22743
  isAllowedForCheckout: isAllowed(
22554
22744
  asset.pickedChainId,
22555
22745
  asset.tokenAddress
22556
- ),
22557
- minValueThreshold
22746
+ )
22558
22747
  });
22559
22748
  return { asset, usableForCheckout };
22560
22749
  });
22561
22750
  }, [
22562
22751
  accountHoldings,
22563
- minValueThreshold,
22564
22752
  checkoutConfig,
22565
22753
  isAllowed,
22566
22754
  loginType,
@@ -22577,7 +22765,7 @@ function useAssetOptions({
22577
22765
  chainId,
22578
22766
  dynamicTargetAssetCandidates
22579
22767
  }) {
22580
- const assetOptions = useMemo28(() => {
22768
+ const assetOptions = useMemo29(() => {
22581
22769
  return enrichedAccountHoldings.filter(
22582
22770
  ({ asset }) => chainId !== void 0 ? asset.pickedChainId === chainId.toString() : true
22583
22771
  ).map(({ asset, usableForCheckout }) => {
@@ -22657,7 +22845,7 @@ function MeshOrAccountSelectAsset({
22657
22845
  targetAssetMinAmount: 0
22658
22846
  };
22659
22847
  const [selectedTargetAsset, setSelectedTargetAsset] = useState46(defaultTargetAsset);
22660
- const defaultTokenSymbols = useMemo28(() => {
22848
+ const defaultTokenSymbols = useMemo29(() => {
22661
22849
  if (!checkoutConfig) {
22662
22850
  return [];
22663
22851
  }
@@ -22724,7 +22912,7 @@ function MeshOrAccountSelectAsset({
22724
22912
  handleTargetAssetUpdate(tokenItem);
22725
22913
  onFinish();
22726
22914
  });
22727
- const selectedChainTokenSymbol = useMemo28(() => {
22915
+ const selectedChainTokenSymbol = useMemo29(() => {
22728
22916
  if (explicitlySelectedChainTokenSymbol) {
22729
22917
  const assetExists = assetOptions.find(
22730
22918
  ({ asset }) => asset.chainSymbolKey === explicitlySelectedChainTokenSymbol
@@ -23444,7 +23632,7 @@ var LightningBoltIcon = ({ size = 16 }) => /* @__PURE__ */ React179.createElemen
23444
23632
 
23445
23633
  // src/components/QRCode/QRCode.tsx
23446
23634
  import QRCodeUtil from "qrcode";
23447
- import React180, { useMemo as useMemo29 } from "react";
23635
+ import React180, { useMemo as useMemo30 } from "react";
23448
23636
  var generateMatrix = (value, errorCorrectionLevel) => {
23449
23637
  const { data } = QRCodeUtil.create(value, { errorCorrectionLevel }).modules;
23450
23638
  const sqrt = Math.sqrt(data.length);
@@ -23472,7 +23660,7 @@ function QRCode({
23472
23660
  }) {
23473
23661
  const { activeTheme } = useActiveTheme();
23474
23662
  const size = sizeProp - Number.parseInt(outsidePadding, 10) * 2;
23475
- const dots = useMemo29(() => {
23663
+ const dots = useMemo30(() => {
23476
23664
  const dots2 = [];
23477
23665
  const matrix = generateMatrix(uri, ecl);
23478
23666
  const cellSize = size / matrix.length;
@@ -24013,14 +24201,31 @@ var TransferTokenDetails = ({
24013
24201
  };
24014
24202
 
24015
24203
  // src/hooks/useTokenTransfer.ts
24016
- import { solanaChain as solanaChain4 } from "@funkit/chains";
24017
- import { FlagKey as FlagKey25 } from "@funkit/utils";
24018
- import { useMemo as useMemo30 } from "react";
24204
+ import { bitcoinChain as bitcoinChain2, solanaChain as solanaChain4 } from "@funkit/chains";
24205
+ import { FlagKey as FlagKey26 } from "@funkit/utils";
24206
+ import { useMemo as useMemo31 } from "react";
24019
24207
  import { mainnet as mainnet9, polygon as polygon7 } from "viem/chains";
24208
+
24209
+ // src/utils/transfer.ts
24210
+ var getTransferTokenQrCodeUri = (props) => {
24211
+ const { depositAddress, type } = props;
24212
+ if (type === "ethereum") {
24213
+ return `ethereum:${depositAddress}`;
24214
+ }
24215
+ if (type === "solana") {
24216
+ return `solana:${depositAddress}`;
24217
+ }
24218
+ if (type === "bitcoin") {
24219
+ return `bitcoin:${depositAddress}`;
24220
+ }
24221
+ throw new Error(`Invalid transfer token qr code type: ${type}`);
24222
+ };
24223
+
24224
+ // src/hooks/useTokenTransfer.ts
24020
24225
  var useTokenTransfer = (selectedChainId, selectedToken, chainIds) => {
24021
24226
  const { checkoutItem } = useCheckoutContext();
24022
24227
  const enableUniversal = useFlag(
24023
- FlagKey25.EnableTokenTransferUniversalDepositAddress,
24228
+ FlagKey26.EnableTokenTransferUniversalDepositAddress,
24024
24229
  false
24025
24230
  );
24026
24231
  const estPriceImpact = usePriceImpactEstimation(selectedToken);
@@ -24038,9 +24243,22 @@ var useTokenTransfer = (selectedChainId, selectedToken, chainIds) => {
24038
24243
  const isUsdceOnPolygon = isPolygon && selectedToken === "USDC.e";
24039
24244
  const isUsdcOnPolygon = isPolygon && selectedToken === "USDC";
24040
24245
  const showOriginalRecipient = isBankrUsUser || !enableUniversal && (isUsdceOnPolygon || isUsdcOnPolygon);
24041
- const funDepositAddress = selectedChainId === solanaChain4.id ? transferInit?.solanaAddr : transferInit?.depositAddr;
24246
+ const funDepositAddress = selectedChainId === solanaChain4.id ? transferInit?.solanaAddr : selectedChainId === bitcoinChain2.id ? transferInit?.btcAddrSegwit : transferInit?.depositAddr;
24247
+ const blockchainType = (() => {
24248
+ if (selectedChainId === solanaChain4.id) {
24249
+ return "solana";
24250
+ }
24251
+ if (selectedChainId === bitcoinChain2.id) {
24252
+ return "bitcoin";
24253
+ }
24254
+ return "ethereum";
24255
+ })();
24042
24256
  const depositAddressTooltip = `Send any accepted token to this address${showOriginalRecipient ? "" : ` and it will auto
24043
24257
  swap to ${checkoutConfig?.targetAssetTicker} in your account`}.`;
24258
+ const qrCodeUri = funDepositAddress ? getTransferTokenQrCodeUri({
24259
+ depositAddress: funDepositAddress,
24260
+ type: blockchainType
24261
+ }) : void 0;
24044
24262
  return {
24045
24263
  depositAddress: showOriginalRecipient ? recipientAddr : funDepositAddress,
24046
24264
  depositAddressTooltip,
@@ -24049,12 +24267,14 @@ var useTokenTransfer = (selectedChainId, selectedToken, chainIds) => {
24049
24267
  minTransferUsdPerChain,
24050
24268
  showOriginalRecipient,
24051
24269
  estPriceImpact: showOriginalRecipient ? void 0 : estPriceImpact,
24052
- maxSlippage: showOriginalRecipient ? void 0 : maxSlippage
24270
+ maxSlippage: showOriginalRecipient ? void 0 : maxSlippage,
24271
+ qrCodeUri,
24272
+ blockchain: blockchainType
24053
24273
  };
24054
24274
  };
24055
24275
  var useMinTransferLimits = () => {
24056
24276
  const { userIpInfo } = useFunkitUserIp();
24057
- const minTransferValueJsonString = useFlag(FlagKey25.MinTokenTransferValue);
24277
+ const minTransferValueJsonString = useFlag(FlagKey26.MinTokenTransferValue);
24058
24278
  const minTransferValue = safeJSONParse(
24059
24279
  minTransferValueJsonString
24060
24280
  );
@@ -24065,23 +24285,27 @@ var useMinTransferLimits = () => {
24065
24285
  const limits = minTransferValue[transferLimitKey] ?? minTransferValue.DEFAULT;
24066
24286
  return limits;
24067
24287
  };
24288
+ function getMinTransferValueForChain(chainId, limits) {
24289
+ const MAINNET_IDS = [mainnet9.id, bitcoinChain2.id];
24290
+ return MAINNET_IDS.includes(chainId) ? limits.mainnet : limits.nonMainnet;
24291
+ }
24068
24292
  var useMinTransferValue = (selectedChainId) => {
24069
24293
  const limits = useMinTransferLimits();
24070
- const limit = selectedChainId === mainnet9.id ? limits.mainnet : limits.nonMainnet;
24294
+ const limit = getMinTransferValueForChain(selectedChainId, limits);
24071
24295
  return Math.ceil(limit);
24072
24296
  };
24073
24297
  var useMinTransferValues = (chainIds) => {
24074
24298
  const limits = useMinTransferLimits();
24075
- return useMemo30(() => {
24299
+ return useMemo31(() => {
24076
24300
  return chainIds.reduce(
24077
24301
  (acc, id) => {
24078
- const limit = id === mainnet9.id ? limits.mainnet : limits.nonMainnet;
24302
+ const limit = getMinTransferValueForChain(id, limits);
24079
24303
  acc[id] = Math.ceil(limit);
24080
24304
  return acc;
24081
24305
  },
24082
24306
  {}
24083
24307
  );
24084
- }, [chainIds, limits.mainnet, limits.nonMainnet]);
24308
+ }, [chainIds, limits]);
24085
24309
  };
24086
24310
  var usePriceImpactEstimation = (selectedToken) => {
24087
24311
  const { apiKey } = useFunkitConfig();
@@ -24155,7 +24379,9 @@ function TransferToken({
24155
24379
  minTransferUsd,
24156
24380
  minTransferUsdPerChain,
24157
24381
  estPriceImpact,
24158
- maxSlippage
24382
+ maxSlippage,
24383
+ qrCodeUri,
24384
+ blockchain
24159
24385
  } = useTokenTransfer(selectedChainId, selectedToken, chainIds);
24160
24386
  const isDefiMode = checkoutItem?.initSettings.config.isDefiMode;
24161
24387
  const toggleQrHover = async () => {
@@ -24336,7 +24562,7 @@ function TransferToken({
24336
24562
  logoSize: 24,
24337
24563
  logoUrl: chainMetadataById[selectedChainId].iconUrl,
24338
24564
  size: 152,
24339
- uri: `ethereum:${depositAddress}`,
24565
+ uri: qrCodeUri ?? "",
24340
24566
  enableCornerMarkersRadius: false,
24341
24567
  enableOuterBorder: false
24342
24568
  }
@@ -24381,7 +24607,13 @@ function TransferToken({
24381
24607
  size: "12"
24382
24608
  }
24383
24609
  )
24384
- ), isLoadingDepositAddress ? /* @__PURE__ */ React189.createElement(FunSkeletonBlock, { height: "66", width: "full" }) : /* @__PURE__ */ React189.createElement(CopyInputDisplayedAddress, { address: depositAddress })), /* @__PURE__ */ React189.createElement(FunInfoBanner, null), /* @__PURE__ */ React189.createElement(
24610
+ ), isLoadingDepositAddress ? /* @__PURE__ */ React189.createElement(FunSkeletonBlock, { height: "66", width: "full" }) : /* @__PURE__ */ React189.createElement(CopyInputDisplayedAddress, { address: depositAddress })), /* @__PURE__ */ React189.createElement(FunInfoBanner, null), blockchain === "bitcoin" && /* @__PURE__ */ React189.createElement(
24611
+ InfoBanner,
24612
+ {
24613
+ message: "Bitcoin deposits might take up to 30 minutes to complete.",
24614
+ type: "announcement"
24615
+ }
24616
+ ), /* @__PURE__ */ React189.createElement(FunInfoBanner, null), /* @__PURE__ */ React189.createElement(
24385
24617
  TransferTokenDetails,
24386
24618
  {
24387
24619
  disabled: isLoadingDepositAddress,
@@ -24765,7 +24997,7 @@ var FiatAccountDetail = {
24765
24997
 
24766
24998
  // src/modals/CheckoutModal/VirtualFiatAccount/KycIframe.tsx
24767
24999
  import { BridgeCustomerStatus as BridgeCustomerStatus7 } from "@funkit/api-base";
24768
- import React196, { useCallback as useCallback35, useEffect as useEffect42, useMemo as useMemo31, useState as useState53 } from "react";
25000
+ import React196, { useCallback as useCallback35, useEffect as useEffect42, useMemo as useMemo32, useState as useState53 } from "react";
24769
25001
  function useIframeListener(listeners) {
24770
25002
  const handleMessage = useCallback35(
24771
25003
  (event) => {
@@ -24818,7 +25050,7 @@ function KycIframe({
24818
25050
  const { clearVirtualFiatAccounts } = useClearFrogAccountsCache();
24819
25051
  const { data: kycLink, isLoading: isLinkLoading } = useLoadKycLink(modalState);
24820
25052
  const [iframeLoading, setIframeLoading] = useState53(true);
24821
- const listeners = useMemo31(
25053
+ const listeners = useMemo32(
24822
25054
  () => ({
24823
25055
  load: () => {
24824
25056
  logger.info("KYC iframe loaded");
@@ -25815,7 +26047,7 @@ function FunConnectOptions({
25815
26047
  }
25816
26048
  }
25817
26049
  };
25818
- const stepComponent = useMemo32(() => {
26050
+ const stepComponent = useMemo33(() => {
25819
26051
  switch (step) {
25820
26052
  case 0 /* SIGNIN_PRIMARY */:
25821
26053
  case 1 /* SIGNIN_SECONDARY */:
@@ -25924,7 +26156,7 @@ var FULL_SOCIAL_LOGIN_OPTIONS = [
25924
26156
  function useEnabledSocialLogins() {
25925
26157
  const funkitConfig = useFunkitConfig();
25926
26158
  const { web2SocialLogins } = funkitConfig.loginConfig;
25927
- const enabledSocialItems = useMemo33(() => {
26159
+ const enabledSocialItems = useMemo34(() => {
25928
26160
  return FULL_SOCIAL_LOGIN_OPTIONS.filter(
25929
26161
  (oAuthItem) => !!web2SocialLogins[oAuthItem.funkitKey]
25930
26162
  );
@@ -25953,7 +26185,7 @@ function FunSignInStep({
25953
26185
  handleOauthRedirect,
25954
26186
  handleGenerateFcUri
25955
26187
  } = useFunkitWeb2Login();
25956
- const isEmailInputValid = useMemo33(() => {
26188
+ const isEmailInputValid = useMemo34(() => {
25957
26189
  return validateEmailString(emailInput);
25958
26190
  }, [emailInput]);
25959
26191
  const [emailError, setEmailError] = useState59();
@@ -26529,7 +26761,7 @@ function FunCheckoutHistoryDetail({
26529
26761
  isActiveCheckout
26530
26762
  ]
26531
26763
  );
26532
- const primaryButtonProps = useMemo34(() => {
26764
+ const primaryButtonProps = useMemo35(() => {
26533
26765
  if (!isCheckoutLoaded) {
26534
26766
  return void 0;
26535
26767
  }
@@ -26618,7 +26850,7 @@ var CheckoutAlert = ({ state, refundState, onHelp }) => {
26618
26850
 
26619
26851
  // src/components/FunCheckoutHistory/FunCheckoutHistoryHelp.tsx
26620
26852
  import { sendSupportMessage } from "@funkit/api-base";
26621
- import React218, { useEffect as useEffect49, useMemo as useMemo35, useRef as useRef23, useState as useState62 } from "react";
26853
+ import React218, { useEffect as useEffect49, useMemo as useMemo36, useRef as useRef23, useState as useState62 } from "react";
26622
26854
  import { createPortal as createPortal15 } from "react-dom";
26623
26855
 
26624
26856
  // src/components/FunInput/FunTextAreaInput.tsx
@@ -26771,7 +27003,7 @@ function FunCheckoutHistoryHelp({
26771
27003
  );
26772
27004
  const [descriptionInput, setDescriptionInput] = useState62("");
26773
27005
  const [errorMessage, setErrorMessage] = useState62();
26774
- const isEmailInputValid = useMemo35(() => {
27006
+ const isEmailInputValid = useMemo36(() => {
26775
27007
  return validateEmailString(emailInput);
26776
27008
  }, [emailInput]);
26777
27009
  const [processStage, setProcessStage] = useState62(
@@ -26963,7 +27195,7 @@ import {
26963
27195
  formatTimestamp as formatTimestamp2,
26964
27196
  isTokenEquivalent as isTokenEquivalent7
26965
27197
  } from "@funkit/utils";
26966
- import React219, { useCallback as useCallback43, useMemo as useMemo36, useRef as useRef24, useState as useState63 } from "react";
27198
+ import React219, { useCallback as useCallback43, useMemo as useMemo37, useRef as useRef24, useState as useState63 } from "react";
26967
27199
  import { createPortal as createPortal16 } from "react-dom";
26968
27200
  function FunDirectExecutionStatusTagLoaded({
26969
27201
  directExecution
@@ -27004,7 +27236,7 @@ function FunDirectExecutionHistoryDetail({
27004
27236
  ]
27005
27237
  );
27006
27238
  const isWithdrawal = directExecution?.clientMetadata?.isWithdrawal;
27007
- const buttonProps = useMemo36(() => {
27239
+ const buttonProps = useMemo37(() => {
27008
27240
  if (!isLoaded) {
27009
27241
  return void 0;
27010
27242
  }
@@ -27417,7 +27649,7 @@ function useCheckoutModalTitle(depositAddress, defaultTitle) {
27417
27649
  import { IN_PROGRESS_CHECKOUT_STATES as IN_PROGRESS_CHECKOUT_STATES2 } from "@funkit/api-base";
27418
27650
  import { formatTimestampToDate, fullMonthNames } from "@funkit/utils";
27419
27651
  import clsx20 from "clsx";
27420
- import React232, { useEffect as useEffect50, useMemo as useMemo37, useRef as useRef25, useState as useState67 } from "react";
27652
+ import React232, { useEffect as useEffect50, useMemo as useMemo38, useRef as useRef25, useState as useState67 } from "react";
27421
27653
  import { Virtuoso } from "react-virtuoso";
27422
27654
  import { useAccount as useAccount7 } from "wagmi";
27423
27655
 
@@ -27964,7 +28196,7 @@ function Home({
27964
28196
  const virtuosoDiv = virtuosoParentRef.current?.firstChild;
27965
28197
  virtuosoDiv?.classList.add(animateVirtuosoInClass);
27966
28198
  }, []);
27967
- const AssetsList = useMemo37(() => {
28199
+ const AssetsList = useMemo38(() => {
27968
28200
  if (walletAssets && !Object.keys(walletAssets).length) {
27969
28201
  return /* @__PURE__ */ React232.createElement(EmptyTabAlert, null);
27970
28202
  }
@@ -27991,7 +28223,7 @@ function Home({
27991
28223
  }
27992
28224
  ));
27993
28225
  }, [walletAssets]);
27994
- const CheckoutsList = useMemo37(() => {
28226
+ const CheckoutsList = useMemo38(() => {
27995
28227
  if (checkoutHistoryList.length === 0 && isCheckoutHistoryInited) {
27996
28228
  return /* @__PURE__ */ React232.createElement(EmptyTabAlert, null);
27997
28229
  }
@@ -28664,7 +28896,7 @@ function ChainModal({ onClose, open }) {
28664
28896
  // src/modals/CheckoutModal/FunCheckoutModal.tsx
28665
28897
  import { FUNKIT_CONNECT_SUPPORTED_CHECKOUT_CHAINS_INFO_LIST as FUNKIT_CONNECT_SUPPORTED_CHECKOUT_CHAINS_INFO_LIST3 } from "@funkit/chains";
28666
28898
  import { LogLevel, initializeRelayClient } from "@funkit/fun-relay";
28667
- import { FlagKey as FlagKey27 } from "@funkit/utils";
28899
+ import { FlagKey as FlagKey28 } from "@funkit/utils";
28668
28900
  import React248, { useRef as useRef27 } from "react";
28669
28901
 
28670
28902
  // src/components/FunCheckoutBlocked/FunCheckoutBlocked.tsx
@@ -28685,7 +28917,7 @@ var FunCheckoutBlocked = ({ reason }) => {
28685
28917
 
28686
28918
  // src/modals/CheckoutModal/TransferToken/CheckoutNotifications.tsx
28687
28919
  import clsx23 from "clsx";
28688
- import React247, { useEffect as useEffect52, useMemo as useMemo38, useState as useState70 } from "react";
28920
+ import React247, { useEffect as useEffect52, useMemo as useMemo39, useState as useState70 } from "react";
28689
28921
 
28690
28922
  // src/components/FunNotificationBanner/FunNotificationShowMoreButton.tsx
28691
28923
  import React242 from "react";
@@ -28733,13 +28965,13 @@ var FunNotificationShowMoreButton = ({
28733
28965
  import {
28734
28966
  getCheckoutsByUserId as getCheckoutsByUserId2
28735
28967
  } from "@funkit/api-base";
28736
- import { FlagKey as FlagKey26 } from "@funkit/utils";
28737
- import { useQuery as useQuery17 } from "@tanstack/react-query";
28968
+ import { FlagKey as FlagKey27 } from "@funkit/utils";
28969
+ import { useQuery as useQuery18 } from "@tanstack/react-query";
28738
28970
  var hasCorrectPaymentMethod = (checkout, paymentMethod) => !paymentMethod || checkout.clientMetadata.selectedPaymentMethodInfo?.paymentMethod === paymentMethod;
28739
28971
  var isRecent = (checkout, timestampCutoff) => checkout.createdTimeMs > timestampCutoff;
28740
28972
  var DEFAULT_NOTIF_CUTOFF = 7 * 24 * 60 * 60 * 1e3;
28741
28973
  function useCheckoutRefreshInterval() {
28742
- const str = useFlag(FlagKey26.CheckoutNotificationsRefreshInterval);
28974
+ const str = useFlag(FlagKey27.CheckoutNotificationsRefreshInterval);
28743
28975
  return safeJSONParse(str) || { listRefresh: 50 * 1e3, itemRefresh: 5 * 1e3 };
28744
28976
  }
28745
28977
  var useRecentCheckouts = ({
@@ -28749,7 +28981,7 @@ var useRecentCheckouts = ({
28749
28981
  const { isUserLoggedIn, userInfo } = useGeneralWallet();
28750
28982
  const { apiKey } = useFunkitConfig();
28751
28983
  const { listRefresh } = useCheckoutRefreshInterval();
28752
- const query = useQuery17({
28984
+ const query = useQuery18({
28753
28985
  queryKey: ["checkouts", userInfo.id],
28754
28986
  queryFn: async () => {
28755
28987
  const checkouts = await getCheckoutsByUserId2({
@@ -28772,7 +29004,7 @@ var useRecentCheckouts = ({
28772
29004
  import {
28773
29005
  getDirectExecutionsByUserId as getDirectExecutionsByUserId2
28774
29006
  } from "@funkit/api-base";
28775
- import { useQuery as useQuery18 } from "@tanstack/react-query";
29007
+ import { useQuery as useQuery19 } from "@tanstack/react-query";
28776
29008
  var isRecent2 = (de, timestampCutoff) => de.createdTimeMs > timestampCutoff;
28777
29009
  var useRecentDirectExecutions = ({
28778
29010
  isVisible
@@ -28780,7 +29012,7 @@ var useRecentDirectExecutions = ({
28780
29012
  const { isUserLoggedIn, userInfo } = useGeneralWallet();
28781
29013
  const { apiKey } = useFunkitConfig();
28782
29014
  const { listRefresh } = useCheckoutRefreshInterval();
28783
- const query = useQuery18({
29015
+ const query = useQuery19({
28784
29016
  queryKey: ["directExecutions", userInfo.id],
28785
29017
  queryFn: async () => {
28786
29018
  const directExecutions = await getDirectExecutionsByUserId2({
@@ -29493,11 +29725,11 @@ var FunNotificationBanner = ({
29493
29725
  import {
29494
29726
  getCheckoutByDepositAddress as getCheckoutByDepositAddress2
29495
29727
  } from "@funkit/api-base";
29496
- import { useQuery as useQuery19 } from "@tanstack/react-query";
29728
+ import { useQuery as useQuery20 } from "@tanstack/react-query";
29497
29729
  var useCheckout = (depositAddress, initial) => {
29498
29730
  const { apiKey } = useFunkitConfig();
29499
29731
  const { itemRefresh } = useCheckoutRefreshInterval();
29500
- const query = useQuery19({
29732
+ const query = useQuery20({
29501
29733
  queryKey: ["checkouts", "checkout", depositAddress],
29502
29734
  queryFn: () => (
29503
29735
  // biome-ignore lint/style/noNonNullAssertion: already checked for null
@@ -29754,19 +29986,19 @@ var CheckoutNotifications = ({
29754
29986
  }
29755
29987
  setInitialDirectExecutions(directExecutions);
29756
29988
  }, [initialDirectExecutions, directExecutions]);
29757
- const displayedDirectExecutions = useMemo38(() => {
29989
+ const displayedDirectExecutions = useMemo39(() => {
29758
29990
  if (!directExecutions) {
29759
29991
  return [];
29760
29992
  }
29761
29993
  return getUpdatedDirectExecutions(directExecutions, initialDirectExecutions).filter(({ txHash }) => !closedNotifications.includes(txHash)).slice(0, MAX_COUNT);
29762
29994
  }, [initialDirectExecutions, directExecutions, closedNotifications]);
29763
- const displayedCheckouts = useMemo38(() => {
29995
+ const displayedCheckouts = useMemo39(() => {
29764
29996
  if (!checkouts) {
29765
29997
  return [];
29766
29998
  }
29767
29999
  return getUpdatedCheckouts(checkouts, initialCheckouts).filter(({ depositAddr }) => !closedNotifications.includes(depositAddr)).slice(0, MAX_COUNT);
29768
30000
  }, [initialCheckouts, checkouts, closedNotifications]);
29769
- const combinedNotifications = useMemo38(() => {
30001
+ const combinedNotifications = useMemo39(() => {
29770
30002
  return [
29771
30003
  ...displayedDirectExecutions.map(
29772
30004
  (item) => ({ ...item, isDirectExecution: true })
@@ -29776,7 +30008,7 @@ var CheckoutNotifications = ({
29776
30008
  )
29777
30009
  ].sort((a, b) => b.createdTimeMs - a.createdTimeMs);
29778
30010
  }, [displayedDirectExecutions, displayedCheckouts]);
29779
- const displayedNotifications = useMemo38(() => {
30011
+ const displayedNotifications = useMemo39(() => {
29780
30012
  return isExpanded ? combinedNotifications : combinedNotifications.slice(0, COLLAPSED_COUNT);
29781
30013
  }, [isExpanded, combinedNotifications]);
29782
30014
  const handleNotificationClose = (id) => setClosedNotifications((prev) => [...prev, id]);
@@ -29907,7 +30139,7 @@ function FunCheckoutModalInner({
29907
30139
  const isBlocked = isUserGeoblocked || modalState.isBlocked;
29908
30140
  const hasBack = hasHistoryEntry && !disableBack;
29909
30141
  const checkoutConfig = checkoutItem.initSettings.config;
29910
- const helpButtonUrl = useFlag(FlagKey27.HelpTutorialUrl);
30142
+ const helpButtonUrl = useFlag(FlagKey28.HelpTutorialUrl);
29911
30143
  const { onScroll, topbar, withTopDivider } = useCustomStatusAnimationAboveTopbar({
29912
30144
  depositAddress: checkoutItem.depositAddress ?? void 0,
29913
30145
  isActiveCheckout: true,
@@ -30113,7 +30345,7 @@ function ModalProvider({ children }) {
30113
30345
  return /* @__PURE__ */ React250.createElement(
30114
30346
  ModalContext.Provider,
30115
30347
  {
30116
- value: useMemo39(
30348
+ value: useMemo40(
30117
30349
  () => ({
30118
30350
  accountModalOpen,
30119
30351
  accountModalTab,
@@ -30884,7 +31116,7 @@ var FunkitWeb2Provider = ({
30884
31116
  },
30885
31117
  [privy]
30886
31118
  );
30887
- const web2UserInfo = useMemo40(() => {
31119
+ const web2UserInfo = useMemo41(() => {
30888
31120
  if (!loggedInUser || !loggedInUser?.linked_accounts || !loggedInUser?.linked_accounts?.length) {
30889
31121
  return PLACEHOLDER_FUNKIT_USER_INFO;
30890
31122
  }
@@ -31800,18 +32032,18 @@ function cssStringFromTheme(theme, options = {}) {
31800
32032
  }
31801
32033
 
31802
32034
  // src/hooks/useIsFunkitCheckoutActivated.ts
31803
- import { FlagKey as FlagKey28 } from "@funkit/utils";
32035
+ import { FlagKey as FlagKey29 } from "@funkit/utils";
31804
32036
  var useIsFunkitCheckoutActivated = () => {
31805
- const isCheckoutActivated = useFlag(FlagKey28.IsCheckoutActivated);
32037
+ const isCheckoutActivated = useFlag(FlagKey29.IsCheckoutActivated);
31806
32038
  return {
31807
32039
  isActivated: isCheckoutActivated
31808
32040
  };
31809
32041
  };
31810
32042
 
31811
32043
  // src/hooks/useFunkitMaxCheckoutUsdInfo.ts
31812
- import { FlagKey as FlagKey29, formatCurrencyAndStringify as formatCurrencyAndStringify16 } from "@funkit/utils";
32044
+ import { FlagKey as FlagKey30, formatCurrencyAndStringify as formatCurrencyAndStringify16 } from "@funkit/utils";
31813
32045
  var useFunkitMaxCheckoutUsdInfo = () => {
31814
- const maxCheckoutUsd = Number(useFlag(FlagKey29.MaxCheckoutUsd));
32046
+ const maxCheckoutUsd = Number(useFlag(FlagKey30.MaxCheckoutUsd));
31815
32047
  const limitText = maxCheckoutUsd === Number.MAX_VALUE ? "no" : formatCurrencyAndStringify16(maxCheckoutUsd, {
31816
32048
  decimalPrecisionForSuffix: 0,
31817
32049
  minimumSignificantDigits: 0,
@@ -31928,7 +32160,7 @@ function setFunkitConnectVersion({ version }) {
31928
32160
  localStorage.setItem(storageKey5, version);
31929
32161
  }
31930
32162
  function getCurrentSdkVersion() {
31931
- return "6.9.0";
32163
+ return "6.11.0";
31932
32164
  }
31933
32165
  function useFingerprint() {
31934
32166
  const fingerprint = useCallback51(() => {