From 74880bb5122f240ae97b8045904c222712c4ba96 Mon Sep 17 00:00:00 2001 From: Javad Khalilian Date: Wed, 13 Dec 2023 13:03:31 +0100 Subject: [PATCH 1/2] fix(pactjs-cli): fixed incorrect network by extracting chainId and networkId from the api field --- .changeset/proud-chairs-run.md | 5 ++++ .../pactjs-cli/src/contract-generate/index.ts | 12 +++++++-- .../src/contract-generate/tests/index.test.ts | 27 +++++++++++++++++++ .../pactjs-cli/src/contract-generate/utils.ts | 12 +++++++++ .../src/utils/retrieveContractFromChain.ts | 8 ++++-- 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 .changeset/proud-chairs-run.md create mode 100644 packages/tools/pactjs-cli/src/contract-generate/tests/index.test.ts create mode 100644 packages/tools/pactjs-cli/src/contract-generate/utils.ts diff --git a/.changeset/proud-chairs-run.md b/.changeset/proud-chairs-run.md new file mode 100644 index 0000000000..f642d3b1d8 --- /dev/null +++ b/.changeset/proud-chairs-run.md @@ -0,0 +1,5 @@ +--- +'@kadena/pactjs-cli': patch +--- + +Extract networkId and chainId from the api diff --git a/packages/tools/pactjs-cli/src/contract-generate/index.ts b/packages/tools/pactjs-cli/src/contract-generate/index.ts index bfd0dfcc2d..ea5b657ce0 100644 --- a/packages/tools/pactjs-cli/src/contract-generate/index.ts +++ b/packages/tools/pactjs-cli/src/contract-generate/index.ts @@ -3,6 +3,7 @@ import { Option } from 'commander'; import { z } from 'zod'; import type { networkMap } from '../utils/networkMap'; import { generate } from './generate'; +import { extractNetworkAndChain } from './utils'; export interface IContractGenerateOptions { clean?: boolean; @@ -33,7 +34,7 @@ const Options = z api: z.string().optional(), chain: z.number().optional(), namespace: z.string().optional(), - network: z.enum(['mainnet', 'testnet']), + network: z.string(), parseTreePath: z.string().optional(), }) .refine(({ file, contract }) => { @@ -101,7 +102,14 @@ export function contractGenerateCommand( ) .action((args: IContractGenerateOptions) => { try { - Options.parse(args); + const { api, ...rest } = args; + const { network, chain } = extractNetworkAndChain(api); + const updatedArgs = { + ...rest, + network: rest.network ?? network, + chain: rest.chain ?? chain, + }; + Options.parse(updatedArgs); } catch (e) { program.error( `${(e as z.ZodError).errors diff --git a/packages/tools/pactjs-cli/src/contract-generate/tests/index.test.ts b/packages/tools/pactjs-cli/src/contract-generate/tests/index.test.ts new file mode 100644 index 0000000000..d8685c9d5b --- /dev/null +++ b/packages/tools/pactjs-cli/src/contract-generate/tests/index.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from 'vitest'; +import { extractNetworkAndChain } from '../utils'; + +describe('extractNetworkAndChain', () => { + it('should return an empty object when api is undefined', () => { + const result = extractNetworkAndChain(undefined); + expect(result).toEqual({}); + }); + + it('should extract the network and chain from the api string', () => { + const api = '/chainweb/0.0/mainnet01/'; + const result = extractNetworkAndChain(api); + expect(result).toEqual({ network: 'mainnet01', chain: undefined }); + }); + + it('should return undefined for network and chain when api string does not match the pattern', () => { + const api = '/chainweb/0.0/'; + const result = extractNetworkAndChain(api); + expect(result).toEqual({ network: undefined, chain: undefined }); + }); + + it('should parse the chain number correctly when api string contains a different chain', () => { + const api = 'http://api.com/chainweb/0.0/testnet04/chain/2/pact'; + const result = extractNetworkAndChain(api); + expect(result).toEqual({ network: 'testnet04', chain: 2 }); + }); +}); diff --git a/packages/tools/pactjs-cli/src/contract-generate/utils.ts b/packages/tools/pactjs-cli/src/contract-generate/utils.ts new file mode 100644 index 0000000000..f35ee7d3e2 --- /dev/null +++ b/packages/tools/pactjs-cli/src/contract-generate/utils.ts @@ -0,0 +1,12 @@ +export function extractNetworkAndChain(api?: string): { + network?: string; + chain?: number; +} { + if (api === undefined) return {}; + const network = api.match(/\/chainweb\/\d+\.\d+\/(\w+)\//)?.[1]; + const chain = api.match(/\/chain\/(\d+)\//)?.[1]; + return { + network, + chain: chain !== undefined ? parseInt(chain, 10) : undefined, + }; +} diff --git a/packages/tools/pactjs-cli/src/utils/retrieveContractFromChain.ts b/packages/tools/pactjs-cli/src/utils/retrieveContractFromChain.ts index a06ebe1464..8d30752635 100644 --- a/packages/tools/pactjs-cli/src/utils/retrieveContractFromChain.ts +++ b/packages/tools/pactjs-cli/src/utils/retrieveContractFromChain.ts @@ -7,11 +7,15 @@ export async function retrieveContractFromChain( module: string, apiHost: string, chain: number | string, - network: keyof typeof networkMap, + network: string, ): Promise { const command = Pact.builder .execution(`(describe-module "${module}")`) - .setNetworkId(networkMap[network].network) + .setNetworkId( + network === 'testnet' || network === 'mainnet' + ? networkMap[network].network + : network, + ) .setMeta({ chainId: chain.toString() as ChainId }) .createTransaction(); From d57ade44e0a4247c76163c0ba6376f94b9598a73 Mon Sep 17 00:00:00 2001 From: Javad Khalilian Date: Thu, 14 Dec 2023 12:11:29 +0100 Subject: [PATCH 2/2] fix(pactjs-cli): add api --- packages/tools/pactjs-cli/src/contract-generate/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tools/pactjs-cli/src/contract-generate/index.ts b/packages/tools/pactjs-cli/src/contract-generate/index.ts index ea5b657ce0..3caf34bc31 100644 --- a/packages/tools/pactjs-cli/src/contract-generate/index.ts +++ b/packages/tools/pactjs-cli/src/contract-generate/index.ts @@ -106,6 +106,7 @@ export function contractGenerateCommand( const { network, chain } = extractNetworkAndChain(api); const updatedArgs = { ...rest, + api, network: rest.network ?? network, chain: rest.chain ?? chain, };