create-ponder 0.0.68 → 0.0.70
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 +22 -22
- package/dist/create-ponder.js.map +1 -1
- package/dist/create-ponder.mjs +22 -22
- package/dist/create-ponder.mjs.map +1 -1
- package/package.json +2 -2
package/dist/create-ponder.js
CHANGED
|
@@ -121,7 +121,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
121
121
|
ponderSchemaFilePath,
|
|
122
122
|
import_prettier.default.format(schemaGraphqlFileContents, { parser: "graphql" })
|
|
123
123
|
);
|
|
124
|
-
const
|
|
124
|
+
const config = {
|
|
125
125
|
networks: [
|
|
126
126
|
{
|
|
127
127
|
name: "mainnet",
|
|
@@ -139,7 +139,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
139
139
|
}
|
|
140
140
|
]
|
|
141
141
|
};
|
|
142
|
-
return
|
|
142
|
+
return config;
|
|
143
143
|
};
|
|
144
144
|
|
|
145
145
|
// src/templates/etherscan.ts
|
|
@@ -325,7 +325,7 @@ var fromEtherscan = async ({
|
|
|
325
325
|
ponderSchemaFilePath,
|
|
326
326
|
import_prettier2.default.format(schemaGraphqlFileContents, { parser: "graphql" })
|
|
327
327
|
);
|
|
328
|
-
const
|
|
328
|
+
const config = {
|
|
329
329
|
networks: [
|
|
330
330
|
{
|
|
331
331
|
name,
|
|
@@ -343,7 +343,7 @@ var fromEtherscan = async ({
|
|
|
343
343
|
}
|
|
344
344
|
]
|
|
345
345
|
};
|
|
346
|
-
return
|
|
346
|
+
return config;
|
|
347
347
|
};
|
|
348
348
|
var fetchEtherscan = async (url) => {
|
|
349
349
|
const maxRetries = 5;
|
|
@@ -538,11 +538,11 @@ var fromSubgraphId = async ({
|
|
|
538
538
|
startBlock: source.source.startBlock
|
|
539
539
|
};
|
|
540
540
|
});
|
|
541
|
-
const
|
|
541
|
+
const config = {
|
|
542
542
|
networks: ponderNetworks,
|
|
543
543
|
contracts: ponderContracts
|
|
544
544
|
};
|
|
545
|
-
return
|
|
545
|
+
return config;
|
|
546
546
|
};
|
|
547
547
|
|
|
548
548
|
// src/templates/subgraphRepo.ts
|
|
@@ -619,11 +619,11 @@ var fromSubgraphRepo = ({
|
|
|
619
619
|
startBlock: source.source.startBlock
|
|
620
620
|
};
|
|
621
621
|
});
|
|
622
|
-
const
|
|
622
|
+
const config = {
|
|
623
623
|
networks: ponderNetworks,
|
|
624
624
|
contracts: ponderContracts
|
|
625
625
|
};
|
|
626
|
-
return
|
|
626
|
+
return config;
|
|
627
627
|
};
|
|
628
628
|
|
|
629
629
|
// src/index.ts
|
|
@@ -631,7 +631,7 @@ var run = async (options, overrides = {}) => {
|
|
|
631
631
|
const { rootDir } = options;
|
|
632
632
|
(0, import_node_fs5.mkdirSync)(import_node_path5.default.join(rootDir, "abis"), { recursive: true });
|
|
633
633
|
(0, import_node_fs5.mkdirSync)(import_node_path5.default.join(rootDir, "src"), { recursive: true });
|
|
634
|
-
let
|
|
634
|
+
let config;
|
|
635
635
|
console.log(
|
|
636
636
|
`
|
|
637
637
|
Creating a new Ponder app in ${import_picocolors.default.bold(import_picocolors.default.green(rootDir))}.`
|
|
@@ -640,7 +640,7 @@ Creating a new Ponder app in ${import_picocolors.default.bold(import_picocolors.
|
|
|
640
640
|
case 1 /* ETHERSCAN */: {
|
|
641
641
|
console.log(`
|
|
642
642
|
Using ${import_picocolors.default.cyan("Etherscan contract link")} template.`);
|
|
643
|
-
|
|
643
|
+
config = await fromEtherscan({
|
|
644
644
|
rootDir,
|
|
645
645
|
etherscanLink: options.template.link,
|
|
646
646
|
etherscanApiKey: options.etherscanApiKey
|
|
@@ -650,7 +650,7 @@ Using ${import_picocolors.default.cyan("Etherscan contract link")} template.`);
|
|
|
650
650
|
case 2 /* SUBGRAPH_ID */: {
|
|
651
651
|
console.log(`
|
|
652
652
|
Using ${import_picocolors.default.cyan("Subgraph ID")} template.`);
|
|
653
|
-
|
|
653
|
+
config = await fromSubgraphId({
|
|
654
654
|
rootDir,
|
|
655
655
|
subgraphId: options.template.id
|
|
656
656
|
});
|
|
@@ -659,18 +659,18 @@ Using ${import_picocolors.default.cyan("Subgraph ID")} template.`);
|
|
|
659
659
|
case 3 /* SUBGRAPH_REPO */: {
|
|
660
660
|
console.log(`
|
|
661
661
|
Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
662
|
-
|
|
662
|
+
config = fromSubgraphRepo({
|
|
663
663
|
rootDir,
|
|
664
664
|
subgraphPath: options.template.path
|
|
665
665
|
});
|
|
666
666
|
break;
|
|
667
667
|
}
|
|
668
668
|
default: {
|
|
669
|
-
|
|
669
|
+
config = fromBasic({ rootDir });
|
|
670
670
|
break;
|
|
671
671
|
}
|
|
672
672
|
}
|
|
673
|
-
|
|
673
|
+
config.contracts.forEach((contract) => {
|
|
674
674
|
let abi;
|
|
675
675
|
if (Array.isArray(contract.abi)) {
|
|
676
676
|
const abiString = (0, import_node_fs5.readFileSync)(import_node_path5.default.join(rootDir, contract.abi[1]), {
|
|
@@ -702,23 +702,23 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
702
702
|
import_prettier5.default.format(handlerFileContents, { parser: "typescript" })
|
|
703
703
|
);
|
|
704
704
|
});
|
|
705
|
-
const
|
|
706
|
-
import type {
|
|
705
|
+
const finalConfig = `
|
|
706
|
+
import type { Config } from "@ponder/core";
|
|
707
707
|
|
|
708
|
-
export const config:
|
|
709
|
-
networks: ${JSON.stringify(
|
|
708
|
+
export const config: Config = {
|
|
709
|
+
networks: ${JSON.stringify(config.networks).replaceAll(
|
|
710
710
|
/"process.env.PONDER_RPC_URL_(.*?)"/g,
|
|
711
711
|
"process.env.PONDER_RPC_URL_$1"
|
|
712
712
|
)},
|
|
713
|
-
contracts: ${JSON.stringify(
|
|
713
|
+
contracts: ${JSON.stringify(config.contracts)},
|
|
714
714
|
};
|
|
715
715
|
`;
|
|
716
716
|
(0, import_node_fs5.writeFileSync)(
|
|
717
717
|
import_node_path5.default.join(rootDir, "ponder.config.ts"),
|
|
718
|
-
import_prettier5.default.format(
|
|
718
|
+
import_prettier5.default.format(finalConfig, { parser: "babel" })
|
|
719
719
|
);
|
|
720
720
|
const uniqueChainIds = Array.from(
|
|
721
|
-
new Set(
|
|
721
|
+
new Set(config.networks.map((n) => n.chainId))
|
|
722
722
|
);
|
|
723
723
|
const envLocal = `${uniqueChainIds.map(
|
|
724
724
|
(chainId) => `PONDER_RPC_URL_${chainId}=""
|
|
@@ -806,7 +806,7 @@ Generated types.`);
|
|
|
806
806
|
// package.json
|
|
807
807
|
var package_default = {
|
|
808
808
|
name: "create-ponder",
|
|
809
|
-
version: "0.0.
|
|
809
|
+
version: "0.0.70",
|
|
810
810
|
description: "Tool to bootstrap a Ponder project",
|
|
811
811
|
license: "MIT",
|
|
812
812
|
author: "olias.eth",
|
|
@@ -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 PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\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 ponderConfig: PartialPonderConfig;\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 ponderConfig = 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 ponderConfig = 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 ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.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 finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.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 { PartialPonderConfig } 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 ponderConfig: PartialPonderConfig = {\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 ponderConfig;\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 { PartialPonderConfig } 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 ponderConfig: PartialPonderConfig = {\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 ponderConfig;\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 {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} 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: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\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 <PonderContract>{\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 ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\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 {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} 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: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\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 <PonderContract>{\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 ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.68\",\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.70\",\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
|
@@ -98,7 +98,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
98
98
|
ponderSchemaFilePath,
|
|
99
99
|
prettier.format(schemaGraphqlFileContents, { parser: "graphql" })
|
|
100
100
|
);
|
|
101
|
-
const
|
|
101
|
+
const config = {
|
|
102
102
|
networks: [
|
|
103
103
|
{
|
|
104
104
|
name: "mainnet",
|
|
@@ -116,7 +116,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
116
116
|
}
|
|
117
117
|
]
|
|
118
118
|
};
|
|
119
|
-
return
|
|
119
|
+
return config;
|
|
120
120
|
};
|
|
121
121
|
|
|
122
122
|
// src/templates/etherscan.ts
|
|
@@ -302,7 +302,7 @@ var fromEtherscan = async ({
|
|
|
302
302
|
ponderSchemaFilePath,
|
|
303
303
|
prettier2.format(schemaGraphqlFileContents, { parser: "graphql" })
|
|
304
304
|
);
|
|
305
|
-
const
|
|
305
|
+
const config = {
|
|
306
306
|
networks: [
|
|
307
307
|
{
|
|
308
308
|
name,
|
|
@@ -320,7 +320,7 @@ var fromEtherscan = async ({
|
|
|
320
320
|
}
|
|
321
321
|
]
|
|
322
322
|
};
|
|
323
|
-
return
|
|
323
|
+
return config;
|
|
324
324
|
};
|
|
325
325
|
var fetchEtherscan = async (url) => {
|
|
326
326
|
const maxRetries = 5;
|
|
@@ -515,11 +515,11 @@ var fromSubgraphId = async ({
|
|
|
515
515
|
startBlock: source.source.startBlock
|
|
516
516
|
};
|
|
517
517
|
});
|
|
518
|
-
const
|
|
518
|
+
const config = {
|
|
519
519
|
networks: ponderNetworks,
|
|
520
520
|
contracts: ponderContracts
|
|
521
521
|
};
|
|
522
|
-
return
|
|
522
|
+
return config;
|
|
523
523
|
};
|
|
524
524
|
|
|
525
525
|
// src/templates/subgraphRepo.ts
|
|
@@ -596,11 +596,11 @@ var fromSubgraphRepo = ({
|
|
|
596
596
|
startBlock: source.source.startBlock
|
|
597
597
|
};
|
|
598
598
|
});
|
|
599
|
-
const
|
|
599
|
+
const config = {
|
|
600
600
|
networks: ponderNetworks,
|
|
601
601
|
contracts: ponderContracts
|
|
602
602
|
};
|
|
603
|
-
return
|
|
603
|
+
return config;
|
|
604
604
|
};
|
|
605
605
|
|
|
606
606
|
// src/index.ts
|
|
@@ -608,7 +608,7 @@ var run = async (options, overrides = {}) => {
|
|
|
608
608
|
const { rootDir } = options;
|
|
609
609
|
mkdirSync(path6.join(rootDir, "abis"), { recursive: true });
|
|
610
610
|
mkdirSync(path6.join(rootDir, "src"), { recursive: true });
|
|
611
|
-
let
|
|
611
|
+
let config;
|
|
612
612
|
console.log(
|
|
613
613
|
`
|
|
614
614
|
Creating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`
|
|
@@ -617,7 +617,7 @@ Creating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`
|
|
|
617
617
|
case 1 /* ETHERSCAN */: {
|
|
618
618
|
console.log(`
|
|
619
619
|
Using ${pico.cyan("Etherscan contract link")} template.`);
|
|
620
|
-
|
|
620
|
+
config = await fromEtherscan({
|
|
621
621
|
rootDir,
|
|
622
622
|
etherscanLink: options.template.link,
|
|
623
623
|
etherscanApiKey: options.etherscanApiKey
|
|
@@ -627,7 +627,7 @@ Using ${pico.cyan("Etherscan contract link")} template.`);
|
|
|
627
627
|
case 2 /* SUBGRAPH_ID */: {
|
|
628
628
|
console.log(`
|
|
629
629
|
Using ${pico.cyan("Subgraph ID")} template.`);
|
|
630
|
-
|
|
630
|
+
config = await fromSubgraphId({
|
|
631
631
|
rootDir,
|
|
632
632
|
subgraphId: options.template.id
|
|
633
633
|
});
|
|
@@ -636,18 +636,18 @@ Using ${pico.cyan("Subgraph ID")} template.`);
|
|
|
636
636
|
case 3 /* SUBGRAPH_REPO */: {
|
|
637
637
|
console.log(`
|
|
638
638
|
Using ${pico.cyan("Subgraph repository")} template.`);
|
|
639
|
-
|
|
639
|
+
config = fromSubgraphRepo({
|
|
640
640
|
rootDir,
|
|
641
641
|
subgraphPath: options.template.path
|
|
642
642
|
});
|
|
643
643
|
break;
|
|
644
644
|
}
|
|
645
645
|
default: {
|
|
646
|
-
|
|
646
|
+
config = fromBasic({ rootDir });
|
|
647
647
|
break;
|
|
648
648
|
}
|
|
649
649
|
}
|
|
650
|
-
|
|
650
|
+
config.contracts.forEach((contract) => {
|
|
651
651
|
let abi;
|
|
652
652
|
if (Array.isArray(contract.abi)) {
|
|
653
653
|
const abiString = readFileSync2(path6.join(rootDir, contract.abi[1]), {
|
|
@@ -679,23 +679,23 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
679
679
|
prettier5.format(handlerFileContents, { parser: "typescript" })
|
|
680
680
|
);
|
|
681
681
|
});
|
|
682
|
-
const
|
|
683
|
-
import type {
|
|
682
|
+
const finalConfig = `
|
|
683
|
+
import type { Config } from "@ponder/core";
|
|
684
684
|
|
|
685
|
-
export const config:
|
|
686
|
-
networks: ${JSON.stringify(
|
|
685
|
+
export const config: Config = {
|
|
686
|
+
networks: ${JSON.stringify(config.networks).replaceAll(
|
|
687
687
|
/"process.env.PONDER_RPC_URL_(.*?)"/g,
|
|
688
688
|
"process.env.PONDER_RPC_URL_$1"
|
|
689
689
|
)},
|
|
690
|
-
contracts: ${JSON.stringify(
|
|
690
|
+
contracts: ${JSON.stringify(config.contracts)},
|
|
691
691
|
};
|
|
692
692
|
`;
|
|
693
693
|
writeFileSync5(
|
|
694
694
|
path6.join(rootDir, "ponder.config.ts"),
|
|
695
|
-
prettier5.format(
|
|
695
|
+
prettier5.format(finalConfig, { parser: "babel" })
|
|
696
696
|
);
|
|
697
697
|
const uniqueChainIds = Array.from(
|
|
698
|
-
new Set(
|
|
698
|
+
new Set(config.networks.map((n) => n.chainId))
|
|
699
699
|
);
|
|
700
700
|
const envLocal = `${uniqueChainIds.map(
|
|
701
701
|
(chainId) => `PONDER_RPC_URL_${chainId}=""
|
|
@@ -783,7 +783,7 @@ Generated types.`);
|
|
|
783
783
|
// package.json
|
|
784
784
|
var package_default = {
|
|
785
785
|
name: "create-ponder",
|
|
786
|
-
version: "0.0.
|
|
786
|
+
version: "0.0.70",
|
|
787
787
|
description: "Tool to bootstrap a Ponder project",
|
|
788
788
|
license: "MIT",
|
|
789
789
|
author: "olias.eth",
|
|
@@ -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 PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\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 ponderConfig: PartialPonderConfig;\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 ponderConfig = 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 ponderConfig = 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 ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.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 finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.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 { PartialPonderConfig } 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 ponderConfig: PartialPonderConfig = {\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 ponderConfig;\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 { PartialPonderConfig } 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 ponderConfig: PartialPonderConfig = {\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 ponderConfig;\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 {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} 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: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\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 <PonderContract>{\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 ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\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 {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} 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: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\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 <PonderContract>{\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 ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.68\",\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.70\",\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.70",
|
|
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.70"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup-node",
|