create-ponder 0.0.72 → 0.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/create-ponder.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type Network = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type Contract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialConfig = {\n database?: {\n kind: string;\n };\n networks: Network[];\n contracts: Contract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let config: PartialConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n config = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n config = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n config = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n config = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n config.contracts.forEach((contract) => {\n let abi: Abi;\n if (Array.isArray(contract.abi)) {\n // If it's an array of ABIs, use the 2nd one (the implementation ABI).\n const abiString = readFileSync(path.join(rootDir, contract.abi[1]), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n } else {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n }\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalConfig = `\n import type { Config } from \"@ponder/core\";\n\n export const config: Config = {\n networks: ${JSON.stringify(config.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(config.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(config.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.8.11\",\n \"typescript\": \"^5.1.3\",\n \"viem\": \"^1.2.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": true,\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return config;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n let blockNumber: number | undefined = undefined;\n\n try {\n const txHash = await getContractCreationTxn(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n if (!apiKey) {\n console.log(\"\\n(1/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const contractCreationBlockNumber = await getTxBlockNumber(\n txHash,\n apiUrl,\n apiKey\n );\n\n blockNumber = contractCreationBlockNumber;\n } catch (error) {\n // Do nothing, blockNumber won't be set.\n }\n\n if (!apiKey) {\n console.log(\"(2/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const abis: { abi: string; contractName: string }[] = [];\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n abis.push({ abi, contractName });\n\n // If the contract is an EIP-1967 proxy, get the implementation contract ABIs.\n if (\n (JSON.parse(abi) as any[]).find(\n (item) =>\n item.type === \"event\" &&\n item.name === \"Upgraded\" &&\n item.inputs[0].name === \"implementation\"\n )\n ) {\n console.log(\n \"Detected EIP-1967 proxy, fetching implementation contract ABIs\"\n );\n if (!apiKey) {\n console.log(\"(3/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { implAddresses } = await getProxyImplementationAddresses({\n contractAddress,\n apiUrl,\n fromBlock: blockNumber,\n apiKey,\n });\n\n for (const [index, implAddress] of implAddresses.entries()) {\n console.log(`Fetching ABI for implementation contract: ${implAddress}`);\n if (!apiKey) {\n console.log(\n `(${4 + index}/${\n 4 + implAddresses.length - 1\n }) Waiting 5 seconds for Etherscan API rate limit`\n );\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n implAddress,\n apiUrl,\n apiKey\n );\n\n abis.push({\n abi,\n contractName: `${contractName}_${implAddress.slice(0, 6)}`,\n });\n }\n }\n\n // Write ABI files.\n let abiConfig: any;\n abis.forEach(({ abi, contractName }) => {\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n if (abis.length === 1) {\n abiConfig = abiRelativePath;\n } else {\n abiConfig ||= [];\n abiConfig.push(abiRelativePath);\n }\n });\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiConfig,\n address: contractAddress,\n startBlock: blockNumber ?? undefined,\n },\n ],\n };\n\n return config;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const maxRetries = 5;\n let retryCount = 0;\n\n while (retryCount <= maxRetries) {\n try {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n } catch (error) {\n retryCount++;\n if (retryCount > maxRetries) {\n throw new Error(`Max retries reached: ${(error as Error).message}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n\nconst getProxyImplementationAddresses = async ({\n contractAddress,\n apiUrl,\n fromBlock,\n apiKey,\n}: {\n contractAddress: string;\n apiUrl: string;\n fromBlock?: number;\n apiKey?: string;\n}) => {\n const searchParams = new URLSearchParams({\n module: \"logs\",\n action: \"getLogs\",\n address: contractAddress,\n fromBlock: fromBlock ? String(fromBlock) : \"0\",\n toBlock: \"latest\",\n topic0:\n \"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b\",\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const logs = data.result;\n\n const implAddresses = logs.map((log: any) => {\n if (log.topics[0] && log.topics[1]) {\n // If there are two topics, this is a compliant EIP-1967 proxy and the address is indexed.\n return `0x${log.topics[1].slice(26)}`;\n } else {\n // If there's only one topic, this might be a non-compliant proxy and the address is not indexed.\n // USDC is an example of this: https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code#L118\n return `0x${log.data.slice(26)}`;\n }\n }) as string[];\n\n return { implAddresses };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n \"explorer.zora.energy\": {\n name: \"zora\",\n chainId: 7777777,\n apiUrl: \"https://explorer.zora.energy/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { Contract, Network, PartialConfig } from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type { Contract, Network, PartialConfig } from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.72\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"detect-package-manager\": \"^2.0.1\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^5.0.1\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["import_node_path","import_node_fs","import_node_path","import_prettier","rimraf","path","path","prettier","import_node_fs","import_node_path","import_prettier","abi","contractName","path","prettier","fetch","import_node_fs","import_node_path","import_node_fetch","import_prettier","fetch","path","prettier","import_node_fs","import_node_path","import_prettier","import_yaml","path","prettier","path","pico","prettier","fromEtherscan","fromSubgraphId","fromSubgraphRepo","prompts","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type Network = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type Contract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialConfig = {\n database?: {\n kind: string;\n };\n networks: Network[];\n contracts: Contract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let config: PartialConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n config = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n config = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n config = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n config = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n config.contracts.forEach((contract) => {\n let abi: Abi;\n if (Array.isArray(contract.abi)) {\n // If it's an array of ABIs, use the 2nd one (the implementation ABI).\n const abiString = readFileSync(path.join(rootDir, contract.abi[1]), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n } else {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n }\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalConfig = `\n import type { Config } from \"@ponder/core\";\n\n export const config: Config = {\n networks: ${JSON.stringify(config.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(config.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(config.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.8.11\",\n \"typescript\": \"^5.1.3\",\n \"viem\": \"^1.2.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": true,\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return config;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n let blockNumber: number | undefined = undefined;\n\n try {\n const txHash = await getContractCreationTxn(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n if (!apiKey) {\n console.log(\"\\n(1/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const contractCreationBlockNumber = await getTxBlockNumber(\n txHash,\n apiUrl,\n apiKey\n );\n\n blockNumber = contractCreationBlockNumber;\n } catch (error) {\n // Do nothing, blockNumber won't be set.\n }\n\n if (!apiKey) {\n console.log(\"(2/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const abis: { abi: string; contractName: string }[] = [];\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n abis.push({ abi, contractName });\n\n // If the contract is an EIP-1967 proxy, get the implementation contract ABIs.\n if (\n (JSON.parse(abi) as any[]).find(\n (item) =>\n item.type === \"event\" &&\n item.name === \"Upgraded\" &&\n item.inputs[0].name === \"implementation\"\n )\n ) {\n console.log(\n \"Detected EIP-1967 proxy, fetching implementation contract ABIs\"\n );\n if (!apiKey) {\n console.log(\"(3/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { implAddresses } = await getProxyImplementationAddresses({\n contractAddress,\n apiUrl,\n fromBlock: blockNumber,\n apiKey,\n });\n\n for (const [index, implAddress] of implAddresses.entries()) {\n console.log(`Fetching ABI for implementation contract: ${implAddress}`);\n if (!apiKey) {\n console.log(\n `(${4 + index}/${\n 4 + implAddresses.length - 1\n }) Waiting 5 seconds for Etherscan API rate limit`\n );\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n implAddress,\n apiUrl,\n apiKey\n );\n\n abis.push({\n abi,\n contractName: `${contractName}_${implAddress.slice(0, 6)}`,\n });\n }\n }\n\n // Write ABI files.\n let abiConfig: any;\n abis.forEach(({ abi, contractName }) => {\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n if (abis.length === 1) {\n abiConfig = abiRelativePath;\n } else {\n abiConfig ||= [];\n abiConfig.push(abiRelativePath);\n }\n });\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiConfig,\n address: contractAddress,\n startBlock: blockNumber ?? undefined,\n },\n ],\n };\n\n return config;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const maxRetries = 5;\n let retryCount = 0;\n\n while (retryCount <= maxRetries) {\n try {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n } catch (error) {\n retryCount++;\n if (retryCount > maxRetries) {\n throw new Error(`Max retries reached: ${(error as Error).message}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n\nconst getProxyImplementationAddresses = async ({\n contractAddress,\n apiUrl,\n fromBlock,\n apiKey,\n}: {\n contractAddress: string;\n apiUrl: string;\n fromBlock?: number;\n apiKey?: string;\n}) => {\n const searchParams = new URLSearchParams({\n module: \"logs\",\n action: \"getLogs\",\n address: contractAddress,\n fromBlock: fromBlock ? String(fromBlock) : \"0\",\n toBlock: \"latest\",\n topic0:\n \"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b\",\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const logs = data.result;\n\n const implAddresses = logs.map((log: any) => {\n if (log.topics[0] && log.topics[1]) {\n // If there are two topics, this is a compliant EIP-1967 proxy and the address is indexed.\n return `0x${log.topics[1].slice(26)}`;\n } else {\n // If there's only one topic, this might be a non-compliant proxy and the address is not indexed.\n // USDC is an example of this: https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code#L118\n return `0x${log.data.slice(26)}`;\n }\n }) as string[];\n\n return { implAddresses };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n \"explorer.zora.energy\": {\n name: \"zora\",\n chainId: 7777777,\n apiUrl: \"https://explorer.zora.energy/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { Contract, Network, PartialConfig } from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type { Contract, Network, PartialConfig } from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.74\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"detect-package-manager\": \"^2.0.1\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^5.0.1\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["import_node_path","import_node_fs","import_node_path","import_prettier","rimraf","path","path","prettier","import_node_fs","import_node_path","import_prettier","abi","contractName","path","prettier","fetch","import_node_fs","import_node_path","import_node_fetch","import_prettier","fetch","path","prettier","import_node_fs","import_node_path","import_prettier","import_yaml","path","prettier","path","pico","prettier","fromEtherscan","fromSubgraphId","fromSubgraphRepo","prompts","path"]}
|
package/dist/create-ponder.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type Network = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type Contract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialConfig = {\n database?: {\n kind: string;\n };\n networks: Network[];\n contracts: Contract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let config: PartialConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n config = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n config = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n config = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n config = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n config.contracts.forEach((contract) => {\n let abi: Abi;\n if (Array.isArray(contract.abi)) {\n // If it's an array of ABIs, use the 2nd one (the implementation ABI).\n const abiString = readFileSync(path.join(rootDir, contract.abi[1]), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n } else {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n }\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalConfig = `\n import type { Config } from \"@ponder/core\";\n\n export const config: Config = {\n networks: ${JSON.stringify(config.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(config.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(config.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.8.11\",\n \"typescript\": \"^5.1.3\",\n \"viem\": \"^1.2.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": true,\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return config;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n let blockNumber: number | undefined = undefined;\n\n try {\n const txHash = await getContractCreationTxn(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n if (!apiKey) {\n console.log(\"\\n(1/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const contractCreationBlockNumber = await getTxBlockNumber(\n txHash,\n apiUrl,\n apiKey\n );\n\n blockNumber = contractCreationBlockNumber;\n } catch (error) {\n // Do nothing, blockNumber won't be set.\n }\n\n if (!apiKey) {\n console.log(\"(2/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const abis: { abi: string; contractName: string }[] = [];\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n abis.push({ abi, contractName });\n\n // If the contract is an EIP-1967 proxy, get the implementation contract ABIs.\n if (\n (JSON.parse(abi) as any[]).find(\n (item) =>\n item.type === \"event\" &&\n item.name === \"Upgraded\" &&\n item.inputs[0].name === \"implementation\"\n )\n ) {\n console.log(\n \"Detected EIP-1967 proxy, fetching implementation contract ABIs\"\n );\n if (!apiKey) {\n console.log(\"(3/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { implAddresses } = await getProxyImplementationAddresses({\n contractAddress,\n apiUrl,\n fromBlock: blockNumber,\n apiKey,\n });\n\n for (const [index, implAddress] of implAddresses.entries()) {\n console.log(`Fetching ABI for implementation contract: ${implAddress}`);\n if (!apiKey) {\n console.log(\n `(${4 + index}/${\n 4 + implAddresses.length - 1\n }) Waiting 5 seconds for Etherscan API rate limit`\n );\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n implAddress,\n apiUrl,\n apiKey\n );\n\n abis.push({\n abi,\n contractName: `${contractName}_${implAddress.slice(0, 6)}`,\n });\n }\n }\n\n // Write ABI files.\n let abiConfig: any;\n abis.forEach(({ abi, contractName }) => {\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n if (abis.length === 1) {\n abiConfig = abiRelativePath;\n } else {\n abiConfig ||= [];\n abiConfig.push(abiRelativePath);\n }\n });\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiConfig,\n address: contractAddress,\n startBlock: blockNumber ?? undefined,\n },\n ],\n };\n\n return config;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const maxRetries = 5;\n let retryCount = 0;\n\n while (retryCount <= maxRetries) {\n try {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n } catch (error) {\n retryCount++;\n if (retryCount > maxRetries) {\n throw new Error(`Max retries reached: ${(error as Error).message}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n\nconst getProxyImplementationAddresses = async ({\n contractAddress,\n apiUrl,\n fromBlock,\n apiKey,\n}: {\n contractAddress: string;\n apiUrl: string;\n fromBlock?: number;\n apiKey?: string;\n}) => {\n const searchParams = new URLSearchParams({\n module: \"logs\",\n action: \"getLogs\",\n address: contractAddress,\n fromBlock: fromBlock ? String(fromBlock) : \"0\",\n toBlock: \"latest\",\n topic0:\n \"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b\",\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const logs = data.result;\n\n const implAddresses = logs.map((log: any) => {\n if (log.topics[0] && log.topics[1]) {\n // If there are two topics, this is a compliant EIP-1967 proxy and the address is indexed.\n return `0x${log.topics[1].slice(26)}`;\n } else {\n // If there's only one topic, this might be a non-compliant proxy and the address is not indexed.\n // USDC is an example of this: https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code#L118\n return `0x${log.data.slice(26)}`;\n }\n }) as string[];\n\n return { implAddresses };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n \"explorer.zora.energy\": {\n name: \"zora\",\n chainId: 7777777,\n apiUrl: \"https://explorer.zora.energy/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { Contract, Network, PartialConfig } from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type { Contract, Network, PartialConfig } from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.72\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"detect-package-manager\": \"^2.0.1\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^5.0.1\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["path","execSync","readFileSync","writeFileSync","path","prettier","path","writeFileSync","path","prettier","abi","contractName","path","writeFileSync","prettier","writeFileSync","path","fetch","prettier","fetch","path","writeFileSync","prettier","writeFileSync","path","prettier","parse","path","parse","writeFileSync","prettier","path","readFileSync","writeFileSync","prettier","execSync","fromEtherscan","fromSubgraphId","fromSubgraphRepo","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type Network = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type Contract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialConfig = {\n database?: {\n kind: string;\n };\n networks: Network[];\n contracts: Contract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let config: PartialConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n config = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n config = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n config = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n config = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n config.contracts.forEach((contract) => {\n let abi: Abi;\n if (Array.isArray(contract.abi)) {\n // If it's an array of ABIs, use the 2nd one (the implementation ABI).\n const abiString = readFileSync(path.join(rootDir, contract.abi[1]), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n } else {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n abi = JSON.parse(abiString);\n }\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalConfig = `\n import type { Config } from \"@ponder/core\";\n\n export const config: Config = {\n networks: ${JSON.stringify(config.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(config.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(config.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.8.11\",\n \"typescript\": \"^5.1.3\",\n \"viem\": \"^1.2.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": true,\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return config;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n let blockNumber: number | undefined = undefined;\n\n try {\n const txHash = await getContractCreationTxn(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n if (!apiKey) {\n console.log(\"\\n(1/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const contractCreationBlockNumber = await getTxBlockNumber(\n txHash,\n apiUrl,\n apiKey\n );\n\n blockNumber = contractCreationBlockNumber;\n } catch (error) {\n // Do nothing, blockNumber won't be set.\n }\n\n if (!apiKey) {\n console.log(\"(2/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const abis: { abi: string; contractName: string }[] = [];\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n abis.push({ abi, contractName });\n\n // If the contract is an EIP-1967 proxy, get the implementation contract ABIs.\n if (\n (JSON.parse(abi) as any[]).find(\n (item) =>\n item.type === \"event\" &&\n item.name === \"Upgraded\" &&\n item.inputs[0].name === \"implementation\"\n )\n ) {\n console.log(\n \"Detected EIP-1967 proxy, fetching implementation contract ABIs\"\n );\n if (!apiKey) {\n console.log(\"(3/n) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { implAddresses } = await getProxyImplementationAddresses({\n contractAddress,\n apiUrl,\n fromBlock: blockNumber,\n apiKey,\n });\n\n for (const [index, implAddress] of implAddresses.entries()) {\n console.log(`Fetching ABI for implementation contract: ${implAddress}`);\n if (!apiKey) {\n console.log(\n `(${4 + index}/${\n 4 + implAddresses.length - 1\n }) Waiting 5 seconds for Etherscan API rate limit`\n );\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n implAddress,\n apiUrl,\n apiKey\n );\n\n abis.push({\n abi,\n contractName: `${contractName}_${implAddress.slice(0, 6)}`,\n });\n }\n }\n\n // Write ABI files.\n let abiConfig: any;\n abis.forEach(({ abi, contractName }) => {\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n if (abis.length === 1) {\n abiConfig = abiRelativePath;\n } else {\n abiConfig ||= [];\n abiConfig.push(abiRelativePath);\n }\n });\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const config: PartialConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiConfig,\n address: contractAddress,\n startBlock: blockNumber ?? undefined,\n },\n ],\n };\n\n return config;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const maxRetries = 5;\n let retryCount = 0;\n\n while (retryCount <= maxRetries) {\n try {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n } catch (error) {\n retryCount++;\n if (retryCount > maxRetries) {\n throw new Error(`Max retries reached: ${(error as Error).message}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n\nconst getProxyImplementationAddresses = async ({\n contractAddress,\n apiUrl,\n fromBlock,\n apiKey,\n}: {\n contractAddress: string;\n apiUrl: string;\n fromBlock?: number;\n apiKey?: string;\n}) => {\n const searchParams = new URLSearchParams({\n module: \"logs\",\n action: \"getLogs\",\n address: contractAddress,\n fromBlock: fromBlock ? String(fromBlock) : \"0\",\n toBlock: \"latest\",\n topic0:\n \"0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b\",\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const logs = data.result;\n\n const implAddresses = logs.map((log: any) => {\n if (log.topics[0] && log.topics[1]) {\n // If there are two topics, this is a compliant EIP-1967 proxy and the address is indexed.\n return `0x${log.topics[1].slice(26)}`;\n } else {\n // If there's only one topic, this might be a non-compliant proxy and the address is not indexed.\n // USDC is an example of this: https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code#L118\n return `0x${log.data.slice(26)}`;\n }\n }) as string[];\n\n return { implAddresses };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n \"explorer.zora.energy\": {\n name: \"zora\",\n chainId: 7777777,\n apiUrl: \"https://explorer.zora.energy/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { Contract, Network, PartialConfig } from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type { Contract, Network, PartialConfig } from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: Network[] = [];\n let ponderContracts: Contract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <Contract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const config: PartialConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return config;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.74\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"detect-package-manager\": \"^2.0.1\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^5.0.1\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["path","execSync","readFileSync","writeFileSync","path","prettier","path","writeFileSync","path","prettier","abi","contractName","path","writeFileSync","prettier","writeFileSync","path","fetch","prettier","fetch","path","writeFileSync","prettier","writeFileSync","path","prettier","parse","path","parse","writeFileSync","prettier","path","readFileSync","writeFileSync","prettier","execSync","fromEtherscan","fromSubgraphId","fromSubgraphRepo","path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-ponder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.74",
|
|
4
4
|
"description": "Tool to bootstrap a Ponder project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "olias.eth",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tsup": "^6.6.3",
|
|
31
31
|
"typescript": "^4.5.5",
|
|
32
32
|
"vitest": "^0.29.2",
|
|
33
|
-
"@ponder/core": "0.0.
|
|
33
|
+
"@ponder/core": "0.0.74"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup-node",
|