create-ponder 0.0.45 → 0.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create-ponder.js +41 -83
- package/dist/create-ponder.js.map +1 -1
- package/dist/create-ponder.mjs +47 -89
- package/dist/create-ponder.mjs.map +1 -1
- package/package.json +3 -2
package/dist/create-ponder.js
CHANGED
|
@@ -33,76 +33,26 @@ 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
|
|
36
|
+
var import_prettier5 = __toESM(require("prettier"));
|
|
37
37
|
|
|
38
|
-
// src/helpers/
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
var cache = /* @__PURE__ */ new Map();
|
|
51
|
-
function hasGlobalInstallation(pm) {
|
|
52
|
-
const key = `has_global_${pm}`;
|
|
53
|
-
if (cache.has(key)) {
|
|
54
|
-
return Promise.resolve(cache.get(key));
|
|
55
|
-
}
|
|
56
|
-
return (0, import_execa.default)(pm, ["--version"]).then((res) => {
|
|
57
|
-
return /^\d+.\d+.\d+$/.test(res.stdout);
|
|
58
|
-
}).then((value) => {
|
|
59
|
-
cache.set(key, value);
|
|
60
|
-
return value;
|
|
61
|
-
}).catch(() => false);
|
|
62
|
-
}
|
|
63
|
-
function getTypeofLockFile(cwd = ".") {
|
|
64
|
-
const key = `lockfile_${cwd}`;
|
|
65
|
-
if (cache.has(key)) {
|
|
66
|
-
return Promise.resolve(cache.get(key));
|
|
38
|
+
// src/helpers/getPackageManager.ts
|
|
39
|
+
var import_detect_package_manager = require("detect-package-manager");
|
|
40
|
+
function getPackageManager() {
|
|
41
|
+
const userAgent = process.env.npm_config_user_agent;
|
|
42
|
+
if (userAgent) {
|
|
43
|
+
if (userAgent.includes("pnpm"))
|
|
44
|
+
return "pnpm";
|
|
45
|
+
if (userAgent.includes("npm"))
|
|
46
|
+
return "npm";
|
|
47
|
+
if (userAgent.includes("yarn"))
|
|
48
|
+
return "yarn";
|
|
67
49
|
}
|
|
68
|
-
return
|
|
69
|
-
pathExists((0, import_path.resolve)(cwd, "yarn.lock")),
|
|
70
|
-
pathExists((0, import_path.resolve)(cwd, "package-lock.json")),
|
|
71
|
-
pathExists((0, import_path.resolve)(cwd, "pnpm-lock.yaml"))
|
|
72
|
-
]).then(([isYarn, isNpm, isPnpm]) => {
|
|
73
|
-
let value = null;
|
|
74
|
-
if (isYarn) {
|
|
75
|
-
value = "yarn";
|
|
76
|
-
} else if (isPnpm) {
|
|
77
|
-
value = "pnpm";
|
|
78
|
-
} else if (isNpm) {
|
|
79
|
-
value = "npm";
|
|
80
|
-
}
|
|
81
|
-
cache.set(key, value);
|
|
82
|
-
return value;
|
|
83
|
-
});
|
|
50
|
+
return (0, import_detect_package_manager.detect)();
|
|
84
51
|
}
|
|
85
|
-
var detect = async ({ cwd } = {}) => {
|
|
86
|
-
const type = await getTypeofLockFile(cwd);
|
|
87
|
-
if (type) {
|
|
88
|
-
return type;
|
|
89
|
-
}
|
|
90
|
-
const [hasYarn, hasPnpm] = await Promise.all([
|
|
91
|
-
hasGlobalInstallation("yarn"),
|
|
92
|
-
hasGlobalInstallation("pnpm")
|
|
93
|
-
]);
|
|
94
|
-
if (hasPnpm) {
|
|
95
|
-
return "pnpm";
|
|
96
|
-
}
|
|
97
|
-
if (hasYarn) {
|
|
98
|
-
return "yarn";
|
|
99
|
-
}
|
|
100
|
-
return "npm";
|
|
101
|
-
};
|
|
102
52
|
|
|
103
53
|
// src/helpers/git.ts
|
|
104
54
|
var import_child_process = require("child_process");
|
|
105
|
-
var
|
|
55
|
+
var import_path = __toESM(require("path"));
|
|
106
56
|
var import_rimraf = __toESM(require("rimraf"));
|
|
107
57
|
function isInGitRepository() {
|
|
108
58
|
try {
|
|
@@ -138,7 +88,7 @@ function tryGitInit(root) {
|
|
|
138
88
|
} catch (e) {
|
|
139
89
|
if (didInit) {
|
|
140
90
|
try {
|
|
141
|
-
import_rimraf.default.sync(
|
|
91
|
+
import_rimraf.default.sync(import_path.default.join(root, ".git"));
|
|
142
92
|
} catch (_) {
|
|
143
93
|
}
|
|
144
94
|
}
|
|
@@ -157,7 +107,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
157
107
|
(0, import_node_fs.writeFileSync)(abiAbsolutePath, abiFileContents);
|
|
158
108
|
const schemaGraphqlFileContents = `
|
|
159
109
|
type ExampleToken @entity {
|
|
160
|
-
id:
|
|
110
|
+
id: String!
|
|
161
111
|
tokenId: Int!
|
|
162
112
|
trait: TokenTrait!
|
|
163
113
|
}
|
|
@@ -266,7 +216,7 @@ var getNetworkByEtherscanHostname = (hostname) => {
|
|
|
266
216
|
};
|
|
267
217
|
|
|
268
218
|
// src/helpers/wait.ts
|
|
269
|
-
var wait = (ms) => new Promise((
|
|
219
|
+
var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
270
220
|
|
|
271
221
|
// src/templates/etherscan.ts
|
|
272
222
|
var fromEtherscan = async ({
|
|
@@ -302,7 +252,7 @@ var fromEtherscan = async ({
|
|
|
302
252
|
(0, import_node_fs2.writeFileSync)(abiAbsolutePath, import_prettier2.default.format(abi, { parser: "json" }));
|
|
303
253
|
const schemaGraphqlFileContents = `
|
|
304
254
|
type ExampleEntity @entity {
|
|
305
|
-
id:
|
|
255
|
+
id: String!
|
|
306
256
|
name: String!
|
|
307
257
|
}
|
|
308
258
|
`;
|
|
@@ -444,10 +394,11 @@ var fromSubgraphId = async ({
|
|
|
444
394
|
const manifest = (0, import_yaml.parse)(manifestRaw);
|
|
445
395
|
const schemaCid = manifest.schema.file["/"].slice(6);
|
|
446
396
|
const schemaRaw = await fetchIpfsFile(schemaCid);
|
|
397
|
+
const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
|
|
447
398
|
const ponderSchemaFilePath = import_node_path3.default.join(rootDir, "schema.graphql");
|
|
448
399
|
(0, import_node_fs3.writeFileSync)(
|
|
449
400
|
ponderSchemaFilePath,
|
|
450
|
-
import_prettier3.default.format(
|
|
401
|
+
import_prettier3.default.format(schemaCleaned, { parser: "graphql" })
|
|
451
402
|
);
|
|
452
403
|
const dataSources = manifest.dataSources.map(
|
|
453
404
|
validateGraphProtocolSource
|
|
@@ -494,6 +445,7 @@ var fromSubgraphId = async ({
|
|
|
494
445
|
// src/templates/subgraphRepo.ts
|
|
495
446
|
var import_node_fs4 = require("fs");
|
|
496
447
|
var import_node_path4 = __toESM(require("path"));
|
|
448
|
+
var import_prettier4 = __toESM(require("prettier"));
|
|
497
449
|
var import_yaml2 = require("yaml");
|
|
498
450
|
var fromSubgraphRepo = ({
|
|
499
451
|
rootDir,
|
|
@@ -521,12 +473,17 @@ var fromSubgraphRepo = ({
|
|
|
521
473
|
throw new Error(`subgraph.yaml file not found`);
|
|
522
474
|
}
|
|
523
475
|
const subgraphYaml = (0, import_yaml2.parse)(subgraphYamlRaw);
|
|
524
|
-
const
|
|
525
|
-
subgraphRootDirPath,
|
|
526
|
-
|
|
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" })
|
|
527
486
|
);
|
|
528
|
-
const ponderSchemaFilePath = import_node_path4.default.join(rootDir, "schema.graphql");
|
|
529
|
-
(0, import_node_fs4.copyFileSync)(subgraphSchemaFilePath, ponderSchemaFilePath);
|
|
530
487
|
ponderContracts = subgraphYaml.dataSources.map(validateGraphProtocolSource).map((source) => {
|
|
531
488
|
const abiPath = source.mapping.abis.find(
|
|
532
489
|
(abi) => abi.name === source.name
|
|
@@ -631,7 +588,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
631
588
|
`;
|
|
632
589
|
(0, import_node_fs5.writeFileSync)(
|
|
633
590
|
import_node_path5.default.join(rootDir, `./src/${contract.name}.ts`),
|
|
634
|
-
|
|
591
|
+
import_prettier5.default.format(handlerFileContents, { parser: "typescript" })
|
|
635
592
|
);
|
|
636
593
|
});
|
|
637
594
|
const finalPonderConfig = `
|
|
@@ -647,7 +604,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
647
604
|
`;
|
|
648
605
|
(0, import_node_fs5.writeFileSync)(
|
|
649
606
|
import_node_path5.default.join(rootDir, "ponder.config.ts"),
|
|
650
|
-
|
|
607
|
+
import_prettier5.default.format(finalPonderConfig, { parser: "babel" })
|
|
651
608
|
);
|
|
652
609
|
const uniqueChainIds = Array.from(
|
|
653
610
|
new Set(ponderConfig.networks.map((n) => n.chainId))
|
|
@@ -678,7 +635,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
678
635
|
`;
|
|
679
636
|
(0, import_node_fs5.writeFileSync)(
|
|
680
637
|
import_node_path5.default.join(rootDir, "package.json"),
|
|
681
|
-
|
|
638
|
+
import_prettier5.default.format(packageJson, { parser: "json" })
|
|
682
639
|
);
|
|
683
640
|
const tsConfig = `
|
|
684
641
|
{
|
|
@@ -699,7 +656,7 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
699
656
|
`;
|
|
700
657
|
(0, import_node_fs5.writeFileSync)(
|
|
701
658
|
import_node_path5.default.join(rootDir, "tsconfig.json"),
|
|
702
|
-
|
|
659
|
+
import_prettier5.default.format(tsConfig, { parser: "json" })
|
|
703
660
|
);
|
|
704
661
|
(0, import_node_fs5.writeFileSync)(
|
|
705
662
|
import_node_path5.default.join(rootDir, ".gitignore"),
|
|
@@ -710,11 +667,10 @@ Using ${import_picocolors.default.cyan("Subgraph repository")} template.`);
|
|
|
710
667
|
.ponder/
|
|
711
668
|
generated/`
|
|
712
669
|
);
|
|
713
|
-
const packageManager = await
|
|
714
|
-
const runCommand = packageManager === "npm" ? `${packageManager} run` : packageManager;
|
|
670
|
+
const packageManager = await getPackageManager();
|
|
715
671
|
console.log(import_picocolors.default.bold(`
|
|
716
672
|
Installing with ${packageManager}.`));
|
|
717
|
-
const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} install`;
|
|
673
|
+
const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} ${packageManager === "npm" ? "--quiet" : "--silent"} install`;
|
|
718
674
|
(0, import_node_child_process.execSync)(installCommand, {
|
|
719
675
|
cwd: rootDir,
|
|
720
676
|
stdio: "inherit"
|
|
@@ -723,7 +679,8 @@ Installing with ${packageManager}.`));
|
|
|
723
679
|
tryGitInit(rootDir);
|
|
724
680
|
console.log(`
|
|
725
681
|
Initialized a git repository.`);
|
|
726
|
-
|
|
682
|
+
const runCommand = `${packageManager === "npm" ? `npm --quiet run` : `${packageManager} --silent`} codegen`;
|
|
683
|
+
(0, import_node_child_process.execSync)(runCommand, {
|
|
727
684
|
cwd: rootDir,
|
|
728
685
|
stdio: "inherit"
|
|
729
686
|
});
|
|
@@ -737,7 +694,7 @@ Generated types.`);
|
|
|
737
694
|
// package.json
|
|
738
695
|
var package_default = {
|
|
739
696
|
name: "create-ponder",
|
|
740
|
-
version: "0.0.
|
|
697
|
+
version: "0.0.47",
|
|
741
698
|
description: "Tool to bootstrap a Ponder project",
|
|
742
699
|
license: "MIT",
|
|
743
700
|
author: "olias.eth",
|
|
@@ -755,6 +712,7 @@ var package_default = {
|
|
|
755
712
|
},
|
|
756
713
|
dependencies: {
|
|
757
714
|
cac: "^6.7.14",
|
|
715
|
+
"detect-package-manager": "^2.0.1",
|
|
758
716
|
execa: "5",
|
|
759
717
|
"node-fetch": "^2.6.7",
|
|
760
718
|
picocolors: "^1.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/detectPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { detect } from \"@/helpers/detectPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await detect();\n const runCommand =\n packageManager === \"npm\" ? `${packageManager} run` : packageManager;\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n execSync(`${runCommand} --silent codegen --silent`, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","// Adapted from https://github.com/egoist/detect-package-manager\nimport execa from \"execa\";\nimport { promises as fs } from \"fs\";\nimport { resolve } from \"path\";\n\nexport type PM = \"npm\" | \"yarn\" | \"pnpm\";\n\nasync function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nconst cache = new Map();\n\nfunction hasGlobalInstallation(pm: PM): Promise<boolean> {\n const key = `has_global_${pm}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return execa(pm, [\"--version\"])\n .then((res) => {\n return /^\\d+.\\d+.\\d+$/.test(res.stdout);\n })\n .then((value) => {\n cache.set(key, value);\n return value;\n })\n .catch(() => false);\n}\n\nfunction getTypeofLockFile(cwd = \".\"): Promise<PM | null> {\n const key = `lockfile_${cwd}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return Promise.all([\n pathExists(resolve(cwd, \"yarn.lock\")),\n pathExists(resolve(cwd, \"package-lock.json\")),\n pathExists(resolve(cwd, \"pnpm-lock.yaml\")),\n ]).then(([isYarn, isNpm, isPnpm]) => {\n let value: PM | null = null;\n\n if (isYarn) {\n value = \"yarn\";\n } else if (isPnpm) {\n value = \"pnpm\";\n } else if (isNpm) {\n value = \"npm\";\n }\n\n cache.set(key, value);\n return value;\n });\n}\n\nconst detect = async ({ cwd }: { cwd?: string } = {}) => {\n const type = await getTypeofLockFile(cwd);\n if (type) {\n return type;\n }\n const [hasYarn, hasPnpm] = await Promise.all([\n hasGlobalInstallation(\"yarn\"),\n hasGlobalInstallation(\"pnpm\"),\n ]);\n // Prefer pnpm, yarn, then npm\n if (hasPnpm) {\n return \"pnpm\";\n }\n if (hasYarn) {\n return \"yarn\";\n }\n return \"npm\";\n};\n\nexport { detect };\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialPonderConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: ID!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return ponderConfig;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialPonderConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.45\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^4.1.2\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["import_node_path","import_node_fs","import_node_path","import_prettier","fs","execa","import_path","rimraf","path","path","prettier","import_node_fs","import_node_path","import_prettier","resolve","path","prettier","fetch","import_node_fs","import_node_path","import_node_fetch","import_prettier","fetch","path","prettier","import_node_fs","import_node_path","import_yaml","path","path","pico","prettier","fromEtherscan","fromSubgraphId","fromSubgraphRepo","prompts","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialPonderConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: 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.47\",\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"]}
|
package/dist/create-ponder.mjs
CHANGED
|
@@ -7,75 +7,25 @@ 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
|
|
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
|
|
13
|
+
import prettier5 from "prettier";
|
|
14
14
|
|
|
15
|
-
// src/helpers/
|
|
16
|
-
import
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
var cache = /* @__PURE__ */ new Map();
|
|
28
|
-
function hasGlobalInstallation(pm) {
|
|
29
|
-
const key = `has_global_${pm}`;
|
|
30
|
-
if (cache.has(key)) {
|
|
31
|
-
return Promise.resolve(cache.get(key));
|
|
15
|
+
// src/helpers/getPackageManager.ts
|
|
16
|
+
import { detect } from "detect-package-manager";
|
|
17
|
+
function getPackageManager() {
|
|
18
|
+
const userAgent = process.env.npm_config_user_agent;
|
|
19
|
+
if (userAgent) {
|
|
20
|
+
if (userAgent.includes("pnpm"))
|
|
21
|
+
return "pnpm";
|
|
22
|
+
if (userAgent.includes("npm"))
|
|
23
|
+
return "npm";
|
|
24
|
+
if (userAgent.includes("yarn"))
|
|
25
|
+
return "yarn";
|
|
32
26
|
}
|
|
33
|
-
return
|
|
34
|
-
return /^\d+.\d+.\d+$/.test(res.stdout);
|
|
35
|
-
}).then((value) => {
|
|
36
|
-
cache.set(key, value);
|
|
37
|
-
return value;
|
|
38
|
-
}).catch(() => false);
|
|
27
|
+
return detect();
|
|
39
28
|
}
|
|
40
|
-
function getTypeofLockFile(cwd = ".") {
|
|
41
|
-
const key = `lockfile_${cwd}`;
|
|
42
|
-
if (cache.has(key)) {
|
|
43
|
-
return Promise.resolve(cache.get(key));
|
|
44
|
-
}
|
|
45
|
-
return Promise.all([
|
|
46
|
-
pathExists(resolve(cwd, "yarn.lock")),
|
|
47
|
-
pathExists(resolve(cwd, "package-lock.json")),
|
|
48
|
-
pathExists(resolve(cwd, "pnpm-lock.yaml"))
|
|
49
|
-
]).then(([isYarn, isNpm, isPnpm]) => {
|
|
50
|
-
let value = null;
|
|
51
|
-
if (isYarn) {
|
|
52
|
-
value = "yarn";
|
|
53
|
-
} else if (isPnpm) {
|
|
54
|
-
value = "pnpm";
|
|
55
|
-
} else if (isNpm) {
|
|
56
|
-
value = "npm";
|
|
57
|
-
}
|
|
58
|
-
cache.set(key, value);
|
|
59
|
-
return value;
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
var detect = async ({ cwd } = {}) => {
|
|
63
|
-
const type = await getTypeofLockFile(cwd);
|
|
64
|
-
if (type) {
|
|
65
|
-
return type;
|
|
66
|
-
}
|
|
67
|
-
const [hasYarn, hasPnpm] = await Promise.all([
|
|
68
|
-
hasGlobalInstallation("yarn"),
|
|
69
|
-
hasGlobalInstallation("pnpm")
|
|
70
|
-
]);
|
|
71
|
-
if (hasPnpm) {
|
|
72
|
-
return "pnpm";
|
|
73
|
-
}
|
|
74
|
-
if (hasYarn) {
|
|
75
|
-
return "yarn";
|
|
76
|
-
}
|
|
77
|
-
return "npm";
|
|
78
|
-
};
|
|
79
29
|
|
|
80
30
|
// src/helpers/git.ts
|
|
81
31
|
import { execSync } from "child_process";
|
|
@@ -134,7 +84,7 @@ var fromBasic = ({ rootDir }) => {
|
|
|
134
84
|
writeFileSync(abiAbsolutePath, abiFileContents);
|
|
135
85
|
const schemaGraphqlFileContents = `
|
|
136
86
|
type ExampleToken @entity {
|
|
137
|
-
id:
|
|
87
|
+
id: String!
|
|
138
88
|
tokenId: Int!
|
|
139
89
|
trait: TokenTrait!
|
|
140
90
|
}
|
|
@@ -243,7 +193,7 @@ var getNetworkByEtherscanHostname = (hostname) => {
|
|
|
243
193
|
};
|
|
244
194
|
|
|
245
195
|
// src/helpers/wait.ts
|
|
246
|
-
var wait = (ms) => new Promise((
|
|
196
|
+
var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
247
197
|
|
|
248
198
|
// src/templates/etherscan.ts
|
|
249
199
|
var fromEtherscan = async ({
|
|
@@ -279,7 +229,7 @@ var fromEtherscan = async ({
|
|
|
279
229
|
writeFileSync2(abiAbsolutePath, prettier2.format(abi, { parser: "json" }));
|
|
280
230
|
const schemaGraphqlFileContents = `
|
|
281
231
|
type ExampleEntity @entity {
|
|
282
|
-
id:
|
|
232
|
+
id: String!
|
|
283
233
|
name: String!
|
|
284
234
|
}
|
|
285
235
|
`;
|
|
@@ -421,10 +371,11 @@ var fromSubgraphId = async ({
|
|
|
421
371
|
const manifest = parse(manifestRaw);
|
|
422
372
|
const schemaCid = manifest.schema.file["/"].slice(6);
|
|
423
373
|
const schemaRaw = await fetchIpfsFile(schemaCid);
|
|
374
|
+
const schemaCleaned = schemaRaw.replaceAll(": ID!", ": String!").replaceAll("BigDecimal", "Float");
|
|
424
375
|
const ponderSchemaFilePath = path4.join(rootDir, "schema.graphql");
|
|
425
376
|
writeFileSync3(
|
|
426
377
|
ponderSchemaFilePath,
|
|
427
|
-
prettier3.format(
|
|
378
|
+
prettier3.format(schemaCleaned, { parser: "graphql" })
|
|
428
379
|
);
|
|
429
380
|
const dataSources = manifest.dataSources.map(
|
|
430
381
|
validateGraphProtocolSource
|
|
@@ -469,8 +420,9 @@ var fromSubgraphId = async ({
|
|
|
469
420
|
};
|
|
470
421
|
|
|
471
422
|
// src/templates/subgraphRepo.ts
|
|
472
|
-
import { copyFileSync, readFileSync } from "node:fs";
|
|
423
|
+
import { copyFileSync, readFileSync, writeFileSync as writeFileSync4 } from "node:fs";
|
|
473
424
|
import path5 from "node:path";
|
|
425
|
+
import prettier4 from "prettier";
|
|
474
426
|
import { parse as parse2 } from "yaml";
|
|
475
427
|
var fromSubgraphRepo = ({
|
|
476
428
|
rootDir,
|
|
@@ -498,12 +450,17 @@ var fromSubgraphRepo = ({
|
|
|
498
450
|
throw new Error(`subgraph.yaml file not found`);
|
|
499
451
|
}
|
|
500
452
|
const subgraphYaml = parse2(subgraphYamlRaw);
|
|
501
|
-
const
|
|
502
|
-
subgraphRootDirPath,
|
|
503
|
-
|
|
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" })
|
|
504
463
|
);
|
|
505
|
-
const ponderSchemaFilePath = path5.join(rootDir, "schema.graphql");
|
|
506
|
-
copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);
|
|
507
464
|
ponderContracts = subgraphYaml.dataSources.map(validateGraphProtocolSource).map((source) => {
|
|
508
465
|
const abiPath = source.mapping.abis.find(
|
|
509
466
|
(abi) => abi.name === source.name
|
|
@@ -606,9 +563,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
606
563
|
})`
|
|
607
564
|
).join("\n")}
|
|
608
565
|
`;
|
|
609
|
-
|
|
566
|
+
writeFileSync5(
|
|
610
567
|
path6.join(rootDir, `./src/${contract.name}.ts`),
|
|
611
|
-
|
|
568
|
+
prettier5.format(handlerFileContents, { parser: "typescript" })
|
|
612
569
|
);
|
|
613
570
|
});
|
|
614
571
|
const finalPonderConfig = `
|
|
@@ -622,9 +579,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
622
579
|
contracts: ${JSON.stringify(ponderConfig.contracts)},
|
|
623
580
|
};
|
|
624
581
|
`;
|
|
625
|
-
|
|
582
|
+
writeFileSync5(
|
|
626
583
|
path6.join(rootDir, "ponder.config.ts"),
|
|
627
|
-
|
|
584
|
+
prettier5.format(finalPonderConfig, { parser: "babel" })
|
|
628
585
|
);
|
|
629
586
|
const uniqueChainIds = Array.from(
|
|
630
587
|
new Set(ponderConfig.networks.map((n) => n.chainId))
|
|
@@ -633,7 +590,7 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
633
590
|
(chainId) => `PONDER_RPC_URL_${chainId}=""
|
|
634
591
|
`
|
|
635
592
|
)}`;
|
|
636
|
-
|
|
593
|
+
writeFileSync5(path6.join(rootDir, ".env.local"), envLocal);
|
|
637
594
|
const packageJson = `
|
|
638
595
|
{
|
|
639
596
|
"private": true,
|
|
@@ -653,9 +610,9 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
653
610
|
}
|
|
654
611
|
}
|
|
655
612
|
`;
|
|
656
|
-
|
|
613
|
+
writeFileSync5(
|
|
657
614
|
path6.join(rootDir, "package.json"),
|
|
658
|
-
|
|
615
|
+
prettier5.format(packageJson, { parser: "json" })
|
|
659
616
|
);
|
|
660
617
|
const tsConfig = `
|
|
661
618
|
{
|
|
@@ -674,11 +631,11 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
674
631
|
"exclude": ["node_modules"]
|
|
675
632
|
}
|
|
676
633
|
`;
|
|
677
|
-
|
|
634
|
+
writeFileSync5(
|
|
678
635
|
path6.join(rootDir, "tsconfig.json"),
|
|
679
|
-
|
|
636
|
+
prettier5.format(tsConfig, { parser: "json" })
|
|
680
637
|
);
|
|
681
|
-
|
|
638
|
+
writeFileSync5(
|
|
682
639
|
path6.join(rootDir, ".gitignore"),
|
|
683
640
|
`node_modules/
|
|
684
641
|
.DS_Store
|
|
@@ -687,11 +644,10 @@ Using ${pico.cyan("Subgraph repository")} template.`);
|
|
|
687
644
|
.ponder/
|
|
688
645
|
generated/`
|
|
689
646
|
);
|
|
690
|
-
const packageManager = await
|
|
691
|
-
const runCommand = packageManager === "npm" ? `${packageManager} run` : packageManager;
|
|
647
|
+
const packageManager = await getPackageManager();
|
|
692
648
|
console.log(pico.bold(`
|
|
693
649
|
Installing with ${packageManager}.`));
|
|
694
|
-
const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} install`;
|
|
650
|
+
const installCommand = overrides.installCommand ? overrides.installCommand : `${packageManager} ${packageManager === "npm" ? "--quiet" : "--silent"} install`;
|
|
695
651
|
execSync2(installCommand, {
|
|
696
652
|
cwd: rootDir,
|
|
697
653
|
stdio: "inherit"
|
|
@@ -700,7 +656,8 @@ Installing with ${packageManager}.`));
|
|
|
700
656
|
tryGitInit(rootDir);
|
|
701
657
|
console.log(`
|
|
702
658
|
Initialized a git repository.`);
|
|
703
|
-
|
|
659
|
+
const runCommand = `${packageManager === "npm" ? `npm --quiet run` : `${packageManager} --silent`} codegen`;
|
|
660
|
+
execSync2(runCommand, {
|
|
704
661
|
cwd: rootDir,
|
|
705
662
|
stdio: "inherit"
|
|
706
663
|
});
|
|
@@ -714,7 +671,7 @@ Generated types.`);
|
|
|
714
671
|
// package.json
|
|
715
672
|
var package_default = {
|
|
716
673
|
name: "create-ponder",
|
|
717
|
-
version: "0.0.
|
|
674
|
+
version: "0.0.47",
|
|
718
675
|
description: "Tool to bootstrap a Ponder project",
|
|
719
676
|
license: "MIT",
|
|
720
677
|
author: "olias.eth",
|
|
@@ -732,6 +689,7 @@ var package_default = {
|
|
|
732
689
|
},
|
|
733
690
|
dependencies: {
|
|
734
691
|
cac: "^6.7.14",
|
|
692
|
+
"detect-package-manager": "^2.0.1",
|
|
735
693
|
execa: "5",
|
|
736
694
|
"node-fetch": "^2.6.7",
|
|
737
695
|
picocolors: "^1.0.0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/detectPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { detect } from \"@/helpers/detectPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await detect();\n const runCommand =\n packageManager === \"npm\" ? `${packageManager} run` : packageManager;\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n execSync(`${runCommand} --silent codegen --silent`, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","// Adapted from https://github.com/egoist/detect-package-manager\nimport execa from \"execa\";\nimport { promises as fs } from \"fs\";\nimport { resolve } from \"path\";\n\nexport type PM = \"npm\" | \"yarn\" | \"pnpm\";\n\nasync function pathExists(p: string) {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nconst cache = new Map();\n\nfunction hasGlobalInstallation(pm: PM): Promise<boolean> {\n const key = `has_global_${pm}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return execa(pm, [\"--version\"])\n .then((res) => {\n return /^\\d+.\\d+.\\d+$/.test(res.stdout);\n })\n .then((value) => {\n cache.set(key, value);\n return value;\n })\n .catch(() => false);\n}\n\nfunction getTypeofLockFile(cwd = \".\"): Promise<PM | null> {\n const key = `lockfile_${cwd}`;\n if (cache.has(key)) {\n return Promise.resolve(cache.get(key));\n }\n\n return Promise.all([\n pathExists(resolve(cwd, \"yarn.lock\")),\n pathExists(resolve(cwd, \"package-lock.json\")),\n pathExists(resolve(cwd, \"pnpm-lock.yaml\")),\n ]).then(([isYarn, isNpm, isPnpm]) => {\n let value: PM | null = null;\n\n if (isYarn) {\n value = \"yarn\";\n } else if (isPnpm) {\n value = \"pnpm\";\n } else if (isNpm) {\n value = \"npm\";\n }\n\n cache.set(key, value);\n return value;\n });\n}\n\nconst detect = async ({ cwd }: { cwd?: string } = {}) => {\n const type = await getTypeofLockFile(cwd);\n if (type) {\n return type;\n }\n const [hasYarn, hasPnpm] = await Promise.all([\n hasGlobalInstallation(\"yarn\"),\n hasGlobalInstallation(\"pnpm\"),\n ]);\n // Prefer pnpm, yarn, then npm\n if (hasPnpm) {\n return \"pnpm\";\n }\n if (hasYarn) {\n return \"yarn\";\n }\n return \"npm\";\n};\n\nexport { detect };\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialPonderConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: ID!\n tokenId: Int!\n trait: TokenTrait!\n }\n enum TokenTrait {\n GOOD\n BAD\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: \"mainnet\",\n chainId: 1,\n rpcUrl: `process.env.PONDER_RPC_URL_1`,\n },\n ],\n contracts: [\n {\n name: \"ExampleContract\",\n network: \"mainnet\",\n address: \"0x0\",\n abi: abiRelativePath,\n startBlock: 1234567,\n },\n ],\n };\n\n return ponderConfig;\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type { PartialPonderConfig } from \"src/index\";\n\nimport { getNetworkByEtherscanHostname } from \"@/helpers/getEtherscanChainId\";\nimport { wait } from \"@/helpers/wait\";\n\nexport const fromEtherscan = async ({\n rootDir,\n etherscanLink,\n etherscanApiKey,\n}: {\n rootDir: string;\n etherscanLink: string;\n etherscanApiKey?: string;\n}) => {\n const apiKey = etherscanApiKey || process.env.ETHERSCAN_API_KEY;\n\n const url = new URL(etherscanLink);\n const network = getNetworkByEtherscanHostname(url.hostname);\n if (!network) {\n throw new Error(`Unrecognized etherscan hostname: ${url.hostname}`);\n }\n\n const { name, chainId, apiUrl } = network;\n const contractAddress = url.pathname.slice(1).split(\"/\")[1];\n\n const txHash = await getContractCreationTxn(contractAddress, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"\\n(1/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const blockNumber = await getTxBlockNumber(txHash, apiUrl, apiKey);\n\n if (!apiKey) {\n console.log(\"(2/2) Waiting 5 seconds for Etherscan API rate limit\");\n await wait(5000);\n }\n const { abi, contractName } = await getContractAbiAndName(\n contractAddress,\n apiUrl,\n apiKey\n );\n\n // Write contract ABI file.\n const abiRelativePath = `./abis/${contractName}.json`;\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, prettier.format(abi, { parser: \"json\" }));\n\n const schemaGraphqlFileContents = `\n type ExampleEntity @entity {\n id: ID!\n name: String!\n }\n `;\n\n // Generate the schema.graphql file.\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaGraphqlFileContents, { parser: \"graphql\" })\n );\n\n // Build and return the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: [\n {\n name: name,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n },\n ],\n contracts: [\n {\n name: contractName,\n network: name,\n abi: abiRelativePath,\n address: contractAddress,\n startBlock: blockNumber,\n },\n ],\n };\n\n return ponderConfig;\n};\n\nconst fetchEtherscan = async (url: string) => {\n const response = await fetch(url);\n const data = await response.json();\n if (data.status === \"0\") {\n throw new Error(`Etherscan API error: ${data.result}`);\n }\n return data;\n};\n\nconst getContractCreationTxn = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getcontractcreation\",\n contractaddresses: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n return data.result[0].txHash as string;\n};\n\nconst getTxBlockNumber = async (\n txHash: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"proxy\",\n action: \"eth_getTransactionByHash\",\n txhash: txHash,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const hexBlockNumber = data.result.blockNumber as string;\n return parseInt(hexBlockNumber.slice(2), 16);\n};\n\nconst getContractAbiAndName = async (\n contractAddress: string,\n apiUrl: string,\n apiKey?: string\n) => {\n const searchParams = new URLSearchParams({\n module: \"contract\",\n action: \"getsourcecode\",\n address: contractAddress,\n });\n if (apiKey) searchParams.append(\"apikey\", apiKey);\n const data = await fetchEtherscan(`${apiUrl}?${searchParams.toString()}`);\n\n const abi = data.result[0].ABI as string;\n const contractName = data.result[0].ContractName as string;\n\n return { abi, contractName };\n};\n","const networkByEtherscanHostname: Record<\n string,\n { name: string; chainId: number; apiUrl: string } | undefined\n> = {\n \"etherscan.io\": {\n name: \"mainnet\",\n chainId: 1,\n apiUrl: \"https://api.etherscan.io/api\",\n },\n \"ropsten.etherscan.io\": {\n name: \"ropsten\",\n chainId: 3,\n apiUrl: \"https://api-ropsten.etherscan.io/api\",\n },\n \"rinkeby.etherscan.io\": {\n name: \"rinkeby\",\n chainId: 4,\n apiUrl: \"https://api-rinkeby.etherscan.io/api\",\n },\n \"goerli.etherscan.io\": {\n name: \"goerli\",\n chainId: 5,\n apiUrl: \"https://api-goerli.etherscan.io/api\",\n },\n \"kovan.etherscan.io\": {\n name: \"kovan\",\n chainId: 42,\n apiUrl: \"https://api-kovan.etherscan.io/api\",\n },\n \"sepolia.etherscan.io\": {\n name: \"sepolia\",\n chainId: 11155111,\n apiUrl: \"https://api-sepolia.etherscan.io/api\",\n },\n \"optimistic.etherscan.io\": {\n name: \"optimism\",\n chainId: 10,\n apiUrl: \"https://api-optimistic.etherscan.io/api\",\n },\n \"goerli-optimism.etherscan.io\": {\n name: \"optimism-goerli\",\n chainId: 420,\n apiUrl: \"https://api-goerli-optimistic.etherscan.io/api\",\n },\n \"polygonscan.com\": {\n name: \"polygon\",\n chainId: 137,\n apiUrl: \"https://api.polygonscan.com/api\",\n },\n \"mumbai.polygonscan.com\": {\n name: \"polygon-mumbai\",\n chainId: 80001,\n apiUrl: \"https://api-testnet.polygonscan.com/api\",\n },\n \"arbiscan.io\": {\n name: \"arbitrum\",\n chainId: 42161,\n apiUrl: \"https://api.arbiscan.io/api\",\n },\n \"goerli.arbiscan.io\": {\n name: \"arbitrum-goerli\",\n chainId: 421613,\n apiUrl: \"https://api-goerli.arbiscan.io/api\",\n },\n};\n\nexport const getNetworkByEtherscanHostname = (hostname: string) => {\n return networkByEtherscanHostname[hostname];\n};\n","export const wait = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport fetch from \"node-fetch\";\nimport prettier from \"prettier\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"src/index\";\nimport { parse } from \"yaml\";\n\nimport { getGraphProtocolChainId } from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\n\nconst fetchIpfsFile = async (cid: string) => {\n const url = `https://ipfs.network.thegraph.com/api/v0/cat?arg=${cid}`;\n const response = await fetch(url);\n const contentRaw = await response.text();\n return contentRaw;\n};\n\nexport const fromSubgraphId = async ({\n rootDir,\n subgraphId,\n}: {\n rootDir: string;\n subgraphId: string;\n}) => {\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // Fetch the manifest file.\n const manifestRaw = await fetchIpfsFile(subgraphId);\n const manifest = parse(manifestRaw);\n\n // Fetch and write the schema.graphql file.\n const schemaCid = manifest.schema.file[\"/\"].slice(6);\n const schemaRaw = await fetchIpfsFile(schemaCid);\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n writeFileSync(\n ponderSchemaFilePath,\n prettier.format(schemaRaw, { parser: \"graphql\" })\n );\n\n const dataSources = (manifest.dataSources as unknown[]).map(\n validateGraphProtocolSource\n );\n\n // Fetch and write all referenced ABIs.\n const abiFiles = dataSources\n .map((source) => source.mapping.abis)\n .flat()\n .filter(\n (source, idx, arr) => arr.findIndex((s) => s.name === source.name) === idx\n );\n await Promise.all(\n abiFiles.map(async (abi) => {\n const abiContent = await fetchIpfsFile(abi.file[\"/\"].slice(6));\n const abiPath = path.join(rootDir, `./abis/${abi.name}.json`);\n writeFileSync(abiPath, prettier.format(abiContent, { parser: \"json\" }));\n })\n );\n\n // Build the ponder sources.\n ponderContracts = dataSources.map((source) => {\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n const abiRelativePath = `./abis/${source.source.abi}.json`;\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: abiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","// https://github.com/graphprotocol/graph-cli/blob/main/src/protocols/index.js#L40\n// https://chainlist.org/\nconst chainIdByGraphNetwork: Record<string, number | undefined> = {\n mainnet: 1,\n kovan: 42,\n rinkeby: 4,\n ropsten: 3,\n goerli: 5,\n \"poa-core\": 99,\n \"poa-sokol\": 77,\n xdai: 100,\n matic: 137,\n mumbai: 80001,\n fantom: 250,\n \"fantom-testnet\": 4002,\n bsc: 56,\n chapel: -1,\n clover: 0,\n avalanche: 43114,\n fuji: 43113,\n celo: 42220,\n \"celo-alfajores\": 44787,\n fuse: 122,\n moonbeam: 1284,\n moonriver: 1285,\n mbase: -1,\n \"arbitrum-one\": 42161,\n \"arbitrum-rinkeby\": 421611,\n optimism: 10,\n \"optimism-kovan\": 69,\n aurora: 1313161554,\n \"aurora-testnet\": 1313161555,\n};\n\nexport const getGraphProtocolChainId = (networkName: string) => {\n return chainIdByGraphNetwork[networkName];\n};\n\nexport const subgraphYamlFileNames = [\"subgraph.yaml\"].concat(\n Object.keys(chainIdByGraphNetwork).map((n) => `subgraph-${n}.yaml`)\n);\n","// https://github.com/graphprotocol/graph-node/blob/master/docs/subgraph-manifest.md\nexport type GraphSource = {\n kind: string; // Should be \"ethereum\"\n name: string;\n network: string;\n source: {\n address: string;\n abi: string; // Keys into dataSource.mapping.abis\n startBlock?: number;\n };\n mapping: {\n kind: string; // Should be \"ethereum/events\"\n apiVersion: string;\n language: string; // Should be \"wasm/assemblyscript\"\n entities: string[]; // Corresponds to entities by name defined in schema.graphql\n abis: {\n name: string;\n file: any;\n }[];\n eventHandlers?: {\n event: string;\n handler: string;\n topic0?: string;\n }[];\n // NOTE: Not planning to support callHandlers or blockHandlers.\n // callHandlers?: {\n // function: string;\n // handler: string;\n // }[];\n // blockHandlers?: {\n // handler: string;\n // filter?: {\n // kind: string;\n // };\n // }[];\n file: string; // relative path to file that contains handlers for this source\n };\n};\n\nexport const validateGraphProtocolSource = (source: unknown): GraphSource => {\n return source as GraphSource;\n};\n","import { copyFileSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parse } from \"yaml\";\n\nimport {\n getGraphProtocolChainId,\n subgraphYamlFileNames,\n} from \"@/helpers/getGraphProtocolChainId\";\nimport { validateGraphProtocolSource } from \"@/helpers/validateGraphProtocolSource\";\nimport type {\n PartialPonderConfig,\n PonderContract,\n PonderNetwork,\n} from \"@/index\";\n\nexport const fromSubgraphRepo = ({\n rootDir,\n subgraphPath,\n}: {\n rootDir: string;\n subgraphPath: string;\n}) => {\n const subgraphRootDir = path.resolve(subgraphPath);\n\n const ponderNetworks: PonderNetwork[] = [];\n let ponderContracts: PonderContract[] = [];\n\n // If the `--from-subgraph` option was passed, parse subgraph files\n const subgraphRootDirPath = path.resolve(subgraphRootDir);\n\n // Read and parse the subgraph YAML file.\n let subgraphYamlRaw = \"\";\n\n for (const subgraphYamlFileName of subgraphYamlFileNames) {\n try {\n subgraphYamlRaw = readFileSync(\n path.join(subgraphRootDirPath, subgraphYamlFileName),\n {\n encoding: \"utf-8\",\n }\n );\n break;\n } catch (e) {\n continue;\n }\n }\n\n if (subgraphYamlRaw === \"\") {\n throw new Error(`subgraph.yaml file not found`);\n }\n\n const subgraphYaml = parse(subgraphYamlRaw);\n\n // Copy over the schema.graphql file.\n const subgraphSchemaFilePath = path.join(\n subgraphRootDirPath,\n subgraphYaml.schema.file\n );\n const ponderSchemaFilePath = path.join(rootDir, \"schema.graphql\");\n copyFileSync(subgraphSchemaFilePath, ponderSchemaFilePath);\n\n // Build the ponder sources. Also copy over the ABI files for each source.\n ponderContracts = (subgraphYaml.dataSources as unknown[])\n .map(validateGraphProtocolSource)\n .map((source) => {\n const abiPath = source.mapping.abis.find(\n (abi) => abi.name === source.name\n )?.file;\n if (!abiPath) {\n throw new Error(`ABI path not found for source: ${source.name}`);\n }\n\n const network = source.network || \"mainnet\";\n const chainId = getGraphProtocolChainId(network);\n if (!chainId || chainId === -1) {\n throw new Error(`Unhandled network name: ${network}`);\n }\n\n if (!ponderNetworks.map((n) => n.name).includes(network)) {\n ponderNetworks.push({\n name: network,\n chainId: chainId,\n rpcUrl: `process.env.PONDER_RPC_URL_${chainId}`,\n });\n }\n\n // Copy the ABI file.\n const abiAbsolutePath = path.join(subgraphRootDirPath, abiPath);\n const abiFileName = path.basename(abiPath);\n\n const ponderAbiRelativePath = `./abis/${abiFileName}`;\n const ponderAbiAbsolutePath = path.join(rootDir, ponderAbiRelativePath);\n\n copyFileSync(abiAbsolutePath, ponderAbiAbsolutePath);\n\n return <PonderContract>{\n name: source.name,\n network: network,\n address: source.source.address,\n abi: ponderAbiRelativePath,\n startBlock: source.source.startBlock,\n };\n });\n\n // Build the partial ponder config.\n const ponderConfig: PartialPonderConfig = {\n networks: ponderNetworks,\n contracts: ponderContracts,\n };\n\n return ponderConfig;\n};\n","{\n \"name\": \"create-ponder\",\n \"version\": \"0.0.45\",\n \"description\": \"Tool to bootstrap a Ponder project\",\n \"license\": \"MIT\",\n \"author\": \"olias.eth\",\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-ponder\": \"dist/create-ponder.js\"\n },\n \"scripts\": {\n \"build\": \"tsup-node\",\n \"test\": \"export $(grep -v '^#' .env.local | xargs) && vitest --no-threads\",\n \"test:ci\": \"vitest --no-threads\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"execa\": \"5\",\n \"node-fetch\": \"^2.6.7\",\n \"picocolors\": \"^1.0.0\",\n \"prettier\": \"^2.6.2\",\n \"prompts\": \"^2.4.2\",\n \"rimraf\": \"^4.1.2\",\n \"yaml\": \"^2.1.1\"\n },\n \"devDependencies\": {\n \"@ponder/core\": \"workspace:*\",\n \"@types/node\": \"^18.7.8\",\n \"@types/node-fetch\": \"2\",\n \"@types/prettier\": \"^2.7.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"abitype\": \"^0.6.7\",\n \"tsup\": \"^6.6.3\",\n \"typescript\": \"^4.5.5\",\n \"vitest\": \"^0.29.2\"\n }\n}\n"],"mappings":"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","names":["path","execSync","readFileSync","writeFileSync","path","prettier","path","writeFileSync","path","prettier","resolve","path","writeFileSync","prettier","writeFileSync","path","fetch","prettier","fetch","path","writeFileSync","prettier","path","parse","path","parse","path","readFileSync","writeFileSync","prettier","execSync","fromEtherscan","fromSubgraphId","fromSubgraphRepo","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/create-ponder.ts","../src/index.ts","../src/helpers/getPackageManager.ts","../src/helpers/git.ts","../src/templates/basic.ts","../src/templates/etherscan.ts","../src/helpers/getEtherscanChainId.ts","../src/helpers/wait.ts","../src/templates/subgraphId.ts","../src/helpers/getGraphProtocolChainId.ts","../src/helpers/validateGraphProtocolSource.ts","../src/templates/subgraphRepo.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { cac } from \"cac\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nimport { CreatePonderOptions, Template, TemplateKind } from \"@/common\";\nimport { run } from \"@/index\";\n\nimport packageJson from \"../../package.json\" assert { type: \"json\" };\n\nconst createPonder = async () => {\n const cli = cac(packageJson.name)\n .version(packageJson.version)\n .usage(\"[options]\")\n .help()\n .option(\"--dir [path]\", \"Path to directory for generated project\")\n .option(\"--from-subgraph-id [id]\", \"Subgraph deployment ID\")\n .option(\"--from-subgraph-repo [path]\", \"Path to subgraph repository\")\n .option(\"--from-etherscan [url]\", \"Link to etherscan contract page\")\n .option(\"--etherscan-api-key [key]\", \"Etherscan API key\");\n\n const parsed = cli.parse(process.argv);\n\n const options = parsed.options as {\n help?: boolean;\n dir?: string;\n fromSubgraphId?: string;\n fromSubgraphRepo?: string;\n fromEtherscan?: string;\n etherscanApiKey?: string;\n };\n\n if (options.help) {\n process.exit(0);\n }\n\n const { fromEtherscan, fromSubgraphId, fromSubgraphRepo } = options;\n\n // Validate CLI options.\n if (\n (fromSubgraphId && fromSubgraphRepo) ||\n (fromSubgraphId && fromEtherscan) ||\n (fromSubgraphRepo && fromEtherscan)\n ) {\n throw new Error(\n `Cannot specify more than one \"--from\" option:\\n --from-subgraph\\n --from-etherscan-id\\n --from-etherscan-repo`\n );\n }\n\n const { projectName } = await prompts({\n type: \"text\",\n name: \"projectName\",\n message: \"What is your project named?\",\n initial: \"my-app\",\n });\n\n // Get template from options if provided.\n let template: Template | undefined = undefined;\n if (fromEtherscan) {\n template = { kind: TemplateKind.ETHERSCAN, link: fromEtherscan };\n }\n if (fromSubgraphId) {\n template = { kind: TemplateKind.SUBGRAPH_ID, id: fromSubgraphId };\n }\n if (fromSubgraphRepo) {\n template = { kind: TemplateKind.SUBGRAPH_REPO, path: fromSubgraphRepo };\n }\n\n // Get template from prompts if not provided.\n if (!fromSubgraphId && !fromSubgraphRepo && !fromEtherscan) {\n const { template: templateKind } = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Would you like to use a template for this project?\",\n choices: [\n { title: \"None\" },\n { title: \"Etherscan contract link\" },\n { title: \"Subgraph ID\" },\n { title: \"Subgraph repository\" },\n ],\n });\n\n if (templateKind === TemplateKind.ETHERSCAN) {\n const { link } = await prompts({\n type: \"text\",\n name: \"link\",\n message: \"Enter an Etherscan contract link\",\n initial: \"https://etherscan.io/address/0x97...\",\n });\n template = { kind: TemplateKind.ETHERSCAN, link };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_ID) {\n const { id } = await prompts({\n type: \"text\",\n name: \"id\",\n message: \"Enter a subgraph deployment ID\",\n initial: \"QmNus...\",\n });\n template = { kind: TemplateKind.SUBGRAPH_ID, id };\n }\n\n if (templateKind === TemplateKind.SUBGRAPH_REPO) {\n const { path } = await prompts({\n type: \"text\",\n name: \"path\",\n message: \"Enter a path to a subgraph repository\",\n initial: \"../subgraph\",\n });\n template = { kind: TemplateKind.SUBGRAPH_REPO, path };\n }\n }\n\n const validatedOptions: CreatePonderOptions = {\n projectName,\n rootDir: path.resolve(\".\", options.dir ? options.dir : projectName),\n template,\n etherscanApiKey: options.etherscanApiKey,\n };\n\n await run(validatedOptions);\n};\n\ncreatePonder();\n","import type { Abi, AbiEvent } from \"abitype\";\nimport { execSync } from \"node:child_process\";\nimport { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pico from \"picocolors\";\nimport prettier from \"prettier\";\n\nimport { CreatePonderOptions, TemplateKind } from \"@/common\";\nimport { getPackageManager } from \"@/helpers/getPackageManager\";\nimport { tryGitInit } from \"@/helpers/git\";\nimport { fromBasic } from \"@/templates/basic\";\nimport { fromEtherscan } from \"@/templates/etherscan\";\nimport { fromSubgraphId } from \"@/templates/subgraphId\";\nimport { fromSubgraphRepo } from \"@/templates/subgraphRepo\";\n\nexport type PonderNetwork = {\n name: string;\n chainId: number;\n rpcUrl: string;\n};\n\nexport type PonderContract = {\n name: string;\n network: string;\n abi: string;\n address: string;\n startBlock?: number;\n};\n\nexport type PartialPonderConfig = {\n database?: {\n kind: string;\n };\n networks: PonderNetwork[];\n contracts: PonderContract[];\n};\n\nexport const run = async (\n options: CreatePonderOptions,\n overrides: { installCommand?: string } = {}\n) => {\n const { rootDir } = options;\n\n // Create required directories.\n mkdirSync(path.join(rootDir, \"abis\"), { recursive: true });\n mkdirSync(path.join(rootDir, \"src\"), { recursive: true });\n\n let ponderConfig: PartialPonderConfig;\n\n console.log(\n `\\nCreating a new Ponder app in ${pico.bold(pico.green(rootDir))}.`\n );\n\n switch (options.template?.kind) {\n case TemplateKind.ETHERSCAN: {\n console.log(`\\nUsing ${pico.cyan(\"Etherscan contract link\")} template.`);\n ponderConfig = await fromEtherscan({\n rootDir,\n etherscanLink: options.template.link,\n etherscanApiKey: options.etherscanApiKey,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_ID: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph ID\")} template.`);\n ponderConfig = await fromSubgraphId({\n rootDir,\n subgraphId: options.template.id,\n });\n break;\n }\n case TemplateKind.SUBGRAPH_REPO: {\n console.log(`\\nUsing ${pico.cyan(\"Subgraph repository\")} template.`);\n\n ponderConfig = fromSubgraphRepo({\n rootDir,\n subgraphPath: options.template.path,\n });\n break;\n }\n default: {\n ponderConfig = fromBasic({ rootDir });\n break;\n }\n }\n\n // Write the handler ts files.\n ponderConfig.contracts.forEach((contract) => {\n const abiString = readFileSync(path.join(rootDir, contract.abi), {\n encoding: \"utf-8\",\n });\n const abi: Abi = JSON.parse(abiString);\n\n const abiEvents = abi.filter(\n (item): item is AbiEvent => item.type === \"event\"\n );\n\n const eventNamesToWrite = abiEvents.map((event) => event.name).slice(0, 2);\n\n const handlerFileContents = `\n import { ponder } from '@/generated'\n\n ${eventNamesToWrite\n .map(\n (eventName) => `\n ponder.on(\"${contract.name}:${eventName}\", async ({ event, context }) => {\n console.log(event.params)\n })`\n )\n .join(\"\\n\")}\n `;\n\n writeFileSync(\n path.join(rootDir, `./src/${contract.name}.ts`),\n prettier.format(handlerFileContents, { parser: \"typescript\" })\n );\n });\n\n // Write the ponder.config.ts file.\n const finalPonderConfig = `\n import type { PonderConfig } from \"@ponder/core\";\n\n export const config: PonderConfig = {\n networks: ${JSON.stringify(ponderConfig.networks).replaceAll(\n /\"process.env.PONDER_RPC_URL_(.*?)\"/g,\n \"process.env.PONDER_RPC_URL_$1\"\n )},\n contracts: ${JSON.stringify(ponderConfig.contracts)},\n };\n `;\n\n writeFileSync(\n path.join(rootDir, \"ponder.config.ts\"),\n prettier.format(finalPonderConfig, { parser: \"babel\" })\n );\n\n // Write the .env.local file.\n const uniqueChainIds = Array.from(\n new Set(ponderConfig.networks.map((n) => n.chainId))\n );\n const envLocal = `${uniqueChainIds.map(\n (chainId) => `PONDER_RPC_URL_${chainId}=\"\"\\n`\n )}`;\n writeFileSync(path.join(rootDir, \".env.local\"), envLocal);\n\n // Write the package.json file.\n const packageJson = `\n {\n \"private\": true,\n \"scripts\": {\n \"dev\": \"ponder dev\",\n \"start\": \"ponder start\",\n \"codegen\": \"ponder codegen\"\n },\n \"dependencies\": {\n \"@ponder/core\": \"latest\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.11.18\",\n \"abitype\": \"^0.6.7\",\n \"typescript\": \"^4.9.5\",\n \"viem\": \"0.1.6\"\n }\n }\n `;\n writeFileSync(\n path.join(rootDir, \"package.json\"),\n prettier.format(packageJson, { parser: \"json\" })\n );\n\n // Write the tsconfig.json file.\n const tsConfig = `\n {\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"rootDir\": \".\",\n \"paths\": {\n \"@/generated\": [\"./generated/index.ts\"]\n }\n },\n \"include\": [\"./**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n }\n `;\n writeFileSync(\n path.join(rootDir, \"tsconfig.json\"),\n prettier.format(tsConfig, { parser: \"json\" })\n );\n\n // Write the .gitignore file.\n writeFileSync(\n path.join(rootDir, \".gitignore\"),\n `node_modules/\\n.DS_Store\\n\\n.env.local\\n.ponder/\\ngenerated/`\n );\n\n const packageManager = await getPackageManager();\n\n // Install packages.\n console.log(pico.bold(`\\nInstalling with ${packageManager}.`));\n\n const installCommand = overrides.installCommand\n ? overrides.installCommand\n : `${packageManager} ${\n packageManager === \"npm\" ? \"--quiet\" : \"--silent\"\n } install`;\n\n execSync(installCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n\n // Intialize git repository\n process.chdir(rootDir);\n tryGitInit(rootDir);\n console.log(`\\nInitialized a git repository.`);\n\n // Run codegen.\n const runCommand = `${\n packageManager === \"npm\" ? `npm --quiet run` : `${packageManager} --silent`\n } codegen`;\n execSync(runCommand, {\n cwd: rootDir,\n stdio: \"inherit\",\n });\n console.log(`\\nGenerated types.`);\n\n console.log(\n pico.green(\"\\nSuccess! \") + `Created ${options.projectName} at ${rootDir}`\n );\n};\n","import { detect } from \"detect-package-manager\";\n\nexport function getPackageManager() {\n const userAgent = process.env.npm_config_user_agent;\n if (userAgent) {\n if (userAgent.includes(\"pnpm\")) return \"pnpm\";\n if (userAgent.includes(\"npm\")) return \"npm\";\n if (userAgent.includes(\"yarn\")) return \"yarn\";\n }\n return detect();\n}\n","/* eslint-disable no-empty */\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport rimraf from \"rimraf\";\n\n// File adapted from next.js\n// https://github.dev/vercel/next.js/blob/9ad1f321b7902542acd2be041fb2f15f023a0ed9/packages/create-next-app/helpers/git.ts\n\nfunction isInGitRepository(): boolean {\n try {\n execSync(\"git rev-parse --is-inside-work-tree\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nfunction isInMercurialRepository(): boolean {\n try {\n execSync(\"hg --cwd . root\", { stdio: \"ignore\" });\n return true;\n } catch (_) {}\n return false;\n}\n\nexport function tryGitInit(root: string): boolean {\n let didInit = false;\n try {\n execSync(\"git --version\", { stdio: \"ignore\" });\n if (isInGitRepository() || isInMercurialRepository()) {\n return false;\n }\n\n execSync(\"git init\", { stdio: \"ignore\" });\n didInit = true;\n\n execSync(\"git checkout -b main\", { stdio: \"ignore\" });\n\n execSync(\"git add -A\", { stdio: \"ignore\" });\n execSync('git commit -m \"chore: initial commit from create-ponder\"', {\n stdio: \"ignore\",\n });\n return true;\n } catch (e) {\n if (didInit) {\n try {\n rimraf.sync(path.join(root, \".git\"));\n } catch (_) {}\n }\n return false;\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport prettier from \"prettier\";\n\nimport type { PartialPonderConfig } from \"@/index\";\n\nexport const fromBasic = ({ rootDir }: { rootDir: string }) => {\n const abiFileContents = `[]`;\n\n const abiRelativePath = \"./abis/ExampleContract.json\";\n const abiAbsolutePath = path.join(rootDir, abiRelativePath);\n writeFileSync(abiAbsolutePath, abiFileContents);\n\n const schemaGraphqlFileContents = `\n type ExampleToken @entity {\n id: 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.47\",\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.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"description": "Tool to bootstrap a Ponder project",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "olias.eth",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"cac": "^6.7.14",
|
|
15
|
+
"detect-package-manager": "^2.0.1",
|
|
15
16
|
"execa": "5",
|
|
16
17
|
"node-fetch": "^2.6.7",
|
|
17
18
|
"picocolors": "^1.0.0",
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
"tsup": "^6.6.3",
|
|
30
31
|
"typescript": "^4.5.5",
|
|
31
32
|
"vitest": "^0.29.2",
|
|
32
|
-
"@ponder/core": "0.0.
|
|
33
|
+
"@ponder/core": "0.0.47"
|
|
33
34
|
},
|
|
34
35
|
"scripts": {
|
|
35
36
|
"build": "tsup-node",
|