diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 2d9dac23a..f21f2fe01 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,4 +1,4 @@ -import { GroupResponse, SemaphoreEthers, SemaphoreSubgraph } from "@semaphore-protocol/data" +import { GroupResponse, SemaphoreEthers, SemaphoreSubgraph, getSupportedNetworks } from "@semaphore-protocol/data" import chalk from "chalk" import { program } from "commander" import figlet from "figlet" @@ -16,7 +16,7 @@ import Spinner from "./spinner.js" const packagePath = `${dirname(fileURLToPath(import.meta.url))}/..` const { description, version } = JSON.parse(readFileSync(`${packagePath}/package.json`, "utf8")) -const supportedNetworks = ["sepolia", "goerli", "mumbai", "optimism-goerli", "arbitrum", "arbitrum-goerli"] +const supportedNetworks = getSupportedNetworks() const supportedTemplates = [ { diff --git a/packages/data/README.md b/packages/data/README.md index 16eca6d9b..f032031a8 100644 --- a/packages/data/README.md +++ b/packages/data/README.md @@ -70,7 +70,13 @@ yarn add @semaphore-protocol/data ## 📜 Usage -\# **new SemaphoreSubgraph**(networkOrSubgraphURL: _Network_ | _string_ = "goerli"): _SemaphoreSubgraph_ +\# **getSupportedNetworks**(): _string[]_ + +```typescript +const supportedNetworks = getSupportedNetworks() +``` + +\# **new SemaphoreSubgraph**(networkOrSubgraphURL: SupportedNetwork | ValueOf\ | string = "sepolia"): _SemaphoreSubgraph_ ```typescript import { SemaphoreSubgraph } from "@semaphore-protocol/data" diff --git a/packages/data/src/ethers.ts b/packages/data/src/ethers.ts index 227f59995..c902d909d 100644 --- a/packages/data/src/ethers.ts +++ b/packages/data/src/ethers.ts @@ -12,10 +12,10 @@ import { import checkParameter from "./checkParameter" import getEvents from "./getEvents" import SemaphoreABI from "./semaphoreABI.json" -import { EthersOptions, GroupResponse, Network } from "./types" +import { EthersOptions, GroupResponse, EthersNetwork } from "./types" export default class SemaphoreEthers { - private _network: Network | string + private _network: EthersNetwork | string private _options: EthersOptions private _contract: Contract @@ -24,7 +24,7 @@ export default class SemaphoreEthers { * @param networkOrEthereumURL Ethereum network or custom URL. * @param options Ethers options. */ - constructor(networkOrEthereumURL: Network | string = "sepolia", options: EthersOptions = {}) { + constructor(networkOrEthereumURL: EthersNetwork | string = "sepolia", options: EthersOptions = {}) { checkParameter(networkOrEthereumURL, "networkOrSubgraphURL", "string") if (options.provider) { @@ -114,7 +114,7 @@ export default class SemaphoreEthers { * Returns the Ethereum network or custom URL. * @returns Ethereum network or custom URL. */ - get network(): Network | string { + get network(): EthersNetwork | string { return this._network } diff --git a/packages/data/src/getSupportedNetworks.ts b/packages/data/src/getSupportedNetworks.ts new file mode 100644 index 000000000..55ec5fce7 --- /dev/null +++ b/packages/data/src/getSupportedNetworks.ts @@ -0,0 +1,9 @@ +import { SupportedNetwork } from "./types" + +/** + * Returns the list of Semaphore supported networks. + * @returns Semaphore supported networks. + */ +export default function getSupportedNetworks(): string[] { + return Object.values(SupportedNetwork) +} diff --git a/packages/data/src/getURL.ts b/packages/data/src/getURL.ts index 17d1a7766..193ef6667 100644 --- a/packages/data/src/getURL.ts +++ b/packages/data/src/getURL.ts @@ -1,19 +1,20 @@ -import { Network } from "./types" +import { SupportedNetwork } from "./types" /** * Returns the subgraph URL related to the network passed as a parameter. - * @param network Semaphore supported network. + * @param supportedNetwork Semaphore supported network. * @returns Subgraph URL. */ -export default function getURL(network: Network): string { - switch (network) { +export default function getURL(supportedNetwork: SupportedNetwork | string): string { + switch (supportedNetwork) { + case "sepolia": case "goerli": case "mumbai": case "optimism-goerli": case "arbitrum-goerli": case "arbitrum": - return `https://api.studio.thegraph.com/query/14377/semaphore-${network}/v3.6.1` + return `https://api.studio.thegraph.com/query/14377/semaphore-${supportedNetwork}/v3.6.1` default: - throw new TypeError(`Network '${network}' is not supported`) + throw new TypeError(`Network '${supportedNetwork}' is not supported`) } } diff --git a/packages/data/src/index.ts b/packages/data/src/index.ts index 38c1a6ced..5756f3ec9 100644 --- a/packages/data/src/index.ts +++ b/packages/data/src/index.ts @@ -1,5 +1,6 @@ -import SemaphoreSubgraph from "./subgraph" import SemaphoreEthers from "./ethers" +import getSupportedNetworks from "./getSupportedNetworks" +import SemaphoreSubgraph from "./subgraph" -export { SemaphoreSubgraph, SemaphoreEthers } export * from "./types" +export { SemaphoreSubgraph, SemaphoreEthers, getSupportedNetworks } diff --git a/packages/data/src/subgraph.test.ts b/packages/data/src/subgraph.test.ts index 9c9fc51c5..390cf429f 100644 --- a/packages/data/src/subgraph.test.ts +++ b/packages/data/src/subgraph.test.ts @@ -16,7 +16,7 @@ describe("SemaphoreSubgraph", () => { semaphore = new SemaphoreSubgraph() const semaphore1 = new SemaphoreSubgraph("arbitrum") - expect(semaphore.url).toContain("goerli") + expect(semaphore.url).toContain("sepolia") expect(semaphore1.url).toContain("arbitrum") }) diff --git a/packages/data/src/subgraph.ts b/packages/data/src/subgraph.ts index bbb570236..851f080e7 100644 --- a/packages/data/src/subgraph.ts +++ b/packages/data/src/subgraph.ts @@ -2,7 +2,7 @@ import { AxiosRequestConfig } from "axios" import checkParameter from "./checkParameter" import getURL from "./getURL" import request from "./request" -import { GroupResponse, GroupOptions, Network } from "./types" +import { GroupOptions, GroupResponse, SupportedNetwork } from "./types" import { jsDateToGraphqlDate } from "./utils" export default class SemaphoreSubgraph { @@ -12,15 +12,15 @@ export default class SemaphoreSubgraph { * Initializes the subgraph object with one of the supported networks or a custom URL. * @param networkOrSubgraphURL Supported Semaphore network or custom Subgraph URL. */ - constructor(networkOrSubgraphURL: Network | string = "goerli") { + constructor(networkOrSubgraphURL: SupportedNetwork | string = SupportedNetwork.SEPOLIA) { checkParameter(networkOrSubgraphURL, "networkOrSubgraphURL", "string") - if (networkOrSubgraphURL.startsWith("http")) { + if (typeof networkOrSubgraphURL === "string" && networkOrSubgraphURL.startsWith("http")) { this._url = networkOrSubgraphURL return } - this._url = getURL(networkOrSubgraphURL as Network) + this._url = getURL(networkOrSubgraphURL) } /** diff --git a/packages/data/src/types/index.ts b/packages/data/src/types/index.ts index bb2bcbd63..cae33f1a8 100644 --- a/packages/data/src/types/index.ts +++ b/packages/data/src/types/index.ts @@ -1,4 +1,13 @@ -export type Network = +export enum SupportedNetwork { + SEPOLIA = "sepolia", + GOERLI = "goerli", + MUMBAI = "mumbai", + OPTIMISM_GOERLI = "optimism-goerli", + ARBITRUM_GOERLI = "arbitrum-goerli", + ARBITRUM = "arbitrum" +} + +export type EthersNetwork = | "homestead" | "matic" | "goerli"