@@ -6,36 +6,55 @@ import useAddToNetwork from "../../hooks/useAddToNetwork";
6
6
import { useLlamaNodesRpcData } from "../../hooks/useLlamaNodesRpcData" ;
7
7
import { FATHOM_DROPDOWN_EVENTS_ID } from "../../hooks/useAnalytics" ;
8
8
import { useRpcStore } from "../../stores" ;
9
- import { renderProviderText } from "../../utils" ;
9
+ import { renderProviderText , containsAny } from "../../utils" ;
10
10
import { Tooltip } from "../../components/Tooltip" ;
11
11
import useAccount from "../../hooks/useAccount" ;
12
12
import { Popover , PopoverDisclosure , usePopoverStore } from "@ariakit/react/popover" ;
13
13
import { useQuery } from "@tanstack/react-query" ;
14
14
15
- // Test functions for trace and archive support
15
+ // Functions to test trace and archive support
16
+
17
+ const SUPPORT_STATUS = {
18
+ supported : "supported" ,
19
+ not_supported : "not-supported" ,
20
+ error : "error" ,
21
+ testing : "testing" ,
22
+ unknown : "unknown" ,
23
+ } ;
16
24
17
25
const testTraceSupport = async ( rpcUrl ) => {
18
26
// Test trace support (with fake tx hash)
27
+
28
+ const fakeTxHash = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" ;
19
29
const tracePayload = {
20
30
jsonrpc : "2.0" ,
21
31
method : "debug_traceTransaction" ,
22
- params : [ "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" , { } ] ,
32
+ params : [ fakeTxHash , { } ] ,
23
33
id : 1 ,
24
34
} ;
25
35
26
36
try {
27
-
28
37
const traceRes = await fetch ( rpcUrl , {
29
38
method : "POST" ,
30
39
headers : { "Content-Type" : "application/json" } ,
31
40
body : JSON . stringify ( tracePayload ) ,
32
- } ) . then ( r => r . json ( ) ) ;
41
+ signal : AbortSignal . timeout ( 7000 ) ,
42
+ } ) . then ( ( r ) => r . json ( ) ) ;
43
+
44
+ const errorMessage = traceRes ?. error ?. message || traceRes ?. message ;
45
+
46
+ // some RPCs might allow the trace with restrictions, better marks those as 'failed to test' instead of 'not supported'
47
+ if ( containsAny ( errorMessage , [ "auth" , "rate" , "limit" , "api" , "allowed" , "whitelist" , "origin" ] ) ) {
48
+ throw new Error ( errorMessage ) ;
49
+ }
33
50
34
- const traceSupported = ! traceRes . error ?. message . includes ( "method" || "API" ) ;
35
- return traceSupported ? "supported" : "not-supported" ;
51
+ const traceSupported =
52
+ containsAny ( errorMessage , [ "transaction not found" , `transaction ${ fakeTxHash } not found` ] ) ||
53
+ traceRes ?. result === null ;
36
54
55
+ return traceSupported ? SUPPORT_STATUS . supported : SUPPORT_STATUS . not_supported ;
37
56
} catch ( error ) {
38
- return " error" ;
57
+ return SUPPORT_STATUS . error ;
39
58
}
40
59
} ;
41
60
@@ -49,18 +68,17 @@ const testArchiveSupport = async (rpcUrl) => {
49
68
} ;
50
69
51
70
try {
52
-
53
71
const archiveRes = await fetch ( rpcUrl , {
54
72
method : "POST" ,
55
73
headers : { "Content-Type" : "application/json" } ,
56
74
body : JSON . stringify ( archivePayload ) ,
57
- } ) . then ( r => r . json ( ) ) ;
75
+ signal : AbortSignal . timeout ( 7000 ) ,
76
+ } ) . then ( ( r ) => r . json ( ) ) ;
58
77
59
- const archiveSupported = ! ! archiveRes . result ;
60
- return archiveSupported ? "supported" : "not-supported" ;
61
-
78
+ const archiveSupported = Boolean ( archiveRes . result ) ;
79
+ return archiveSupported ? SUPPORT_STATUS . supported : SUPPORT_STATUS . not_supported ;
62
80
} catch ( error ) {
63
- return " error" ;
81
+ return SUPPORT_STATUS . error ;
64
82
}
65
83
} ;
66
84
@@ -125,12 +143,12 @@ export default function RPCList({ chain, lang }) {
125
143
126
144
return {
127
145
...rest ,
128
- data : {
129
- ...data ,
130
- height,
131
- latency : lat ,
132
- trust,
133
- disableConnect
146
+ data : {
147
+ ...data ,
148
+ height,
149
+ latency : lat ,
150
+ trust,
151
+ disableConnect,
134
152
} ,
135
153
} ;
136
154
} ) ;
@@ -226,14 +244,16 @@ function PrivacyIcon({ tracking, isOpenSource = false }) {
226
244
227
245
function SupportIcon ( { support } ) {
228
246
switch ( support ) {
229
- case " supported" :
247
+ case SUPPORT_STATUS . supported :
230
248
return < GreenIcon /> ;
231
- case "not-supported" :
249
+ case SUPPORT_STATUS . not_supported :
232
250
return < RedIcon /> ;
233
- case " error" :
251
+ case SUPPORT_STATUS . error :
234
252
return < OrangeIcon /> ;
235
- case "testing" :
236
- return < div className = "w-4 h-4 mx-auto animate-spin rounded-full border-2 border-gray-300 border-t-blue-600" > </ div > ;
253
+ case SUPPORT_STATUS . testing :
254
+ return (
255
+ < div className = "w-4 h-4 mx-auto animate-spin rounded-full border-2 border-gray-300 border-t-blue-600" > </ div >
256
+ ) ;
237
257
default :
238
258
return < EmptyIcon /> ;
239
259
}
@@ -260,37 +280,38 @@ const Row = ({ values, chain, privacy, lang, className }) => {
260
280
261
281
const { mutate : addToNetwork } = useAddToNetwork ( ) ;
262
282
263
-
264
283
const traceSupport = useQuery ( {
265
- queryKey : [ "support" , data ?. url ] ,
284
+ queryKey : [ "trace- support" , data ?. url ] ,
266
285
queryFn : ( ) => testTraceSupport ( data ?. url ) ,
267
286
staleTime : 1000 * 60 * 60 ,
268
287
refetchInterval : 1000 * 60 * 60 ,
269
288
refetchOnMount : false ,
270
289
refetchOnWindowFocus : false ,
271
290
enabled : ! ! data ?. url ,
272
- } )
291
+ } ) ;
273
292
274
293
const archiveSupport = useQuery ( {
275
- queryKey : [ "support" , data ?. url ] ,
294
+ queryKey : [ "archive- support" , data ?. url ] ,
276
295
queryFn : ( ) => testArchiveSupport ( data ?. url ) ,
277
296
staleTime : 1000 * 60 * 60 ,
278
297
refetchInterval : 1000 * 60 * 60 ,
279
298
refetchOnMount : false ,
280
299
refetchOnWindowFocus : false ,
281
300
enabled : ! ! data ?. url ,
282
- } )
301
+ } ) ;
283
302
284
303
const getSupportTooltipContent = ( support , type ) => {
285
304
switch ( support ) {
286
- case " supported" :
305
+ case SUPPORT_STATUS . supported :
287
306
return `${ type } methods are supported` ;
288
- case "not-supported" :
307
+ case SUPPORT_STATUS . not_supported :
289
308
return `${ type } methods are not supported` ;
290
- case " error" :
309
+ case SUPPORT_STATUS . error :
291
310
return `Error testing ${ type } support` ;
292
- case " testing" :
311
+ case SUPPORT_STATUS . testing :
293
312
return `Testing ${ type } support...` ;
313
+ case SUPPORT_STATUS . unknown :
314
+ return `${ type } support unknown` ;
294
315
default :
295
316
return `${ type } support unknown` ;
296
317
}
@@ -324,13 +345,37 @@ const Row = ({ values, chain, privacy, lang, className }) => {
324
345
</ Tooltip >
325
346
</ td >
326
347
< td className = "px-3 py-1 text-sm border" >
327
- < Tooltip content = { getSupportTooltipContent ( traceSupport . isLoading ? 'testing' : traceSupport ?. data ?? 'unknown' , "Trace" ) } >
328
- { isLoading ? < Shimmer /> : < SupportIcon support = { traceSupport . isLoading ? 'testing' : traceSupport ?. data ?? 'unknown' } /> }
348
+ < Tooltip
349
+ content = { getSupportTooltipContent (
350
+ traceSupport . isLoading ? SUPPORT_STATUS . testing : traceSupport ?. data ?? SUPPORT_STATUS . unknown ,
351
+ "Trace" ,
352
+ ) }
353
+ >
354
+ { isLoading ? (
355
+ < Shimmer />
356
+ ) : (
357
+ < SupportIcon
358
+ support = { traceSupport . isLoading ? SUPPORT_STATUS . testing : traceSupport ?. data ?? SUPPORT_STATUS . unknown }
359
+ />
360
+ ) }
329
361
</ Tooltip >
330
362
</ td >
331
363
< td className = "px-3 py-1 text-sm border" >
332
- < Tooltip content = { getSupportTooltipContent ( archiveSupport . isLoading ? 'testing' : archiveSupport ?. data ?? 'unknown' , "Archive" ) } >
333
- { isLoading ? < Shimmer /> : < SupportIcon support = { archiveSupport . isLoading ? 'testing' : archiveSupport ?. data ?? 'unknown' } /> }
364
+ < Tooltip
365
+ content = { getSupportTooltipContent (
366
+ archiveSupport . isLoading ? SUPPORT_STATUS . testing : archiveSupport ?. data ?? SUPPORT_STATUS . unknown ,
367
+ "Archive" ,
368
+ ) }
369
+ >
370
+ { isLoading ? (
371
+ < Shimmer />
372
+ ) : (
373
+ < SupportIcon
374
+ support = {
375
+ archiveSupport . isLoading ? SUPPORT_STATUS . testing : archiveSupport ?. data ?? SUPPORT_STATUS . unknown
376
+ }
377
+ />
378
+ ) }
334
379
</ Tooltip >
335
380
</ td >
336
381
< td className = "px-3 py-1 text-sm text-center border" >
0 commit comments