@sodax/dapp-kit 0.0.1-rc.9 → 1.0.0-beta

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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +157 -58
  3. package/dist/index.d.mts +1558 -0
  4. package/dist/index.d.ts +1558 -4
  5. package/dist/index.js +1025 -88
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +983 -89
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +7 -8
  10. package/src/contexts/index.ts +3 -2
  11. package/src/hooks/backend/README.md +135 -0
  12. package/src/hooks/backend/index.ts +23 -0
  13. package/src/hooks/backend/useBackendAllMoneyMarketAssets.ts +49 -0
  14. package/src/hooks/backend/useBackendAllMoneyMarketBorrowers.ts +61 -0
  15. package/src/hooks/backend/useBackendIntentByHash.ts +53 -0
  16. package/src/hooks/backend/useBackendIntentByTxHash.ts +57 -0
  17. package/src/hooks/backend/useBackendMoneyMarketAsset.ts +57 -0
  18. package/src/hooks/backend/useBackendMoneyMarketAssetBorrowers.ts +67 -0
  19. package/src/hooks/backend/useBackendMoneyMarketAssetSuppliers.ts +67 -0
  20. package/src/hooks/backend/useBackendMoneyMarketPosition.ts +56 -0
  21. package/src/hooks/backend/useBackendOrderbook.ts +63 -0
  22. package/src/hooks/bridge/index.ts +5 -0
  23. package/src/hooks/bridge/useBridge.ts +57 -0
  24. package/src/hooks/bridge/useBridgeAllowance.ts +49 -0
  25. package/src/hooks/bridge/useBridgeApprove.ts +68 -0
  26. package/src/hooks/bridge/useGetBridgeableAmount.ts +50 -0
  27. package/src/hooks/bridge/useGetBridgeableTokens.ts +62 -0
  28. package/src/hooks/index.ts +4 -0
  29. package/src/hooks/migrate/index.ts +4 -0
  30. package/src/hooks/migrate/types.ts +15 -0
  31. package/src/hooks/migrate/useMigrate.tsx +110 -0
  32. package/src/hooks/migrate/useMigrationAllowance.tsx +79 -0
  33. package/src/hooks/migrate/useMigrationApprove.tsx +129 -0
  34. package/src/hooks/mm/index.ts +2 -0
  35. package/src/hooks/mm/useAToken.ts +47 -0
  36. package/src/hooks/mm/useMMAllowance.ts +2 -1
  37. package/src/hooks/mm/useMMApprove.ts +2 -1
  38. package/src/hooks/mm/useReservesData.ts +1 -8
  39. package/src/hooks/mm/useReservesHumanized.ts +30 -0
  40. package/src/hooks/mm/useReservesList.ts +29 -0
  41. package/src/hooks/mm/useReservesUsdFormat.ts +38 -0
  42. package/src/hooks/mm/useUserFormattedSummary.ts +54 -0
  43. package/src/hooks/mm/useUserReservesData.ts +30 -31
  44. package/src/hooks/provider/useHubProvider.ts +3 -3
  45. package/src/hooks/provider/useSpokeProvider.ts +45 -21
  46. package/src/hooks/shared/index.ts +4 -0
  47. package/src/hooks/shared/useDeriveUserWalletAddress.ts +44 -0
  48. package/src/hooks/shared/useEstimateGas.ts +18 -0
  49. package/src/hooks/shared/useRequestTrustline.ts +103 -0
  50. package/src/hooks/shared/useStellarTrustlineCheck.ts +71 -0
  51. package/src/hooks/staking/index.ts +19 -0
  52. package/src/hooks/staking/useCancelUnstake.ts +52 -0
  53. package/src/hooks/staking/useClaim.ts +46 -0
  54. package/src/hooks/staking/useConvertedAssets.ts +47 -0
  55. package/src/hooks/staking/useInstantUnstake.ts +50 -0
  56. package/src/hooks/staking/useInstantUnstakeAllowance.ts +59 -0
  57. package/src/hooks/staking/useInstantUnstakeApprove.ts +52 -0
  58. package/src/hooks/staking/useInstantUnstakeRatio.ts +54 -0
  59. package/src/hooks/staking/useStake.ts +47 -0
  60. package/src/hooks/staking/useStakeAllowance.ts +57 -0
  61. package/src/hooks/staking/useStakeApprove.ts +50 -0
  62. package/src/hooks/staking/useStakeRatio.ts +53 -0
  63. package/src/hooks/staking/useStakingConfig.ts +40 -0
  64. package/src/hooks/staking/useStakingInfo.ts +50 -0
  65. package/src/hooks/staking/useUnstake.ts +54 -0
  66. package/src/hooks/staking/useUnstakeAllowance.ts +58 -0
  67. package/src/hooks/staking/useUnstakeApprove.ts +52 -0
  68. package/src/hooks/staking/useUnstakingInfo.ts +53 -0
  69. package/src/hooks/staking/useUnstakingInfoWithPenalty.ts +59 -0
  70. package/src/hooks/swap/index.ts +2 -1
  71. package/src/hooks/swap/useCancelSwap.ts +44 -0
  72. package/src/hooks/swap/useQuote.ts +16 -2
  73. package/src/hooks/swap/useStatus.ts +1 -1
  74. package/src/hooks/swap/{useCreateIntentOrder.ts → useSwap.ts} +16 -11
  75. package/src/hooks/swap/useSwapAllowance.ts +5 -1
  76. package/src/hooks/swap/useSwapApprove.ts +14 -14
  77. package/src/index.ts +0 -1
  78. package/src/providers/SodaxProvider.tsx +8 -20
  79. package/dist/contexts/index.d.ts +0 -8
  80. package/dist/contexts/index.d.ts.map +0 -1
  81. package/dist/core/index.d.ts +0 -3
  82. package/dist/core/index.d.ts.map +0 -1
  83. package/dist/hooks/index.d.ts +0 -5
  84. package/dist/hooks/index.d.ts.map +0 -1
  85. package/dist/hooks/mm/index.d.ts +0 -9
  86. package/dist/hooks/mm/index.d.ts.map +0 -1
  87. package/dist/hooks/mm/useBorrow.d.ts +0 -35
  88. package/dist/hooks/mm/useBorrow.d.ts.map +0 -1
  89. package/dist/hooks/mm/useMMAllowance.d.ts +0 -26
  90. package/dist/hooks/mm/useMMAllowance.d.ts.map +0 -1
  91. package/dist/hooks/mm/useMMApprove.d.ts +0 -27
  92. package/dist/hooks/mm/useMMApprove.d.ts.map +0 -1
  93. package/dist/hooks/mm/useRepay.d.ts +0 -35
  94. package/dist/hooks/mm/useRepay.d.ts.map +0 -1
  95. package/dist/hooks/mm/useReservesData.d.ts +0 -19
  96. package/dist/hooks/mm/useReservesData.d.ts.map +0 -1
  97. package/dist/hooks/mm/useSupply.d.ts +0 -34
  98. package/dist/hooks/mm/useSupply.d.ts.map +0 -1
  99. package/dist/hooks/mm/useUserReservesData.d.ts +0 -3
  100. package/dist/hooks/mm/useUserReservesData.d.ts.map +0 -1
  101. package/dist/hooks/mm/useWithdraw.d.ts +0 -33
  102. package/dist/hooks/mm/useWithdraw.d.ts.map +0 -1
  103. package/dist/hooks/provider/index.d.ts +0 -3
  104. package/dist/hooks/provider/index.d.ts.map +0 -1
  105. package/dist/hooks/provider/useHubProvider.d.ts +0 -3
  106. package/dist/hooks/provider/useHubProvider.d.ts.map +0 -1
  107. package/dist/hooks/provider/useSpokeProvider.d.ts +0 -18
  108. package/dist/hooks/provider/useSpokeProvider.d.ts.map +0 -1
  109. package/dist/hooks/shared/index.d.ts +0 -2
  110. package/dist/hooks/shared/index.d.ts.map +0 -1
  111. package/dist/hooks/shared/useSodaxContext.d.ts +0 -8
  112. package/dist/hooks/shared/useSodaxContext.d.ts.map +0 -1
  113. package/dist/hooks/swap/index.d.ts +0 -6
  114. package/dist/hooks/swap/index.d.ts.map +0 -1
  115. package/dist/hooks/swap/useCreateIntentOrder.d.ts +0 -33
  116. package/dist/hooks/swap/useCreateIntentOrder.d.ts.map +0 -1
  117. package/dist/hooks/swap/useQuote.d.ts +0 -39
  118. package/dist/hooks/swap/useQuote.d.ts.map +0 -1
  119. package/dist/hooks/swap/useStatus.d.ts +0 -31
  120. package/dist/hooks/swap/useStatus.d.ts.map +0 -1
  121. package/dist/hooks/swap/useSwapAllowance.d.ts +0 -23
  122. package/dist/hooks/swap/useSwapAllowance.d.ts.map +0 -1
  123. package/dist/hooks/swap/useSwapApprove.d.ts +0 -26
  124. package/dist/hooks/swap/useSwapApprove.d.ts.map +0 -1
  125. package/dist/index.d.ts.map +0 -1
  126. package/dist/providers/SodaxProvider.d.ts +0 -10
  127. package/dist/providers/SodaxProvider.d.ts.map +0 -1
  128. package/dist/providers/index.d.ts +0 -2
  129. package/dist/providers/index.d.ts.map +0 -1
  130. package/src/core/index.ts +0 -12
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- import React, { createContext, useContext, useMemo } from 'react';
2
- import { EvmSpokeProvider, spokeChainConfig, SuiSpokeProvider, IconSpokeProvider, CWSpokeProvider, StellarSpokeProvider, SolanaSpokeProvider, encodeAddress, EvmWalletAbstraction, getMoneyMarketConfig, Sodax, getHubChainConfig, EvmHubProvider, hubAssets } from '@sodax/sdk';
3
- import { getXChainType, useWalletProvider } from '@sodax/wallet-sdk';
1
+ import React, { createContext, useContext, useState, useCallback, useMemo, useRef, useEffect } from 'react';
2
+ import { SpokeService, deriveUserWalletAddress, STELLAR_MAINNET_CHAIN_ID, StellarSpokeProvider, StellarSpokeService, spokeChainConfig, SONIC_MAINNET_CHAIN_ID, SonicSpokeProvider, EvmSpokeProvider, SuiSpokeProvider, IconSpokeProvider, InjectiveSpokeProvider, SolanaSpokeProvider, isLegacybnUSDToken, Sodax } from '@sodax/sdk';
4
3
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
5
4
  import { parseUnits } from 'viem';
5
+ import { ICON_MAINNET_CHAIN_ID } from '@sodax/types';
6
6
 
7
7
  // src/contexts/index.ts
8
8
  var SodaxContext = createContext(null);
@@ -13,58 +13,165 @@ var useSodaxContext = () => {
13
13
  }
14
14
  return context;
15
15
  };
16
+ function useEstimateGas(spokeProvider) {
17
+ return useMutation({
18
+ mutationFn: async (rawTx) => {
19
+ if (!spokeProvider) {
20
+ throw new Error("spokeProvider is not found");
21
+ }
22
+ const response = await SpokeService.estimateGas(rawTx, spokeProvider);
23
+ return response;
24
+ }
25
+ });
26
+ }
27
+ function useDeriveUserWalletAddress(spokeProvider, walletAddress) {
28
+ const { sodax } = useSodaxContext();
29
+ return useQuery({
30
+ queryKey: ["deriveUserWalletAddress", spokeProvider?.chainConfig.chain.id, walletAddress],
31
+ queryFn: async () => {
32
+ if (!spokeProvider) {
33
+ throw new Error("Spoke provider is required");
34
+ }
35
+ return await deriveUserWalletAddress(spokeProvider, sodax.hubProvider, walletAddress);
36
+ },
37
+ enabled: !!spokeProvider,
38
+ refetchInterval: false
39
+ // This is a deterministic operation, no need to refetch
40
+ });
41
+ }
42
+ function useStellarTrustlineCheck(token, amount, spokeProvider, chainId) {
43
+ return useQuery({
44
+ queryKey: ["stellar-trustline-check", token],
45
+ queryFn: async () => {
46
+ if (chainId !== STELLAR_MAINNET_CHAIN_ID) {
47
+ return true;
48
+ }
49
+ if (!spokeProvider || !token || !amount || !(spokeProvider instanceof StellarSpokeProvider)) {
50
+ console.error(
51
+ "Spoke provider, token or amount not found. Details: spokeProvider:",
52
+ spokeProvider,
53
+ "token:",
54
+ token,
55
+ "amount:",
56
+ amount
57
+ );
58
+ return false;
59
+ }
60
+ const response = await StellarSpokeService.hasSufficientTrustline(token, amount, spokeProvider);
61
+ return response;
62
+ },
63
+ enabled: !!spokeProvider && !!token && !!amount
64
+ });
65
+ }
66
+ function useRequestTrustline(token) {
67
+ const queryClient = useQueryClient();
68
+ const [isLoading, setIsLoading] = useState(false);
69
+ const [isRequested, setIsRequested] = useState(false);
70
+ const [error, setError] = useState(null);
71
+ const [data, setData] = useState(null);
72
+ const requestTrustline = useCallback(
73
+ async ({
74
+ token: token2,
75
+ amount,
76
+ spokeProvider
77
+ }) => {
78
+ if (!spokeProvider || !token2 || !amount || !(spokeProvider instanceof StellarSpokeProvider)) {
79
+ const error2 = new Error("Spoke provider, token or amount not found");
80
+ setError(error2);
81
+ throw error2;
82
+ }
83
+ setIsLoading(true);
84
+ setError(null);
85
+ try {
86
+ const result = await StellarSpokeService.requestTrustline(token2, amount, spokeProvider);
87
+ setData(result);
88
+ setIsRequested(true);
89
+ queryClient.invalidateQueries({ queryKey: ["stellar-trustline-check", token2] });
90
+ return result;
91
+ } catch (err) {
92
+ const error2 = err instanceof Error ? err : new Error("Unknown error occurred");
93
+ setError(error2);
94
+ throw error2;
95
+ } finally {
96
+ setIsLoading(false);
97
+ }
98
+ },
99
+ [queryClient]
100
+ );
101
+ return {
102
+ requestTrustline,
103
+ isLoading,
104
+ isRequested,
105
+ error,
106
+ data
107
+ };
108
+ }
16
109
 
17
110
  // src/hooks/provider/useHubProvider.ts
18
111
  function useHubProvider() {
19
- const { hubProvider } = useSodaxContext();
20
- return hubProvider;
112
+ const { sodax } = useSodaxContext();
113
+ return sodax.hubProvider;
21
114
  }
22
115
  function useSpokeProvider(spokeChainId, walletProvider) {
23
- const xChainType = getXChainType(spokeChainId);
24
- const walletProvider_ = useWalletProvider(spokeChainId);
25
- const _walletProvider = walletProvider ?? walletProvider_;
116
+ const { rpcConfig } = useSodaxContext();
117
+ const xChainType = spokeChainId ? spokeChainConfig[spokeChainId]?.chain.type : void 0;
26
118
  const spokeProvider = useMemo(() => {
27
- if (!_walletProvider) return void 0;
119
+ if (!walletProvider) return void 0;
28
120
  if (!spokeChainId) return void 0;
121
+ if (!xChainType) return void 0;
122
+ if (!rpcConfig) return void 0;
29
123
  if (xChainType === "EVM") {
124
+ if (spokeChainId === SONIC_MAINNET_CHAIN_ID) {
125
+ return new SonicSpokeProvider(
126
+ walletProvider,
127
+ spokeChainConfig[spokeChainId]
128
+ );
129
+ }
30
130
  return new EvmSpokeProvider(
31
- _walletProvider,
131
+ walletProvider,
32
132
  spokeChainConfig[spokeChainId]
33
133
  );
34
134
  }
35
135
  if (xChainType === "SUI") {
36
136
  return new SuiSpokeProvider(
37
137
  spokeChainConfig[spokeChainId],
38
- _walletProvider
138
+ walletProvider
39
139
  );
40
140
  }
41
141
  if (xChainType === "ICON") {
42
142
  return new IconSpokeProvider(
43
- _walletProvider,
143
+ walletProvider,
44
144
  spokeChainConfig[spokeChainId]
45
145
  );
46
146
  }
47
147
  if (xChainType === "INJECTIVE") {
48
- return new CWSpokeProvider(
148
+ return new InjectiveSpokeProvider(
49
149
  spokeChainConfig[spokeChainId],
50
- _walletProvider
150
+ walletProvider
51
151
  );
52
152
  }
53
153
  if (xChainType === "STELLAR") {
54
154
  const stellarConfig = spokeChainConfig[spokeChainId];
55
- return new StellarSpokeProvider(_walletProvider, stellarConfig, {
56
- horizonRpcUrl: stellarConfig.horizonRpcUrl,
57
- sorobanRpcUrl: stellarConfig.sorobanRpcUrl
58
- });
155
+ return new StellarSpokeProvider(
156
+ walletProvider,
157
+ stellarConfig,
158
+ rpcConfig.stellar ? rpcConfig.stellar : {
159
+ horizonRpcUrl: stellarConfig.horizonRpcUrl,
160
+ sorobanRpcUrl: stellarConfig.sorobanRpcUrl
161
+ }
162
+ );
59
163
  }
60
164
  if (xChainType === "SOLANA") {
61
165
  return new SolanaSpokeProvider(
62
- _walletProvider,
63
- spokeChainConfig[spokeChainId]
166
+ walletProvider,
167
+ rpcConfig.solana ? {
168
+ ...spokeChainConfig[spokeChainId],
169
+ rpcUrl: rpcConfig.solana
170
+ } : spokeChainConfig[spokeChainId]
64
171
  );
65
172
  }
66
173
  return void 0;
67
- }, [spokeChainId, xChainType, _walletProvider]);
174
+ }, [spokeChainId, xChainType, walletProvider, rpcConfig]);
68
175
  return spokeProvider;
69
176
  }
70
177
  function useBorrow(spokeToken, spokeProvider) {
@@ -160,46 +267,26 @@ function useWithdraw(spokeToken, spokeProvider) {
160
267
  }
161
268
  });
162
269
  }
163
- function useUserReservesData(spokeChainId, address) {
270
+ function useUserReservesData(spokeProvider, address, refetchInterval = 5e3) {
164
271
  const { sodax } = useSodaxContext();
165
- const hubChainId = sodax.config?.hubProviderConfig?.chainConfig.chain.id ?? "sonic";
166
- const hubProvider = useHubProvider();
167
- const { data: userReserves } = useQuery({
168
- queryKey: ["userReserves", spokeChainId, address],
272
+ return useQuery({
273
+ queryKey: ["userReserves", spokeProvider?.chainConfig.chain.id, address],
169
274
  queryFn: async () => {
170
- if (!hubProvider || !address) {
171
- return;
275
+ if (!spokeProvider) {
276
+ throw new Error("Spoke provider or address is not defined");
172
277
  }
173
- const addressBytes = encodeAddress(spokeChainId, address);
174
- const hubWalletAddress = await EvmWalletAbstraction.getUserHubWalletAddress(
175
- spokeChainId,
176
- addressBytes,
177
- hubProvider
178
- );
179
- const moneyMarketConfig = getMoneyMarketConfig(hubChainId);
180
- const [res] = await sodax.moneyMarket.getUserReservesData(
181
- hubWalletAddress,
182
- moneyMarketConfig.uiPoolDataProvider,
183
- moneyMarketConfig.poolAddressesProvider
184
- );
185
- return res;
278
+ return await sodax.moneyMarket.data.getUserReservesData(spokeProvider);
186
279
  },
187
- enabled: !!spokeChainId && !!hubProvider && !!address,
188
- refetchInterval: 5e3
280
+ enabled: !!spokeProvider && !!address,
281
+ refetchInterval
189
282
  });
190
- return userReserves;
191
283
  }
192
284
  function useReservesData() {
193
285
  const { sodax } = useSodaxContext();
194
- const hubChainId = sodax.config?.hubProviderConfig?.chainConfig.chain.id ?? "sonic";
195
286
  return useQuery({
196
287
  queryKey: ["reservesData"],
197
288
  queryFn: async () => {
198
- const moneyMarketConfig = getMoneyMarketConfig(hubChainId);
199
- return await sodax.moneyMarket.getReservesData(
200
- moneyMarketConfig.uiPoolDataProvider,
201
- moneyMarketConfig.poolAddressesProvider
202
- );
289
+ return await sodax.moneyMarket.data.getReservesData();
203
290
  }
204
291
  });
205
292
  }
@@ -209,10 +296,11 @@ function useMMAllowance(token, amount, action, spokeProvider) {
209
296
  queryKey: ["allowance", token.address, amount, action],
210
297
  queryFn: async () => {
211
298
  if (!spokeProvider) throw new Error("Spoke provider is required");
299
+ const actionBasedDecimals = action === "withdraw" || action === "borrow" ? 18 : token.decimals;
212
300
  const allowance = await sodax.moneyMarket.isAllowanceValid(
213
301
  {
214
302
  token: token.address,
215
- amount: parseUnits(amount, token.decimals),
303
+ amount: parseUnits(amount, actionBasedDecimals),
216
304
  action
217
305
  },
218
306
  spokeProvider
@@ -238,10 +326,11 @@ function useMMApprove(token, spokeProvider) {
238
326
  if (!spokeProvider) {
239
327
  throw new Error("Spoke provider not found");
240
328
  }
329
+ const actionBasedDecimals = action === "withdraw" || action === "borrow" ? 18 : token.decimals;
241
330
  const allowance = await sodax.moneyMarket.approve(
242
331
  {
243
332
  token: token.address,
244
- amount: parseUnits(amount, token.decimals),
333
+ amount: parseUnits(amount, actionBasedDecimals),
245
334
  action
246
335
  },
247
336
  spokeProvider
@@ -262,28 +351,72 @@ function useMMApprove(token, spokeProvider) {
262
351
  resetError
263
352
  };
264
353
  }
354
+ function useAToken(aToken) {
355
+ const { sodax } = useSodaxContext();
356
+ return useQuery({
357
+ queryKey: ["aToken", sodax.hubProvider.chainConfig.chain.id, aToken],
358
+ queryFn: async () => {
359
+ if (!aToken) {
360
+ throw new Error("aToken address or hub provider is not defined");
361
+ }
362
+ const aTokenData = await sodax.moneyMarket.data.getATokenData(aToken);
363
+ return {
364
+ ...aTokenData,
365
+ xChainId: sodax.hubProvider.chainConfig.chain.id
366
+ };
367
+ },
368
+ enabled: !!aToken
369
+ });
370
+ }
371
+ function useReservesUsdFormat() {
372
+ const { sodax } = useSodaxContext();
373
+ return useQuery({
374
+ queryKey: ["reservesUsdFormat"],
375
+ queryFn: async () => {
376
+ const reserves = await sodax.moneyMarket.data.getReservesHumanized();
377
+ return sodax.moneyMarket.data.formatReservesUSD(sodax.moneyMarket.data.buildReserveDataWithPrice(reserves));
378
+ }
379
+ });
380
+ }
265
381
  var useQuote = (payload) => {
266
382
  const { sodax } = useSodaxContext();
383
+ const queryKey = useMemo(() => {
384
+ if (!payload) return ["quote", void 0];
385
+ return [
386
+ "quote",
387
+ {
388
+ ...payload,
389
+ amount: payload.amount.toString()
390
+ }
391
+ ];
392
+ }, [payload]);
267
393
  return useQuery({
268
- queryKey: [payload],
394
+ queryKey,
269
395
  queryFn: async () => {
270
396
  if (!payload) {
271
397
  return void 0;
272
398
  }
273
- return sodax.solver.getQuote(payload);
399
+ return sodax.swaps.getQuote(payload);
274
400
  },
275
401
  enabled: !!payload,
276
402
  refetchInterval: 3e3
277
403
  });
278
404
  };
279
- function useCreateIntentOrder(spokeProvider) {
405
+ function useSwap(spokeProvider) {
280
406
  const { sodax } = useSodaxContext();
407
+ const queryClient = useQueryClient();
281
408
  return useMutation({
282
409
  mutationFn: async (params) => {
283
410
  if (!spokeProvider) {
284
411
  throw new Error("Spoke provider not found");
285
412
  }
286
- return sodax.solver.createAndSubmitIntent(params, spokeProvider);
413
+ return sodax.swaps.swap({
414
+ intentParams: params,
415
+ spokeProvider
416
+ });
417
+ },
418
+ onSuccess: () => {
419
+ queryClient.invalidateQueries({ queryKey: ["xBalances"] });
287
420
  }
288
421
  });
289
422
  }
@@ -292,7 +425,7 @@ var useStatus = (intent_tx_hash) => {
292
425
  return useQuery({
293
426
  queryKey: [intent_tx_hash],
294
427
  queryFn: async () => {
295
- return sodax.solver.getStatus({ intent_tx_hash });
428
+ return sodax.swaps.getStatus({ intent_tx_hash });
296
429
  },
297
430
  refetchInterval: 3e3
298
431
  // 3s
@@ -306,16 +439,20 @@ function useSwapAllowance(params, spokeProvider) {
306
439
  if (!spokeProvider || !params) {
307
440
  return false;
308
441
  }
309
- const allowance = await sodax.solver.isAllowanceValid(params, spokeProvider);
442
+ const allowance = await sodax.swaps.isAllowanceValid({
443
+ intentParams: params,
444
+ spokeProvider
445
+ });
310
446
  if (allowance.ok) {
311
447
  return allowance.value;
312
448
  }
313
449
  return false;
314
450
  },
315
- enabled: !!spokeProvider && !!params
451
+ enabled: !!spokeProvider && !!params,
452
+ refetchInterval: 2e3
316
453
  });
317
454
  }
318
- function useSwapApprove(token, spokeProvider) {
455
+ function useSwapApprove(params, spokeProvider) {
319
456
  const { sodax } = useSodaxContext();
320
457
  const queryClient = useQueryClient();
321
458
  const {
@@ -324,25 +461,24 @@ function useSwapApprove(token, spokeProvider) {
324
461
  error,
325
462
  reset: resetError
326
463
  } = useMutation({
327
- mutationFn: async ({ amount }) => {
464
+ mutationFn: async ({ params: params2 }) => {
328
465
  if (!spokeProvider) {
329
466
  throw new Error("Spoke provider not found");
330
467
  }
331
- if (!token) {
332
- throw new Error("Token not found");
468
+ if (!params2) {
469
+ throw new Error("Swap Params not found");
333
470
  }
334
- const allowance = await sodax.solver.approve(
335
- token.address,
336
- parseUnits(amount, token.decimals),
471
+ const allowance = await sodax.swaps.approve({
472
+ intentParams: params2,
337
473
  spokeProvider
338
- );
474
+ });
339
475
  if (!allowance.ok) {
340
- throw new Error("Failed to approve tokens");
476
+ throw new Error("Failed to approve input token");
341
477
  }
342
478
  return allowance.ok;
343
479
  },
344
480
  onSuccess: () => {
345
- queryClient.invalidateQueries({ queryKey: ["allowance", token?.address] });
481
+ queryClient.invalidateQueries({ queryKey: ["allowance", params] });
346
482
  }
347
483
  });
348
484
  return {
@@ -352,30 +488,788 @@ function useSwapApprove(token, spokeProvider) {
352
488
  resetError
353
489
  };
354
490
  }
355
- var SodaxProvider = ({ children, testnet = false, config }) => {
356
- const sodax = new Sodax(config);
357
- const hubChainId = config?.hubProviderConfig?.chainConfig.chain.id;
358
- const hubRpcUrl = config?.hubProviderConfig?.hubRpcUrl;
359
- const hubProvider = useMemo(() => {
360
- if (hubChainId && hubRpcUrl) {
361
- const hubChainCfg = getHubChainConfig(hubChainId);
362
- return new EvmHubProvider({
363
- hubRpcUrl,
364
- chainConfig: hubChainCfg
365
- });
491
+ function useCancelSwap(spokeProvider) {
492
+ const { sodax } = useSodaxContext();
493
+ return useMutation({
494
+ mutationFn: async ({ intent, raw = false }) => {
495
+ if (!spokeProvider) {
496
+ throw new Error("Spoke provider not found");
497
+ }
498
+ return sodax.swaps.cancelIntent(intent, spokeProvider, raw);
366
499
  }
367
- return void 0;
368
- }, [hubChainId, hubRpcUrl]);
369
- return /* @__PURE__ */ React.createElement(SodaxContext.Provider, { value: { sodax, testnet, hubProvider } }, children);
500
+ });
501
+ }
502
+ var useBackendIntentByTxHash = (txHash, refetchInterval = 1e3) => {
503
+ const { sodax } = useSodaxContext();
504
+ return useQuery({
505
+ queryKey: ["backend", "intent", "txHash", txHash],
506
+ queryFn: async () => {
507
+ if (!txHash) {
508
+ return void 0;
509
+ }
510
+ return sodax.backendApi.getIntentByTxHash(txHash);
511
+ },
512
+ refetchInterval,
513
+ enabled: !!txHash && txHash.length > 0,
514
+ retry: 3
515
+ });
516
+ };
517
+ var useBackendIntentByHash = (intentHash) => {
518
+ const { sodax } = useSodaxContext();
519
+ return useQuery({
520
+ queryKey: ["backend", "intent", "hash", intentHash],
521
+ queryFn: async () => {
522
+ if (!intentHash) {
523
+ return void 0;
524
+ }
525
+ return sodax.backendApi.getIntentByHash(intentHash);
526
+ },
527
+ enabled: !!intentHash && intentHash.length > 0,
528
+ retry: 3
529
+ });
530
+ };
531
+ var useBackendOrderbook = (params) => {
532
+ const { sodax } = useSodaxContext();
533
+ return useQuery({
534
+ queryKey: ["backend", "solver", "orderbook", params],
535
+ queryFn: async () => {
536
+ if (!params || !params.offset || !params.limit) {
537
+ return void 0;
538
+ }
539
+ return sodax.backendApi.getOrderbook(params);
540
+ },
541
+ enabled: !!params && !!params.offset && !!params.limit,
542
+ staleTime: 30 * 1e3,
543
+ // 30 seconds for real-time data
544
+ retry: 3
545
+ });
546
+ };
547
+ var useBackendMoneyMarketPosition = (userAddress) => {
548
+ const { sodax } = useSodaxContext();
549
+ return useQuery({
550
+ queryKey: ["backend", "moneymarket", "position", userAddress],
551
+ queryFn: async () => {
552
+ if (!userAddress) {
553
+ return void 0;
554
+ }
555
+ return sodax.backendApi.getMoneyMarketPosition(userAddress);
556
+ },
557
+ enabled: !!userAddress && userAddress.length > 0,
558
+ retry: 3
559
+ });
370
560
  };
371
- var getSpokeTokenAddressByVault = (spokeChainId, vault) => {
372
- const tokens = hubAssets[spokeChainId];
373
- const address = Object.keys(tokens).find(
374
- (tokenAddress) => tokens[tokenAddress].vault.toLowerCase() === vault.toLowerCase()
561
+ var useBackendAllMoneyMarketAssets = () => {
562
+ const { sodax } = useSodaxContext();
563
+ return useQuery({
564
+ queryKey: ["backend", "moneymarket", "assets", "all"],
565
+ queryFn: async () => {
566
+ return sodax.backendApi.getAllMoneyMarketAssets();
567
+ },
568
+ retry: 3
569
+ });
570
+ };
571
+ var useBackendMoneyMarketAsset = (reserveAddress) => {
572
+ const { sodax } = useSodaxContext();
573
+ return useQuery({
574
+ queryKey: ["backend", "moneymarket", "asset", reserveAddress],
575
+ queryFn: async () => {
576
+ if (!reserveAddress) {
577
+ return void 0;
578
+ }
579
+ return sodax.backendApi.getMoneyMarketAsset(reserveAddress);
580
+ },
581
+ enabled: !!reserveAddress && reserveAddress.length > 0,
582
+ retry: 3
583
+ });
584
+ };
585
+ var useBackendMoneyMarketAssetBorrowers = (params) => {
586
+ const { sodax } = useSodaxContext();
587
+ return useQuery({
588
+ queryKey: ["backend", "moneymarket", "asset", "borrowers", params],
589
+ queryFn: async () => {
590
+ if (!params.reserveAddress || !params.offset || !params.limit) {
591
+ return void 0;
592
+ }
593
+ return sodax.backendApi.getMoneyMarketAssetBorrowers(params.reserveAddress, {
594
+ offset: params.offset,
595
+ limit: params.limit
596
+ });
597
+ },
598
+ enabled: !!params.reserveAddress && !!params.offset && !!params.limit,
599
+ retry: 3
600
+ });
601
+ };
602
+ var useBackendMoneyMarketAssetSuppliers = (params) => {
603
+ const { sodax } = useSodaxContext();
604
+ return useQuery({
605
+ queryKey: ["backend", "moneymarket", "asset", "suppliers", params],
606
+ queryFn: async () => {
607
+ if (!params.reserveAddress || !params.offset || !params.limit) {
608
+ return void 0;
609
+ }
610
+ return sodax.backendApi.getMoneyMarketAssetSuppliers(params.reserveAddress, {
611
+ offset: params.offset,
612
+ limit: params.limit
613
+ });
614
+ },
615
+ enabled: !!params.reserveAddress && !!params.offset && !!params.limit,
616
+ retry: 3
617
+ });
618
+ };
619
+ var useBackendAllMoneyMarketBorrowers = (params) => {
620
+ const { sodax } = useSodaxContext();
621
+ return useQuery({
622
+ queryKey: ["backend", "moneymarket", "borrowers", "all", params],
623
+ queryFn: async () => {
624
+ if (!params || !params.offset || !params.limit) {
625
+ return void 0;
626
+ }
627
+ return sodax.backendApi.getAllMoneyMarketBorrowers(params);
628
+ },
629
+ enabled: !!params && !!params.offset && !!params.limit,
630
+ retry: 3
631
+ });
632
+ };
633
+ function useBridgeAllowance(params, spokeProvider) {
634
+ const { sodax } = useSodaxContext();
635
+ return useQuery({
636
+ queryKey: ["bridge-allowance", params],
637
+ queryFn: async () => {
638
+ if (!spokeProvider || !params) {
639
+ return false;
640
+ }
641
+ const allowance = await sodax.bridge.isAllowanceValid({
642
+ params,
643
+ spokeProvider
644
+ });
645
+ if (allowance.ok) {
646
+ return allowance.value;
647
+ }
648
+ return false;
649
+ },
650
+ enabled: !!spokeProvider && !!params
651
+ });
652
+ }
653
+ function useBridgeApprove(spokeProvider) {
654
+ const { sodax } = useSodaxContext();
655
+ const queryClient = useQueryClient();
656
+ const {
657
+ mutateAsync: approve,
658
+ isPending,
659
+ error,
660
+ reset: resetError
661
+ } = useMutation({
662
+ mutationFn: async (params) => {
663
+ if (!spokeProvider) {
664
+ throw new Error("Spoke provider not found");
665
+ }
666
+ const allowance = await sodax.bridge.approve({
667
+ params,
668
+ spokeProvider
669
+ });
670
+ if (!allowance.ok) {
671
+ throw new Error("Failed to approve tokens for bridge");
672
+ }
673
+ return true;
674
+ },
675
+ onSuccess: (_, params) => {
676
+ queryClient.invalidateQueries({ queryKey: ["bridge-allowance", params] });
677
+ }
678
+ });
679
+ return {
680
+ approve,
681
+ isLoading: isPending,
682
+ error,
683
+ resetError
684
+ };
685
+ }
686
+ function useBridge(spokeProvider) {
687
+ const { sodax } = useSodaxContext();
688
+ return useMutation({
689
+ mutationFn: async (params) => {
690
+ if (!spokeProvider) {
691
+ throw new Error("Spoke provider not found");
692
+ }
693
+ const result = await sodax.bridge.bridge({
694
+ params,
695
+ spokeProvider
696
+ });
697
+ if (!result.ok) {
698
+ throw new Error(`Bridge failed: ${result.error.code}`);
699
+ }
700
+ return result;
701
+ }
702
+ });
703
+ }
704
+ function useGetBridgeableAmount(from, to) {
705
+ const { sodax } = useSodaxContext();
706
+ return useQuery({
707
+ queryKey: ["spoke-asset-manager-token-balance", from, to],
708
+ queryFn: async () => {
709
+ if (!from || !to) {
710
+ return 0n;
711
+ }
712
+ const result = await sodax.bridge.getBridgeableAmount(from, to);
713
+ if (result.ok) {
714
+ return result.value;
715
+ }
716
+ console.error("Error getting bridgeable amount:", result.error);
717
+ return 0n;
718
+ },
719
+ enabled: !!from && !!to
720
+ });
721
+ }
722
+ function useGetBridgeableTokens(from, to, token) {
723
+ const { sodax } = useSodaxContext();
724
+ return useQuery({
725
+ queryKey: ["bridgeable-tokens", from, to, token],
726
+ queryFn: async () => {
727
+ if (!from || !to || !token) {
728
+ return [];
729
+ }
730
+ const result = sodax.bridge.getBridgeableTokens(from, to, token);
731
+ if (result.ok) {
732
+ return result.value;
733
+ }
734
+ console.error("Error getting bridgeable tokens:", result.error);
735
+ return [];
736
+ },
737
+ enabled: !!from && !!to && !!token
738
+ });
739
+ }
740
+ function useStake(spokeProvider) {
741
+ const { sodax } = useSodaxContext();
742
+ return useMutation({
743
+ mutationFn: async (params) => {
744
+ if (!spokeProvider) {
745
+ throw new Error("Spoke provider not found");
746
+ }
747
+ const result = await sodax.staking.stake(params, spokeProvider);
748
+ if (!result.ok) {
749
+ throw new Error(`Stake failed: ${result.error.code}`);
750
+ }
751
+ return result.value;
752
+ }
753
+ });
754
+ }
755
+ function useStakeApprove(spokeProvider) {
756
+ const { sodax } = useSodaxContext();
757
+ return useMutation({
758
+ mutationFn: async (params) => {
759
+ if (!spokeProvider) {
760
+ throw new Error("Spoke provider not found");
761
+ }
762
+ const result = await sodax.staking.approve({
763
+ params: { ...params, action: "stake" },
764
+ spokeProvider
765
+ });
766
+ if (!result.ok) {
767
+ throw new Error(`Stake approval failed: ${result.error.code}`);
768
+ }
769
+ return result.value;
770
+ }
771
+ });
772
+ }
773
+ function useStakeAllowance(params, spokeProvider) {
774
+ const { sodax } = useSodaxContext();
775
+ return useQuery({
776
+ queryKey: ["soda", "stakeAllowance", params, spokeProvider?.chainConfig.chain.id],
777
+ queryFn: async () => {
778
+ if (!params || !spokeProvider) {
779
+ return false;
780
+ }
781
+ const result = await sodax.staking.isAllowanceValid({
782
+ params: { ...params, action: "stake" },
783
+ spokeProvider
784
+ });
785
+ if (!result.ok) {
786
+ throw new Error(`Allowance check failed: ${result.error.code}`);
787
+ }
788
+ return result.value;
789
+ },
790
+ enabled: !!params && !!spokeProvider,
791
+ refetchInterval: 5e3
792
+ // Refetch every 5 seconds
793
+ });
794
+ }
795
+ function useUnstake(spokeProvider) {
796
+ const { sodax } = useSodaxContext();
797
+ const queryClient = useQueryClient();
798
+ return useMutation({
799
+ mutationFn: async (params) => {
800
+ if (!spokeProvider) {
801
+ throw new Error("Spoke provider not found");
802
+ }
803
+ const result = await sodax.staking.unstake({ ...params, action: "unstake" }, spokeProvider);
804
+ if (!result.ok) {
805
+ throw new Error(`Unstake failed: ${result.error.code}`);
806
+ }
807
+ return result.value;
808
+ },
809
+ onSuccess: () => {
810
+ queryClient.invalidateQueries({ queryKey: ["stakingInfo"] });
811
+ queryClient.invalidateQueries({ queryKey: ["unstakingInfo"] });
812
+ queryClient.invalidateQueries({ queryKey: ["unstakingInfoWithPenalty"] });
813
+ }
814
+ });
815
+ }
816
+ function useClaim(spokeProvider) {
817
+ const { sodax } = useSodaxContext();
818
+ return useMutation({
819
+ mutationFn: async (params) => {
820
+ if (!spokeProvider) {
821
+ throw new Error("Spoke provider not found");
822
+ }
823
+ const result = await sodax.staking.claim({ ...params, action: "claim" }, spokeProvider);
824
+ if (!result.ok) {
825
+ throw new Error(`Claim failed: ${result.error.code}`);
826
+ }
827
+ return result.value;
828
+ }
829
+ });
830
+ }
831
+ function useCancelUnstake(spokeProvider) {
832
+ const { sodax } = useSodaxContext();
833
+ const queryClient = useQueryClient();
834
+ return useMutation({
835
+ mutationFn: async (params) => {
836
+ if (!spokeProvider) {
837
+ throw new Error("Spoke provider not available");
838
+ }
839
+ const result = await sodax.staking.cancelUnstake({ ...params, action: "cancelUnstake" }, spokeProvider);
840
+ if (!result.ok) {
841
+ throw new Error(`Cancel unstake failed: ${result.error.code}`);
842
+ }
843
+ return result.value;
844
+ },
845
+ onSuccess: () => {
846
+ queryClient.invalidateQueries({ queryKey: ["stakingInfo"] });
847
+ queryClient.invalidateQueries({ queryKey: ["unstakingInfo"] });
848
+ queryClient.invalidateQueries({ queryKey: ["unstakingInfoWithPenalty"] });
849
+ }
850
+ });
851
+ }
852
+ function useStakingInfo(spokeProvider, refetchInterval = 5e3) {
853
+ const { sodax } = useSodaxContext();
854
+ return useQuery({
855
+ queryKey: ["soda", "stakingInfo", spokeProvider?.chainConfig.chain.id],
856
+ queryFn: async () => {
857
+ if (!spokeProvider) {
858
+ throw new Error("Spoke provider not found");
859
+ }
860
+ const result = await sodax.staking.getStakingInfoFromSpoke(spokeProvider);
861
+ if (!result.ok) {
862
+ throw new Error(`Failed to fetch staking info: ${result.error.code}`);
863
+ }
864
+ return result.value;
865
+ },
866
+ enabled: !!spokeProvider,
867
+ refetchInterval
868
+ });
869
+ }
870
+ function useUnstakingInfoWithPenalty(userAddress, spokeProvider, refetchInterval = 5e3) {
871
+ const { sodax } = useSodaxContext();
872
+ return useQuery({
873
+ queryKey: ["soda", "unstakingInfoWithPenalty", spokeProvider?.chainConfig.chain.id, userAddress],
874
+ queryFn: async () => {
875
+ if (!spokeProvider) {
876
+ throw new Error("Spoke provider not found");
877
+ }
878
+ const penaltyResult = await sodax.staking.getUnstakingInfoWithPenalty(spokeProvider);
879
+ if (!penaltyResult.ok) {
880
+ throw new Error(`Failed to fetch unstaking info with penalty: ${penaltyResult.error.code}`);
881
+ }
882
+ return penaltyResult.value;
883
+ },
884
+ enabled: !!spokeProvider && !!userAddress,
885
+ refetchInterval
886
+ });
887
+ }
888
+ function useStakingConfig(refetchInterval = 3e4) {
889
+ const { sodax } = useSodaxContext();
890
+ return useQuery({
891
+ queryKey: ["soda", "stakingConfig"],
892
+ queryFn: async () => {
893
+ const result = await sodax.staking.getStakingConfig();
894
+ if (!result.ok) {
895
+ throw new Error(`Failed to fetch staking config: ${result.error.code}`);
896
+ }
897
+ return result.value;
898
+ },
899
+ refetchInterval
900
+ });
901
+ }
902
+ function useStakeRatio(amount, refetchInterval = 1e4) {
903
+ const { sodax } = useSodaxContext();
904
+ return useQuery({
905
+ queryKey: ["soda", "stakeRatio", amount?.toString()],
906
+ queryFn: async () => {
907
+ if (!amount || amount <= 0n) {
908
+ throw new Error("Amount must be greater than 0");
909
+ }
910
+ if (!sodax?.staking) {
911
+ throw new Error("Staking service not available");
912
+ }
913
+ const result = await sodax.staking.getStakeRatio(amount);
914
+ if (!result.ok) {
915
+ throw new Error(`Failed to fetch stake ratio: ${result.error.code}`);
916
+ }
917
+ return result.value;
918
+ },
919
+ enabled: !!amount && amount > 0n && !!sodax?.staking,
920
+ refetchInterval
921
+ });
922
+ }
923
+ function useInstantUnstakeRatio(amount, refetchInterval = 1e4) {
924
+ const { sodax } = useSodaxContext();
925
+ console.log("useInstantUnstakeRatio hook called with:", { amount: amount?.toString(), sodax: !!sodax });
926
+ return useQuery({
927
+ queryKey: ["soda", "instantUnstakeRatio", amount?.toString()],
928
+ queryFn: async () => {
929
+ console.log("useInstantUnstakeRatio queryFn called with amount:", amount?.toString());
930
+ if (!amount || amount <= 0n) {
931
+ throw new Error("Amount must be greater than 0");
932
+ }
933
+ if (!sodax?.staking) {
934
+ throw new Error("Staking service not available");
935
+ }
936
+ const result = await sodax.staking.getInstantUnstakeRatio(amount);
937
+ if (!result.ok) {
938
+ throw new Error(`Failed to fetch instant unstake ratio: ${result.error.code}`);
939
+ }
940
+ return result.value;
941
+ },
942
+ enabled: !!amount && amount > 0n && !!sodax?.staking,
943
+ refetchInterval
944
+ });
945
+ }
946
+ function useConvertedAssets(amount, refetchInterval = 1e4) {
947
+ const { sodax } = useSodaxContext();
948
+ console.log("useConvertedAssets hook called with:", { amount: amount?.toString(), sodax: !!sodax });
949
+ return useQuery({
950
+ queryKey: ["soda", "convertedAssets", amount?.toString()],
951
+ queryFn: async () => {
952
+ console.log("useConvertedAssets queryFn called with amount:", amount?.toString());
953
+ if (!amount || amount <= 0n) {
954
+ throw new Error("Amount must be greater than 0");
955
+ }
956
+ const result = await sodax.staking.getConvertedAssets(amount);
957
+ if (!result.ok) {
958
+ throw new Error(`Failed to fetch converted assets: ${result.error.code}`);
959
+ }
960
+ return result.value;
961
+ },
962
+ enabled: !!amount && amount > 0n && !!sodax?.staking,
963
+ refetchInterval
964
+ });
965
+ }
966
+ function useInstantUnstake(spokeProvider) {
967
+ const { sodax } = useSodaxContext();
968
+ return useMutation({
969
+ mutationFn: async (params) => {
970
+ if (!spokeProvider) {
971
+ throw new Error("spokeProvider is not found");
972
+ }
973
+ const result = await sodax.staking.instantUnstake({ ...params, action: "instantUnstake" }, spokeProvider);
974
+ if (!result.ok) {
975
+ throw new Error(`Instant unstake failed: ${result.error.code}`);
976
+ }
977
+ return result.value;
978
+ },
979
+ onError: (error) => {
980
+ console.error("Instant unstake error:", error);
981
+ }
982
+ });
983
+ }
984
+ function useUnstakeAllowance(params, spokeProvider) {
985
+ const { sodax } = useSodaxContext();
986
+ return useQuery({
987
+ queryKey: ["soda", "unstakeAllowance", params, spokeProvider?.chainConfig.chain.id],
988
+ queryFn: async () => {
989
+ if (!params || !spokeProvider) {
990
+ return false;
991
+ }
992
+ const result = await sodax.staking.isAllowanceValid({
993
+ params: { ...params, action: "unstake" },
994
+ spokeProvider
995
+ });
996
+ if (!result.ok) {
997
+ console.error(`Unstake allowance check failed: ${result.error.code}, error: ${result.error.error}`);
998
+ throw new Error(`Unstake allowance check failed: ${result.error.code}`);
999
+ }
1000
+ return result.value;
1001
+ },
1002
+ enabled: !!params && !!spokeProvider,
1003
+ refetchInterval: 5e3
1004
+ // Refetch every 5 seconds
1005
+ });
1006
+ }
1007
+ function useUnstakeApprove(spokeProvider) {
1008
+ const { sodax } = useSodaxContext();
1009
+ return useMutation({
1010
+ mutationFn: async (params) => {
1011
+ console.log("useUnstakeApprove called with params:", params);
1012
+ if (!spokeProvider) {
1013
+ throw new Error("Spoke provider not found");
1014
+ }
1015
+ const result = await sodax.staking.approve({
1016
+ params: { ...params, action: "unstake" },
1017
+ spokeProvider
1018
+ });
1019
+ if (!result.ok) {
1020
+ throw new Error(`Unstake approval failed: ${result.error.code}`);
1021
+ }
1022
+ return result.value;
1023
+ }
1024
+ });
1025
+ }
1026
+ function useUnstakingInfo(userAddress, spokeProvider, refetchInterval = 5e3) {
1027
+ const { sodax } = useSodaxContext();
1028
+ return useQuery({
1029
+ queryKey: ["soda", "unstakingInfoWithPenalty", spokeProvider?.chainConfig.chain.id, userAddress],
1030
+ queryFn: async () => {
1031
+ if (!spokeProvider || !userAddress) {
1032
+ throw new Error("Spoke provider or user address not found");
1033
+ }
1034
+ const result = await sodax.staking.getUnstakingInfo(spokeProvider);
1035
+ if (!result.ok) {
1036
+ throw new Error(`Failed to fetch unstaking info: ${result.error.code}`);
1037
+ }
1038
+ return result.value;
1039
+ },
1040
+ enabled: !!spokeProvider && !!userAddress,
1041
+ refetchInterval
1042
+ });
1043
+ }
1044
+ function useInstantUnstakeApprove(spokeProvider) {
1045
+ const { sodax } = useSodaxContext();
1046
+ return useMutation({
1047
+ mutationFn: async (params) => {
1048
+ console.log("useInstantUnstakeApprove called with params:", params);
1049
+ if (!spokeProvider) {
1050
+ throw new Error("Spoke provider not found");
1051
+ }
1052
+ const result = await sodax.staking.approve({
1053
+ params: { ...params, action: "instantUnstake" },
1054
+ spokeProvider
1055
+ });
1056
+ if (!result.ok) {
1057
+ throw new Error(`Instant unstake approval failed: ${result.error.code}`);
1058
+ }
1059
+ return result.value;
1060
+ }
1061
+ });
1062
+ }
1063
+ function useInstantUnstakeAllowance(params, spokeProvider) {
1064
+ const { sodax } = useSodaxContext();
1065
+ return useQuery({
1066
+ queryKey: ["soda", "instantUnstakeAllowance", params, spokeProvider?.chainConfig.chain.id],
1067
+ queryFn: async () => {
1068
+ if (!params || !spokeProvider) {
1069
+ return false;
1070
+ }
1071
+ const result = await sodax.staking.isAllowanceValid({
1072
+ params: { ...params, action: "instantUnstake" },
1073
+ spokeProvider
1074
+ });
1075
+ if (!result.ok) {
1076
+ console.error(`Unstake allowance check failed: ${result.error.code}, error: ${result.error.error}`);
1077
+ throw new Error(`Unstake allowance check failed: ${result.error.code}`);
1078
+ }
1079
+ return result.value;
1080
+ },
1081
+ enabled: !!params && !!spokeProvider,
1082
+ refetchInterval: 5e3
1083
+ // Refetch every 5 seconds
1084
+ });
1085
+ }
1086
+
1087
+ // src/hooks/migrate/types.ts
1088
+ var MIGRATION_MODE_ICX_SODA = "icxsoda";
1089
+ var MIGRATION_MODE_BNUSD = "bnusd";
1090
+
1091
+ // src/hooks/migrate/useMigrate.tsx
1092
+ function useMigrate(spokeProvider) {
1093
+ const { sodax } = useSodaxContext();
1094
+ return useMutation({
1095
+ mutationFn: async (params) => {
1096
+ const { token, amount, migrationMode = MIGRATION_MODE_ICX_SODA, toToken, destinationAddress } = params;
1097
+ const amountToMigrate = parseUnits(amount ?? "0", token?.decimals ?? 0);
1098
+ if (!spokeProvider) {
1099
+ throw new Error("Spoke provider not found");
1100
+ }
1101
+ if (migrationMode === MIGRATION_MODE_ICX_SODA) {
1102
+ if (token?.xChainId === ICON_MAINNET_CHAIN_ID) {
1103
+ const params2 = {
1104
+ address: spokeChainConfig[ICON_MAINNET_CHAIN_ID].nativeToken,
1105
+ amount: amountToMigrate,
1106
+ to: destinationAddress
1107
+ };
1108
+ const result2 = await sodax.migration.migrateIcxToSoda(params2, spokeProvider, 3e4);
1109
+ if (result2.ok) {
1110
+ const [spokeTxHash, hubTxHash] = result2.value;
1111
+ return { spokeTxHash, hubTxHash };
1112
+ }
1113
+ throw new Error("ICX to SODA migration failed. Please try again.");
1114
+ }
1115
+ const revertParams = {
1116
+ amount: amountToMigrate,
1117
+ to: destinationAddress
1118
+ };
1119
+ const result = await sodax.migration.revertMigrateSodaToIcx(
1120
+ revertParams,
1121
+ spokeProvider,
1122
+ 3e4
1123
+ );
1124
+ if (result.ok) {
1125
+ const [hubTxHash, spokeTxHash] = result.value;
1126
+ return { spokeTxHash, hubTxHash };
1127
+ }
1128
+ throw new Error("SODA to ICX migration failed. Please try again.");
1129
+ }
1130
+ if (migrationMode === MIGRATION_MODE_BNUSD) {
1131
+ const params2 = {
1132
+ srcChainId: token?.xChainId,
1133
+ dstChainId: toToken?.xChainId,
1134
+ srcbnUSD: token?.address,
1135
+ dstbnUSD: toToken?.address,
1136
+ amount: amountToMigrate,
1137
+ to: destinationAddress
1138
+ };
1139
+ const result = await sodax.migration.migratebnUSD(params2, spokeProvider, 3e4);
1140
+ if (result.ok) {
1141
+ const [spokeTxHash, hubTxHash] = result.value;
1142
+ return { spokeTxHash, hubTxHash };
1143
+ }
1144
+ const errorMessage = isLegacybnUSDToken(token?.address) ? "bnUSD migration failed. Please try again." : "bnUSD reverse migration failed. Please try again.";
1145
+ throw new Error(errorMessage);
1146
+ }
1147
+ throw new Error("Invalid migration mode");
1148
+ }
1149
+ });
1150
+ }
1151
+ function useMigrationAllowance(params, spokeProvider) {
1152
+ const { sodax } = useSodaxContext();
1153
+ return useQuery({
1154
+ queryKey: ["migration-allowance", params],
1155
+ queryFn: async () => {
1156
+ if (!spokeProvider || !params) {
1157
+ return false;
1158
+ }
1159
+ const { token, amount, migrationMode = MIGRATION_MODE_ICX_SODA, toToken, destinationAddress } = params;
1160
+ if (token?.xChainId === ICON_MAINNET_CHAIN_ID) {
1161
+ return true;
1162
+ }
1163
+ if (!spokeProvider) throw new Error("Spoke provider is required");
1164
+ const amountToMigrate = parseUnits(amount ?? "0", token?.decimals ?? 0);
1165
+ let migrationParams;
1166
+ if (migrationMode === MIGRATION_MODE_ICX_SODA) {
1167
+ migrationParams = {
1168
+ amount: amountToMigrate,
1169
+ to: destinationAddress
1170
+ };
1171
+ } else {
1172
+ if (!toToken) throw new Error("Destination token is required for bnUSD migration");
1173
+ migrationParams = {
1174
+ srcChainId: token?.xChainId,
1175
+ dstChainId: toToken?.xChainId,
1176
+ srcbnUSD: token?.address,
1177
+ dstbnUSD: toToken?.address,
1178
+ amount: amountToMigrate,
1179
+ to: destinationAddress
1180
+ };
1181
+ }
1182
+ const allowance = await sodax.migration.isAllowanceValid(migrationParams, "revert", spokeProvider);
1183
+ if (allowance.ok) {
1184
+ return allowance.value;
1185
+ }
1186
+ return false;
1187
+ },
1188
+ enabled: !!spokeProvider && !!params,
1189
+ refetchInterval: 2e3
1190
+ });
1191
+ }
1192
+ function useMigrationApprove(params, spokeProvider) {
1193
+ const { sodax } = useSodaxContext();
1194
+ const [isLoading, setIsLoading] = useState(false);
1195
+ const [error, setError] = useState(null);
1196
+ const [isApproved, setIsApproved] = useState(false);
1197
+ const queryClient = useQueryClient();
1198
+ const prevTokenAddress = useRef(void 0);
1199
+ const prevAmount = useRef(void 0);
1200
+ useEffect(() => {
1201
+ if (prevTokenAddress.current !== params?.token?.address || prevAmount.current !== params?.amount) {
1202
+ setIsApproved(false);
1203
+ prevTokenAddress.current = params?.token?.address;
1204
+ prevAmount.current = params?.amount;
1205
+ }
1206
+ }, [params?.token?.address, params?.amount]);
1207
+ const approve = useCallback(
1208
+ async ({ params: approveParams }) => {
1209
+ try {
1210
+ setIsLoading(true);
1211
+ setError(null);
1212
+ if (!spokeProvider) {
1213
+ throw new Error("Spoke provider not found");
1214
+ }
1215
+ if (!approveParams) {
1216
+ throw new Error("Migration intent not found");
1217
+ }
1218
+ const { token, amount, migrationMode = MIGRATION_MODE_ICX_SODA, toToken, destinationAddress } = approveParams;
1219
+ const amountToMigrate = parseUnits(amount ?? "0", token?.decimals ?? 0);
1220
+ let result;
1221
+ if (migrationMode === MIGRATION_MODE_ICX_SODA) {
1222
+ const revertParams = {
1223
+ amount: amountToMigrate,
1224
+ to: destinationAddress
1225
+ };
1226
+ result = await sodax.migration.approve(revertParams, "revert", spokeProvider, false);
1227
+ } else if (migrationMode === MIGRATION_MODE_BNUSD) {
1228
+ if (!toToken) throw new Error("Destination token is required for bnUSD migration");
1229
+ const migrationParams = {
1230
+ srcChainId: token?.xChainId,
1231
+ dstChainId: toToken?.xChainId,
1232
+ srcbnUSD: token?.address,
1233
+ dstbnUSD: toToken?.address,
1234
+ amount: amountToMigrate,
1235
+ to: destinationAddress
1236
+ };
1237
+ result = await sodax.migration.approve(migrationParams, "revert", spokeProvider, false);
1238
+ } else {
1239
+ throw new Error("Invalid migration mode");
1240
+ }
1241
+ if (!result.ok) {
1242
+ throw new Error("Failed to approve tokens");
1243
+ }
1244
+ setIsApproved(true);
1245
+ queryClient.invalidateQueries({ queryKey: ["migration-allowance", params] });
1246
+ return result.ok;
1247
+ } catch (err) {
1248
+ const error2 = err instanceof Error ? err : new Error("An unknown error occurred");
1249
+ setError(error2);
1250
+ throw error2;
1251
+ } finally {
1252
+ setIsLoading(false);
1253
+ }
1254
+ },
1255
+ [spokeProvider, sodax, queryClient, params]
375
1256
  );
376
- return address;
1257
+ const resetError = useCallback(() => {
1258
+ setError(null);
1259
+ }, []);
1260
+ return {
1261
+ approve,
1262
+ isLoading,
1263
+ error,
1264
+ resetError,
1265
+ isApproved
1266
+ };
1267
+ }
1268
+ var SodaxProvider = ({ children, testnet = false, config, rpcConfig }) => {
1269
+ const sodax = new Sodax(config);
1270
+ return /* @__PURE__ */ React.createElement(SodaxContext.Provider, { value: { sodax, testnet, rpcConfig } }, children);
377
1271
  };
378
1272
 
379
- export { SodaxProvider, getSpokeTokenAddressByVault, useBorrow, useCreateIntentOrder, useHubProvider, useMMAllowance, useMMApprove, useQuote, useRepay, useReservesData, useSodaxContext, useSpokeProvider, useStatus, useSupply, useSwapAllowance, useSwapApprove, useUserReservesData, useWithdraw };
1273
+ export { MIGRATION_MODE_BNUSD, MIGRATION_MODE_ICX_SODA, SodaxProvider, useAToken, useBackendAllMoneyMarketAssets, useBackendAllMoneyMarketBorrowers, useBackendIntentByHash, useBackendIntentByTxHash, useBackendMoneyMarketAsset, useBackendMoneyMarketAssetBorrowers, useBackendMoneyMarketAssetSuppliers, useBackendMoneyMarketPosition, useBackendOrderbook, useBorrow, useBridge, useBridgeAllowance, useBridgeApprove, useCancelSwap, useCancelUnstake, useClaim, useConvertedAssets, useDeriveUserWalletAddress, useEstimateGas, useGetBridgeableAmount, useGetBridgeableTokens, useHubProvider, useInstantUnstake, useInstantUnstakeAllowance, useInstantUnstakeApprove, useInstantUnstakeRatio, useMMAllowance, useMMApprove, useMigrate, useMigrationAllowance, useMigrationApprove, useQuote, useRepay, useRequestTrustline, useReservesData, useReservesUsdFormat, useSodaxContext, useSpokeProvider, useStake, useStakeAllowance, useStakeApprove, useStakeRatio, useStakingConfig, useStakingInfo, useStatus, useStellarTrustlineCheck, useSupply, useSwap, useSwapAllowance, useSwapApprove, useUnstake, useUnstakeAllowance, useUnstakeApprove, useUnstakingInfo, useUnstakingInfoWithPenalty, useUserReservesData, useWithdraw };
380
1274
  //# sourceMappingURL=index.mjs.map
381
1275
  //# sourceMappingURL=index.mjs.map