create-ponder 0.0.45 → 0.0.46

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.
@@ -35,74 +35,24 @@ var import_node_path5 = __toESM(require("path"));
35
35
  var import_picocolors = __toESM(require("picocolors"));
36
36
  var import_prettier4 = __toESM(require("prettier"));
37
37
 
38
- // src/helpers/detectPackageManager.ts
39
- var import_execa = __toESM(require("execa"));
40
- var import_fs = require("fs");
41
- var import_path = require("path");
42
- async function pathExists(p) {
43
- try {
44
- await import_fs.promises.access(p);
45
- return true;
46
- } catch {
47
- return false;
38
+ // src/helpers/getPackageManager.ts
39
+ var import_detect_package_manager = require("detect-package-manager");
40
+ function getPackageManager() {
41
+ const userAgent = process.env.npm_config_user_agent;
42
+ if (userAgent) {
43
+ if (userAgent.includes("pnpm"))
44
+ return "pnpm";
45
+ if (userAgent.includes("npm"))
46
+ return "npm";
47
+ if (userAgent.includes("yarn"))
48
+ return "yarn";
48
49
  }
50
+ return (0, import_detect_package_manager.detect)();
49
51
  }
50
- var cache = /* @__PURE__ */ new Map();
51
- function hasGlobalInstallation(pm) {
52
- const key = `has_global_${pm}`;
53
- if (cache.has(key)) {
54
- return Promise.resolve(cache.get(key));
55
- }
56
- return (0, import_execa.default)(pm, ["--version"]).then((res) => {
57
- return /^\d+.\d+.\d+$/.test(res.stdout);
58
- }).then((value) => {
59
- cache.set(key, value);
60
- return value;
61
- }).catch(() => false);
62
- }
63
- function getTypeofLockFile(cwd = ".") {
64
- const key = `lockfile_${cwd}`;
65
- if (cache.has(key)) {
66
- return Promise.resolve(cache.get(key));
67
- }
68
- return Promise.all([
69
- pathExists((0, import_path.resolve)(cwd, "yarn.lock")),
70
- pathExists((0, import_path.resolve)(cwd, "package-lock.json")),
71
- pathExists((0, import_path.resolve)(cwd, "pnpm-lock.yaml"))
72
- ]).then(([isYarn, isNpm, isPnpm]) => {
73
- let value = null;
74
- if (isYarn) {
75
- value = "yarn";
76
- } else if (isPnpm) {
77
- value = "pnpm";
78
- } else if (isNpm) {
79
- value = "npm";
80
- }
81
- cache.set(key, value);
82
- return value;
83
- });
84
- }
85
- var detect = async ({ cwd } = {}) => {
86
- const type = await getTypeofLockFile(cwd);
87
- if (type) {
88
- return type;
89
- }
90
- const [hasYarn, hasPnpm] = await Promise.all([
91
- hasGlobalInstallation("yarn"),
92
- hasGlobalInstallation("pnpm")
93
- ]);
94
- if (hasPnpm) {
95
- return "pnpm";
96
- }
97
- if (hasYarn) {
98
- return "yarn";
99
- }
100
- return "npm";
101
- };
102
52
 
103
53
  // src/helpers/git.ts
104
54
  var import_child_process = require("child_process");
105
- var import_path2 = __toESM(require("path"));
55
+ var import_path = __toESM(require("path"));
106
56
  var import_rimraf = __toESM(require("rimraf"));
107
57
  function isInGitRepository() {
108
58
  try {
@@ -138,7 +88,7 @@ function tryGitInit(root) {
138
88
  } catch (e) {
139
89
  if (didInit) {
140
90
  try {
141
- import_rimraf.default.sync(import_path2.default.join(root, ".git"));
91
+ import_rimraf.default.sync(import_path.default.join(root, ".git"));
142
92
  } catch (_) {
143
93
  }
144
94
  }
@@ -266,7 +216,7 @@ var getNetworkByEtherscanHostname = (hostname) => {
266
216
  };
267
217
 
268
218
  // src/helpers/wait.ts
269
- var wait = (ms) => new Promise((resolve2) => setTimeout(resolve2, ms));
219
+ var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
270
220
 
271
221
  // src/templates/etherscan.ts
272
222
  var fromEtherscan = async ({
@@ -710,11 +660,10 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
710
660
  .ponder/
711
661
  generated/`
712
662
  );
713
- const packageManager = await detect();
714
- const runCommand = packageManager === "npm" ? `${packageManager} run` : packageManager;
663
+ const packageManager = await getPackageManager();
715
664
  console.log(import_picocolors.default.bold(`
716
665
  Installing with ${packageManager}.`));
717
- const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} install`;
666
+ const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} ${packageManager === "npm" ? "--quiet" : "--silent"} install`;
718
667
  (0, import_node_child_process.execSync)(installCommand, {
719
668
  cwd: rootDir,
720
669
  stdio: "inherit"
@@ -723,7 +672,8 @@ Installing with ${packageManager}.`));
723
672
  tryGitInit(rootDir);
724
673
  console.log(`
725
674
  Initialized a git repository.`);
726
- (0, import_node_child_process.execSync)(`${runCommand} --silent codegen --silent`, {
675
+ const runCommand = `${packageManager === "npm" ? `npm --quiet run` : `${packageManager} --silent`} codegen`;
676
+ (0, import_node_child_process.execSync)(runCommand, {
727
677
  cwd: rootDir,
728
678
  stdio: "inherit"
729
679
  });
@@ -737,7 +687,7 @@ Generated types.`);
737
687
  // package.json
738
688
  var package_default = {
739
689
  name: "create-ponder",
740
- version: "0.0.45",
690
+ version: "0.0.46",
741
691
  description: "Tool to bootstrap a Ponder project",
742
692
  license: "MIT",
743
693
  author: "olias.eth",
@@ -755,6 +705,7 @@ var package_default = {
755
705
  },
756
706
  dependencies: {
757
707
  cac: "^6.7.14",
708
+ "detect-package-manager": "^2.0.1",
758
709
  execa: "5",
759
710
  "node-fetch": "^2.6.7",
760
711
  picocolors: "^1.0.0",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/detectPackageManager.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 { detect } from \"@/helpers/detectPackageManager\";\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 const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\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.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.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 \"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 detect();\n const runCommand =\n packageManager === \"npm\" ? `${packageManager} run` : packageManager;\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} 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 execSync(`${runCommand} --silent codegen --silent`, {\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","// Adapted from https://github.com/egoist/detect-package-manager\nimport execa from \"execa\";\nimport { promises as fs } from \"fs\";\nimport { resolve } from \"path\";\n\nexport type PM = \"npm\" | \"yarn\" | \"pnpm\";\n\nasync function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nconst cache = new Map();\n\nfunction hasGlobalInstallation(pm: PM): Promise<boolean> {\n const key = `has_global_${pm}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return execa(pm, [\"--version\"])\n .then((res) => {\n return /^\\d+.\\d+.\\d+$/.test(res.stdout);\n })\n .then((value) => {\n cache.set(key, value);\n return value;\n })\n .catch(() => false);\n}\n\nfunction getTypeofLockFile(cwd = \".\"): Promise<PM | null> {\n const key = `lockfile_${cwd}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return Promise.all([\n pathExists(resolve(cwd, \"yarn.lock\")),\n pathExists(resolve(cwd, \"package-lock.json\")),\n pathExists(resolve(cwd, \"pnpm-lock.yaml\")),\n ]).then(([isYarn, isNpm, isPnpm]) => {\n let value: PM | null = null;\n\n if (isYarn) {\n value = \"yarn\";\n } else if (isPnpm) {\n value = \"pnpm\";\n } else if (isNpm) {\n value = \"npm\";\n }\n\n cache.set(key, value);\n return value;\n });\n}\n\nconst detect = async ({ cwd }: { cwd?: string } = {}) => {\n const type = await getTypeofLockFile(cwd);\n if (type) {\n return type;\n }\n const [hasYarn, hasPnpm] = await Promise.all([\n hasGlobalInstallation(\"yarn\"),\n hasGlobalInstallation(\"pnpm\"),\n ]);\n // Prefer pnpm, yarn, then npm\n if (hasPnpm) {\n return \"pnpm\";\n }\n if (hasYarn) {\n return \"yarn\";\n }\n return \"npm\";\n};\n\nexport { detect };\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: ID!\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 const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\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: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\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};\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","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};\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 ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { 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 } from \"node:fs\";\nimport path from \"node:path\";\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 subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\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.45\",\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 \"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\": \"^4.1.2\",\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","fs","execa","import_path","rimraf","path","path","prettier","import_node_fs","import_node_path","import_prettier","resolve","path","prettier","fetch","import_node_fs","import_node_path","import_node_fetch","import_prettier","fetch","path","prettier","import_node_fs","import_node_path","import_yaml","path","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 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 const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\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.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.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 \"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: ID!\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 const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\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: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\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};\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","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};\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 ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { 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 } from \"node:fs\";\nimport path from \"node:path\";\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 subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\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.46\",\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\": \"^4.1.2\",\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","path","prettier","fetch","import_node_fs","import_node_path","import_node_fetch","import_prettier","fetch","path","prettier","import_node_fs","import_node_path","import_yaml","path","path","pico","prettier","fromEtherscan","fromSubgraphId","fromSubgraphRepo","prompts","path"]}
@@ -12,70 +12,20 @@ import path6 from "node:path";
12
12
  import pico from "picocolors";
13
13
  import prettier4 from "prettier";
14
14
 
15
- // src/helpers/detectPackageManager.ts
16
- import execa from "execa";
17
- import { promises as fs } from "fs";
18
- import { resolve } from "path";
19
- async function pathExists(p) {
20
- try {
21
- await fs.access(p);
22
- return true;
23
- } catch {
24
- return false;
15
+ // src/helpers/getPackageManager.ts
16
+ import { detect } from "detect-package-manager";
17
+ function getPackageManager() {
18
+ const userAgent = process.env.npm_config_user_agent;
19
+ if (userAgent) {
20
+ if (userAgent.includes("pnpm"))
21
+ return "pnpm";
22
+ if (userAgent.includes("npm"))
23
+ return "npm";
24
+ if (userAgent.includes("yarn"))
25
+ return "yarn";
25
26
  }
27
+ return detect();
26
28
  }
27
- var cache = /* @__PURE__ */ new Map();
28
- function hasGlobalInstallation(pm) {
29
- const key = `has_global_${pm}`;
30
- if (cache.has(key)) {
31
- return Promise.resolve(cache.get(key));
32
- }
33
- return execa(pm, ["--version"]).then((res) => {
34
- return /^\d+.\d+.\d+$/.test(res.stdout);
35
- }).then((value) => {
36
- cache.set(key, value);
37
- return value;
38
- }).catch(() => false);
39
- }
40
- function getTypeofLockFile(cwd = ".") {
41
- const key = `lockfile_${cwd}`;
42
- if (cache.has(key)) {
43
- return Promise.resolve(cache.get(key));
44
- }
45
- return Promise.all([
46
- pathExists(resolve(cwd, "yarn.lock")),
47
- pathExists(resolve(cwd, "package-lock.json")),
48
- pathExists(resolve(cwd, "pnpm-lock.yaml"))
49
- ]).then(([isYarn, isNpm, isPnpm]) => {
50
- let value = null;
51
- if (isYarn) {
52
- value = "yarn";
53
- } else if (isPnpm) {
54
- value = "pnpm";
55
- } else if (isNpm) {
56
- value = "npm";
57
- }
58
- cache.set(key, value);
59
- return value;
60
- });
61
- }
62
- var detect = async ({ cwd } = {}) => {
63
- const type = await getTypeofLockFile(cwd);
64
- if (type) {
65
- return type;
66
- }
67
- const [hasYarn, hasPnpm] = await Promise.all([
68
- hasGlobalInstallation("yarn"),
69
- hasGlobalInstallation("pnpm")
70
- ]);
71
- if (hasPnpm) {
72
- return "pnpm";
73
- }
74
- if (hasYarn) {
75
- return "yarn";
76
- }
77
- return "npm";
78
- };
79
29
 
80
30
  // src/helpers/git.ts
81
31
  import { execSync } from "child_process";
@@ -243,7 +193,7 @@ var getNetworkByEtherscanHostname = (hostname) => {
243
193
  };
244
194
 
245
195
  // src/helpers/wait.ts
246
- var wait = (ms) => new Promise((resolve2) => setTimeout(resolve2, ms));
196
+ var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
247
197
 
248
198
  // src/templates/etherscan.ts
249
199
  var fromEtherscan = async ({
@@ -687,11 +637,10 @@ Using ${pico.cyan("Subgraph repository")} template.`);
687
637
  .ponder/
688
638
  generated/`
689
639
  );
690
- const packageManager = await detect();
691
- const runCommand = packageManager === "npm" ? `${packageManager} run` : packageManager;
640
+ const packageManager = await getPackageManager();
692
641
  console.log(pico.bold(`
693
642
  Installing with ${packageManager}.`));
694
- const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} install`;
643
+ const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} ${packageManager === "npm" ? "--quiet" : "--silent"} install`;
695
644
  execSync2(installCommand, {
696
645
  cwd: rootDir,
697
646
  stdio: "inherit"
@@ -700,7 +649,8 @@ Installing with ${packageManager}.`));
700
649
  tryGitInit(rootDir);
701
650
  console.log(`
702
651
  Initialized a git repository.`);
703
- execSync2(`${runCommand} --silent codegen --silent`, {
652
+ const runCommand = `${packageManager === "npm" ? `npm --quiet run` : `${packageManager} --silent`} codegen`;
653
+ execSync2(runCommand, {
704
654
  cwd: rootDir,
705
655
  stdio: "inherit"
706
656
  });
@@ -714,7 +664,7 @@ Generated types.`);
714
664
  // package.json
715
665
  var package_default = {
716
666
  name: "create-ponder",
717
- version: "0.0.45",
667
+ version: "0.0.46",
718
668
  description: "Tool to bootstrap a Ponder project",
719
669
  license: "MIT",
720
670
  author: "olias.eth",
@@ -732,6 +682,7 @@ var package_default = {
732
682
  },
733
683
  dependencies: {
734
684
  cac: "^6.7.14",
685
+ "detect-package-manager": "^2.0.1",
735
686
  execa: "5",
736
687
  "node-fetch": "^2.6.7",
737
688
  picocolors: "^1.0.0",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/detectPackageManager.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 { detect } from \"@/helpers/detectPackageManager\";\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 const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\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.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.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 \"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 detect();\n const runCommand =\n packageManager === \"npm\" ? `${packageManager} run` : packageManager;\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} 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 execSync(`${runCommand} --silent codegen --silent`, {\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","// Adapted from https://github.com/egoist/detect-package-manager\nimport execa from \"execa\";\nimport { promises as fs } from \"fs\";\nimport { resolve } from \"path\";\n\nexport type PM = \"npm\" | \"yarn\" | \"pnpm\";\n\nasync function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nconst cache = new Map();\n\nfunction hasGlobalInstallation(pm: PM): Promise<boolean> {\n const key = `has_global_${pm}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return execa(pm, [\"--version\"])\n .then((res) => {\n return /^\\d+.\\d+.\\d+$/.test(res.stdout);\n })\n .then((value) => {\n cache.set(key, value);\n return value;\n })\n .catch(() => false);\n}\n\nfunction getTypeofLockFile(cwd = \".\"): Promise<PM | null> {\n const key = `lockfile_${cwd}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return Promise.all([\n pathExists(resolve(cwd, \"yarn.lock\")),\n pathExists(resolve(cwd, \"package-lock.json\")),\n pathExists(resolve(cwd, \"pnpm-lock.yaml\")),\n ]).then(([isYarn, isNpm, isPnpm]) => {\n let value: PM | null = null;\n\n if (isYarn) {\n value = \"yarn\";\n } else if (isPnpm) {\n value = \"pnpm\";\n } else if (isNpm) {\n value = \"npm\";\n }\n\n cache.set(key, value);\n return value;\n });\n}\n\nconst detect = async ({ cwd }: { cwd?: string } = {}) => {\n const type = await getTypeofLockFile(cwd);\n if (type) {\n return type;\n }\n const [hasYarn, hasPnpm] = await Promise.all([\n hasGlobalInstallation(\"yarn\"),\n hasGlobalInstallation(\"pnpm\"),\n ]);\n // Prefer pnpm, yarn, then npm\n if (hasPnpm) {\n return \"pnpm\";\n }\n if (hasYarn) {\n return \"yarn\";\n }\n return \"npm\";\n};\n\nexport { detect };\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: ID!\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 const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\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: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\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};\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","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};\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 ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { 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 } from \"node:fs\";\nimport path from \"node:path\";\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 subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\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.45\",\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 \"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\": \"^4.1.2\",\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","resolve","path","writeFileSync","prettier","writeFileSync","path","fetch","prettier","fetch","path","writeFileSync","prettier","path","parse","path","parse","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 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 const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\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.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.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 \"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: ID!\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 const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\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: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\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};\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","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};\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 ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { 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 } from \"node:fs\";\nimport path from \"node:path\";\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 subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\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.46\",\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\": \"^4.1.2\",\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","path","writeFileSync","prettier","writeFileSync","path","fetch","prettier","fetch","path","writeFileSync","prettier","path","parse","path","parse","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.45",
3
+ "version": "0.0.46",
4
4
  "description": "Tool to bootstrap a Ponder project",
5
5
  "license": "MIT",
6
6
  "author": "olias.eth",
@@ -12,6 +12,7 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "cac": "^6.7.14",
15
+ "detect-package-manager": "^2.0.1",
15
16
  "execa": "5",
16
17
  "node-fetch": "^2.6.7",
17
18
  "picocolors": "^1.0.0",
@@ -29,7 +30,7 @@
29
30
  "tsup": "^6.6.3",
30
31
  "typescript": "^4.5.5",
31
32
  "vitest": "^0.29.2",
32
- "@ponder/core": "0.0.45"
33
+ "@ponder/core": "0.0.46"
33
34
  },
34
35
  "scripts": {
35
36
  "build": "tsup-node",