diff --git a/src/Main.tsx b/src/Main.tsx index 1fe30e5..344e34c 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -2,7 +2,7 @@ import React, { useMemo, useState } from "react"; import { Outlet } from "react-router-dom"; import Header from "./Header"; import { AppConfig, AppConfigContext } from "./useAppConfig"; -import { SourcifySource } from "./url"; +import { SourcifySource } from "./sourcify/useSourcify"; const Main: React.FC = () => { const [sourcifySource, setSourcifySource] = useState( diff --git a/src/SourcifyMenu.tsx b/src/SourcifyMenu.tsx index ce23472..c4b60dd 100644 --- a/src/SourcifyMenu.tsx +++ b/src/SourcifyMenu.tsx @@ -2,8 +2,8 @@ import React, { PropsWithChildren } from "react"; import { Menu } from "@headlessui/react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faBars } from "@fortawesome/free-solid-svg-icons/faBars"; -import { SourcifySource } from "./url"; import { useAppConfigContext } from "./useAppConfig"; +import { SourcifySource } from "./sourcify/useSourcify"; const SourcifyMenu: React.FC = () => { const { sourcifySource, setSourcifySource } = useAppConfigContext(); diff --git a/src/sourcify/useSourcify.ts b/src/sourcify/useSourcify.ts index 69ccfff..12be76f 100644 --- a/src/sourcify/useSourcify.ts +++ b/src/sourcify/useSourcify.ts @@ -3,7 +3,6 @@ import { Interface } from "@ethersproject/abi"; import { ErrorDescription } from "@ethersproject/abi/lib/interface"; import useSWRImmutable from "swr/immutable"; import { ChecksummedAddress, TransactionData } from "../types"; -import { sourcifyMetadata, SourcifySource, sourcifySourceFile } from "../url"; import { useAppConfigContext } from "../useAppConfig"; export type UserMethod = { @@ -82,6 +81,55 @@ export type Metadata = { }; }; +export enum SourcifySource { + // Resolve trusted IPNS for root IPFS + IPFS_IPNS, + + // Centralized Sourcify servers + CENTRAL_SERVER, +} + +const sourcifyIPNS = + "k51qzi5uqu5dll0ocge71eudqnrgnogmbr37gsgl12uubsinphjoknl6bbi41p"; +const defaultIpfsGatewayPrefix = `https://ipfs.io/ipns/${sourcifyIPNS}`; +const sourcifyHttpRepoPrefix = `https://repo.sourcify.dev`; + +const resolveSourcifySource = (source: SourcifySource) => { + if (source === SourcifySource.IPFS_IPNS) { + return defaultIpfsGatewayPrefix; + } + if (source === SourcifySource.CENTRAL_SERVER) { + return sourcifyHttpRepoPrefix; + } + + throw new Error(`Unknown Sourcify integration source code: ${source}`); +}; + +/** + * Builds a complete Sourcify metadata.json URL given the contract address + * and chain. + */ +export const sourcifyMetadata = ( + address: ChecksummedAddress, + chainId: number, + source: SourcifySource, + type: MatchType +) => + `${resolveSourcifySource(source)}/contracts/${ + type === MatchType.FULL_MATCH ? "full_match" : "partial_match" + }/${chainId}/${address}/metadata.json`; + +export const sourcifySourceFile = ( + address: ChecksummedAddress, + chainId: number, + filepath: string, + source: SourcifySource, + type: MatchType +) => + `${resolveSourcifySource(source)}/contracts/${ + type === MatchType.FULL_MATCH ? "full_match" : "partial_match" + }/${chainId}/${address}/sources/${filepath}`; + export enum MatchType { FULL_MATCH, PARTIAL_MATCH, diff --git a/src/url.ts b/src/url.ts index b4ad6e2..236b3e9 100644 --- a/src/url.ts +++ b/src/url.ts @@ -1,5 +1,4 @@ import { BlockTag } from "@ethersproject/abstract-provider"; -import { MatchType } from "./sourcify/useSourcify"; import { ChecksummedAddress } from "./types"; export const fourBytesURL = ( @@ -30,54 +29,5 @@ export const transactionURL = (txHash: string) => `/tx/${txHash}`; export const addressByNonceURL = (address: ChecksummedAddress, nonce: number) => `/address/${address}?nonce=${nonce}`; -export enum SourcifySource { - // Resolve trusted IPNS for root IPFS - IPFS_IPNS, - - // Centralized Sourcify servers - CENTRAL_SERVER, -} - -const sourcifyIPNS = - "k51qzi5uqu5dll0ocge71eudqnrgnogmbr37gsgl12uubsinphjoknl6bbi41p"; -const defaultIpfsGatewayPrefix = `https://ipfs.io/ipns/${sourcifyIPNS}`; -const sourcifyHttpRepoPrefix = `https://repo.sourcify.dev`; - -const resolveSourcifySource = (source: SourcifySource) => { - if (source === SourcifySource.IPFS_IPNS) { - return defaultIpfsGatewayPrefix; - } - if (source === SourcifySource.CENTRAL_SERVER) { - return sourcifyHttpRepoPrefix; - } - - throw new Error(`Unknown Sourcify integration source code: ${source}`); -}; - -/** - * Builds a complete Sourcify metadata.json URL given the contract address - * and chain. - */ -export const sourcifyMetadata = ( - address: ChecksummedAddress, - chainId: number, - source: SourcifySource, - type: MatchType -) => - `${resolveSourcifySource(source)}/contracts/${ - type === MatchType.FULL_MATCH ? "full_match" : "partial_match" - }/${chainId}/${address}/metadata.json`; - -export const sourcifySourceFile = ( - address: ChecksummedAddress, - chainId: number, - filepath: string, - source: SourcifySource, - type: MatchType -) => - `${resolveSourcifySource(source)}/contracts/${ - type === MatchType.FULL_MATCH ? "full_match" : "partial_match" - }/${chainId}/${address}/sources/${filepath}`; - export const openInRemixURL = (checksummedAddress: string, networkId: number) => `https://remix.ethereum.org/#activate=sourcify&call=sourcify//fetchAndSave//${checksummedAddress}//${networkId}`; diff --git a/src/useAppConfig.ts b/src/useAppConfig.ts index 56007e0..1ba3c9d 100644 --- a/src/useAppConfig.ts +++ b/src/useAppConfig.ts @@ -1,5 +1,5 @@ import React, { useContext } from "react"; -import { SourcifySource } from "./url"; +import { SourcifySource } from "./sourcify/useSourcify"; export type AppConfig = { sourcifySource: SourcifySource;