@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.
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/internal/searchService.d.ts +17 -0
- package/dist/services/internal/searchService.js +84 -0
- package/dist/services/internal/searchService.js.map +1 -0
- package/dist/tests/fetchSquidData.d.ts +2 -0
- package/dist/tests/fetchSquidData.js +8 -0
- package/dist/tests/fetchSquidData.js.map +1 -1
- package/dist/tests/searchService.test.d.ts +1 -0
- package/dist/tests/searchService.test.js +86 -0
- package/dist/tests/searchService.test.js.map +1 -0
- package/package.json +3 -2
package/dist/services/index.d.ts
CHANGED
|
@@ -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";
|
package/dist/services/index.js
CHANGED
|
@@ -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":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,IAAI,KAAK,GAAsB,SAAS,CAAC;AACzC,IAAI,MAAM,GAAgB,EAAE,CAAC;AAC7B,IAAI,MAAM,GAAY,EAAE,CAAC;AAEzB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACrC,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;QAC7B,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yFAAyF,EAAE,GAAG,EAAE;YACjG,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,uFAAuF;YACvF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,iCAAiC;YACjC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAChE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAEnD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,KAAK;gBACtB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CACxD,CAAC;YAEF,MAAM,wBAAwB,GAAG,MAAM,CAAC,SAAS,CAC/C,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC1C,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK;oBACrB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC,CAC3D,CAAC;YAEF,MAAM,CAAC,wBAAwB,CAAC,CAAC,eAAe,CAC9C,eAAe,CAAC,MAAM,GAAG,CAAC,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAEnD,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CACzC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,KAAK;gBACtB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CACxD,CAAC;YAEF,MAAM,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE9C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtD,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7B,MAAM,CACJ,KAAK,CAAC,MAAM,KAAK,KAAK;oBACpB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CACxD,CAAC,UAAU,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,yDAAyD;QACzD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,WAAW,GAAG,4CAA4C,CAAC;YACjE,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,mBAAmB,GAAG,QAAQ,CAAC;YACrC,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xsquid/react-hooks",
|
|
3
|
-
"version": "1.0.
|
|
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",
|