@turtleclub/hooks 0.3.0 → 0.3.1-beta.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@turtleclub/hooks",
3
3
  "type": "module",
4
- "version": "0.3.0",
4
+ "version": "0.3.1-beta.0",
5
5
  "license": "MIT",
6
6
  "exports": {
7
7
  ".": {
@@ -29,7 +29,6 @@
29
29
  "@tanstack/query-sync-storage-persister": "^5.55.3",
30
30
  "@tanstack/react-query": "^5.55.3",
31
31
  "@tanstack/react-query-persist-client": "^5.55.3",
32
- "@ton/ton": "^15.3.0",
33
32
  "@turtleclub/api": "0.3.0",
34
33
  "@turtleclub/chains": "0.2.0",
35
34
  "@turtleclub/utils": "0.2.0",
@@ -56,5 +55,5 @@
56
55
  "publishConfig": {
57
56
  "access": "public"
58
57
  },
59
- "gitHead": "f6bf0b6ad11bf17b42530b61deff9e1d2bbc0c1e"
58
+ "gitHead": "130669808a312b09cc3709b0f1ec18d70d60e535"
60
59
  }
@@ -1,6 +1,5 @@
1
1
  // Hooks exports
2
2
  export { useEvmCampaignPositions } from "./useEvmCampaignPositions";
3
- export { useTonCampaignPositions } from "./useTonCampaignPositions";
4
3
  export { useUserCampaignPositions } from "./useUserCampaignPositions";
5
4
  export { useCampaign, useTacCampaign, useKatanaCampaign } from "./useCampaign";
6
5
 
@@ -3,7 +3,6 @@ import type { Address } from "viem";
3
3
  import { useCampaign } from "./useCampaign";
4
4
  import type { CampaignVaultSchema } from "./api/partners/campaignSchemas";
5
5
  import { useEvmCampaignPositions } from "./useEvmCampaignPositions";
6
- import { useTonCampaignPositions } from "./useTonCampaignPositions";
7
6
 
8
7
  export interface Position {
9
8
  vault: CampaignVaultSchema;
@@ -20,43 +19,26 @@ export function useUserCampaignPositions({
20
19
  }) {
21
20
  const { vaults } = useCampaign(campaignName);
22
21
 
23
- const hasTONVaults = vaults.some(vault =>
24
- vault.vedaProviderConfig?.[1]
25
- );
26
-
27
- const hasEVMVaults = vaults.some(vault =>
28
- !vault.vedaProviderConfig?.[1]
29
- );
22
+ const hasEVMVaults = vaults.some((vault: any) => !vault.vedaProviderConfig?.[1]);
30
23
 
31
24
  const evmPositions = useEvmCampaignPositions({
32
25
  campaignName,
33
26
  userAddress: hasEVMVaults ? (userAddress as Address) : undefined,
34
27
  });
35
28
 
36
- const tonPositions = useTonCampaignPositions({
37
- campaignName,
38
- userAddress: hasTONVaults ? (userAddress as string) : undefined,
39
- });
40
-
41
- const userPositions = useMemo(() => [
42
- ...evmPositions.userPositions,
43
- ...tonPositions.userPositions,
44
- ], [evmPositions.userPositions, tonPositions.userPositions]);
45
-
46
- const userTotalTVL = useMemo(() =>
47
- evmPositions.userTotalTVL + tonPositions.userTotalTVL,
48
- [evmPositions.userTotalTVL, tonPositions.userTotalTVL]
29
+ const userPositions = useMemo(
30
+ () => [...evmPositions.userPositions],
31
+ [evmPositions.userPositions]
49
32
  );
50
33
 
51
- const isLoading = evmPositions.isLoading || tonPositions.isLoading;
52
- const error = evmPositions.error || tonPositions.error;
34
+ const userTotalTVL = useMemo(() => evmPositions.userTotalTVL, [evmPositions.userTotalTVL]);
35
+
36
+ const isLoading = evmPositions.isLoading;
37
+ const error = evmPositions.error;
53
38
 
54
39
  const invalidateUserPositions = useCallback(async () => {
55
- await Promise.all([
56
- evmPositions.invalidateUserPositions(),
57
- tonPositions.invalidateUserPositions(),
58
- ]);
59
- }, [evmPositions.invalidateUserPositions, tonPositions.invalidateUserPositions]);
40
+ await Promise.all([evmPositions.invalidateUserPositions()]);
41
+ }, [evmPositions.invalidateUserPositions]);
60
42
 
61
43
  return {
62
44
  userPositions,
@@ -65,4 +47,4 @@ export function useUserCampaignPositions({
65
47
  error,
66
48
  invalidateUserPositions,
67
49
  };
68
- }
50
+ }
@@ -1,141 +0,0 @@
1
- import { useCallback, useMemo } from "react";
2
- import { useQuery } from "@tanstack/react-query";
3
- import { TonClient4 } from "@ton/ton";
4
- import { useCampaign } from "./useCampaign";
5
- import type { CampaignVaultSchema } from "./api/partners/campaignSchemas";
6
-
7
- export interface Position {
8
- vault: CampaignVaultSchema;
9
- userBalance: bigint;
10
- userTVL: number;
11
- }
12
-
13
- interface Positions {
14
- userPositions: Position[];
15
- userTotalTVL: number;
16
- }
17
-
18
- export function useTonCampaignPositions({
19
- campaignName,
20
- userAddress,
21
- }: {
22
- campaignName: string;
23
- userAddress?: string;
24
- }) {
25
- const { vaults } = useCampaign(campaignName);
26
-
27
- const isTestnet = userAddress?.includes("0Q");
28
- const tonClient4 = useMemo(() => {
29
- const endpoint = isTestnet
30
- ? "https://testnet-v4.tonhubapi.com"
31
- : "https://mainnet-v4.tonhubapi.com";
32
-
33
- return new TonClient4({ endpoint });
34
- }, [isTestnet]);
35
-
36
- //Add Ecosystem for Ton Vaults
37
- const tonVaults = useMemo(() => {
38
- if (!userAddress) return [];
39
-
40
- return vaults.filter(vault =>
41
- vault.vedaProviderConfig?.deployments[0]
42
- );
43
- }, [vaults, userAddress]);
44
-
45
- const {
46
- data: positions,
47
- isLoading,
48
- error: queryError,
49
- refetch: refetchUserPositions,
50
- } = useQuery<Positions>({
51
- queryKey: ["ton-positions", userAddress, campaignName, tonVaults.length],
52
- queryFn: async () => {
53
- if (!userAddress || tonVaults.length === 0) {
54
- return {
55
- userPositions: [],
56
- userTotalTVL: 0,
57
- };
58
- }
59
-
60
- const userPositionsById: Record<string, Position> = {};
61
- let userTotalTVL = 0;
62
-
63
- for (const vault of tonVaults) {
64
- let userBalance = 0n;
65
- let userVaultTVL = 0;
66
-
67
- if (vault.vedaProviderConfig?.deployments[0].chainId === 239) {
68
- const apiEndpoint = isTestnet
69
- ? "https://testnet.tonapi.io/v2"
70
- : "https://tonapi.io/v2";
71
- const response = await fetch(`${apiEndpoint}/accounts/${userAddress}/jettons`);
72
- const data = await response.json();
73
-
74
- const tacTONBalance = data.balances?.find((balance: any) =>
75
- balance.jetton?.symbol === 'tacTON'
76
- );
77
-
78
- if (tacTONBalance) {
79
- const rawBalance = BigInt(tacTONBalance.balance);
80
- const decimals = tacTONBalance.jetton?.decimals || 9;
81
- const readableBalance = Number(rawBalance) / Math.pow(10, decimals);
82
-
83
- userVaultTVL = readableBalance * (2.9629) * (1.4/2008.205653); // TODO: Use live price
84
- userBalance = BigInt(Math.floor(readableBalance * 1e9));
85
- } else {
86
- userBalance = 0n;
87
- userVaultTVL = 0;
88
- }
89
- }
90
-
91
- if (userBalance > 0n || userVaultTVL > 0) {
92
- const existingPosition = userPositionsById[vault.id];
93
- if (existingPosition) {
94
- userPositionsById[vault.id] = {
95
- vault: vault,
96
- userBalance: existingPosition.userBalance + userBalance,
97
- userTVL: existingPosition.userTVL + userVaultTVL,
98
- };
99
- } else {
100
- userPositionsById[vault.id] = {
101
- vault: vault,
102
- userBalance: userBalance,
103
- userTVL: userVaultTVL,
104
- };
105
- }
106
- userTotalTVL += userVaultTVL;
107
- }
108
- }
109
-
110
- const userPositions = Object.values(userPositionsById);
111
-
112
- return {
113
- userPositions,
114
- userTotalTVL,
115
- };
116
- },
117
- enabled: !!userAddress && tonVaults.length > 0,
118
- staleTime: 30_000, // 30 seconds
119
- gcTime: 60_000, // 1 minute
120
- refetchOnMount: false,
121
- refetchOnWindowFocus: false,
122
- refetchOnReconnect: false,
123
- });
124
-
125
- const invalidateUserPositions = useCallback(async () => {
126
- await refetchUserPositions();
127
- }, [refetchUserPositions]);
128
-
129
- const result = useMemo(
130
- () => ({
131
- userPositions: positions?.userPositions ?? [],
132
- userTotalTVL: positions?.userTotalTVL ?? 0,
133
- isLoading,
134
- error: queryError,
135
- invalidateUserPositions,
136
- }),
137
- [positions, isLoading, queryError, invalidateUserPositions],
138
- );
139
-
140
- return result;
141
- }