@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/dist/index.cjs +11 -133
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -133
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/src/campaigns-v2/index.ts +0 -1
- package/src/campaigns-v2/useUserCampaignPositions.ts +11 -29
- package/src/campaigns-v2/useTonCampaignPositions.ts +0 -141
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": "
|
|
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
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
}
|