@turtleclub/hooks 0.5.0-beta.42 → 0.5.0-beta.44

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.cjs CHANGED
@@ -167,6 +167,7 @@ __export(index_exports, {
167
167
  tokenSchema: () => tokenSchema,
168
168
  transactionSchema: () => transactionSchema,
169
169
  txResponseItemSchema: () => txResponseItemSchema,
170
+ useActionsDefaultParams: () => useActionsDefaultParams,
170
171
  useAttributeAction: () => useAttributeAction,
171
172
  useBalance: () => useBalance2,
172
173
  useCancelDepositAction: () => useCancelDepositAction,
@@ -211,6 +212,7 @@ __export(index_exports, {
211
212
  useSupportedTokens: () => useSupportedTokens,
212
213
  useSwapRoute: () => useSwapRoute,
213
214
  useTokenBalance: () => useTokenBalance,
215
+ useTurtleMembershipFlow: () => useTurtleMembershipFlow,
214
216
  useUpdateProduct: () => useUpdateProduct,
215
217
  useUploadProductLogo: () => useUploadProductLogo,
216
218
  useUserById: () => useUserById,
@@ -1895,7 +1897,7 @@ function useCreateMembership() {
1895
1897
  }
1896
1898
 
1897
1899
  // src/v2/earn-deposits/hooks.ts
1898
- var import_react_query6 = require("@tanstack/react-query");
1900
+ var import_react_query9 = require("@tanstack/react-query");
1899
1901
 
1900
1902
  // src/v2/earn-deposits/hooks/useDepositValidation.ts
1901
1903
  var import_react = require("react");
@@ -2339,7 +2341,7 @@ var balanceQueries = (0, import_query_key_factory15.createQueryKeys)("balance",
2339
2341
  // src/v2/earn-actions/useEarnDeposit.ts
2340
2342
  var DEFAULT_SLIPPAGE_BPS = 50;
2341
2343
  function useEarnDeposit(options) {
2342
- const { opportunity, userAddress, distributorId, executeTransaction, onSuccess, referralCode } = options;
2344
+ const { opportunity, userAddress, distributorId, executeTransactionAndWait, onSuccess, referralCode } = options;
2343
2345
  const queryClient = (0, import_react_query5.useQueryClient)();
2344
2346
  const [isConfirming, setIsConfirming] = (0, import_react4.useState)(false);
2345
2347
  const [error, setError] = (0, import_react4.useState)(null);
@@ -2360,7 +2362,7 @@ function useEarnDeposit(options) {
2360
2362
  let lastTxHash;
2361
2363
  for (const txItem of transactions) {
2362
2364
  const txRequest = toTransactionRequest(txItem);
2363
- const txHash = await executeTransaction(txRequest);
2365
+ const txHash = await executeTransactionAndWait(txRequest);
2364
2366
  if (!txHash) {
2365
2367
  throw new Error(`Transaction failed: ${txItem.description || "Unknown transaction"}`);
2366
2368
  }
@@ -2368,7 +2370,7 @@ function useEarnDeposit(options) {
2368
2370
  }
2369
2371
  return lastTxHash;
2370
2372
  },
2371
- [executeTransaction, toTransactionRequest]
2373
+ [executeTransactionAndWait, toTransactionRequest]
2372
2374
  );
2373
2375
  const attributeTransactionSafely = (0, import_react4.useCallback)(
2374
2376
  async (actionId, txHash) => {
@@ -2471,7 +2473,7 @@ function useDepositFlow({
2471
2473
  userAddress,
2472
2474
  distributorId,
2473
2475
  balances,
2474
- executeTransaction,
2476
+ executeTransactionAndWait,
2475
2477
  onDepositSuccess,
2476
2478
  refetchBalances,
2477
2479
  slippageBps,
@@ -2493,7 +2495,7 @@ function useDepositFlow({
2493
2495
  opportunity,
2494
2496
  userAddress,
2495
2497
  distributorId,
2496
- executeTransaction,
2498
+ executeTransactionAndWait,
2497
2499
  onSuccess: () => {
2498
2500
  selection.setAmount(void 0);
2499
2501
  refetchBalances?.();
@@ -2531,163 +2533,13 @@ function useDepositFlow({
2531
2533
  };
2532
2534
  }
2533
2535
 
2534
- // src/v2/earn-deposits/hooks.ts
2535
- function useDeposits({ params, enabled = true }) {
2536
- return (0, import_react_query6.useQuery)({
2537
- ...earnDepositsQueries.byParams(params),
2538
- ...queryDefaults,
2539
- enabled
2540
- });
2541
- }
2542
-
2543
- // src/v2/enso-balances/hooks.ts
2544
- var import_react6 = require("react");
2545
- var import_react_query7 = require("@tanstack/react-query");
2546
- function useMultiChainBalances({
2547
- chainIds,
2548
- address
2549
- }) {
2550
- const queries2 = (0, import_react_query7.useQueries)({
2551
- queries: chainIds.map((chainId) => ({
2552
- ...ensoBalancesQueries.byParams({ user: address || "", chain: chainId }),
2553
- enabled: !!address,
2554
- staleTime: 60 * 1e3,
2555
- refetchInterval: 3 * 60 * 1e3,
2556
- refetchOnMount: false,
2557
- refetchOnWindowFocus: false
2558
- }))
2559
- });
2560
- const isLoading = queries2.some((query) => query.isLoading);
2561
- const error = queries2.find((query) => query.error)?.error || null;
2562
- const refetchAll = () => {
2563
- queries2.forEach((query) => {
2564
- query.refetch();
2565
- });
2566
- };
2567
- const balances = (0, import_react6.useMemo)(() => {
2568
- const balanceMap = {};
2569
- queries2.forEach((query, index) => {
2570
- const chainId = chainIds[index];
2571
- if (query.data && chainId !== void 0) {
2572
- balanceMap[chainId] = query.data.balances;
2573
- }
2574
- });
2575
- return balanceMap;
2576
- }, [queries2, chainIds]);
2577
- return {
2578
- balances,
2579
- isLoading,
2580
- error,
2581
- refetchAll
2582
- };
2583
- }
2584
-
2585
- // src/v2/opportunities/hooks.ts
2586
- var import_react_query8 = require("@tanstack/react-query");
2587
- function useOpportunities(options) {
2588
- return (0, import_react_query8.useQuery)({
2589
- ...opportunitiesQueries.all,
2590
- ...queryDefaults,
2591
- select: (data) => {
2592
- const uniqueChainsMap = new Map(
2593
- data.opportunities.map((opportunity) => opportunity.receiptToken?.chain).filter((chain) => chain !== void 0).map((chain) => [chain.id, chain])
2594
- );
2595
- const chains = Array.from(uniqueChainsMap.values());
2596
- return {
2597
- ...data,
2598
- chains
2599
- };
2600
- }
2601
- });
2602
- }
2603
- function useOpportunity({ id, ...options }) {
2604
- return (0, import_react_query8.useQuery)({
2605
- ...opportunitiesQueries.byId(id),
2606
- ...queryDefaults,
2607
- select: (data) => {
2608
- return {
2609
- ...data,
2610
- chain: data.receiptToken?.chain
2611
- };
2612
- }
2613
- });
2614
- }
2615
- function useOpportunitiesPaginated({
2616
- params,
2617
- enabled = true
2618
- } = {}) {
2619
- return (0, import_react_query8.useQuery)({
2620
- ...opportunitiesQueries.paginated(params),
2621
- ...queryDefaults,
2622
- enabled
2623
- });
2624
- }
2625
- function useOpportunitiesFilterOptions({
2626
- enabled = true
2627
- } = {}) {
2628
- return (0, import_react_query8.useQuery)({
2629
- ...opportunitiesQueries.filterOptions,
2630
- ...queryDefaults,
2631
- enabled
2632
- });
2633
- }
2634
-
2635
- // src/v2/products/hooks.ts
2636
- var import_react_query9 = require("@tanstack/react-query");
2637
- function useProducts({ filters, enabled = true }) {
2638
- return (0, import_react_query9.useQuery)({
2639
- ...productsQueries.list(filters),
2640
- ...queryDefaults,
2641
- enabled
2642
- });
2643
- }
2644
- function useProduct({ id, enabled = true }) {
2645
- return (0, import_react_query9.useQuery)({
2646
- ...productsQueries.byId(id),
2647
- ...queryDefaults,
2648
- enabled
2649
- });
2650
- }
2651
- function useCreateProduct(options) {
2652
- return (0, import_react_query9.useMutation)({
2653
- mutationFn: (input) => createProduct(input),
2654
- ...options
2655
- });
2656
- }
2657
- function useUpdateProduct(options) {
2658
- return (0, import_react_query9.useMutation)({
2659
- mutationFn: (input) => updateProduct(input),
2660
- ...options
2661
- });
2662
- }
2663
- function useDeleteProduct(options) {
2664
- return (0, import_react_query9.useMutation)({
2665
- mutationFn: (id) => deleteProduct(id),
2666
- ...options
2667
- });
2668
- }
2669
- function useUploadProductLogo(options) {
2670
- return (0, import_react_query9.useMutation)({
2671
- mutationFn: (request) => uploadProductLogo(request),
2672
- ...options
2673
- });
2674
- }
2675
-
2676
- // src/v2/balance/types.ts
2677
- var BalanceSourcePriority = /* @__PURE__ */ ((BalanceSourcePriority2) => {
2678
- BalanceSourcePriority2[BalanceSourcePriority2["ONCHAIN"] = 1] = "ONCHAIN";
2679
- BalanceSourcePriority2[BalanceSourcePriority2["PORTFOLIO"] = 2] = "PORTFOLIO";
2680
- BalanceSourcePriority2[BalanceSourcePriority2["ENSO"] = 3] = "ENSO";
2681
- return BalanceSourcePriority2;
2682
- })(BalanceSourcePriority || {});
2683
-
2684
- // src/v2/balance/hooks/useBalance.ts
2536
+ // src/v2/earn-deposits/hooks/useActionsDefaultParams.ts
2685
2537
  var import_react10 = require("react");
2686
2538
 
2687
2539
  // src/v2/balance/hooks/useGetOnChainBalance.ts
2688
2540
  var import_wagmi = require("wagmi");
2689
2541
  var import_viem3 = require("viem");
2690
- var import_react7 = require("react");
2542
+ var import_react6 = require("react");
2691
2543
  var NATIVE_TOKEN_ADDRESSES = [
2692
2544
  "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
2693
2545
  "0x0000000000000000000000000000000000000000"
@@ -2702,7 +2554,7 @@ function useGetOnChainBalance({
2702
2554
  address,
2703
2555
  enabled = true
2704
2556
  }) {
2705
- const { nativeTokens, erc20Tokens } = (0, import_react7.useMemo)(() => {
2557
+ const { nativeTokens, erc20Tokens } = (0, import_react6.useMemo)(() => {
2706
2558
  const native = [];
2707
2559
  const erc20 = [];
2708
2560
  for (const token of tokens) {
@@ -2730,7 +2582,7 @@ function useGetOnChainBalance({
2730
2582
  refetchOnWindowFocus: true
2731
2583
  }
2732
2584
  });
2733
- const contracts = (0, import_react7.useMemo)(() => {
2585
+ const contracts = (0, import_react6.useMemo)(() => {
2734
2586
  if (!address || !enabled) return [];
2735
2587
  return erc20Tokens.map(
2736
2588
  (token) => ({
@@ -2756,7 +2608,7 @@ function useGetOnChainBalance({
2756
2608
  refetchOnWindowFocus: true
2757
2609
  }
2758
2610
  });
2759
- const balances = (0, import_react7.useMemo)(() => {
2611
+ const balances = (0, import_react6.useMemo)(() => {
2760
2612
  const result = [];
2761
2613
  if (nativeToken && nativeBalanceData) {
2762
2614
  result.push({
@@ -2783,7 +2635,7 @@ function useGetOnChainBalance({
2783
2635
  }, [nativeToken, nativeBalanceData, erc20Results, erc20Tokens]);
2784
2636
  const isLoading = nativeTokens.length > 0 && isNativeLoading || erc20Tokens.length > 0 && isErc20Loading;
2785
2637
  const error = nativeError || erc20Error;
2786
- const refetch = (0, import_react7.useCallback)(() => {
2638
+ const refetch = (0, import_react6.useCallback)(() => {
2787
2639
  if (nativeTokens.length > 0) {
2788
2640
  refetchNative();
2789
2641
  }
@@ -2799,14 +2651,17 @@ function useGetOnChainBalance({
2799
2651
  };
2800
2652
  }
2801
2653
 
2802
- // src/v2/balance/hooks/usePortfolioBalance.ts
2803
- var import_react_query12 = require("@tanstack/react-query");
2654
+ // src/v2/balance/hooks/useBalance.ts
2804
2655
  var import_react9 = require("react");
2805
2656
 
2657
+ // src/v2/balance/hooks/usePortfolioBalance.ts
2658
+ var import_react_query8 = require("@tanstack/react-query");
2659
+ var import_react8 = require("react");
2660
+
2806
2661
  // src/v2/supported-chains/hooks.ts
2807
- var import_react_query10 = require("@tanstack/react-query");
2662
+ var import_react_query6 = require("@tanstack/react-query");
2808
2663
  function useSupportedChains() {
2809
- const { data, isLoading, error, refetch } = (0, import_react_query10.useQuery)({
2664
+ const { data, isLoading, error, refetch } = (0, import_react_query6.useQuery)({
2810
2665
  ...supportedChainsQueries.all,
2811
2666
  ...queryDefaults
2812
2667
  });
@@ -2821,15 +2676,15 @@ function useSupportedChains() {
2821
2676
  }
2822
2677
 
2823
2678
  // src/v2/supported-tokens/hooks.ts
2824
- var import_react_query11 = require("@tanstack/react-query");
2825
- var import_react8 = require("react");
2679
+ var import_react_query7 = require("@tanstack/react-query");
2680
+ var import_react7 = require("react");
2826
2681
  function useSupportedTokens({
2827
2682
  page = 0,
2828
2683
  limit = 20,
2829
2684
  search,
2830
2685
  enabled = true
2831
2686
  } = {}) {
2832
- const { data, isLoading, error, refetch } = (0, import_react_query11.useQuery)({
2687
+ const { data, isLoading, error, refetch } = (0, import_react_query7.useQuery)({
2833
2688
  ...supportedTokensQueries.list({ page, limit, search }),
2834
2689
  ...queryDefaults,
2835
2690
  staleTime: 5 * 60 * 1e3,
@@ -2840,7 +2695,7 @@ function useSupportedTokens({
2840
2695
  // Don't refetch on tab focus
2841
2696
  enabled
2842
2697
  });
2843
- const tokens = (0, import_react8.useMemo)(() => {
2698
+ const tokens = (0, import_react7.useMemo)(() => {
2844
2699
  if (!data?.tokens) return [];
2845
2700
  return data.tokens.map(({ active, ...token }) => token);
2846
2701
  }, [data?.tokens]);
@@ -2871,14 +2726,14 @@ function usePortfolioBalance({
2871
2726
  isLoading,
2872
2727
  error,
2873
2728
  refetch
2874
- } = (0, import_react_query12.useQuery)({
2729
+ } = (0, import_react_query8.useQuery)({
2875
2730
  ...balanceQueries.portfolio(address || ""),
2876
2731
  ...queryDefaults,
2877
2732
  enabled: !!address,
2878
2733
  refetchInterval: 1 * 60 * 1e3
2879
2734
  // 1 minute
2880
2735
  });
2881
- const balances = (0, import_react9.useMemo)(() => {
2736
+ const balances = (0, import_react8.useMemo)(() => {
2882
2737
  if (!portfolioData) return [];
2883
2738
  const tokenBalances = [];
2884
2739
  portfolioData.portfolio.holdings.wallets.forEach((wallet) => {
@@ -2933,6 +2788,14 @@ function usePortfolioBalance({
2933
2788
  };
2934
2789
  }
2935
2790
 
2791
+ // src/v2/balance/types.ts
2792
+ var BalanceSourcePriority = /* @__PURE__ */ ((BalanceSourcePriority2) => {
2793
+ BalanceSourcePriority2[BalanceSourcePriority2["ONCHAIN"] = 1] = "ONCHAIN";
2794
+ BalanceSourcePriority2[BalanceSourcePriority2["PORTFOLIO"] = 2] = "PORTFOLIO";
2795
+ BalanceSourcePriority2[BalanceSourcePriority2["ENSO"] = 3] = "ENSO";
2796
+ return BalanceSourcePriority2;
2797
+ })(BalanceSourcePriority || {});
2798
+
2936
2799
  // src/v2/balance/utils.ts
2937
2800
  var import_viem5 = require("viem");
2938
2801
 
@@ -3036,7 +2899,7 @@ function useBalance2({
3036
2899
  } = usePortfolioBalance({
3037
2900
  address
3038
2901
  });
3039
- const consolidatedBalances = (0, import_react10.useMemo)(() => {
2902
+ const consolidatedBalances = (0, import_react9.useMemo)(() => {
3040
2903
  const sources = [];
3041
2904
  if (depositOpportunity && onChainBalances.length > 0) {
3042
2905
  sources.push(onChainBalances);
@@ -3064,8 +2927,227 @@ function useBalance2({
3064
2927
  };
3065
2928
  }
3066
2929
 
3067
- // src/v2/balance/hooks/useEnsoBalances.ts
2930
+ // src/v2/earn-deposits/hooks/useActionsDefaultParams.ts
2931
+ function sortByBalance(balances) {
2932
+ return [...balances].sort((a, b) => {
2933
+ const aValue = BigInt(a.amount);
2934
+ const bValue = BigInt(b.amount);
2935
+ if (bValue > aValue) return 1;
2936
+ if (bValue < aValue) return -1;
2937
+ return 0;
2938
+ });
2939
+ }
2940
+ function useActionsDefaultParams({
2941
+ opportunity,
2942
+ address,
2943
+ depositMode
2944
+ }) {
2945
+ const opportunityChainId = opportunity ? Number(opportunity.receiptToken.chain.chainId) : void 0;
2946
+ const isSecondaryOnly = opportunity?.vaultConfig?.secondaryOnly === true;
2947
+ const effectiveDepositMode = isSecondaryOnly ? "route" : depositMode;
2948
+ const useOnChainBalances = effectiveDepositMode === "native";
2949
+ const {
2950
+ balances: depositTokenBalances,
2951
+ isLoading: isDepositBalancesLoading,
2952
+ refetch: refetchDepositBalances
2953
+ } = useGetOnChainBalance({
2954
+ tokens: opportunity?.depositTokens ?? [],
2955
+ chainId: opportunityChainId,
2956
+ address,
2957
+ enabled: !!address && !!opportunity && opportunityChainId != null
2958
+ });
2959
+ const {
2960
+ balances: allChainBalances,
2961
+ isLoading: isAllChainBalancesLoading,
2962
+ refetchAll: refetchAllBalances
2963
+ } = useBalance2({
2964
+ address,
2965
+ chainIds: opportunityChainId ? [opportunityChainId] : [],
2966
+ depositOpportunity: opportunity ?? void 0
2967
+ });
2968
+ const rawBalances = (0, import_react10.useMemo)(() => {
2969
+ if (useOnChainBalances) {
2970
+ if (depositTokenBalances.length > 0) {
2971
+ return depositTokenBalances;
2972
+ }
2973
+ if (opportunity?.depositTokens) {
2974
+ return opportunity.depositTokens.map((token) => ({
2975
+ token,
2976
+ amount: "0",
2977
+ source: "onchain"
2978
+ }));
2979
+ }
2980
+ return [];
2981
+ }
2982
+ return allChainBalances;
2983
+ }, [useOnChainBalances, depositTokenBalances, allChainBalances, opportunity?.depositTokens]);
2984
+ const isBalancesLoading = useOnChainBalances ? isDepositBalancesLoading : isAllChainBalancesLoading;
2985
+ const refetchBalances = useOnChainBalances ? refetchDepositBalances : refetchAllBalances;
2986
+ const balances = (0, import_react10.useMemo)(() => {
2987
+ let filtered = rawBalances;
2988
+ if (!useOnChainBalances && opportunityChainId) {
2989
+ filtered = filtered.filter((b) => {
2990
+ const tokenChainId = Number(b.token.chain?.chainId);
2991
+ return tokenChainId === opportunityChainId;
2992
+ });
2993
+ }
2994
+ if (!useOnChainBalances) {
2995
+ filtered = filtered.filter((b) => BigInt(b.amount) > 0n);
2996
+ }
2997
+ filtered = filterExcludedTokens(filtered);
2998
+ return sortByBalance(filtered);
2999
+ }, [rawBalances, useOnChainBalances, opportunityChainId]);
3000
+ return {
3001
+ balances,
3002
+ isBalancesLoading,
3003
+ refetchBalances
3004
+ };
3005
+ }
3006
+
3007
+ // src/v2/earn-deposits/hooks.ts
3008
+ function useDeposits({ params, enabled = true }) {
3009
+ return (0, import_react_query9.useQuery)({
3010
+ ...earnDepositsQueries.byParams(params),
3011
+ ...queryDefaults,
3012
+ enabled
3013
+ });
3014
+ }
3015
+
3016
+ // src/v2/enso-balances/hooks.ts
3068
3017
  var import_react11 = require("react");
3018
+ var import_react_query10 = require("@tanstack/react-query");
3019
+ function useMultiChainBalances({
3020
+ chainIds,
3021
+ address
3022
+ }) {
3023
+ const queries2 = (0, import_react_query10.useQueries)({
3024
+ queries: chainIds.map((chainId) => ({
3025
+ ...ensoBalancesQueries.byParams({ user: address || "", chain: chainId }),
3026
+ enabled: !!address,
3027
+ staleTime: 60 * 1e3,
3028
+ refetchInterval: 3 * 60 * 1e3,
3029
+ refetchOnMount: false,
3030
+ refetchOnWindowFocus: false
3031
+ }))
3032
+ });
3033
+ const isLoading = queries2.some((query) => query.isLoading);
3034
+ const error = queries2.find((query) => query.error)?.error || null;
3035
+ const refetchAll = () => {
3036
+ queries2.forEach((query) => {
3037
+ query.refetch();
3038
+ });
3039
+ };
3040
+ const balances = (0, import_react11.useMemo)(() => {
3041
+ const balanceMap = {};
3042
+ queries2.forEach((query, index) => {
3043
+ const chainId = chainIds[index];
3044
+ if (query.data && chainId !== void 0) {
3045
+ balanceMap[chainId] = query.data.balances;
3046
+ }
3047
+ });
3048
+ return balanceMap;
3049
+ }, [queries2, chainIds]);
3050
+ return {
3051
+ balances,
3052
+ isLoading,
3053
+ error,
3054
+ refetchAll
3055
+ };
3056
+ }
3057
+
3058
+ // src/v2/opportunities/hooks.ts
3059
+ var import_react_query11 = require("@tanstack/react-query");
3060
+ function useOpportunities(options) {
3061
+ return (0, import_react_query11.useQuery)({
3062
+ ...opportunitiesQueries.all,
3063
+ ...queryDefaults,
3064
+ select: (data) => {
3065
+ const uniqueChainsMap = new Map(
3066
+ data.opportunities.map((opportunity) => opportunity.receiptToken?.chain).filter((chain) => chain !== void 0).map((chain) => [chain.id, chain])
3067
+ );
3068
+ const chains = Array.from(uniqueChainsMap.values());
3069
+ return {
3070
+ ...data,
3071
+ chains
3072
+ };
3073
+ }
3074
+ });
3075
+ }
3076
+ function useOpportunity({ id, ...options }) {
3077
+ return (0, import_react_query11.useQuery)({
3078
+ ...opportunitiesQueries.byId(id),
3079
+ ...queryDefaults,
3080
+ select: (data) => {
3081
+ return {
3082
+ ...data,
3083
+ chain: data.receiptToken?.chain
3084
+ };
3085
+ }
3086
+ });
3087
+ }
3088
+ function useOpportunitiesPaginated({
3089
+ params,
3090
+ enabled = true
3091
+ } = {}) {
3092
+ return (0, import_react_query11.useQuery)({
3093
+ ...opportunitiesQueries.paginated(params),
3094
+ ...queryDefaults,
3095
+ enabled
3096
+ });
3097
+ }
3098
+ function useOpportunitiesFilterOptions({
3099
+ enabled = true
3100
+ } = {}) {
3101
+ return (0, import_react_query11.useQuery)({
3102
+ ...opportunitiesQueries.filterOptions,
3103
+ ...queryDefaults,
3104
+ enabled
3105
+ });
3106
+ }
3107
+
3108
+ // src/v2/products/hooks.ts
3109
+ var import_react_query12 = require("@tanstack/react-query");
3110
+ function useProducts({ filters, enabled = true }) {
3111
+ return (0, import_react_query12.useQuery)({
3112
+ ...productsQueries.list(filters),
3113
+ ...queryDefaults,
3114
+ enabled
3115
+ });
3116
+ }
3117
+ function useProduct({ id, enabled = true }) {
3118
+ return (0, import_react_query12.useQuery)({
3119
+ ...productsQueries.byId(id),
3120
+ ...queryDefaults,
3121
+ enabled
3122
+ });
3123
+ }
3124
+ function useCreateProduct(options) {
3125
+ return (0, import_react_query12.useMutation)({
3126
+ mutationFn: (input) => createProduct(input),
3127
+ ...options
3128
+ });
3129
+ }
3130
+ function useUpdateProduct(options) {
3131
+ return (0, import_react_query12.useMutation)({
3132
+ mutationFn: (input) => updateProduct(input),
3133
+ ...options
3134
+ });
3135
+ }
3136
+ function useDeleteProduct(options) {
3137
+ return (0, import_react_query12.useMutation)({
3138
+ mutationFn: (id) => deleteProduct(id),
3139
+ ...options
3140
+ });
3141
+ }
3142
+ function useUploadProductLogo(options) {
3143
+ return (0, import_react_query12.useMutation)({
3144
+ mutationFn: (request) => uploadProductLogo(request),
3145
+ ...options
3146
+ });
3147
+ }
3148
+
3149
+ // src/v2/balance/hooks/useEnsoBalances.ts
3150
+ var import_react12 = require("react");
3069
3151
  function useEnsoBalances({
3070
3152
  address,
3071
3153
  chainIds
@@ -3080,7 +3162,7 @@ function useEnsoBalances({
3080
3162
  chainIds,
3081
3163
  address
3082
3164
  });
3083
- const balances = (0, import_react11.useMemo)(() => {
3165
+ const balances = (0, import_react12.useMemo)(() => {
3084
3166
  if (isSupportedTokensLoading || isLoading) return [];
3085
3167
  const tokenBalances = [];
3086
3168
  Object.entries(ensoBalances).forEach(([, chainBalances]) => {
@@ -3199,10 +3281,10 @@ function useStreamSupportedChains({
3199
3281
  }
3200
3282
 
3201
3283
  // src/v2/swap/useSwapRoute.ts
3202
- var import_react12 = require("react");
3284
+ var import_react13 = require("react");
3203
3285
 
3204
3286
  // src/v2/swap/route-processor.ts
3205
- var import_utils4 = require("@turtleclub/utils");
3287
+ var import_utils5 = require("@turtleclub/utils");
3206
3288
  var parseEnsoStep = (kind, fromToken, toToken) => {
3207
3289
  return {
3208
3290
  in: {
@@ -3224,7 +3306,7 @@ var parseApproveStep = (token, amount) => {
3224
3306
  symbol: token.symbol
3225
3307
  },
3226
3308
  out: null,
3227
- amount: (0, import_utils4.formatToken)(amount, { decimals: token.decimals }, true, false, 4),
3309
+ amount: (0, import_utils5.formatToken)(amount, { decimals: token.decimals }, true, false, 4),
3228
3310
  type: "approve"
3229
3311
  };
3230
3312
  };
@@ -3258,7 +3340,7 @@ function toEnsoTokenAddress(address) {
3258
3340
  return address;
3259
3341
  }
3260
3342
  function useSwapRoute(isEnabled, userAddress, distributorId, options, referralCode) {
3261
- const params = (0, import_react12.useMemo)(() => {
3343
+ const params = (0, import_react13.useMemo)(() => {
3262
3344
  if (!options || !isEnabled) return void 0;
3263
3345
  return {
3264
3346
  ...options,
@@ -3267,7 +3349,7 @@ function useSwapRoute(isEnabled, userAddress, distributorId, options, referralCo
3267
3349
  referral_code: referralCode
3268
3350
  };
3269
3351
  }, [options, userAddress, distributorId, referralCode]);
3270
- const hasRequiredParams = (0, import_react12.useMemo)(() => {
3352
+ const hasRequiredParams = (0, import_react13.useMemo)(() => {
3271
3353
  return !!(userAddress && params?.token_in && params?.token_out && params?.amount && params?.chain && params?.slippage && params?.distributor_id);
3272
3354
  }, [options]);
3273
3355
  const { data, isLoading, error } = useEarnRoute({
@@ -3284,7 +3366,7 @@ function useSwapRoute(isEnabled, userAddress, distributorId, options, referralCo
3284
3366
  },
3285
3367
  enabled: hasRequiredParams && isEnabled
3286
3368
  });
3287
- const routeDetails = (0, import_react12.useMemo)(() => processRouteDetails(data ?? null), [data]);
3369
+ const routeDetails = (0, import_react13.useMemo)(() => processRouteDetails(data ?? null), [data]);
3288
3370
  return {
3289
3371
  fetchedRoute: data ?? null,
3290
3372
  outputAmount: data?.amount_out ?? void 0,
@@ -3369,6 +3451,124 @@ function useSubmitCoverRequest(options) {
3369
3451
  });
3370
3452
  }
3371
3453
 
3454
+ // src/v2/membership-flow/hooks.ts
3455
+ var import_react14 = require("react");
3456
+ var useTurtleMembershipFlow = ({
3457
+ address,
3458
+ walletEcosystem = "evm",
3459
+ signMessage,
3460
+ chainId = "1",
3461
+ url,
3462
+ enabled = true,
3463
+ onError
3464
+ }) => {
3465
+ const previousAddressRef = (0, import_react14.useRef)(void 0);
3466
+ const isProcessingRef = (0, import_react14.useRef)(false);
3467
+ const {
3468
+ data: membershipData,
3469
+ isLoading: isCheckingMembership
3470
+ } = useCheckMembership({
3471
+ params: {
3472
+ address: address || "",
3473
+ walletEcosystem
3474
+ },
3475
+ enabled: !!address
3476
+ });
3477
+ const {
3478
+ mutateAsync: createAgreement,
3479
+ isPending: isCreatingAgreement,
3480
+ error: agreementError
3481
+ } = useCreateMembershipAgreement();
3482
+ const {
3483
+ mutateAsync: createMembership2,
3484
+ isPending: isCreatingMembership,
3485
+ error: membershipError
3486
+ } = useCreateMembership();
3487
+ const handleMembershipFlow = (0, import_react14.useCallback)(async (memberAddress) => {
3488
+ if (isProcessingRef.current) return;
3489
+ isProcessingRef.current = true;
3490
+ try {
3491
+ const agreementResult = await createAgreement({
3492
+ address: memberAddress,
3493
+ walletEcosystem,
3494
+ url: url || (typeof window !== "undefined" ? window.location.href : ""),
3495
+ chainId
3496
+ });
3497
+ let signature;
3498
+ try {
3499
+ signature = await signMessage(agreementResult.message);
3500
+ } catch (signError) {
3501
+ const errorMessage = signError?.message || "User rejected signature";
3502
+ if (onError) {
3503
+ await onError({
3504
+ type: "signature_rejected",
3505
+ message: errorMessage
3506
+ });
3507
+ }
3508
+ return;
3509
+ }
3510
+ const membershipResult = await createMembership2({
3511
+ address: memberAddress,
3512
+ walletEcosystem,
3513
+ signature,
3514
+ nonce: agreementResult.nonce
3515
+ });
3516
+ if (!membershipResult.isMember && membershipResult.error) {
3517
+ const errorMessage = membershipResult.error;
3518
+ if (onError) {
3519
+ await onError({
3520
+ type: "membership_failed",
3521
+ message: errorMessage
3522
+ });
3523
+ }
3524
+ }
3525
+ } catch (error2) {
3526
+ const errorMessage = error2?.message || "Unknown error during membership flow";
3527
+ if (onError) {
3528
+ await onError({
3529
+ type: "membership_failed",
3530
+ message: errorMessage
3531
+ });
3532
+ }
3533
+ } finally {
3534
+ isProcessingRef.current = false;
3535
+ }
3536
+ }, [createAgreement, walletEcosystem, url, chainId, signMessage, createMembership2, onError]);
3537
+ (0, import_react14.useEffect)(() => {
3538
+ if (!enabled) return;
3539
+ const currentAddress = address;
3540
+ if (!currentAddress) {
3541
+ if (previousAddressRef.current !== void 0) {
3542
+ previousAddressRef.current = void 0;
3543
+ }
3544
+ return;
3545
+ }
3546
+ if (isCheckingMembership) {
3547
+ return;
3548
+ }
3549
+ if (currentAddress !== previousAddressRef.current) {
3550
+ previousAddressRef.current = currentAddress;
3551
+ if (membershipData?.isMember) {
3552
+ return;
3553
+ }
3554
+ handleMembershipFlow(currentAddress);
3555
+ }
3556
+ }, [address, enabled, isCheckingMembership, membershipData, handleMembershipFlow]);
3557
+ const refetch = async () => {
3558
+ if (address) {
3559
+ await handleMembershipFlow(address);
3560
+ }
3561
+ };
3562
+ const isLoading = isCheckingMembership || isCreatingAgreement || isCreatingMembership;
3563
+ const error = agreementError?.message || membershipError?.message || null;
3564
+ return {
3565
+ isMember: membershipData?.isMember,
3566
+ isLoading,
3567
+ error,
3568
+ refetch
3569
+ };
3570
+ };
3571
+
3372
3572
  // src/v2/organizations/schema.ts
3373
3573
  var import_zod17 = require("zod");
3374
3574
  var LeaveOrganizationInputSchema = import_zod17.z.object({
@@ -3586,6 +3786,7 @@ var queries = (0, import_query_key_factory16.mergeQueryKeys)(
3586
3786
  tokenSchema,
3587
3787
  transactionSchema,
3588
3788
  txResponseItemSchema,
3789
+ useActionsDefaultParams,
3589
3790
  useAttributeAction,
3590
3791
  useBalance,
3591
3792
  useCancelDepositAction,
@@ -3630,6 +3831,7 @@ var queries = (0, import_query_key_factory16.mergeQueryKeys)(
3630
3831
  useSupportedTokens,
3631
3832
  useSwapRoute,
3632
3833
  useTokenBalance,
3834
+ useTurtleMembershipFlow,
3633
3835
  useUpdateProduct,
3634
3836
  useUploadProductLogo,
3635
3837
  useUserById,