From a963e5cb3f7a5f76f335078ca433a73f40ef854c Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Wed, 25 Sep 2024 14:41:54 +0900 Subject: [PATCH 1/5] loaders: Add loaderResult type --- src/loaders.ts | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/loaders.ts b/src/loaders.ts index 3e37ae2..dfa13b9 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -60,7 +60,7 @@ export type ContractResult = { * * @experimental */ - loaderResult?: any; + loaderResult?: EtherscanContractResult | ContractMetadata | any; } /** @@ -199,7 +199,7 @@ export class EtherscanABILoader implements ABILoader { throw new Error(r.result); // This gets wrapped below } - const result = r.result[0]; + const result = r.result[0] as EtherscanContractResult; return { abi: JSON.parse(result.ABI), name: result.ContractName, @@ -255,6 +255,23 @@ export class EtherscanABILoader implements ABILoader { export class EtherscanABILoaderError extends errors.LoaderError { }; +// Etherscan Contract Source API response +export type EtherscanContractResult = { + SourceCode: string; + ABI: string; + ContractName: string; + CompilerVersion: string; + OptimizationUsed: number; + Runs: number; + ConstructorArguments: string; + EVMVersion: string; + Library: string; + LicenseType: string; + Proxy: "1" | "0"; + Implementation: string; + SwarmSource: string; +} + function isSourcifyNotFound(error: any): boolean { return ( @@ -288,7 +305,7 @@ export class SourcifyABILoader implements ABILoader { if (metadata === undefined) throw new SourcifyABILoaderError("metadata.json not found"); // Note: Sometimes metadata.json contains sources, but not always. So we can't rely on just the metadata.json - const m = JSON.parse(metadata.content); + const m = JSON.parse(metadata.content) as ContractMetadata; // Sourcify includes a title from the Natspec comments let name = m.output.devdoc?.title; @@ -380,6 +397,27 @@ export class SourcifyABILoader implements ABILoader { export class SourcifyABILoaderError extends errors.LoaderError { }; +interface ContractMetadata { + compiler: { + version: string; + }; + language: string; + output: { + abi: any[]; + devdoc: any; + userdoc: any; + }; + settings: { + compilationTarget: Record; + evmVersion: string; + libraries: Record; + metadata: Record; + optimizer: any; + remappings: string[]; + }; + sources: Record; + version: number; +} export interface SignatureLookup { loadFunctions(selector: string): Promise; From ec7f1a0382cb33a1890a4ba000379b05f9eeb7c2 Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Wed, 25 Sep 2024 18:20:44 +0900 Subject: [PATCH 2/5] loaders: Rename Sourcify metadata type --- src/loaders.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/loaders.ts b/src/loaders.ts index dfa13b9..7837b54 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -60,7 +60,7 @@ export type ContractResult = { * * @experimental */ - loaderResult?: EtherscanContractResult | ContractMetadata | any; + loaderResult?: EtherscanContractResult | SourcifyContractMetadata | any; } /** @@ -305,7 +305,7 @@ export class SourcifyABILoader implements ABILoader { if (metadata === undefined) throw new SourcifyABILoaderError("metadata.json not found"); // Note: Sometimes metadata.json contains sources, but not always. So we can't rely on just the metadata.json - const m = JSON.parse(metadata.content) as ContractMetadata; + const m = JSON.parse(metadata.content) as SourcifyContractMetadata; // Sourcify includes a title from the Natspec comments let name = m.output.devdoc?.title; @@ -397,15 +397,16 @@ export class SourcifyABILoader implements ABILoader { export class SourcifyABILoaderError extends errors.LoaderError { }; -interface ContractMetadata { +// Contract metadata from Sourcify +interface SourcifyContractMetadata { compiler: { version: string; }; language: string; output: { abi: any[]; - devdoc: any; - userdoc: any; + devdoc?: any; + userdoc?: any; }; settings: { compilationTarget: Record; From dfec2a8c6016dfc62e4a5791c06c5531fd7feb2b Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Wed, 25 Sep 2024 20:03:18 +0900 Subject: [PATCH 3/5] loaders: Export SourcifyContractMetadata --- src/loaders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders.ts b/src/loaders.ts index 7837b54..7e1a1e5 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -398,7 +398,7 @@ export class SourcifyABILoader implements ABILoader { export class SourcifyABILoaderError extends errors.LoaderError { }; // Contract metadata from Sourcify -interface SourcifyContractMetadata { +export interface SourcifyContractMetadata { compiler: { version: string; }; From 02c212af02e2603e02d8e0c684c8455693a523a4 Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Thu, 26 Sep 2024 00:44:10 +0900 Subject: [PATCH 4/5] Update src/loaders.ts Co-authored-by: Andrey Petrov --- src/loaders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders.ts b/src/loaders.ts index 7e1a1e5..8ec4d78 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -255,7 +255,7 @@ export class EtherscanABILoader implements ABILoader { export class EtherscanABILoaderError extends errors.LoaderError { }; -// Etherscan Contract Source API response +/// Etherscan Contract Source API response export type EtherscanContractResult = { SourceCode: string; ABI: string; From 478d838bda399ee88f7f8fedcc7b0f04da035c85 Mon Sep 17 00:00:00 2001 From: Yota Hamada Date: Thu, 26 Sep 2024 00:44:16 +0900 Subject: [PATCH 5/5] Update src/loaders.ts Co-authored-by: Andrey Petrov --- src/loaders.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders.ts b/src/loaders.ts index 8ec4d78..cb09465 100644 --- a/src/loaders.ts +++ b/src/loaders.ts @@ -397,7 +397,7 @@ export class SourcifyABILoader implements ABILoader { export class SourcifyABILoaderError extends errors.LoaderError { }; -// Contract metadata from Sourcify +/// Sourcify Contract metadata from API response export interface SourcifyContractMetadata { compiler: { version: string;