Skip to content

Commit bdc693a

Browse files
authored
Merge pull request #31 from lidofinance/fix/remove-weth
fix: edge case
2 parents 62b354a + 89cce7e commit bdc693a

File tree

1 file changed

+96
-148
lines changed

1 file changed

+96
-148
lines changed

modules/vaults/hooks/use-vault-data.ts

Lines changed: 96 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { type Address } from 'viem';
21
import { usePublicClient } from 'wagmi';
32
import invariant from 'tiny-invariant';
43
import { useQuery } from '@tanstack/react-query';
@@ -10,9 +9,97 @@ import { getStakingVaultContract } from 'modules/vaults/contracts/staking-vault'
109
import { getDashboardContract } from 'modules/vaults/contracts/dashboard';
1110
import { STRATEGY_LAZY } from 'consts/react-query-strategies';
1211
import { getHealthScore } from 'utils/get-health-score';
12+
import { DEFAULT_ADMIN_ROLE, NODE_OPERATOR_MANAGER_ROLE } from 'consts/roles';
13+
import { bigIntMax } from 'utils/bigint-math';
1314

1415
import type { VaultInfo } from 'types';
15-
import { DEFAULT_ADMIN_ROLE, NODE_OPERATOR_MANAGER_ROLE } from 'consts/roles';
16+
import type { PublicClient, Address } from 'viem';
17+
import type { LidoSDKShares } from '@lidofinance/lido-ethereum-sdk/shares';
18+
19+
type VaultDataArgs = {
20+
publicClient: PublicClient;
21+
vaultAddress: Address;
22+
shares: LidoSDKShares;
23+
};
24+
25+
const getVaultData = async ({
26+
publicClient,
27+
vaultAddress,
28+
shares,
29+
}: VaultDataArgs): Promise<VaultInfo> => {
30+
const vaultHubContract = getVaultHubContract(publicClient);
31+
const vaultContract = getStakingVaultContract(vaultAddress, publicClient);
32+
33+
const [owner, inOutDelta, nodeOperator, locked] = await Promise.all([
34+
vaultContract.read.owner(),
35+
vaultContract.read.inOutDelta(),
36+
vaultContract.read.nodeOperator(),
37+
vaultContract.read.locked(),
38+
]);
39+
40+
const balance = await publicClient.getBalance({
41+
address: vaultContract.address,
42+
});
43+
44+
const vaultHubSocket = await vaultHubContract.read.vaultSocket([
45+
vaultAddress,
46+
]);
47+
48+
const dashboardContract = getDashboardContract(owner, publicClient);
49+
50+
const [
51+
valuation,
52+
nodeOperatorUnclaimedFee,
53+
withdrawableEther,
54+
nodeOperatorFeeBP,
55+
totalMintableShares,
56+
defaultAdmins,
57+
nodeOperatorManagers,
58+
confirmExpiry,
59+
] = await Promise.all([
60+
dashboardContract.read.totalValue(),
61+
dashboardContract.read.nodeOperatorUnclaimedFee(),
62+
dashboardContract.read.withdrawableEther(),
63+
dashboardContract.read.nodeOperatorFeeBP(),
64+
dashboardContract.read.totalMintingCapacity(),
65+
dashboardContract.read.getRoleMembers([DEFAULT_ADMIN_ROLE]),
66+
dashboardContract.read.getRoleMembers([NODE_OPERATOR_MANAGER_ROLE]),
67+
dashboardContract.read.getConfirmExpiry(),
68+
]);
69+
70+
const [mintedEth, mintableEth, ethLimit] = await Promise.all([
71+
shares.convertToSteth(vaultHubSocket.liabilityShares),
72+
shares.convertToSteth(
73+
bigIntMax(totalMintableShares - vaultHubSocket.liabilityShares, 0n),
74+
),
75+
shares.convertToSteth(vaultHubSocket.shareLimit),
76+
]);
77+
78+
const healthScore = getHealthScore(valuation, vaultHubSocket);
79+
80+
return {
81+
mintable: mintableEth,
82+
minted: mintedEth,
83+
nodeOperator,
84+
ethLimit,
85+
valuation,
86+
inOutDelta,
87+
locked,
88+
apr: null,
89+
healthScore,
90+
address: vaultAddress,
91+
totalMintableShares,
92+
nodeOperatorUnclaimedFee,
93+
withdrawableEther,
94+
owner,
95+
balance,
96+
nodeOperatorFeeBP,
97+
defaultAdmins,
98+
nodeOperatorManagers,
99+
confirmExpiry,
100+
...vaultHubSocket,
101+
};
102+
};
16103

17104
export const useSingleVaultData = (vaultAddress: Address | undefined) => {
18105
const { shares } = useLidoSDK();
@@ -25,78 +112,7 @@ export const useSingleVaultData = (vaultAddress: Address | undefined) => {
25112
invariant(publicClient, 'PublicClient is not defined');
26113
invariant(vaultAddress, 'vaultAddress is not defined');
27114

28-
const vaultHubContract = getVaultHubContract(publicClient);
29-
const vaultContract = getStakingVaultContract(vaultAddress, publicClient);
30-
31-
const [owner, inOutDelta, nodeOperator, locked] = await Promise.all([
32-
vaultContract.read.owner(),
33-
vaultContract.read.inOutDelta(),
34-
vaultContract.read.nodeOperator(),
35-
vaultContract.read.locked(),
36-
]);
37-
38-
const balance = await publicClient.getBalance({
39-
address: vaultContract.address,
40-
});
41-
42-
const vaultHubSocket = await vaultHubContract.read.vaultSocket([
43-
vaultAddress,
44-
]);
45-
46-
const dashboardContract = getDashboardContract(owner, publicClient);
47-
48-
const [
49-
valuation,
50-
nodeOperatorUnclaimedFee,
51-
withdrawableEther,
52-
nodeOperatorFeeBP,
53-
totalMintableShares,
54-
defaultAdmins,
55-
nodeOperatorManagers,
56-
confirmExpiry,
57-
] = await Promise.all([
58-
dashboardContract.read.totalValue(),
59-
dashboardContract.read.nodeOperatorUnclaimedFee(),
60-
dashboardContract.read.withdrawableEther(),
61-
dashboardContract.read.nodeOperatorFeeBP(),
62-
dashboardContract.read.totalMintingCapacity(),
63-
dashboardContract.read.getRoleMembers([DEFAULT_ADMIN_ROLE]),
64-
dashboardContract.read.getRoleMembers([NODE_OPERATOR_MANAGER_ROLE]),
65-
dashboardContract.read.getConfirmExpiry(),
66-
]);
67-
68-
const [mintedEth, mintableEth, ethLimit] = await Promise.all([
69-
shares.convertToSteth(vaultHubSocket.liabilityShares),
70-
shares.convertToSteth(
71-
totalMintableShares - vaultHubSocket.liabilityShares,
72-
),
73-
shares.convertToSteth(vaultHubSocket.shareLimit),
74-
]);
75-
76-
const healthScore = getHealthScore(valuation, vaultHubSocket);
77-
78-
return {
79-
mintable: mintableEth,
80-
minted: mintedEth,
81-
nodeOperator,
82-
ethLimit,
83-
valuation,
84-
inOutDelta,
85-
locked,
86-
apr: null,
87-
healthScore,
88-
address: vaultAddress,
89-
totalMintableShares,
90-
nodeOperatorUnclaimedFee,
91-
withdrawableEther,
92-
owner,
93-
balance,
94-
nodeOperatorFeeBP,
95-
defaultAdmins,
96-
nodeOperatorManagers,
97-
confirmExpiry,
98-
...vaultHubSocket,
99-
};
115+
return getVaultData({ publicClient, shares, vaultAddress });
100116
},
101117
...STRATEGY_LAZY,
102118
});
@@ -116,7 +132,6 @@ export const useVaultData = (
116132
queryFn: async (): Promise<VaultInfo[]> => {
117133
invariant(publicClient, 'PublicClient is not ready');
118134

119-
const vaultHubContract = getVaultHubContract(publicClient);
120135
const vaults: VaultInfo[] = [];
121136

122137
if (vaultsAddressesList?.length && vaultsAddressesList.length === 0) {
@@ -125,80 +140,13 @@ export const useVaultData = (
125140

126141
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
127142
for (const vaultAddress of vaultsAddressesList!) {
128-
const vaultContract = getStakingVaultContract(
129-
vaultAddress,
130-
publicClient,
143+
vaults.push(
144+
await getVaultData({
145+
publicClient,
146+
vaultAddress,
147+
shares,
148+
}),
131149
);
132-
133-
const [owner, inOutDelta, nodeOperator, locked] = await Promise.all([
134-
vaultContract.read.owner(),
135-
vaultContract.read.inOutDelta(),
136-
vaultContract.read.nodeOperator(),
137-
vaultContract.read.locked(),
138-
]);
139-
140-
const balance = await publicClient.getBalance({
141-
address: vaultContract.address,
142-
});
143-
144-
const vaultHubSocket = await vaultHubContract.read.vaultSocket([
145-
vaultAddress,
146-
]);
147-
148-
const dashboardContract = getDashboardContract(owner, publicClient);
149-
150-
const [
151-
valuation,
152-
nodeOperatorUnclaimedFee,
153-
withdrawableEther,
154-
nodeOperatorFeeBP,
155-
totalMintableShares,
156-
confirmExpiry,
157-
defaultAdmins,
158-
nodeOperatorManagers,
159-
] = await Promise.all([
160-
dashboardContract.read.totalValue(),
161-
dashboardContract.read.nodeOperatorUnclaimedFee(),
162-
dashboardContract.read.withdrawableEther(),
163-
dashboardContract.read.nodeOperatorFeeBP(),
164-
dashboardContract.read.totalMintingCapacity(),
165-
dashboardContract.read.getConfirmExpiry(),
166-
dashboardContract.read.getRoleMembers([DEFAULT_ADMIN_ROLE]),
167-
dashboardContract.read.getRoleMembers([NODE_OPERATOR_MANAGER_ROLE]),
168-
]);
169-
170-
const [mintedEth, mintableEth, ethLimit] = await Promise.all([
171-
shares.convertToSteth(vaultHubSocket.liabilityShares),
172-
shares.convertToSteth(
173-
totalMintableShares - vaultHubSocket.liabilityShares,
174-
),
175-
shares.convertToSteth(vaultHubSocket.shareLimit),
176-
]);
177-
178-
const healthScore = getHealthScore(valuation, vaultHubSocket);
179-
180-
vaults.push({
181-
mintable: mintableEth,
182-
minted: mintedEth,
183-
nodeOperator,
184-
ethLimit,
185-
valuation,
186-
inOutDelta,
187-
locked,
188-
apr: null,
189-
healthScore,
190-
address: vaultAddress,
191-
totalMintableShares,
192-
nodeOperatorUnclaimedFee,
193-
withdrawableEther,
194-
owner,
195-
balance,
196-
nodeOperatorFeeBP,
197-
confirmExpiry,
198-
defaultAdmins,
199-
nodeOperatorManagers,
200-
...vaultHubSocket,
201-
});
202150
}
203151

204152
return vaults;

0 commit comments

Comments
 (0)