Skip to content

Commit fa9ce8f

Browse files
committed
chore(entropy) Dyamic Fee table
1 parent fa1ee09 commit fa9ce8f

12 files changed

+1258
-1281
lines changed

abis/IEntropy.json

Lines changed: 0 additions & 820 deletions
This file was deleted.

abis/IEntropyV2.json

Lines changed: 628 additions & 0 deletions
Large diffs are not rendered by default.

components/EntropyApiDataFetcher.tsx

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { useEffect, useState } from "react";
2+
import * as chains from "viem/chains";
3+
import { EntropyDeploymentsConfig } from "./EntropyDeploymentsConfig";
4+
5+
interface ApiChainConfig {
6+
name: string;
7+
network_id: number;
8+
contract_addr: string;
9+
reveal_delay_blocks: number;
10+
gas_limit: number;
11+
default_fee: number;
12+
}
13+
14+
export interface EntropyDeployment {
15+
address: string;
16+
delay: string;
17+
gasLimit: string;
18+
default_fee: number;
19+
rpc?: string;
20+
explorer?: string;
21+
nativeCurrency?: string;
22+
}
23+
24+
const fetchEntropyDeployments = async (
25+
url: string
26+
): Promise<ApiChainConfig[]> => {
27+
try {
28+
const response = await fetch(url);
29+
const data = await response.json();
30+
return data as ApiChainConfig[];
31+
} catch (error) {
32+
console.error("Error fetching entropy deployments:", error);
33+
return [];
34+
}
35+
};
36+
37+
export const getChainData = (network_id: number) => {
38+
for (const chain of Object.values(chains)) {
39+
if (chain.id === network_id) {
40+
return chain;
41+
}
42+
}
43+
return null;
44+
};
45+
46+
interface EntropyApiDataFetcherProps {
47+
url: string;
48+
children: (
49+
data: Record<string, EntropyDeployment>,
50+
isLoading: boolean,
51+
error: string | null
52+
) => React.ReactNode;
53+
}
54+
55+
export function EntropyApiDataFetcher({
56+
url,
57+
children,
58+
}: EntropyApiDataFetcherProps) {
59+
const [data, setData] = useState<Record<string, EntropyDeployment>>({});
60+
const [isLoading, setIsLoading] = useState(true);
61+
const [error, setError] = useState<string | null>(null);
62+
63+
useEffect(() => {
64+
fetchEntropyDeployments(url)
65+
.then((apiData: ApiChainConfig[]) => {
66+
const transformedData = apiData.reduce((acc, chain) => {
67+
const chainData = getChainData(chain.network_id);
68+
const configOverride = EntropyDeploymentsConfig[chain.network_id];
69+
70+
acc[chain.name] = {
71+
address: chain.contract_addr,
72+
delay: `${chain.reveal_delay_blocks} block${
73+
chain.reveal_delay_blocks !== 1 ? "s" : ""
74+
}`,
75+
gasLimit: chain.gas_limit.toLocaleString(),
76+
default_fee: chain.default_fee,
77+
// Use config override first, then viem data, then undefined
78+
rpc: configOverride?.rpc || chainData?.rpcUrls?.default?.http?.[0],
79+
explorer:
80+
configOverride?.explorer ||
81+
chainData?.blockExplorers?.default?.url,
82+
nativeCurrency:
83+
configOverride?.nativeCurrency ||
84+
chainData?.nativeCurrency?.symbol,
85+
};
86+
return acc;
87+
}, {} as Record<string, EntropyDeployment>);
88+
89+
setData(transformedData);
90+
setIsLoading(false);
91+
})
92+
.catch((err) => {
93+
setError(err.message);
94+
setIsLoading(false);
95+
});
96+
}, [url]);
97+
98+
return <>{children(data, isLoading, error)}</>;
99+
}

components/EntropyDeploymentTable.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EntropyDeployment } from "./EntropyDeployments";
1+
import { EntropyDeployment } from "./EntropyApiDataFetcher";
22
import { StyledTd } from "./Table";
33

44
const EntropyDeploymentTable = ({
@@ -24,24 +24,31 @@ const EntropyDeploymentTable = ({
2424
<tr key={name}>
2525
<StyledTd>{name}</StyledTd>
2626
<StyledTd>
27-
<a
28-
href={deployment.explorer.replace(
29-
"$ADDRESS",
30-
deployment.address
31-
)}
32-
className={
33-
"nx-text-primary-600 nx-underline nx-decoration-from-font [text-underline-position:from-font]"
34-
}
35-
target={"_blank"}
36-
>
27+
{deployment.explorer ? (
28+
<a
29+
href={deployment.explorer + "/address/" + deployment.address}
30+
className={
31+
"nx-text-primary-600 nx-underline nx-decoration-from-font [text-underline-position:from-font]"
32+
}
33+
target={"_blank"}
34+
>
35+
<code
36+
className={
37+
"nx-border-black nx-border-opacity-[0.04] nx-bg-opacity-[0.03] nx-bg-black nx-break-words nx-rounded-md nx-border nx-py-0.5 nx-px-[.25em] nx-text-[.9em] dark:nx-border-white/10 dark:nx-bg-white/10 "
38+
}
39+
>
40+
{deployment.address}
41+
</code>
42+
</a>
43+
) : (
3744
<code
3845
className={
3946
"nx-border-black nx-border-opacity-[0.04] nx-bg-opacity-[0.03] nx-bg-black nx-break-words nx-rounded-md nx-border nx-py-0.5 nx-px-[.25em] nx-text-[.9em] dark:nx-border-white/10 dark:nx-bg-white/10 "
4047
}
4148
>
4249
{deployment.address}
4350
</code>
44-
</a>
51+
)}
4552
</StyledTd>
4653
{showReveal && <StyledTd>{deployment.delay}</StyledTd>}
4754
<StyledTd>{deployment.gasLimit}</StyledTd>

0 commit comments

Comments
 (0)