@0xsquid/react-hooks 1.0.0

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 (108) hide show
  1. package/.babelrc +7 -0
  2. package/.eslintignore +1 -0
  3. package/.eslintrc.json +44 -0
  4. package/dist/index.js +6 -0
  5. package/jest.config.ts +28 -0
  6. package/package.json +124 -0
  7. package/scripts/copyAssets.js +27 -0
  8. package/scripts/removeBuildTestFolder.js +28 -0
  9. package/scripts/replacePaths.js +37 -0
  10. package/src/assets/images/icons/wallets/binance.svg +4 -0
  11. package/src/assets/images/icons/wallets/bitget.svg +43 -0
  12. package/src/assets/images/icons/wallets/bitkeep.svg +9 -0
  13. package/src/assets/images/icons/wallets/blockchaindotcom.svg +11 -0
  14. package/src/assets/images/icons/wallets/brave.svg +18 -0
  15. package/src/assets/images/icons/wallets/c98.svg +3 -0
  16. package/src/assets/images/icons/wallets/coinbase.svg +5 -0
  17. package/src/assets/images/icons/wallets/cosmostation.svg +9 -0
  18. package/src/assets/images/icons/wallets/defiConnect.svg +25 -0
  19. package/src/assets/images/icons/wallets/exodus.svg +33 -0
  20. package/src/assets/images/icons/wallets/fetchai.svg +1 -0
  21. package/src/assets/images/icons/wallets/index.ts +43 -0
  22. package/src/assets/images/icons/wallets/keplr.svg +9 -0
  23. package/src/assets/images/icons/wallets/leap.svg +35 -0
  24. package/src/assets/images/icons/wallets/metamask.svg +48 -0
  25. package/src/assets/images/icons/wallets/okx.svg +1 -0
  26. package/src/assets/images/icons/wallets/rabby.svg +1 -0
  27. package/src/assets/images/icons/wallets/trustwallet.svg +11 -0
  28. package/src/assets/images/icons/wallets/walletConnect.svg +11 -0
  29. package/src/assets/images/icons/wallets/wallet_icon.svg +1 -0
  30. package/src/assets/images/icons/wallets/xdefi.svg +9 -0
  31. package/src/assets/images/icons/wallets/zerion.svg +11 -0
  32. package/src/connectors/ExodusConnector.ts +6 -0
  33. package/src/connectors/LedgerLiveConnector.ts +226 -0
  34. package/src/contracts/typechain/ERC20.d.ts +441 -0
  35. package/src/contracts/typechain/factories/ERC20__factory.d.ts +56 -0
  36. package/src/contracts/typechain/factories/ERC20__factory.ts +340 -0
  37. package/src/core/constants.ts +549 -0
  38. package/src/core/externalLinks.ts +26 -0
  39. package/src/core/index.ts +1 -0
  40. package/src/core/multicall3.ts +22 -0
  41. package/src/core/numbers.ts +44 -0
  42. package/src/core/providers/CosmosProvider.tsx +55 -0
  43. package/src/core/queries/queries-keys.ts +156 -0
  44. package/src/core/queries/react-query-config.ts +13 -0
  45. package/src/core/types/components.ts +16 -0
  46. package/src/core/types/config.ts +52 -0
  47. package/src/core/types/dex.ts +31 -0
  48. package/src/core/types/error.ts +52 -0
  49. package/src/core/types/event.ts +16 -0
  50. package/src/core/types/route.ts +21 -0
  51. package/src/core/types/swap.ts +8 -0
  52. package/src/core/types/tokens.ts +30 -0
  53. package/src/core/types/transaction.ts +84 -0
  54. package/src/core/types/types.ts +37 -0
  55. package/src/core/types/wallet.ts +83 -0
  56. package/src/hooks/chains/useSquidChains.ts +66 -0
  57. package/src/hooks/cosmos/useCosmos.ts +279 -0
  58. package/src/hooks/cosmos/useCosmosForChain.ts +33 -0
  59. package/src/hooks/index.ts +32 -0
  60. package/src/hooks/navigation/useKeyboardNavigation.ts +88 -0
  61. package/src/hooks/store/useSquidStore.ts +80 -0
  62. package/src/hooks/swap/useSwap.ts +359 -0
  63. package/src/hooks/tokens/useAllTokensWithBalance.ts +157 -0
  64. package/src/hooks/tokens/useBalance.ts +180 -0
  65. package/src/hooks/tokens/useMultiChainBalance.ts +59 -0
  66. package/src/hooks/tokens/usePrices.ts +52 -0
  67. package/src/hooks/tokens/useSingleTokenPrice.ts +45 -0
  68. package/src/hooks/tokens/useSquidTokens.ts +48 -0
  69. package/src/hooks/tokens/useTokensWithBalance.ts +169 -0
  70. package/src/hooks/transaction/useEstimate.ts +397 -0
  71. package/src/hooks/transaction/useEstimatePriceImpact.ts +39 -0
  72. package/src/hooks/transaction/useExecuteTransaction.ts +440 -0
  73. package/src/hooks/transaction/useExpress.ts +46 -0
  74. package/src/hooks/transaction/useGetRoute.ts +145 -0
  75. package/src/hooks/transaction/useSingleTransaction.ts +155 -0
  76. package/src/hooks/transaction/useTransaction.ts +734 -0
  77. package/src/hooks/user/useUserParams.ts +63 -0
  78. package/src/hooks/wallet/useAddToken.ts +53 -0
  79. package/src/hooks/wallet/useAutoConnect.ts +56 -0
  80. package/src/hooks/wallet/useGnosisContext.ts +84 -0
  81. package/src/hooks/wallet/useIntegratorContext.ts +44 -0
  82. package/src/hooks/wallet/useMultiChainWallet.ts +146 -0
  83. package/src/hooks/wallet/useWallet.ts +86 -0
  84. package/src/hooks/webapp-router/useSquidRouter.ts +42 -0
  85. package/src/index.ts +5 -0
  86. package/src/provider/index.tsx +105 -0
  87. package/src/react-app-env.d.ts +2 -0
  88. package/src/services/external/analyticsService.ts +46 -0
  89. package/src/services/external/coingeckoService.ts +35 -0
  90. package/src/services/external/rpcService.ts +196 -0
  91. package/src/services/external/secretService.ts +178 -0
  92. package/src/services/index.ts +1 -0
  93. package/src/services/internal/apiService.ts +6 -0
  94. package/src/services/internal/assetsService.ts +84 -0
  95. package/src/services/internal/configService.ts +261 -0
  96. package/src/services/internal/errorService.ts +124 -0
  97. package/src/services/internal/eventService.ts +93 -0
  98. package/src/services/internal/priceService.ts +10 -0
  99. package/src/services/internal/transactionService.ts +255 -0
  100. package/src/services/internal/transactionStatusService.ts +293 -0
  101. package/src/services/internal/walletService.ts +158 -0
  102. package/src/tests/assetsService.test.ts +176 -0
  103. package/src/tests/configService.test.ts +486 -0
  104. package/src/tests/fetchSquidData.ts +43 -0
  105. package/src/tests/jest-svg-transform.ts +19 -0
  106. package/src/tests/sample.json +0 -0
  107. package/src/tests/walletService.test.ts +178 -0
  108. package/tsconfig.json +30 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * See https://stackoverflow.com/questions/58603201/jest-cannot-load-svg-file
3
+ * And also https://jestjs.io/docs/tutorial-react#custom-transformers
4
+ *
5
+ * This file is used to transform svg files into empty modules
6
+ * this way Jest can handle .svg imports without any issues
7
+ */
8
+ // export {};
9
+ module.exports = {
10
+ process() {
11
+ return {
12
+ code: `module.exports = {};`,
13
+ };
14
+ },
15
+ getCacheKey() {
16
+ // The output is always the same.
17
+ return "svgTransform";
18
+ },
19
+ };
File without changes
@@ -0,0 +1,178 @@
1
+ import {
2
+ isWalletAddressValid,
3
+ formatWalletAddress,
4
+ } from "@/services/internal/walletService";
5
+ import { OnlineSquidData, fetchSquidData } from "./fetchSquidData";
6
+
7
+ let squid: OnlineSquidData | undefined = undefined;
8
+ let CHAINS: OnlineSquidData["chains"] = {};
9
+
10
+ describe("walletService", () => {
11
+ beforeAll(async () => {
12
+ squid = await fetchSquidData();
13
+ CHAINS = squid?.chains;
14
+ });
15
+ describe("isWalletAddressValid", () => {
16
+ test("returns true when address is a valid EVM address for an EVM chain", () => {
17
+ expect(
18
+ isWalletAddressValid(
19
+ CHAINS.BASE,
20
+ "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664"
21
+ )
22
+ ).toBe(true);
23
+
24
+ expect(
25
+ isWalletAddressValid(
26
+ CHAINS.BINANCE,
27
+ "0x6f1c3f578ef3f0d2cf9b1ec712d9654f143ea4d1"
28
+ )
29
+ ).toBe(true);
30
+
31
+ expect(
32
+ isWalletAddressValid(
33
+ CHAINS.POLYGON,
34
+ "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d"
35
+ )
36
+ ).toBe(true);
37
+ });
38
+
39
+ test("returns false when address is not a valid EVM address for an EVM chain", () => {
40
+ expect(
41
+ isWalletAddressValid(
42
+ CHAINS.BASE,
43
+ "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C66" // missing last character
44
+ )
45
+ ).toBe(false);
46
+
47
+ expect(
48
+ isWalletAddressValid(
49
+ CHAINS.BINANCE,
50
+ "e43f1c3f578ef3f0d2cf9b1ec712d9654f143ea4d1" // missing 0x prefix
51
+ )
52
+ ).toBe(false);
53
+
54
+ expect(
55
+ isWalletAddressValid(
56
+ CHAINS.POLYGON,
57
+ "cosmos1w3jhx7w3jhx7w3jhx7w3jhx7w3jhx7w3jhx7w3j" // cosmos address
58
+ )
59
+ ).toBe(false);
60
+ });
61
+
62
+ test("returns true when address is a valid Cosmos address for a Cosmos chain", () => {
63
+ expect(
64
+ isWalletAddressValid(
65
+ CHAINS.NOBLE,
66
+ "noble1awrua7e2kj69d7vn5qt5tccrhavmj9xa6up0eq"
67
+ )
68
+ ).toBe(true);
69
+
70
+ expect(
71
+ isWalletAddressValid(
72
+ CHAINS.NOBLE,
73
+ "noble1qe8uuf5x69c526h4nzxwv4ltftr73v7qgk33qz"
74
+ )
75
+ ).toBe(true);
76
+
77
+ expect(
78
+ isWalletAddressValid(
79
+ CHAINS.NOBLE,
80
+ "noble1zttnm2cl60m5ffsrfeqtzkmtvepl4hwnsqg9fd"
81
+ )
82
+ ).toBe(true);
83
+ });
84
+
85
+ test("returns false when address is not a valid Cosmos address for a Cosmos chain", () => {
86
+ expect(
87
+ isWalletAddressValid(
88
+ CHAINS.NOBLE,
89
+ "noble1qe8uuf5x69c526h4nzxwv4ltftr73v7qgk33" // missing last character
90
+ )
91
+ ).toBe(false);
92
+
93
+ expect(
94
+ isWalletAddressValid(
95
+ CHAINS.NOBLE,
96
+ "1qe8uuf5x69c526h4nzxwv4ltftr73v7qgk33q" // missing chain prefix
97
+ )
98
+ ).toBe(false);
99
+
100
+ expect(
101
+ isWalletAddressValid(
102
+ CHAINS.NOBLE,
103
+ "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664" // EVM address
104
+ )
105
+ ).toBe(false);
106
+ });
107
+ });
108
+
109
+ describe("formatWalletAddress", () => {
110
+ test("formats EVM addresses correctly", () => {
111
+ expect(
112
+ formatWalletAddress("0x6f1c3f578ef3f0d2cf9b1ec712d9654f143ea4d1", 5)
113
+ ).toBe("0x6f1...4d1");
114
+
115
+ expect(
116
+ formatWalletAddress("0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", 8)
117
+ ).toBe("0xbc4ca0...36f13d");
118
+
119
+ expect(
120
+ formatWalletAddress("0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664", 3)
121
+ ).toBe("0xa...4");
122
+ });
123
+
124
+ test("formats Cosmos addresses correctly", () => {
125
+ expect(
126
+ formatWalletAddress("noble1awrua7e2kj69d7vn5qt5tccrhavmj9xa6up0eq", 5)
127
+ ).toBe("noble...0eq");
128
+
129
+ expect(
130
+ formatWalletAddress("noble1qe8uuf5x69c526h4nzxwv4ltftr73v7qgk33qz", 8)
131
+ ).toBe("noble1qe...gk33qz");
132
+
133
+ expect(
134
+ formatWalletAddress("noble1zttnm2cl60m5ffsrfeqtzkmtvepl4hwnsqg9fd", 3)
135
+ ).toBe("nob...d");
136
+ });
137
+
138
+ test("returns empty string when address is undefined or empty string", () => {
139
+ expect(formatWalletAddress(undefined)).toBe("");
140
+
141
+ expect(formatWalletAddress("")).toBe("");
142
+
143
+ expect(formatWalletAddress("", 0)).toBe("");
144
+
145
+ expect(formatWalletAddress(undefined, 0)).toBe("");
146
+ });
147
+
148
+ test("handles trim length smaller than or equal to 2", () => {
149
+ expect(formatWalletAddress("0x123", 1)).toBe("0...");
150
+
151
+ expect(formatWalletAddress("0x123", 2)).toBe("0x...");
152
+ });
153
+
154
+ test("for negative trim length, removes its absolute value and adds three dots at the end", () => {
155
+ expect(formatWalletAddress("0x123", -1)).toBe("0x12..."); // trims 1 characters and adds three dots
156
+
157
+ expect(
158
+ formatWalletAddress("0x6f1c3f578ef3f0d2cf9b1ec712d9654f143ea4d1", -5)
159
+ ).toBe(
160
+ "0x6f1c3f578ef3f0d2cf9b1ec712d9654f143..." // trims 5 characters and adds three dots
161
+ );
162
+
163
+ expect(
164
+ formatWalletAddress("noble1awrua7e2kj69d7vn5qt5tccrhavmj9xa6up0eq", -9)
165
+ ).toBe(
166
+ "noble1awrua7e2kj69d7vn5qt5tccrhavmj..." // trims 9 characters and adds three dots
167
+ );
168
+ });
169
+
170
+ test("returns full address when its length is smaller than trim length", () => {
171
+ const evmAddress = "0x6f1c3f578ef3f0d2cf9b1ec712d9654f143ea4d1";
172
+ expect(formatWalletAddress(evmAddress, 100)).toBe(evmAddress);
173
+
174
+ const cosmosAddress = "noble1awrua7e2kj69d7vn5qt5tccrhavmj9xa6up0eq";
175
+ expect(formatWalletAddress(cosmosAddress, 100)).toBe(cosmosAddress);
176
+ });
177
+ });
178
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "module": "ESNext",
7
+ "target": "ES6",
8
+ "moduleResolution": "node",
9
+ "declaration": true,
10
+ "esModuleInterop": true,
11
+ "jsx": "react",
12
+ "sourceMap": true,
13
+ "baseUrl": ".",
14
+ "paths": {
15
+ "@/*": ["src/*"]
16
+ },
17
+ "allowJs": true,
18
+ "allowSyntheticDefaultImports": true,
19
+ "forceConsistentCasingInFileNames": true,
20
+ "isolatedModules": true,
21
+ "lib": ["dom", "dom.iterable", "esnext"],
22
+ "noFallthroughCasesInSwitch": true,
23
+ "resolveJsonModule": true,
24
+ "skipLibCheck": true,
25
+ "strict": true,
26
+ "types": ["jest", "node", "react", "react-dom"]
27
+ },
28
+ "include": ["src/**/*", "src/**/*.json", "src/**/*.svg"],
29
+ "exclude": ["**/.*/", "**/dist", "node_modules"]
30
+ }