@0xsquid/react-hooks 1.0.41 → 1.0.42

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.
@@ -5,6 +5,7 @@ export * from "./internal/errorService";
5
5
  export * from "./internal/eventService";
6
6
  export * from "./internal/numberService";
7
7
  export * from "./internal/priceService";
8
+ export * from "./internal/searchService";
8
9
  export * from "./internal/transactionService";
9
10
  export * from "./internal/transactionStatusService";
10
11
  export * from "./internal/walletService";
@@ -5,6 +5,7 @@ export * from "./internal/errorService";
5
5
  export * from "./internal/eventService";
6
6
  export * from "./internal/numberService";
7
7
  export * from "./internal/priceService";
8
+ export * from "./internal/searchService";
8
9
  export * from "./internal/transactionService";
9
10
  export * from "./internal/transactionStatusService";
10
11
  export * from "./internal/walletService";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { ChainData, Token } from "@0xsquid/squid-types";
2
+ /**
3
+ * Searches for tokens based on a query string, prioritizing results in the following order:
4
+ * 1. Exact address
5
+ * 2. ETH on Ethereum mainnet (chainId 1)
6
+ * 3. Native tokens of chains matching the query (e.g., BNB when searching for "binance")
7
+ * 4. Exact matches for native tokens (e.g., native FTM when searching for "FTM")
8
+ * 5. Other exact matches for token names or symbols
9
+ * 6. Other native tokens that partially match the query
10
+ * 7. Remaining tokens that partially match the query
11
+ *
12
+ * @param query - The search query string
13
+ * @param tokens - Array of all available tokens
14
+ * @param chains - Array of chain data
15
+ * @returns An array of tokens sorted according to the priority described above
16
+ */
17
+ export declare const searchTokens: (query: string, tokens: Token[], chains: ChainData[]) => Token[];
@@ -0,0 +1,84 @@
1
+ import Fuse from "fuse.js";
2
+ import { nativeEvmTokenAddress } from "../../core/constants";
3
+ const fuseSearchOptions = {
4
+ isCaseSensitive: false,
5
+ threshold: 0.1,
6
+ findAllMatches: false,
7
+ includeMatches: true,
8
+ keys: [
9
+ { name: "symbol", weight: 1 },
10
+ { name: "name", weight: 0.8 },
11
+ ],
12
+ };
13
+ /**
14
+ * Searches for tokens based on a query string, prioritizing results in the following order:
15
+ * 1. Exact address
16
+ * 2. ETH on Ethereum mainnet (chainId 1)
17
+ * 3. Native tokens of chains matching the query (e.g., BNB when searching for "binance")
18
+ * 4. Exact matches for native tokens (e.g., native FTM when searching for "FTM")
19
+ * 5. Other exact matches for token names or symbols
20
+ * 6. Other native tokens that partially match the query
21
+ * 7. Remaining tokens that partially match the query
22
+ *
23
+ * @param query - The search query string
24
+ * @param tokens - Array of all available tokens
25
+ * @param chains - Array of chain data
26
+ * @returns An array of tokens sorted according to the priority described above
27
+ */
28
+ export const searchTokens = (query, tokens, chains) => {
29
+ // Query must at least be 2 characters long
30
+ if (query.length <= 1)
31
+ return tokens;
32
+ // Check for exact address match first
33
+ const exactAddressMatch = tokens.find((token) => token.address.toLowerCase() === query.toLowerCase());
34
+ if (exactAddressMatch) {
35
+ return [exactAddressMatch];
36
+ }
37
+ // Init fuse.js
38
+ const fuse = new Fuse(tokens, fuseSearchOptions);
39
+ // Perform the search with fuse
40
+ const searchResults = fuse.search(query);
41
+ // Find native tokens that match the query or related chain names
42
+ const nativeTokens = chains
43
+ .filter((chain) => chain.nativeCurrency.symbol.toLowerCase() === query.toLowerCase() ||
44
+ chain.nativeCurrency.name.toLowerCase().includes(query.toLowerCase()) ||
45
+ chain.networkName.toLowerCase().includes(query.toLowerCase()) ||
46
+ chain.axelarChainName.toLowerCase().includes(query.toLowerCase()))
47
+ .map((chain) => tokens.find((token) => token.chainId === chain.chainId &&
48
+ token.address.toLowerCase() === nativeEvmTokenAddress))
49
+ .filter((token) => token !== undefined);
50
+ // Separate ETH on Ethereum mainnet (chainId 1) for top priority
51
+ const ethMainnet = nativeTokens.find((token) => token.symbol === "ETH" && token.chainId === "1");
52
+ const otherNativeTokens = nativeTokens.filter((token) => !(token.symbol === "ETH" && token.chainId === "1"));
53
+ // Find exact matches for token name or symbol
54
+ const exactMatches = searchResults
55
+ .map((result) => result.item)
56
+ .filter((token) => token.name.toLowerCase() === query.toLowerCase() ||
57
+ token.symbol.toLowerCase() === query.toLowerCase());
58
+ // Prioritize native tokens within exact matches
59
+ const prioritizedExactMatches = exactMatches.sort((a, b) => {
60
+ const aIsNative = a.address.toLowerCase() === nativeEvmTokenAddress;
61
+ const bIsNative = b.address.toLowerCase() === nativeEvmTokenAddress;
62
+ if (aIsNative && !bIsNative)
63
+ return -1;
64
+ if (!aIsNative && bIsNative)
65
+ return 1;
66
+ return 0;
67
+ });
68
+ // Collect remaining search results that aren't exact matches
69
+ const otherResults = searchResults
70
+ .map((result) => result.item)
71
+ .filter((token) => !(token.name.toLowerCase() === query.toLowerCase() ||
72
+ token.symbol.toLowerCase() === query.toLowerCase()));
73
+ // Combine all results in the desired priority order
74
+ const combinedResults = [
75
+ ...(ethMainnet ? [ethMainnet] : []),
76
+ ...otherNativeTokens,
77
+ ...prioritizedExactMatches,
78
+ ...otherResults,
79
+ ];
80
+ // Remove any duplicate tokens from the results
81
+ const uniqueResults = Array.from(new Set(combinedResults));
82
+ return uniqueResults;
83
+ };
84
+ //# sourceMappingURL=searchService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchService.js","sourceRoot":"","sources":["../../../src/services/internal/searchService.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
+ import { Squid } from "@0xsquid/sdk";
1
2
  import { ChainData, Token } from "@0xsquid/squid-types";
2
3
  export interface OnlineSquidData {
3
4
  tokens: Record<string, Record<string, Token>>;
4
5
  chains: Record<string, ChainData>;
5
6
  }
6
7
  export declare const fetchSquidData: () => Promise<OnlineSquidData>;
8
+ export declare const fetchNativeSquidData: () => Promise<Squid>;
@@ -24,4 +24,12 @@ export const fetchSquidData = async () => {
24
24
  await squid.init();
25
25
  return remapSquidData(squid);
26
26
  };
27
+ export const fetchNativeSquidData = async () => {
28
+ const squid = new Squid({
29
+ integratorId: INTEGRATOR_ID,
30
+ baseUrl: "https://v2.api.squidrouter.com",
31
+ });
32
+ await squid.init();
33
+ return squid;
34
+ };
27
35
  //# sourceMappingURL=fetchSquidData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetchSquidData.js","sourceRoot":"","sources":["../../src/tests/fetchSquidData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAO1C,MAAM,cAAc,GAAG,CAAC,SAAgB,EAAE,EAAE;IAC1C,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAExD,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,MAAM;aACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;aAClD,MAAM,CACL,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;YACzB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA2B,CAC5B,CAAC;QAEJ,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA8B,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,gCAAgC;KAC1C,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"fetchSquidData.js","sourceRoot":"","sources":["../../src/tests/fetchSquidData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAO1C,MAAM,cAAc,GAAG,CAAC,SAAgB,EAAE,EAAE;IAC1C,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAExD,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,MAAM;aACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;aAClD,MAAM,CACL,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;YACzB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA2B,CAC5B,CAAC;QAEJ,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA8B,EAAE;IACjE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,gCAAgC;KAC1C,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAoB,EAAE;IAC7D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,gCAAgC;KAC1C,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ import { nativeEvmTokenAddress } from "../core/constants";
2
+ import { searchTokens } from "../services/internal/searchService";
3
+ import { fetchNativeSquidData } from "./fetchSquidData";
4
+ let squid = undefined;
5
+ let CHAINS = [];
6
+ let TOKENS = [];
7
+ describe("searchService", () => {
8
+ beforeAll(async () => {
9
+ squid = await fetchNativeSquidData();
10
+ CHAINS = squid?.chains ?? [];
11
+ TOKENS = squid?.tokens ?? [];
12
+ });
13
+ describe("searchTokens", () => {
14
+ it("should prioritize ETH on chainId 1", () => {
15
+ const result = searchTokens("ETH", TOKENS, CHAINS);
16
+ expect(result[0].symbol).toBe("ETH");
17
+ expect(result[0].chainId).toBe("1");
18
+ });
19
+ it("should handle native token search (FTM case)", () => {
20
+ const result = searchTokens("FTM", TOKENS, CHAINS);
21
+ expect(result[0].symbol).toBe("FTM");
22
+ expect(result[0].address.toLowerCase()).toBe(nativeEvmTokenAddress);
23
+ });
24
+ it("should return results for token address search", () => {
25
+ const testAddress = TOKENS[0].address;
26
+ const result = searchTokens(testAddress, TOKENS, CHAINS);
27
+ expect(result[0].address).toBe(testAddress);
28
+ });
29
+ it("should prioritize native token based on chain name, instead of full match of token name", () => {
30
+ const result = searchTokens("binance", TOKENS, CHAINS);
31
+ //There's one token named "Binance" but we need to return the native token on bsc first
32
+ expect(result[0].symbol).toBe("BNB");
33
+ expect(result[0].chainId).toBe("56");
34
+ // Then the token named "Binance"
35
+ expect(result[1].name.toLocaleLowerCase()).toBe("binance");
36
+ });
37
+ it("should handle case-insensitive search", () => {
38
+ const result = searchTokens("eth", TOKENS, CHAINS);
39
+ expect(result[0].symbol).toBe("ETH");
40
+ });
41
+ it("should return native ETH tokens in correct order", () => {
42
+ const result = searchTokens("ETH", TOKENS, CHAINS);
43
+ expect(result[0].symbol).toBe("ETH");
44
+ expect(result[0].chainId).toBe("1");
45
+ const nextFewResults = result.slice(1, 5);
46
+ nextFewResults.forEach((token) => {
47
+ expect(token.symbol).toBe("ETH");
48
+ expect(token.address.toLowerCase()).toBe(nativeEvmTokenAddress);
49
+ expect(token.chainId).not.toBe("1");
50
+ });
51
+ });
52
+ it("should prioritize native ETH tokens over wrapped or bridged versions", () => {
53
+ const result = searchTokens("ETH", TOKENS, CHAINS);
54
+ const nativeEthTokens = result.filter((token) => token.symbol === "ETH" &&
55
+ token.address.toLowerCase() === nativeEvmTokenAddress);
56
+ const wrappedOrBridgedEthIndex = result.findIndex((token) => ["WETH", "axlWETH"].includes(token.symbol) ||
57
+ (token.symbol === "ETH" &&
58
+ token.address.toLowerCase() !== nativeEvmTokenAddress));
59
+ expect(wrappedOrBridgedEthIndex).toBeGreaterThan(nativeEthTokens.length - 1);
60
+ });
61
+ it("should return non-ETH tokens after all native ETH tokens", () => {
62
+ const result = searchTokens("ETH", TOKENS, CHAINS);
63
+ const lastNativeEthIndex = result.findIndex((token) => token.symbol !== "ETH" ||
64
+ token.address.toLowerCase() !== nativeEvmTokenAddress);
65
+ expect(lastNativeEthIndex).toBeGreaterThan(0);
66
+ const nonEthTokens = result.slice(lastNativeEthIndex);
67
+ nonEthTokens.forEach((token) => {
68
+ expect(token.symbol !== "ETH" ||
69
+ token.address.toLowerCase() !== nativeEvmTokenAddress).toBeTruthy();
70
+ });
71
+ });
72
+ // it should return the right token for the right address
73
+ it("should return the right token for the right address", () => {
74
+ const ARB_ADDRESS = "0x912CE59144191C1204E64559FE8253a0e49E6548";
75
+ const result = searchTokens(ARB_ADDRESS, TOKENS, CHAINS);
76
+ expect(result[0].symbol).toBe("ARB");
77
+ expect(result[0].chainId).toBe("42161");
78
+ });
79
+ it("should only return the token if address is full", () => {
80
+ const PARTIAL_ARB_ADDRESS = "0x912C";
81
+ const result = searchTokens(PARTIAL_ARB_ADDRESS, TOKENS, CHAINS);
82
+ expect(result).toHaveLength(0);
83
+ });
84
+ });
85
+ });
86
+ //# sourceMappingURL=searchService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchService.test.js","sourceRoot":"","sources":["../../src/tests/searchService.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xsquid/react-hooks",
3
- "version": "1.0.41",
3
+ "version": "1.0.42",
4
4
  "description": "Squid hooks monorepo",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -42,7 +42,8 @@
42
42
  "lodash": "4.17.21",
43
43
  "secretjs": "1.12.4",
44
44
  "wagmi": "^0.12.13",
45
- "zustand": "4.5.0"
45
+ "zustand": "4.5.0",
46
+ "fuse.js": "6.6.2"
46
47
  },
47
48
  "peerDependencies": {
48
49
  "ethers": "^5.7.2 || ^4.0.49",