From 4032c837bd9ea7d57c1bc57ac8349ed73acc9fa8 Mon Sep 17 00:00:00 2001 From: Brice Date: Fri, 29 Nov 2024 17:13:52 +0800 Subject: [PATCH 01/10] fix: honor --contract-name and --start-block --- packages/cli/src/commands/add.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 86420c124..2a9266edc 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -136,8 +136,9 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - - startBlock ||= Number(await loadStartBlockForContract(network, address)).toString(); + if (startBlock === undefined) { + startBlock = Number(await loadStartBlockForContract(network, address)).toString(); + } } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { @@ -161,7 +162,7 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - contractName = await loadContractNameForAddress(network, address); + contractName ||= await loadContractNameForAddress(network, address); } catch (error) { // not asking user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { From a6e830dc7844a56608ffa5025db7dbbcd1481cdc Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 29 Nov 2024 13:29:03 -0500 Subject: [PATCH 02/10] Improve `startBlock` validation --- packages/cli/src/commands/add.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 2a9266edc..183276621 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -81,7 +81,7 @@ export default class AddCommand extends Command { if (isLocalHost) this.warn('`localhost` network detected, prompting user for inputs'); - let startBlock = startBlockFlag; + let startBlock = parseInt(startBlockFlag ?? '').toString(); let contractName = contractNameFlag; const entities = getEntities(manifest); @@ -136,9 +136,7 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - if (startBlock === undefined) { - startBlock = Number(await loadStartBlockForContract(network, address)).toString(); - } + startBlock ||= Number(await loadStartBlockForContract(network, address)).toString(); } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { @@ -161,7 +159,6 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - contractName ||= await loadContractNameForAddress(network, address); } catch (error) { // not asking user to do prompt in test environment From f8a4032dbd97ab712753d33eca07c284f59045de Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 29 Nov 2024 13:29:53 -0500 Subject: [PATCH 03/10] Add changeset --- .changeset/heavy-socks-cross.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/heavy-socks-cross.md diff --git a/.changeset/heavy-socks-cross.md b/.changeset/heavy-socks-cross.md new file mode 100644 index 000000000..264ba2711 --- /dev/null +++ b/.changeset/heavy-socks-cross.md @@ -0,0 +1,5 @@ +--- +'@graphprotocol/graph-cli': patch +--- + +Fix `graph add` flag parameters parsing From f5af1616bb7d6678505e429feaf9add397c11304 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 29 Nov 2024 13:50:20 -0500 Subject: [PATCH 04/10] Add `startBlock` to test case --- packages/cli/tests/cli/add.test.ts | 2 ++ packages/cli/tests/cli/add/expected/subgraph.yaml | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/cli/tests/cli/add.test.ts b/packages/cli/tests/cli/add.test.ts index f76e29df5..ab3137cc1 100644 --- a/packages/cli/tests/cli/add.test.ts +++ b/packages/cli/tests/cli/add.test.ts @@ -19,6 +19,8 @@ describe('Add command', () => { '0x2E645469f354BB4F5c8a05B3b30A929361cf77eC', '--contract-name', 'Gravatar', + '--start-block', + '6175244', '--abi', `${EXAMPLE_SUBGRAPH_PATH}/abis/Gravity.json`, ], diff --git a/packages/cli/tests/cli/add/expected/subgraph.yaml b/packages/cli/tests/cli/add/expected/subgraph.yaml index ec41bb25d..5756ec28c 100644 --- a/packages/cli/tests/cli/add/expected/subgraph.yaml +++ b/packages/cli/tests/cli/add/expected/subgraph.yaml @@ -32,6 +32,7 @@ dataSources: source: address: "0x2E645469f354BB4F5c8a05B3b30A929361cf77eC" abi: Gravatar + startBlock: 6175244 mapping: kind: ethereum/events apiVersion: 0.0.7 From 984cf70b0bc587b89d84c09f5e3a9f07212a6916 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 13 Dec 2024 14:37:41 -0500 Subject: [PATCH 05/10] Fix contract name uniqueness check --- packages/cli/src/commands/add.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 183276621..f0f658761 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -84,15 +84,6 @@ export default class AddCommand extends Command { let startBlock = parseInt(startBlockFlag ?? '').toString(); let contractName = contractNameFlag; - const entities = getEntities(manifest); - const contractNames = getContractNames(manifest); - if (contractNames.includes(contractName)) { - this.error( - `Datasource or template with name ${contractName} already exists, please choose a different name.`, - { exit: 1 }, - ); - } - let ethabi = null; if (abi) { ethabi = EthereumABI.load(contractName, abi); @@ -179,6 +170,15 @@ export default class AddCommand extends Command { } } + const entities = getEntities(manifest); + const contractNames = getContractNames(manifest); + if (contractNames.includes(contractName)) { + this.error( + `Datasource or template with name ${contractName} already exists, please choose a different name.`, + { exit: 1 }, + ); + } + await writeABI(ethabi, contractName); const { collisionEntities, onlyCollisions, abiData } = updateEventNamesOnCollision( From 65bbf1725347b436be8e55f442a71d66cf893391 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 13 Dec 2024 15:00:46 -0500 Subject: [PATCH 06/10] Parse `startBlockFlag` only if defined --- packages/cli/src/commands/add.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index f0f658761..f1eb44217 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -81,7 +81,7 @@ export default class AddCommand extends Command { if (isLocalHost) this.warn('`localhost` network detected, prompting user for inputs'); - let startBlock = parseInt(startBlockFlag ?? '').toString(); + let startBlock = startBlockFlag ? parseInt(startBlockFlag).toString() : startBlockFlag; let contractName = contractNameFlag; let ethabi = null; From 4df772a1ece5c0f7fa12ceb34de3182f6cf90757 Mon Sep 17 00:00:00 2001 From: Etienne Donneger Date: Fri, 13 Dec 2024 15:03:54 -0500 Subject: [PATCH 07/10] Fix lint --- renovate.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/renovate.json b/renovate.json index f815cdfe4..f56ae2213 100644 --- a/renovate.json +++ b/renovate.json @@ -16,11 +16,7 @@ "rebaseWhen": "conflicted", "packageRules": [ { - "excludePackagePatterns": [ - "typescript", - "typedoc*", - "^@theguild/" - ], + "excludePackagePatterns": ["typescript", "typedoc*", "^@theguild/"], "matchPackagePatterns": ["*"], "matchUpdateTypes": ["minor", "patch"], "groupName": "all non-major dependencies", From c6bc143d2822831d563f887e884279d22aabc455 Mon Sep 17 00:00:00 2001 From: YaroShkvorets Date: Sun, 15 Dec 2024 16:36:51 -0500 Subject: [PATCH 08/10] remove default value for `--contract-name` --- ...aphprotocol_graph-cli-1829-dependencies.md | 5 --- packages/cli/src/commands/add.ts | 36 +++++++++---------- 2 files changed, 17 insertions(+), 24 deletions(-) delete mode 100644 .changeset/@graphprotocol_graph-cli-1829-dependencies.md diff --git a/.changeset/@graphprotocol_graph-cli-1829-dependencies.md b/.changeset/@graphprotocol_graph-cli-1829-dependencies.md deleted file mode 100644 index 9ad443a35..000000000 --- a/.changeset/@graphprotocol_graph-cli-1829-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@graphprotocol/graph-cli": patch ---- -dependencies updates: - - Updated dependency [`prettier@3.4.2` ↗︎](https://www.npmjs.com/package/prettier/v/3.4.2) (from `3.4.1`, in `dependencies`) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 87164e659..7f66e3953 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -18,6 +18,8 @@ import EthereumABI from '../protocols/ethereum/abi.js'; import Protocol from '../protocols/index.js'; import Subgraph from '../subgraph.js'; +const DEFAULT_CONTRACT_NAME = 'Contract'; + export default class AddCommand extends Command { static description = 'Adds a new datasource to a subgraph.'; @@ -36,14 +38,14 @@ export default class AddCommand extends Command { char: 'h', }), abi: Flags.string({ - summary: 'Path to the contract ABI.', + summary: 'Path to the contract ABI. If not provided, will be fetched from contract API.', }), 'start-block': Flags.string({ - summary: 'The block number to start indexing events from.', + summary: + 'The block number to start indexing events from. If not provided, will be fetched from contract API', }), 'contract-name': Flags.string({ - summary: 'Name of the contract.', - default: 'Contract', + summary: 'Name of the contract. If not provided, will be fetched from contract API', }), 'merge-entities': Flags.boolean({ summary: 'Whether to merge entities with the same name.', @@ -80,7 +82,7 @@ export default class AddCommand extends Command { const contractService = new ContractService(registry); let startBlock = startBlockFlag ? parseInt(startBlockFlag).toString() : startBlockFlag; - let contractName = contractNameFlag; + let contractName = contractNameFlag || DEFAULT_CONTRACT_NAME; let ethabi = null; if (abi) { @@ -94,43 +96,36 @@ export default class AddCommand extends Command { 'Fetching ABI from contract API...', 'Failed to fetch ABI', 'Warning fetching ABI', - () => contractService?.getABI(EthereumABI, network, address), + () => contractService.getABI(EthereumABI, network, address), ), ); + if (!ethabi) throw Error; } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { - const { abi: abiFromFile } = await prompt.ask<{ abi: EthereumABI }>([ + const { abi: abiFile } = await prompt.ask<{ abi: string }>([ { type: 'input', name: 'abi', message: 'ABI file (path)', - initial: ethabi, validate: async (value: string) => { try { EthereumABI.load(contractName, value); return true; } catch (e) { - this.error(e.message); - } - }, - result: async (value: string) => { - try { - return EthereumABI.load(contractName, value); - } catch (e) { - return e.message; + return `Failed to load ABI from ${value}: ${e.message}`; } }, }, ]); - ethabi = abiFromFile; + ethabi = EthereumABI.load(contractName, abiFile); } } } try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - startBlock ||= Number(await contractService?.getStartBlock(network, address)).toString(); + startBlock ||= Number(await contractService.getStartBlock(network, address)).toString(); } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { @@ -153,7 +148,10 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - contractName = (await contractService?.getContractName(network, address)) ?? ''; + if (contractName === DEFAULT_CONTRACT_NAME) { + contractName = + (await contractService.getContractName(network, address)) ?? DEFAULT_CONTRACT_NAME; + } } catch (error) { // not asking user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { From 760d96fe11eb4b3bff3685267c672633d345e9b8 Mon Sep 17 00:00:00 2001 From: YaroShkvorets Date: Sun, 15 Dec 2024 22:13:19 -0500 Subject: [PATCH 09/10] fix add command exit --- packages/cli/src/commands/add.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 7f66e3953..617b1ed92 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -242,9 +242,11 @@ export default class AddCommand extends Command { }); } - await withSpinner('Running codegen', 'Failed to run codegen', 'Warning during codegen', () => - system.run(yarn ? 'yarn codegen' : 'npm run codegen'), + await withSpinner('Running codegen', 'Failed to run codegen', 'Warning during codegen', async () => + await system.run(yarn ? 'yarn codegen' : 'npm run codegen'), ); + + this.exit(0); } } From 3e4a299bd28b0bb5946a99a86c6d30eac19b24c3 Mon Sep 17 00:00:00 2001 From: YaroShkvorets Date: Sun, 15 Dec 2024 22:28:11 -0500 Subject: [PATCH 10/10] lint --- packages/cli/src/commands/add.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 617b1ed92..63a604025 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -242,8 +242,11 @@ export default class AddCommand extends Command { }); } - await withSpinner('Running codegen', 'Failed to run codegen', 'Warning during codegen', async () => - await system.run(yarn ? 'yarn codegen' : 'npm run codegen'), + await withSpinner( + 'Running codegen', + 'Failed to run codegen', + 'Warning during codegen', + async () => await system.run(yarn ? 'yarn codegen' : 'npm run codegen'), ); this.exit(0);