Skip to content

Commit 1cc7195

Browse files
committed
Fixes to archive/trace support
1 parent 7f8e437 commit 1cc7195

File tree

2 files changed

+88
-38
lines changed

2 files changed

+88
-38
lines changed

components/RPCList/index.js

Lines changed: 83 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,55 @@ import useAddToNetwork from "../../hooks/useAddToNetwork";
66
import { useLlamaNodesRpcData } from "../../hooks/useLlamaNodesRpcData";
77
import { FATHOM_DROPDOWN_EVENTS_ID } from "../../hooks/useAnalytics";
88
import { useRpcStore } from "../../stores";
9-
import { renderProviderText } from "../../utils";
9+
import { renderProviderText, containsAny } from "../../utils";
1010
import { Tooltip } from "../../components/Tooltip";
1111
import useAccount from "../../hooks/useAccount";
1212
import { Popover, PopoverDisclosure, usePopoverStore } from "@ariakit/react/popover";
1313
import { 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

1725
const 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

227245
function 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">

utils/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,8 @@ export const notTranslation =
9494
return en[ns][key];
9595
}
9696
};
97+
98+
export const containsAny = (str, substrings) => {
99+
if (!str) return false;
100+
return substrings.some(substring => str.toLowerCase().includes(substring.toLowerCase()));
101+
};

0 commit comments

Comments
 (0)