@@ -6,36 +6,55 @@ import useAddToNetwork from "../../hooks/useAddToNetwork";
66import { useLlamaNodesRpcData } from "../../hooks/useLlamaNodesRpcData" ;
77import { FATHOM_DROPDOWN_EVENTS_ID } from "../../hooks/useAnalytics" ;
88import { useRpcStore } from "../../stores" ;
9- import { renderProviderText } from "../../utils" ;
9+ import { renderProviderText , containsAny } from "../../utils" ;
1010import { Tooltip } from "../../components/Tooltip" ;
1111import useAccount from "../../hooks/useAccount" ;
1212import { Popover , PopoverDisclosure , usePopoverStore } from "@ariakit/react/popover" ;
1313import { useQuery } from "@tanstack/react-query" ;
1414
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+ } ;
1624
1725const testTraceSupport = async ( rpcUrl ) => {
1826 // Test trace support (with fake tx hash)
27+
28+ const fakeTxHash = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" ;
1929 const tracePayload = {
2030 jsonrpc : "2.0" ,
2131 method : "debug_traceTransaction" ,
22- params : [ "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" , { } ] ,
32+ params : [ fakeTxHash , { } ] ,
2333 id : 1 ,
2434 } ;
2535
2636 try {
27-
2837 const traceRes = await fetch ( rpcUrl , {
2938 method : "POST" ,
3039 headers : { "Content-Type" : "application/json" } ,
3140 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+ }
3350
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 ;
3654
55+ return traceSupported ? SUPPORT_STATUS . supported : SUPPORT_STATUS . not_supported ;
3756 } catch ( error ) {
38- return " error" ;
57+ return SUPPORT_STATUS . error ;
3958 }
4059} ;
4160
@@ -49,18 +68,17 @@ const testArchiveSupport = async (rpcUrl) => {
4968 } ;
5069
5170 try {
52-
5371 const archiveRes = await fetch ( rpcUrl , {
5472 method : "POST" ,
5573 headers : { "Content-Type" : "application/json" } ,
5674 body : JSON . stringify ( archivePayload ) ,
57- } ) . then ( r => r . json ( ) ) ;
75+ signal : AbortSignal . timeout ( 7000 ) ,
76+ } ) . then ( ( r ) => r . json ( ) ) ;
5877
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 ;
6280 } catch ( error ) {
63- return " error" ;
81+ return SUPPORT_STATUS . error ;
6482 }
6583} ;
6684
@@ -125,12 +143,12 @@ export default function RPCList({ chain, lang }) {
125143
126144 return {
127145 ...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,
134152 } ,
135153 } ;
136154 } ) ;
@@ -226,14 +244,16 @@ function PrivacyIcon({ tracking, isOpenSource = false }) {
226244
227245function SupportIcon ( { support } ) {
228246 switch ( support ) {
229- case " supported" :
247+ case SUPPORT_STATUS . supported :
230248 return < GreenIcon /> ;
231- case "not-supported" :
249+ case SUPPORT_STATUS . not_supported :
232250 return < RedIcon /> ;
233- case " error" :
251+ case SUPPORT_STATUS . error :
234252 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+ ) ;
237257 default :
238258 return < EmptyIcon /> ;
239259 }
@@ -260,37 +280,38 @@ const Row = ({ values, chain, privacy, lang, className }) => {
260280
261281 const { mutate : addToNetwork } = useAddToNetwork ( ) ;
262282
263-
264283 const traceSupport = useQuery ( {
265- queryKey : [ "support" , data ?. url ] ,
284+ queryKey : [ "trace- support" , data ?. url ] ,
266285 queryFn : ( ) => testTraceSupport ( data ?. url ) ,
267286 staleTime : 1000 * 60 * 60 ,
268287 refetchInterval : 1000 * 60 * 60 ,
269288 refetchOnMount : false ,
270289 refetchOnWindowFocus : false ,
271290 enabled : ! ! data ?. url ,
272- } )
291+ } ) ;
273292
274293 const archiveSupport = useQuery ( {
275- queryKey : [ "support" , data ?. url ] ,
294+ queryKey : [ "archive- support" , data ?. url ] ,
276295 queryFn : ( ) => testArchiveSupport ( data ?. url ) ,
277296 staleTime : 1000 * 60 * 60 ,
278297 refetchInterval : 1000 * 60 * 60 ,
279298 refetchOnMount : false ,
280299 refetchOnWindowFocus : false ,
281300 enabled : ! ! data ?. url ,
282- } )
301+ } ) ;
283302
284303 const getSupportTooltipContent = ( support , type ) => {
285304 switch ( support ) {
286- case " supported" :
305+ case SUPPORT_STATUS . supported :
287306 return `${ type } methods are supported` ;
288- case "not-supported" :
307+ case SUPPORT_STATUS . not_supported :
289308 return `${ type } methods are not supported` ;
290- case " error" :
309+ case SUPPORT_STATUS . error :
291310 return `Error testing ${ type } support` ;
292- case " testing" :
311+ case SUPPORT_STATUS . testing :
293312 return `Testing ${ type } support...` ;
313+ case SUPPORT_STATUS . unknown :
314+ return `${ type } support unknown` ;
294315 default :
295316 return `${ type } support unknown` ;
296317 }
@@ -324,13 +345,37 @@ const Row = ({ values, chain, privacy, lang, className }) => {
324345 </ Tooltip >
325346 </ td >
326347 < 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+ ) }
329361 </ Tooltip >
330362 </ td >
331363 < 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+ ) }
334379 </ Tooltip >
335380 </ td >
336381 < td className = "px-3 py-1 text-sm text-center border" >
0 commit comments