create-ponder 0.0.46 → 0.0.48

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.
@@ -33,7 +33,7 @@ var import_node_child_process = require("child_process");
33
33
  var import_node_fs5 = require("fs");
34
34
  var import_node_path5 = __toESM(require("path"));
35
35
  var import_picocolors = __toESM(require("picocolors"));
36
- var import_prettier4 = __toESM(require("prettier"));
36
+ var import_prettier5 = __toESM(require("prettier"));
37
37
 
38
38
  // src/helpers/getPackageManager.ts
39
39
  var import_detect_package_manager = require("detect-package-manager");
@@ -107,7 +107,7 @@ var fromBasic = ({ rootDir }) => {
107
107
  (0, import_node_fs.writeFileSync)(abiAbsolutePath, abiFileContents);
108
108
  const schemaGraphqlFileContents = `
109
109
  type ExampleToken @entity {
110
- id: ID!
110
+ id: String!
111
111
  tokenId: Int!
112
112
  trait: TokenTrait!
113
113
  }
@@ -252,7 +252,7 @@ var fromEtherscan = async ({
252
252
  (0, import_node_fs2.writeFileSync)(abiAbsolutePath, import_prettier2.default.format(abi, { parser: "json" }));
253
253
  const schemaGraphqlFileContents = `
254
254
  type ExampleEntity @entity {
255
- id: ID!
255
+ id: String!
256
256
  name: String!
257
257
  }
258
258
  `;
@@ -394,10 +394,11 @@ var fromSubgraphId = async ({
394
394
  const manifest = (0, import_yaml.parse)(manifestRaw);
395
395
  const schemaCid = manifest.schema.file["/"].slice(6);
396
396
  const schemaRaw = await fetchIpfsFile(schemaCid);
397
+ const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
397
398
  const ponderSchemaFilePath = import_node_path3.default.join(rootDir, "schema.graphql");
398
399
  (0, import_node_fs3.writeFileSync)(
399
400
  ponderSchemaFilePath,
400
- import_prettier3.default.format(schemaRaw, { parser: "graphql" })
401
+ import_prettier3.default.format(schemaCleaned, { parser: "graphql" })
401
402
  );
402
403
  const dataSources = manifest.dataSources.map(
403
404
  validateGraphProtocolSource
@@ -444,6 +445,7 @@ var fromSubgraphId = async ({
444
445
  // src/templates/subgraphRepo.ts
445
446
  var import_node_fs4 = require("fs");
446
447
  var import_node_path4 = __toESM(require("path"));
448
+ var import_prettier4 = __toESM(require("prettier"));
447
449
  var import_yaml2 = require("yaml");
448
450
  var fromSubgraphRepo = ({
449
451
  rootDir,
@@ -471,12 +473,17 @@ var fromSubgraphRepo = ({
471
473
  throw new Error(`subgraph.yaml file not found`);
472
474
  }
473
475
  const subgraphYaml = (0, import_yaml2.parse)(subgraphYamlRaw);
474
- const subgraphSchemaFilePath = import_node_path4.default.join(
475
- subgraphRootDirPath,
476
- subgraphYaml.schema.file
476
+ const schemaRaw = (0, import_node_fs4.readFileSync)(
477
+ import_node_path4.default.join(subgraphRootDirPath, subgraphYaml.schema.file),
478
+ {
479
+ encoding: "utf-8"
480
+ }
481
+ );
482
+ const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
483
+ (0, import_node_fs4.writeFileSync)(
484
+ import_node_path4.default.join(rootDir, "schema.graphql"),
485
+ import_prettier4.default.format(schemaCleaned, { parser: "graphql" })
477
486
  );
478
- const ponderSchemaFilePath = import_node_path4.default.join(rootDir, "schema.graphql");
479
- (0, import_node_fs4.copyFileSync)(subgraphSchemaFilePath, ponderSchemaFilePath);
480
487
  ponderContracts = subgraphYaml.dataSources.map(validateGraphProtocolSource).map((source) => {
481
488
  const abiPath = source.mapping.abis.find(
482
489
  (abi) => abi.name === source.name
@@ -581,7 +588,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
581
588
  `;
582
589
  (0, import_node_fs5.writeFileSync)(
583
590
  import_node_path5.default.join(rootDir, `./src/${contract.name}.ts`),
584
- import_prettier4.default.format(handlerFileContents, { parser: "typescript" })
591
+ import_prettier5.default.format(handlerFileContents, { parser: "typescript" })
585
592
  );
586
593
  });
587
594
  const finalPonderConfig = `
@@ -597,7 +604,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
597
604
  `;
598
605
  (0, import_node_fs5.writeFileSync)(
599
606
  import_node_path5.default.join(rootDir, "ponder.config.ts"),
600
- import_prettier4.default.format(finalPonderConfig, { parser: "babel" })
607
+ import_prettier5.default.format(finalPonderConfig, { parser: "babel" })
601
608
  );
602
609
  const uniqueChainIds = Array.from(
603
610
  new Set(ponderConfig.networks.map((n) => n.chainId))
@@ -628,7 +635,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
628
635
  `;
629
636
  (0, import_node_fs5.writeFileSync)(
630
637
  import_node_path5.default.join(rootDir, "package.json"),
631
- import_prettier4.default.format(packageJson, { parser: "json" })
638
+ import_prettier5.default.format(packageJson, { parser: "json" })
632
639
  );
633
640
  const tsConfig = `
634
641
  {
@@ -649,7 +656,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
649
656
  `;
650
657
  (0, import_node_fs5.writeFileSync)(
651
658
  import_node_path5.default.join(rootDir, "tsconfig.json"),
652
- import_prettier4.default.format(tsConfig, { parser: "json" })
659
+ import_prettier5.default.format(tsConfig, { parser: "json" })
653
660
  );
654
661
  (0, import_node_fs5.writeFileSync)(
655
662
  import_node_path5.default.join(rootDir, ".gitignore"),
@@ -687,7 +694,7 @@ Generated types.`);
687
694
  // package.json
688
695
  var package_default = {
689
696
  name: "create-ponder",
690
- version: "0.0.46",
697
+ version: "0.0.48",
691
698
  description: "Tool to bootstrap a Ponder project",
692
699
  license: "MIT",
693
700
  author: "olias.eth",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n 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"]}
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: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return ponderConfig;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialPonderConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n 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: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: 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 schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.48\",\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_prettier","import_yaml","path","prettier","path","pico","prettier","fromEtherscan","fromSubgraphId","fromSubgraphRepo","prompts","path"]}
@@ -7,10 +7,10 @@ import prompts from "prompts";
7
7
 
8
8
  // src/index.ts
9
9
  import { execSync as execSync2 } from "node:child_process";
10
- import { mkdirSync, readFileSync as readFileSync2, writeFileSync as writeFileSync4 } from "node:fs";
10
+ import { mkdirSync, readFileSync as readFileSync2, writeFileSync as writeFileSync5 } from "node:fs";
11
11
  import path6 from "node:path";
12
12
  import pico from "picocolors";
13
- import prettier4 from "prettier";
13
+ import prettier5 from "prettier";
14
14
 
15
15
  // src/helpers/getPackageManager.ts
16
16
  import { detect } from "detect-package-manager";
@@ -84,7 +84,7 @@ var fromBasic = ({ rootDir }) => {
84
84
  writeFileSync(abiAbsolutePath, abiFileContents);
85
85
  const schemaGraphqlFileContents = `
86
86
  type ExampleToken @entity {
87
- id: ID!
87
+ id: String!
88
88
  tokenId: Int!
89
89
  trait: TokenTrait!
90
90
  }
@@ -229,7 +229,7 @@ var fromEtherscan = async ({
229
229
  writeFileSync2(abiAbsolutePath, prettier2.format(abi, { parser: "json" }));
230
230
  const schemaGraphqlFileContents = `
231
231
  type ExampleEntity @entity {
232
- id: ID!
232
+ id: String!
233
233
  name: String!
234
234
  }
235
235
  `;
@@ -371,10 +371,11 @@ var fromSubgraphId = async ({
371
371
  const manifest = parse(manifestRaw);
372
372
  const schemaCid = manifest.schema.file["/"].slice(6);
373
373
  const schemaRaw = await fetchIpfsFile(schemaCid);
374
+ const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
374
375
  const ponderSchemaFilePath = path4.join(rootDir, "schema.graphql");
375
376
  writeFileSync3(
376
377
  ponderSchemaFilePath,
377
- prettier3.format(schemaRaw, { parser: "graphql" })
378
+ prettier3.format(schemaCleaned, { parser: "graphql" })
378
379
  );
379
380
  const dataSources = manifest.dataSources.map(
380
381
  validateGraphProtocolSource
@@ -419,8 +420,9 @@ var fromSubgraphId = async ({
419
420
  };
420
421
 
421
422
  // src/templates/subgraphRepo.ts
422
- import { copyFileSync, readFileSync } from "node:fs";
423
+ import { copyFileSync, readFileSync, writeFileSync as writeFileSync4 } from "node:fs";
423
424
  import path5 from "node:path";
425
+ import prettier4 from "prettier";
424
426
  import { parse as parse2 } from "yaml";
425
427
  var fromSubgraphRepo = ({
426
428
  rootDir,
@@ -448,12 +450,17 @@ var fromSubgraphRepo = ({
448
450
  throw new Error(`subgraph.yaml file not found`);
449
451
  }
450
452
  const subgraphYaml = parse2(subgraphYamlRaw);
451
- const subgraphSchemaFilePath = path5.join(
452
- subgraphRootDirPath,
453
- subgraphYaml.schema.file
453
+ const schemaRaw = readFileSync(
454
+ path5.join(subgraphRootDirPath, subgraphYaml.schema.file),
455
+ {
456
+ encoding: "utf-8"
457
+ }
458
+ );
459
+ const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
460
+ writeFileSync4(
461
+ path5.join(rootDir, "schema.graphql"),
462
+ prettier4.format(schemaCleaned, { parser: "graphql" })
454
463
  );
455
- const ponderSchemaFilePath = path5.join(rootDir, "schema.graphql");
456
- copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);
457
464
  ponderContracts = subgraphYaml.dataSources.map(validateGraphProtocolSource).map((source) => {
458
465
  const abiPath = source.mapping.abis.find(
459
466
  (abi) => abi.name === source.name
@@ -556,9 +563,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
556
563
  })`
557
564
  ).join("\n")}
558
565
  `;
559
- writeFileSync4(
566
+ writeFileSync5(
560
567
  path6.join(rootDir, `./src/${contract.name}.ts`),
561
- prettier4.format(handlerFileContents, { parser: "typescript" })
568
+ prettier5.format(handlerFileContents, { parser: "typescript" })
562
569
  );
563
570
  });
564
571
  const finalPonderConfig = `
@@ -572,9 +579,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
572
579
  contracts: ${JSON.stringify(ponderConfig.contracts)},
573
580
  };
574
581
  `;
575
- writeFileSync4(
582
+ writeFileSync5(
576
583
  path6.join(rootDir, "ponder.config.ts"),
577
- prettier4.format(finalPonderConfig, { parser: "babel" })
584
+ prettier5.format(finalPonderConfig, { parser: "babel" })
578
585
  );
579
586
  const uniqueChainIds = Array.from(
580
587
  new Set(ponderConfig.networks.map((n) => n.chainId))
@@ -583,7 +590,7 @@ Using ${pico.cyan("Subgraph repository")} template.`);
583
590
  (chainId) => `PONDER_RPC_URL_${chainId}=""
584
591
  `
585
592
  )}`;
586
- writeFileSync4(path6.join(rootDir, ".env.local"), envLocal);
593
+ writeFileSync5(path6.join(rootDir, ".env.local"), envLocal);
587
594
  const packageJson = `
588
595
  {
589
596
  "private": true,
@@ -603,9 +610,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
603
610
  }
604
611
  }
605
612
  `;
606
- writeFileSync4(
613
+ writeFileSync5(
607
614
  path6.join(rootDir, "package.json"),
608
- prettier4.format(packageJson, { parser: "json" })
615
+ prettier5.format(packageJson, { parser: "json" })
609
616
  );
610
617
  const tsConfig = `
611
618
  {
@@ -624,11 +631,11 @@ Using ${pico.cyan("Subgraph repository")} template.`);
624
631
  "exclude": ["node_modules"]
625
632
  }
626
633
  `;
627
- writeFileSync4(
634
+ writeFileSync5(
628
635
  path6.join(rootDir, "tsconfig.json"),
629
- prettier4.format(tsConfig, { parser: "json" })
636
+ prettier5.format(tsConfig, { parser: "json" })
630
637
  );
631
- writeFileSync4(
638
+ writeFileSync5(
632
639
  path6.join(rootDir, ".gitignore"),
633
640
  `node_modules/
634
641
  .DS_Store
@@ -664,7 +671,7 @@ Generated types.`);
664
671
  // package.json
665
672
  var package_default = {
666
673
  name: "create-ponder",
667
- version: "0.0.46",
674
+ version: "0.0.48",
668
675
  description: "Tool to bootstrap a Ponder project",
669
676
  license: "MIT",
670
677
  author: "olias.eth",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n 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"]}
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: String!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return ponderConfig;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialPonderConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n 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: String!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: 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 schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const schemaRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYaml.schema.file),\n {\n encoding: \"utf-8\",\n }\n );\n const schemaCleaned = schemaRaw\n .replaceAll(\": ID!\", \": String!\")\n .replaceAll(\"BigDecimal\", \"Float\");\n writeFileSync(\n path.join(rootDir, \"schema.graphql\"),\n prettier.format(schemaCleaned, { parser: \"graphql\" })\n );\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.48\",\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","writeFileSync","path","prettier","parse","path","parse","writeFileSync","prettier","path","readFileSync","writeFileSync","prettier","execSync","fromEtherscan","fromSubgraphId","fromSubgraphRepo","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ponder",
3
- "version": "0.0.46",
3
+ "version": "0.0.48",
4
4
  "description": "Tool to bootstrap a Ponder project",
5
5
  "license": "MIT",
6
6
  "author": "olias.eth",
@@ -30,7 +30,7 @@
30
30
  "tsup": "^6.6.3",
31
31
  "typescript": "^4.5.5",
32
32
  "vitest": "^0.29.2",
33
- "@ponder/core": "0.0.46"
33
+ "@ponder/core": "0.0.48"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "tsup-node",