11import { useEffect , useState } from "react" ;
22import * as chains from "viem-chains/chains" ;
33import { EntropyDeploymentsConfig } from "./EntropyDeploymentsConfig" ;
4+ import { z } from "zod" ;
45
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- }
6+ const ApiChainConfigSchema = z . object ( {
7+ name : z . string ( ) ,
8+ network_id : z . number ( ) ,
9+ contract_addr : z . string ( ) ,
10+ reveal_delay_blocks : z . number ( ) ,
11+ gas_limit : z . number ( ) ,
12+ default_fee : z . number ( ) ,
13+ } ) ;
14+
15+ type ApiChainConfig = z . infer < typeof ApiChainConfigSchema > ;
16+
17+ const entropyDeploymentsSchema = z . array ( ApiChainConfigSchema ) ;
1318
1419export interface EntropyDeployment {
1520 address : string ;
@@ -21,71 +26,58 @@ export interface EntropyDeployment {
2126 nativeCurrency ?: string ;
2227}
2328
29+ const getChainData = ( network_id : number ) => {
30+ return Object . values ( chains ) . find ( ( chain ) => chain . id === network_id ) ;
31+ } ;
32+
33+ const transformChainData = ( chain : ApiChainConfig ) : [ string , EntropyDeployment ] => {
34+ const chainData = getChainData ( chain . network_id ) ;
35+ const configOverride = EntropyDeploymentsConfig [ chain . network_id ] ;
36+
37+ const deployment : EntropyDeployment = {
38+ address : chain . contract_addr ,
39+ delay : `${ chain . reveal_delay_blocks } block${
40+ chain . reveal_delay_blocks !== 1 ? "s" : ""
41+ } `,
42+ gasLimit : chain . gas_limit . toLocaleString ( ) ,
43+ default_fee : chain . default_fee ,
44+ // Use config override first, then viem data, then undefined
45+ rpc : configOverride ?. rpc ?? chainData ?. rpcUrls ?. default ?. http ?. [ 0 ] ,
46+ explorer :
47+ configOverride ?. explorer ?? chainData ?. blockExplorers ?. default ?. url ,
48+ nativeCurrency :
49+ configOverride ?. nativeCurrency ?? chainData ?. nativeCurrency ?. symbol ,
50+ } ;
51+
52+ return [ chain . name , deployment ] ;
53+ } ;
54+
2455const fetchEntropyDeployments = async (
2556 url : string
26- ) : Promise < ApiChainConfig [ ] > => {
57+ ) : Promise < Record < string , EntropyDeployment > > => {
2758 try {
2859 const response = await fetch ( url ) ;
29- const data = await response . json ( ) ;
30- return data as ApiChainConfig [ ] ;
60+ const apiData = entropyDeploymentsSchema . parse ( await response . json ( ) ) ;
61+
62+ return Object . fromEntries ( apiData . map ( transformChainData ) ) ;
3163 } catch ( error ) {
3264 console . error ( "Error fetching entropy deployments:" , error ) ;
33- return [ ] ;
65+ return { } ;
3466 }
3567} ;
3668
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 ) {
69+ export function useEntropyApiData ( url : string ) {
5970 const [ data , setData ] = useState < Record < string , EntropyDeployment > > ( { } ) ;
6071 const [ isLoading , setIsLoading ] = useState ( true ) ;
6172 const [ error , setError ] = useState < string | null > ( null ) ;
6273
6374 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 > ) ;
75+ setData ( { } ) ;
76+ setIsLoading ( true ) ;
77+ setError ( null ) ;
8878
79+ fetchEntropyDeployments ( url )
80+ . then ( ( transformedData ) => {
8981 setData ( transformedData ) ;
9082 setIsLoading ( false ) ;
9183 } )
@@ -95,5 +87,5 @@ export function EntropyApiDataFetcher({
9587 } ) ;
9688 } , [ url ] ) ;
9789
98- return < > { children ( data , isLoading , error ) } </ > ;
90+ return { data, isLoading, error } ;
9991}
0 commit comments