@0xsquid/react-hooks 1.0.45-beta.1 → 1.0.46

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 (95) hide show
  1. package/dist/assets/images/icons/wallets/index.d.ts +0 -1
  2. package/dist/assets/images/icons/wallets/index.js +0 -1
  3. package/dist/assets/images/icons/wallets/index.js.map +1 -1
  4. package/dist/core/constants.d.ts +3 -3
  5. package/dist/core/constants.js +18 -45
  6. package/dist/core/constants.js.map +1 -1
  7. package/dist/core/queries/queries-keys.d.ts +5 -3
  8. package/dist/core/queries/queries-keys.js +12 -8
  9. package/dist/core/queries/queries-keys.js.map +1 -1
  10. package/dist/core/types/index.d.ts +1 -2
  11. package/dist/core/types/swap.d.ts +1 -2
  12. package/dist/core/types/wallet.d.ts +3 -20
  13. package/dist/core/types/wallet.js +1 -2
  14. package/dist/core/types/wallet.js.map +1 -1
  15. package/dist/hooks/chains/useSquidChains.d.ts +3 -1
  16. package/dist/hooks/chains/useSquidChains.js +13 -3
  17. package/dist/hooks/chains/useSquidChains.js.map +1 -1
  18. package/dist/hooks/cosmos/useCosmos.js +1 -1
  19. package/dist/hooks/cosmos/useCosmos.js.map +1 -1
  20. package/dist/hooks/index.d.ts +4 -2
  21. package/dist/hooks/index.js +4 -2
  22. package/dist/hooks/index.js.map +1 -1
  23. package/dist/hooks/squid/useSquid.js +3 -2
  24. package/dist/hooks/squid/useSquid.js.map +1 -1
  25. package/dist/hooks/store/useHistoryStore.d.ts +47 -0
  26. package/dist/hooks/store/useHistoryStore.js +41 -0
  27. package/dist/hooks/store/useHistoryStore.js.map +1 -0
  28. package/dist/hooks/store/useSquidStore.d.ts +12 -59
  29. package/dist/hooks/store/useSquidStore.js +11 -28
  30. package/dist/hooks/store/useSquidStore.js.map +1 -1
  31. package/dist/hooks/swap/useSwap.d.ts +6 -8
  32. package/dist/hooks/swap/useSwap.js +93 -153
  33. package/dist/hooks/swap/useSwap.js.map +1 -1
  34. package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js +4 -18
  35. package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js.map +1 -1
  36. package/dist/hooks/tokens/useBalance.js +4 -4
  37. package/dist/hooks/tokens/useBalance.js.map +1 -1
  38. package/dist/hooks/tokens/useSingleTokenPrice.d.ts +19 -1
  39. package/dist/hooks/tokens/useSquidTokens.d.ts +76 -4
  40. package/dist/hooks/tokens/useSquidTokens.js +60 -103
  41. package/dist/hooks/tokens/useSquidTokens.js.map +1 -1
  42. package/dist/hooks/tokens/useTokensWithBalance.js +4 -3
  43. package/dist/hooks/tokens/useTokensWithBalance.js.map +1 -1
  44. package/dist/hooks/transaction/useAllTransactionsStatus.d.ts +4 -0
  45. package/dist/hooks/transaction/useAllTransactionsStatus.js +49 -0
  46. package/dist/hooks/transaction/useAllTransactionsStatus.js.map +1 -0
  47. package/dist/hooks/transaction/useEstimate.d.ts +58 -3
  48. package/dist/hooks/transaction/useEstimate.js +5 -5
  49. package/dist/hooks/transaction/useEstimate.js.map +1 -1
  50. package/dist/hooks/transaction/useEstimatePriceImpact.js +2 -2
  51. package/dist/hooks/transaction/useEstimatePriceImpact.js.map +1 -1
  52. package/dist/hooks/transaction/useExecuteTransaction.js +29 -40
  53. package/dist/hooks/transaction/useExecuteTransaction.js.map +1 -1
  54. package/dist/hooks/transaction/useExpress.js +2 -2
  55. package/dist/hooks/transaction/useExpress.js.map +1 -1
  56. package/dist/hooks/transaction/useGetRoute.d.ts +5 -0
  57. package/dist/hooks/transaction/useGetRoute.js +48 -21
  58. package/dist/hooks/transaction/useGetRoute.js.map +1 -1
  59. package/dist/hooks/transaction/useSingleTransaction.d.ts +3 -4
  60. package/dist/hooks/transaction/useSingleTransaction.js +21 -32
  61. package/dist/hooks/transaction/useSingleTransaction.js.map +1 -1
  62. package/dist/hooks/transaction/useTransaction.js +6 -3
  63. package/dist/hooks/transaction/useTransaction.js.map +1 -1
  64. package/dist/hooks/user/useHistory.d.ts +12 -0
  65. package/dist/hooks/user/useHistory.js +94 -0
  66. package/dist/hooks/user/useHistory.js.map +1 -0
  67. package/dist/hooks/user/useUserParams.js +2 -2
  68. package/dist/hooks/user/useUserParams.js.map +1 -1
  69. package/dist/hooks/wallet/useMultiChainWallet.d.ts +2 -2
  70. package/dist/hooks/wallet/useMultiChainWallet.js +13 -33
  71. package/dist/hooks/wallet/useMultiChainWallet.js.map +1 -1
  72. package/dist/provider/index.js +5 -5
  73. package/dist/provider/index.js.map +1 -1
  74. package/dist/services/external/secretService.d.ts +0 -1
  75. package/dist/services/external/secretService.js +1 -1
  76. package/dist/services/external/secretService.js.map +1 -1
  77. package/dist/services/index.d.ts +0 -1
  78. package/dist/services/index.js +0 -1
  79. package/dist/services/index.js.map +1 -1
  80. package/dist/services/internal/configService.d.ts +5 -5
  81. package/dist/services/internal/configService.js +23 -23
  82. package/dist/services/internal/configService.js.map +1 -1
  83. package/dist/services/internal/transactionService.d.ts +40 -20
  84. package/dist/services/internal/transactionService.js +59 -55
  85. package/dist/services/internal/transactionService.js.map +1 -1
  86. package/dist/services/internal/walletService.d.ts +1 -1
  87. package/dist/tests/configService.test.js +11 -70
  88. package/dist/tests/configService.test.js.map +1 -1
  89. package/package.json +2 -2
  90. package/dist/hooks/wallet/useEns.d.ts +0 -27
  91. package/dist/hooks/wallet/useEns.js +0 -66
  92. package/dist/hooks/wallet/useEns.js.map +0 -1
  93. package/dist/services/external/ens.d.ts +0 -11
  94. package/dist/services/external/ens.js +0 -91
  95. package/dist/services/external/ens.js.map +0 -1
@@ -1,27 +0,0 @@
1
- import { UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
2
- import { EnsData } from "../../core";
3
- type QueryOptions = Omit<UseQueryOptions<EnsData, unknown, EnsData, (string | undefined)[]>, "queryFn" | "queryKey">;
4
- /**
5
- * Returns the ENS data of the given address
6
- *
7
- * @param address the address to get the ENS name of
8
- * @returns the ENS data of the given address
9
- */
10
- export declare function useEnsDataForAddress({ address, options, }: {
11
- address?: string;
12
- options?: QueryOptions;
13
- }): UseQueryResult<EnsData>;
14
- export declare function useDebouncedValue<T>(value: T, delay: number): T;
15
- /**
16
- * Search for ENS names.
17
- * Returns an exact match if the name is an ENS name, and multiple matches otherwise.
18
- *
19
- * @param name the name to search for
20
- * @param enabled whether the search is enabled or not
21
- * @returns the ENS search query
22
- */
23
- export declare function useEnsSearch({ name, enabled, }: {
24
- name?: string;
25
- enabled?: boolean;
26
- }): UseQueryResult<import("../../core").EnsSearchResult[], unknown>;
27
- export {};
@@ -1,66 +0,0 @@
1
- import { useQuery, } from "@tanstack/react-query";
2
- import { useEffect, useState } from "react";
3
- import { EnsService } from "../../services/external/ens";
4
- /**
5
- * Returns the ENS data of the given address
6
- *
7
- * @param address the address to get the ENS name of
8
- * @returns the ENS data of the given address
9
- */
10
- export function useEnsDataForAddress({ address, options, }) {
11
- const ensQuery = useQuery(["ens", address?.toLowerCase()], () => EnsService.getEnsDataFromAddress(address), {
12
- ...options,
13
- enabled: Boolean(address?.trim()) &&
14
- (options?.enabled === undefined ? true : options.enabled),
15
- cacheTime: Infinity,
16
- });
17
- return ensQuery;
18
- }
19
- export function useDebouncedValue(value, delay) {
20
- const [debouncedValue, setDebouncedValue] = useState(value);
21
- useEffect(() => {
22
- const handler = setTimeout(() => {
23
- setDebouncedValue(value);
24
- }, delay);
25
- return () => {
26
- clearTimeout(handler);
27
- };
28
- }, [value, delay]);
29
- return debouncedValue;
30
- }
31
- /**
32
- * Search for ENS names.
33
- * Returns an exact match if the name is an ENS name, and multiple matches otherwise.
34
- *
35
- * @param name the name to search for
36
- * @param enabled whether the search is enabled or not
37
- * @returns the ENS search query
38
- */
39
- export function useEnsSearch({ name, enabled = true, }) {
40
- const debouncedName = useDebouncedValue(enabled ? name : undefined, 500);
41
- const ensSearchQuery = useQuery(["ensSearch", debouncedName], () => {
42
- const isExactEnsSearch = checkIsExactEns(debouncedName);
43
- return isExactEnsSearch
44
- ? EnsService.getExactEns(debouncedName)
45
- : EnsService.searchEnsNames(debouncedName);
46
- }, {
47
- enabled: Boolean(debouncedName?.trim()) && enabled,
48
- cacheTime: Infinity,
49
- });
50
- return ensSearchQuery;
51
- }
52
- const ENS_DOMAINS = ["eth", "cb.id", "xyz", "app", "link", "bit", "crypto"];
53
- /**
54
- * Checks if the given name is an exact ens name
55
- * like "smth.eth", "smth.cb.id", "smth.xyz", etc...
56
- */
57
- function checkIsExactEns(name = "") {
58
- if (!name)
59
- return false;
60
- const nameParts = name.split(".");
61
- if (nameParts.length < 2)
62
- return false;
63
- const tld = nameParts[nameParts.length - 1];
64
- return ENS_DOMAINS.includes(tld);
65
- }
66
- //# sourceMappingURL=useEns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useEns.js","sourceRoot":"","sources":["../../../src/hooks/wallet/useEns.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAOzD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,OAAO,EACP,OAAO,GAIR;IACC,MAAM,QAAQ,GAAG,QAAQ,CACvB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAC/B,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAC/C;QACE,GAAG,OAAO;QACV,OAAO,EACL,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACxB,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3D,SAAS,EAAE,QAAQ;KACpB,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,KAAQ,EAAE,KAAa;IAC1D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,OAAO,GAAG,IAAI,GAIf;IACC,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEzE,MAAM,cAAc,GAAG,QAAQ,CAC7B,CAAC,WAAW,EAAE,aAAa,CAAC,EAC5B,GAAG,EAAE;QACH,MAAM,gBAAgB,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAExD,OAAO,gBAAgB;YACrB,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC;YACvC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,EACD;QACE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO;QAClD,SAAS,EAAE,QAAQ;KACpB,CACF,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAE5E;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe,EAAE;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE5C,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
@@ -1,11 +0,0 @@
1
- import { EnsData, EnsSearchResult } from "../../core";
2
- export declare class EnsService {
3
- static getEnsDataFromAddress(address?: string): Promise<EnsData>;
4
- static getAvatarFromEns(ensName?: string): Promise<string | undefined>;
5
- static searchEnsNames(partialName?: string): Promise<EnsSearchResult[]>;
6
- static getExactEns(exactEns?: string): Promise<EnsSearchResult[]>;
7
- static ensQuery({ query, type, }: {
8
- query?: string;
9
- type: "partial" | "exact";
10
- }): Promise<EnsSearchResult[]>;
11
- }
@@ -1,91 +0,0 @@
1
- import { ChainType } from "@0xsquid/squid-types";
2
- import { ethers } from "ethers";
3
- const provider = new ethers.providers.CloudflareProvider();
4
- const ENS_QUERIES = {
5
- SEARCH: (partialName) => `{
6
- domains(where: {name_contains: "${partialName}"}, first: 15) {
7
- name
8
- resolvedAddress {
9
- id
10
- }
11
- }}`,
12
- EXACT: (exactEns) => `{
13
- domains(where: {name: "${exactEns}"}) {
14
- name
15
- resolvedAddress {
16
- id
17
- }
18
- }}`,
19
- };
20
- const API_URL = "https://gateway-arbitrum.network.thegraph.com/api/5eacbb93828c22affad909725dd61cab/subgraphs/id/5XqPmWe6gjyrJtFn9cLy237i4cWw2j9HcUJEXsP5qGtH";
21
- export class EnsService {
22
- static async getEnsDataFromAddress(address) {
23
- if (!address)
24
- return {};
25
- try {
26
- const ensName = await provider.lookupAddress(address);
27
- if (!ensName) {
28
- return {};
29
- }
30
- const avatar = await this.getAvatarFromEns(ensName);
31
- return { name: ensName, avatar };
32
- }
33
- catch (error) {
34
- console.error("Error fetching ENS name:", error);
35
- return {};
36
- }
37
- }
38
- static async getAvatarFromEns(ensName) {
39
- if (!ensName)
40
- return;
41
- try {
42
- const resolver = await provider.getResolver(ensName);
43
- const avatar = await resolver?.getText("avatar");
44
- return avatar;
45
- }
46
- catch (error) {
47
- console.error("Error fetching ENS avatar:", error);
48
- return;
49
- }
50
- }
51
- static async searchEnsNames(partialName) {
52
- return this.ensQuery({ query: partialName, type: "partial" });
53
- }
54
- static async getExactEns(exactEns) {
55
- return this.ensQuery({ query: exactEns, type: "exact" });
56
- }
57
- static async ensQuery({ query, type, }) {
58
- if (!query)
59
- return [];
60
- const queryString = type === "partial" ? ENS_QUERIES.SEARCH(query) : ENS_QUERIES.EXACT(query);
61
- try {
62
- const response = await fetch(API_URL, {
63
- method: "POST",
64
- headers: {
65
- "Content-Type": "application/json",
66
- },
67
- body: JSON.stringify({ query: queryString }),
68
- });
69
- const data = await response.json();
70
- const domains = data?.data?.domains ?? [];
71
- if (domains.length === 0) {
72
- return [];
73
- }
74
- const ensDomains = domains
75
- .filter((domain) => !!domain?.resolvedAddress?.id)
76
- .map((domain) => ({
77
- address: domain.resolvedAddress.id,
78
- ens: {
79
- name: domain.name,
80
- },
81
- chainType: ChainType.EVM,
82
- }));
83
- return ensDomains;
84
- }
85
- catch (error) {
86
- console.error("Error fetching ENS names:", error);
87
- return [];
88
- }
89
- }
90
- }
91
- //# sourceMappingURL=ens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../src/services/external/ens.ts"],"names":[],"mappings":"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"}