@0xsquid/react-hooks 8.11.1-beta-danal.1 → 8.11.1-beta-danal.3

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 (35) hide show
  1. package/dist/core/constants.d.ts +1 -0
  2. package/dist/core/types/danal.d.ts +18 -0
  3. package/dist/core/types/index.d.ts +1 -0
  4. package/dist/hooks/index.d.ts +1 -1
  5. package/dist/hooks/tokens/useBalance.d.ts +1 -0
  6. package/dist/hooks/tokens/useNativeBalance.d.ts +1 -0
  7. package/dist/{index-D6rznmR_.js → index-DUJ-UlLM.js} +125 -10
  8. package/dist/index-DUJ-UlLM.js.map +1 -0
  9. package/dist/{index-BT6G_mgr.js → index-DrkMKLtr.js} +127 -9
  10. package/dist/index-DrkMKLtr.js.map +1 -0
  11. package/dist/{index.es-BZb8tg2z.js → index.es-C7zrx1ig.js} +2 -2
  12. package/dist/{index.es-BZb8tg2z.js.map → index.es-C7zrx1ig.js.map} +1 -1
  13. package/dist/{index.es-Dl19u5sy.js → index.es-CDalyOHR.js} +2 -2
  14. package/dist/{index.es-Dl19u5sy.js.map → index.es-CDalyOHR.js.map} +1 -1
  15. package/dist/index.esm.js +1 -1
  16. package/dist/index.js +4 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/{secretService-TP5V9Jwg.js → secretService-CFS8rXMv.js} +2 -2
  19. package/dist/{secretService-TP5V9Jwg.js.map → secretService-CFS8rXMv.js.map} +1 -1
  20. package/dist/{secretService-Dvc9Dg4U.js → secretService-YF4EFa4h.js} +2 -2
  21. package/dist/{secretService-Dvc9Dg4U.js.map → secretService-YF4EFa4h.js.map} +1 -1
  22. package/dist/server.esm.js.map +1 -1
  23. package/dist/server.js.map +1 -1
  24. package/dist/services/external/danalApiClient.d.ts +8 -0
  25. package/dist/services/external/index.d.ts +1 -0
  26. package/dist/services/external/rpcService.d.ts +2 -0
  27. package/dist/services/internal/danalService.d.ts +2 -0
  28. package/dist/{stellarService.client-c48cnGgL.js → stellarService.client-LAWbES06.js} +2 -2
  29. package/dist/{stellarService.client-c48cnGgL.js.map → stellarService.client-LAWbES06.js.map} +1 -1
  30. package/dist/{stellarService.client-WTkVJJhn.js → stellarService.client-uTJfWhDa.js} +2 -2
  31. package/dist/{stellarService.client-WTkVJJhn.js.map → stellarService.client-uTJfWhDa.js.map} +1 -1
  32. package/dist/tests/danalBalances.test.d.ts +1 -0
  33. package/package.json +2 -2
  34. package/dist/index-BT6G_mgr.js.map +0 -1
  35. package/dist/index-D6rznmR_.js.map +0 -1
@@ -110,6 +110,7 @@ const internalSquidApiBaseUrl = "https://app.squidrouter.com/api";
110
110
  const XAMAN_API_URL = `${internalSquidApiBaseUrl}/xaman/`;
111
111
  const TOKEN_PRICE_API_URL = `${internalSquidApiBaseUrl}/coingecko`;
112
112
  const CANTON_AMULET_REGISTRY_URL = `${internalSquidApiBaseUrl}/canton/scan-proxy`;
113
+ const DANAL_TESTNET_API_URL = "https://testnet.squid-api.payprotocol.io";
113
114
  const DEFAULT_ROUTE_REFETCH_INTERVAL = 30_000;
114
115
  const SOLANA_RPC_URL = "https://meredith-ute2ko-fast-mainnet.helius-rpc.com";
115
116
  const INTEGRATOR_ID = "squid-widget-playground-local-cd33cba6-7e12-4fcc-8d5d-35e286f655ea";
@@ -21132,6 +21133,11 @@ function groupCantonHoldingBalances(acsResponse) {
21132
21133
  return Object.fromEntries(Object.entries(totals).map(([key, total]) => [key, total.toString(10)]));
21133
21134
  }
21134
21135
 
21136
+ function isDanalTestnetToken(token) {
21137
+ return (token?.type === squidTypes.ChainType.DANAL &&
21138
+ token.chainId === CHAIN_IDS.DANAL_TESTNET &&
21139
+ token.address.toLowerCase() === nativeDanalTokenAddress);
21140
+ }
21135
21141
  // Matches the backend validation: "PCI" + 50 uppercase-hex chars, case-sensitive.
21136
21142
  const DANAL_ADDRESS_REGEX = /^PCI[0-9A-F]{50}$/;
21137
21143
  function isDanalAddressValid(address) {
@@ -22592,6 +22598,44 @@ function mergeWallets({ multiChainWallets, singleChainWallets, }) {
22592
22598
  return unifiedWallets;
22593
22599
  }
22594
22600
 
22601
+ const isBalanceAmount = (value) => typeof value === "string" && /^\d+$/.test(value);
22602
+ class DanalApiClient {
22603
+ apiUrl;
22604
+ constructor(apiUrl = DANAL_TESTNET_API_URL) {
22605
+ this.apiUrl = apiUrl;
22606
+ }
22607
+ async getBalance(address) {
22608
+ const data = await this.fetch("balance", address);
22609
+ if (data?.address !== address ||
22610
+ data.token !== "PCI" ||
22611
+ !isBalanceAmount(data.balance)) {
22612
+ throw new Error("Invalid Danal balance response");
22613
+ }
22614
+ return data;
22615
+ }
22616
+ async getAccountInfo(address) {
22617
+ const data = await this.fetch("account", address);
22618
+ if (data?.["@account"] !== address ||
22619
+ data.token !== "PCI" ||
22620
+ data.balance?.["@balance"] !== address ||
22621
+ !isBalanceAmount(data.balance.amount)) {
22622
+ throw new Error("Invalid Danal account response");
22623
+ }
22624
+ return data;
22625
+ }
22626
+ async fetch(resource, address) {
22627
+ if (!isDanalAddressValid(address)) {
22628
+ throw new Error("Invalid Danal address");
22629
+ }
22630
+ const url = `${this.apiUrl.replace(/\/$/, "")}/${resource}/${address}`;
22631
+ const response = await fetch(url);
22632
+ if (!response.ok) {
22633
+ throw new Error(`Danal API error: ${response.status}`);
22634
+ }
22635
+ return response.json();
22636
+ }
22637
+ }
22638
+
22595
22639
  const provider = new ethers.CloudflareProvider();
22596
22640
  const API_BASE_URL = `${internalSquidApiBaseUrl}/ens`;
22597
22641
  const getAvatarFromEns = async (ensName) => {
@@ -23735,7 +23779,7 @@ const filterViewableTokens = (tokens, config, direction) => {
23735
23779
  };
23736
23780
  const getSecretNetworkBalances = async (chainData, cosmosAddress, squidTokens, keplrTypeWallet) => {
23737
23781
  const squidSecretTokens = squidTokens.filter((t) => t.chainId === CHAIN_IDS.SECRET);
23738
- const { fetchAllSecretBalances } = await Promise.resolve().then(function () { return require('./secretService-TP5V9Jwg.js'); });
23782
+ const { fetchAllSecretBalances } = await Promise.resolve().then(function () { return require('./secretService-CFS8rXMv.js'); });
23739
23783
  return fetchAllSecretBalances(chainData, cosmosAddress, squidSecretTokens, keplrTypeWallet);
23740
23784
  };
23741
23785
  function getTokenAssetsKey(token) {
@@ -25316,7 +25360,8 @@ const searchTokens = (query, tokens, chains) => {
25316
25360
  .filter((chain) => chain.nativeCurrency.symbol.toLowerCase() === query.toLowerCase() ||
25317
25361
  chain.nativeCurrency.name.toLowerCase().includes(query.toLowerCase()) ||
25318
25362
  chain.networkName.toLowerCase().includes(query.toLowerCase()) ||
25319
- chain.axelarChainName.toLowerCase().includes(query.toLowerCase()))
25363
+ (chain.axelarChainName?.toLowerCase().includes(query.toLowerCase()) ??
25364
+ false))
25320
25365
  .map((chain) => tokens.find((token) => token.chainId === chain.chainId &&
25321
25366
  token.address.toLowerCase() === nativeEvmTokenAddress))
25322
25367
  .filter((token) => token !== undefined);
@@ -27494,7 +27539,7 @@ function useStellarWallets() {
27494
27539
  try {
27495
27540
  const { allowAllModules: initializeAllModules } = await import('@creit.tech/stellar-wallets-kit');
27496
27541
  const { LedgerModule } = await import('@creit.tech/stellar-wallets-kit/modules/ledger.module.mjs');
27497
- const { formatStellarWallet } = await Promise.resolve().then(function () { return require('./stellarService.client-WTkVJJhn.js'); });
27542
+ const { formatStellarWallet } = await Promise.resolve().then(function () { return require('./stellarService.client-uTJfWhDa.js'); });
27498
27543
  const modules = [...initializeAllModules(), new LedgerModule()];
27499
27544
  const promises = modules.map(async (module) => {
27500
27545
  const isAvailable = await module.isAvailable();
@@ -30111,6 +30156,24 @@ const getAllSuiTokensBalance = async (userAddress, suiTokens, suiChains) => {
30111
30156
  const allResults = await Promise.all(suiChains.map(getBalancesForChain));
30112
30157
  return allResults.flat();
30113
30158
  };
30159
+ const getDanalTokenBalance = async (userAddress, token) => {
30160
+ if (!isDanalTestnetToken(token))
30161
+ return BigInt(0);
30162
+ const { balance } = await new DanalApiClient().getBalance(userAddress);
30163
+ return BigInt(balance);
30164
+ };
30165
+ const getAllDanalTokensBalance = async (userAddress, tokens) => {
30166
+ const nativeToken = tokens.find(isDanalTestnetToken);
30167
+ const balance = nativeToken
30168
+ ? await getDanalTokenBalance(userAddress, nativeToken)
30169
+ : BigInt(0);
30170
+ return tokens.map((token) => ({
30171
+ ...token,
30172
+ balance: isDanalTestnetToken(token)
30173
+ ? formatBNToReadable(balance, token.decimals)
30174
+ : "0",
30175
+ }));
30176
+ };
30114
30177
  const getXrplTokenBalance = async (userAddress, token, chain) => {
30115
30178
  const xrplClient = await getClient(chain);
30116
30179
  const balance = await xrplClient.getBalance(userAddress, token.address);
@@ -30390,6 +30453,25 @@ const useStellarBalance = ({ userAddress, chain, enabled, token, refreshInterval
30390
30453
  });
30391
30454
  return { balance, isLoading };
30392
30455
  };
30456
+ const useDanalBalance = ({ chain, token, userAddress, enabled = true, refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS$1, }) => {
30457
+ const { data: balance = "0", isInitialLoading } = reactQuery.useQuery({
30458
+ queryKey: keys().balance(chain?.chainId, token?.address, userAddress),
30459
+ queryFn: async () => {
30460
+ if (!userAddress || !token)
30461
+ return "0";
30462
+ const balanceBn = await getDanalTokenBalance(userAddress, token);
30463
+ return formatBNToReadable(balanceBn, token.decimals);
30464
+ },
30465
+ enabled: enabled &&
30466
+ chain?.chainType === squidTypes.ChainType.DANAL &&
30467
+ chain.chainId === token?.chainId &&
30468
+ isDanalTestnetToken(token) &&
30469
+ isDanalAddressValid(userAddress),
30470
+ refetchInterval: refreshIntervalMs,
30471
+ retry: 2,
30472
+ });
30473
+ return { balance, isLoading: isInitialLoading };
30474
+ };
30393
30475
  const useCantonBalance = ({ chain, token, userAddress, enabled = true, refreshIntervalMs = DEFAULT_REFRESH_INTERVAL_MS$1, }) => {
30394
30476
  const cantonConnector = useWalletStore((store) => store.connectedWalletsByChainType[squidTypes.ChainType.CANTON]?.wallet?.connector);
30395
30477
  const { data: balance = "0", isLoading } = reactQuery.useQuery({
@@ -30634,6 +30716,23 @@ const useCantonNativeBalance = ({ address, chain, }) => {
30634
30716
  }, [nativeToken?.decimals, rawBalance]);
30635
30717
  return { balance, isLoading };
30636
30718
  };
30719
+ const useDanalNativeBalance = ({ address, chain, }) => {
30720
+ const { nativeToken } = useNativeTokenForChain(chain);
30721
+ const { balance: rawBalance, isLoading } = useDanalBalance({
30722
+ chain,
30723
+ token: nativeToken,
30724
+ userAddress: address,
30725
+ });
30726
+ const balance = React.useMemo(() => {
30727
+ if (nativeToken?.decimals != null) {
30728
+ return {
30729
+ decimals: nativeToken.decimals,
30730
+ value: parseToBigInt(rawBalance, nativeToken.decimals),
30731
+ };
30732
+ }
30733
+ }, [nativeToken?.decimals, rawBalance]);
30734
+ return { balance, isLoading };
30735
+ };
30637
30736
  const useNativeBalance = (chain) => {
30638
30737
  const { connectedAddresses } = useWallet();
30639
30738
  const { data: cosmosAddressForChain } = useCosmosForChain(chain);
@@ -30668,6 +30767,10 @@ const useNativeBalance = (chain) => {
30668
30767
  address: connectedAddresses[squidTypes.ChainType.CANTON],
30669
30768
  chain,
30670
30769
  });
30770
+ const { balance: nativeDanalBalance, isLoading: isDanalLoading } = useDanalNativeBalance({
30771
+ address: connectedAddresses[squidTypes.ChainType.DANAL],
30772
+ chain,
30773
+ });
30671
30774
  const { nativeBalance, nativeBalanceFormatted } = React.useMemo(() => {
30672
30775
  let balance;
30673
30776
  switch (chain?.chainType) {
@@ -30696,7 +30799,7 @@ const useNativeBalance = (chain) => {
30696
30799
  balance = nativeCantonBalance;
30697
30800
  break;
30698
30801
  case squidTypes.ChainType.DANAL:
30699
- balance = undefined;
30802
+ balance = nativeDanalBalance;
30700
30803
  break;
30701
30804
  }
30702
30805
  const balanceFormatted = !!balance
@@ -30716,6 +30819,7 @@ const useNativeBalance = (chain) => {
30716
30819
  nativeXrplBalance,
30717
30820
  nativeStellarBalance,
30718
30821
  nativeCantonBalance,
30822
+ nativeDanalBalance,
30719
30823
  ]);
30720
30824
  const isLoading = React.useMemo(() => {
30721
30825
  if (!chain?.chainType)
@@ -30738,7 +30842,7 @@ const useNativeBalance = (chain) => {
30738
30842
  case squidTypes.ChainType.CANTON:
30739
30843
  return isCantonLoading;
30740
30844
  case squidTypes.ChainType.DANAL:
30741
- return false;
30845
+ return isDanalLoading;
30742
30846
  }
30743
30847
  }, [
30744
30848
  chain?.chainType,
@@ -30750,6 +30854,7 @@ const useNativeBalance = (chain) => {
30750
30854
  isXrpLoading,
30751
30855
  isStellarLoading,
30752
30856
  isCantonLoading,
30857
+ isDanalLoading,
30753
30858
  ]);
30754
30859
  return { nativeBalance, nativeBalanceFormatted, isLoading };
30755
30860
  };
@@ -30964,7 +31069,7 @@ function hederaWalletConnect(parameters) {
30964
31069
  const optionalChains = config.chains.map((x) => x.id);
30965
31070
  if (!optionalChains.length)
30966
31071
  return;
30967
- const { EthereumProvider } = await Promise.resolve().then(function () { return require('./index.es-BZb8tg2z.js'); });
31072
+ const { EthereumProvider } = await Promise.resolve().then(function () { return require('./index.es-C7zrx1ig.js'); });
30968
31073
  const rawProvider = await EthereumProvider.init({
30969
31074
  ...restParameters,
30970
31075
  disableProviderPing: true,
@@ -31837,7 +31942,7 @@ const useAllTokensWithBalanceForChainType = ({ chainType, address, direction, qu
31837
31942
  case squidTypes.ChainType.CANTON:
31838
31943
  return cantonTokens.length > 0;
31839
31944
  case squidTypes.ChainType.DANAL:
31840
- return danalTokens.length > 0;
31945
+ return danalTokens.length > 0 && isDanalAddressValid(address);
31841
31946
  }
31842
31947
  }, [
31843
31948
  chainType,
@@ -31900,6 +32005,9 @@ const useAllTokensWithBalanceForChainType = ({ chainType, address, direction, qu
31900
32005
  })
31901
32006
  : placeholderData.tokens;
31902
32007
  break;
32008
+ case squidTypes.ChainType.DANAL:
32009
+ fetchedTokens = await getAllDanalTokensBalance(address, danalTokens);
32010
+ break;
31903
32011
  default:
31904
32012
  fetchedTokens = placeholderData.tokens;
31905
32013
  break;
@@ -32090,6 +32198,12 @@ const useMultiChainBalance = ({ chain, token, userAddress, enabled = true, }) =>
32090
32198
  userAddress,
32091
32199
  enabled: chain?.chainType === squidTypes.ChainType.CANTON && enabled,
32092
32200
  });
32201
+ const { balance: danalBalance } = useDanalBalance({
32202
+ chain,
32203
+ token,
32204
+ userAddress,
32205
+ enabled: chain?.chainType === squidTypes.ChainType.DANAL && enabled,
32206
+ });
32093
32207
  const balance = React.useMemo(() => {
32094
32208
  if (!chain?.chainType)
32095
32209
  return "0";
@@ -32111,7 +32225,7 @@ const useMultiChainBalance = ({ chain, token, userAddress, enabled = true, }) =>
32111
32225
  case squidTypes.ChainType.CANTON:
32112
32226
  return cantonBalance;
32113
32227
  case squidTypes.ChainType.DANAL:
32114
- return "0";
32228
+ return danalBalance;
32115
32229
  }
32116
32230
  }, [
32117
32231
  chain?.chainType,
@@ -32123,6 +32237,7 @@ const useMultiChainBalance = ({ chain, token, userAddress, enabled = true, }) =>
32123
32237
  xrplBalance,
32124
32238
  stellarBalance,
32125
32239
  cantonBalance,
32240
+ danalBalance,
32126
32241
  ]);
32127
32242
  return { balance };
32128
32243
  };
@@ -38971,6 +39086,7 @@ exports.CHAIN_IDS = CHAIN_IDS;
38971
39086
  exports.CosmosProvider = CosmosProvider;
38972
39087
  exports.DEFAULT_LOCALE = DEFAULT_LOCALE;
38973
39088
  exports.DEFAULT_ROUTE_REFETCH_INTERVAL = DEFAULT_ROUTE_REFETCH_INTERVAL;
39089
+ exports.DanalApiClient = DanalApiClient;
38974
39090
  exports.EnsService = EnsService;
38975
39091
  exports.EvmNetworkNotSupportedErrorCode = EvmNetworkNotSupportedErrorCode;
38976
39092
  exports.FINAL_TRANSACTION_STATUSES = FINAL_TRANSACTION_STATUSES;
@@ -39088,6 +39204,7 @@ exports.isCoralBridgeAction = isCoralBridgeAction;
39088
39204
  exports.isCosmosAddressValid = isCosmosAddressValid;
39089
39205
  exports.isDanalAddressValid = isDanalAddressValid;
39090
39206
  exports.isDanalDepositRoute = isDanalDepositRoute;
39207
+ exports.isDanalTestnetToken = isDanalTestnetToken;
39091
39208
  exports.isDanalTxHashValid = isDanalTxHashValid;
39092
39209
  exports.isDepositAddressDirectTransferRoute = isDepositAddressDirectTransferRoute;
39093
39210
  exports.isEmptyObject = isEmptyObject;
@@ -39170,6 +39287,7 @@ exports.useCosmosForChain = useCosmosForChain;
39170
39287
  exports.useCosmosNativeBalance = useCosmosNativeBalance;
39171
39288
  exports.useCountryDetails = useCountryDetails;
39172
39289
  exports.useCurrencyDetails = useCurrencyDetails;
39290
+ exports.useDanalBalance = useDanalBalance;
39173
39291
  exports.useDebouncedValue = useDebouncedValue;
39174
39292
  exports.useDepositAddress = useDepositAddress;
39175
39293
  exports.useDepositTransactionStatus = useDepositTransactionStatus;
@@ -39239,4 +39357,4 @@ exports.useXrplTrustLine = useXrplTrustLine;
39239
39357
  exports.waitForReceiptWithRetry = waitForReceiptWithRetry;
39240
39358
  exports.walletIconBaseUrl = walletIconBaseUrl;
39241
39359
  exports.walletSupportsChainType = walletSupportsChainType;
39242
- //# sourceMappingURL=index-BT6G_mgr.js.map
39360
+ //# sourceMappingURL=index-DrkMKLtr.js.map