From cd60ea615e577d5e0bf85b304d3980ed976e6ae7 Mon Sep 17 00:00:00 2001 From: Beepidibop <63800471+beepidibop@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:53:49 -0600 Subject: [PATCH 1/5] Add ContractTypesMap to artifacts.d.ts Add `ContractTypesMap` that returns `GetContractReturnType<${ctd.typeName}["abi"]>` to the `generateArtifactsDefinition()` and `generateDuplicateArtifactsDefinition()`. --- packages/hardhat-viem/src/internal/tasks.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/hardhat-viem/src/internal/tasks.ts b/packages/hardhat-viem/src/internal/tasks.ts index 7e053a051b..177b0e026d 100644 --- a/packages/hardhat-viem/src/internal/tasks.ts +++ b/packages/hardhat-viem/src/internal/tasks.ts @@ -164,6 +164,12 @@ declare module "hardhat/types/artifacts" { .map((name) => `${name}: never;`) .join("\n ")} } + + interface ContractTypesMap { + ${Array.from(duplicateContractNames) + .map((name) => `${name}: never;`) + .join("\n ")} + } } `; } @@ -260,6 +266,7 @@ function generateArtifactsDefinition( return `${AUTOGENERATED_FILE_PREFACE} import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; ${contractTypeData .map((ctd) => `import { ${ctd.typeName} } from "./${ctd.contractName}";`) @@ -274,6 +281,15 @@ declare module "hardhat/types/artifacts" { .map((ctd) => `["${ctd.fqn}"]: ${ctd.typeName};`) .join("\n ")} } + + interface ContractTypesMap { + ${contractTypeData + .map((ctd) => `["${ctd.contractName}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`) + .join("\n ")} + ${contractTypeData + .map((ctd) => `["${ctd.fqn}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`) + .join("\n ")} + } } `; } From 7625d6fd250da8853021bd5e93b9a163c999aca2 Mon Sep 17 00:00:00 2001 From: Beepidibop <63800471+beepidibop@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:16:03 -0600 Subject: [PATCH 2/5] update snapshots for adding ContractTypesMap --- .../type-generation/snapshots/artifacts.d.ts | 4 ++++ .../snapshots/contracts/A.sol/artifacts.d.ts | 8 ++++++++ .../snapshots/contracts/C.sol/artifacts.d.ts | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts index eeda088124..c01f03bcd3 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/artifacts.d.ts @@ -9,4 +9,8 @@ declare module "hardhat/types/artifacts" { interface ArtifactsMap { B: never; } + + interface ContractTypesMap { + B: never; + } } diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts index 18aea5c6b7..270ec057ef 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/A.sol/artifacts.d.ts @@ -4,6 +4,7 @@ // eslint-disable import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; import { A$Type } from "./A"; import { B$Type } from "./B"; @@ -15,4 +16,11 @@ declare module "hardhat/types/artifacts" { ["contracts/A.sol:A"]: A$Type; ["contracts/A.sol:B"]: B$Type; } + + interface ContractTypesMap { + ["A"]: GetContractReturnType; + ["B"]: GetContractReturnType; + ["contracts/A.sol:A"]: GetContractReturnType; + ["contracts/A.sol:B"]: GetContractReturnType; + } } diff --git a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts index 4994bfede7..1171b90f27 100644 --- a/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts +++ b/packages/hardhat-viem/test/fixture-projects/type-generation/snapshots/contracts/C.sol/artifacts.d.ts @@ -4,6 +4,7 @@ // eslint-disable import "hardhat/types/artifacts"; +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; import { B$Type } from "./B"; import { C$Type } from "./C"; @@ -15,4 +16,11 @@ declare module "hardhat/types/artifacts" { ["contracts/C.sol:B"]: B$Type; ["contracts/C.sol:C"]: C$Type; } + + interface ContractTypesMap { + ["B"]: GetContractReturnType; + ["C"]: GetContractReturnType; + ["contracts/C.sol:B"]: GetContractReturnType; + ["contracts/C.sol:C"]: GetContractReturnType; + } } From 830a78522cca45e356d4ea44e6f5ab4a2171167d Mon Sep 17 00:00:00 2001 From: Luis Schaab Date: Tue, 25 Jun 2024 13:36:43 -0300 Subject: [PATCH 3/5] Add readme section --- packages/hardhat-viem/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/hardhat-viem/README.md b/packages/hardhat-viem/README.md index a35c39d1f6..30e8aac08a 100644 --- a/packages/hardhat-viem/README.md +++ b/packages/hardhat-viem/README.md @@ -248,6 +248,18 @@ This allows you to deploy a contract linked to the `ExampleLib` library at the a To deploy a contract, all libraries must be linked. An error will be thrown if any libraries are missing. +#### Using `ContractTypesMap` for easier contract type imports + +To simplify importing contract types in `hardhat-viem`, you can use the `ContractTypesMap`. This map contains the contract types of all contracts in your project, indexed by their names. + +```typescript +import { ContractTypesMap } from "hardhat/types/artifacts"; + +const contract: ContractTypesMap["ContractName"]; +``` + +This reduces the need for multiple imports and makes your code cleaner and easier to manage. + ## Usage There are no additional steps you need to take for this plugin to work. From a8a603821aa46ce0c02ff8fa4b075e309c0c4c7d Mon Sep 17 00:00:00 2001 From: Luis Schaab Date: Tue, 25 Jun 2024 13:36:53 -0300 Subject: [PATCH 4/5] Add changeset --- .changeset/smooth-rabbits-wait.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/smooth-rabbits-wait.md diff --git a/.changeset/smooth-rabbits-wait.md b/.changeset/smooth-rabbits-wait.md new file mode 100644 index 0000000000..e4219e3841 --- /dev/null +++ b/.changeset/smooth-rabbits-wait.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/hardhat-viem": patch +--- + +Added `ContractTypesMap` to simplify contract type imports (thanks @beepidibop!) From 890bdee2d92e5eb039a521bf3d037ca3d4987e61 Mon Sep 17 00:00:00 2001 From: Luis Schaab Date: Tue, 25 Jun 2024 13:43:39 -0300 Subject: [PATCH 5/5] Fix lint --- packages/hardhat-viem/src/internal/tasks.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/hardhat-viem/src/internal/tasks.ts b/packages/hardhat-viem/src/internal/tasks.ts index 177b0e026d..a6bb4f2980 100644 --- a/packages/hardhat-viem/src/internal/tasks.ts +++ b/packages/hardhat-viem/src/internal/tasks.ts @@ -167,8 +167,8 @@ declare module "hardhat/types/artifacts" { interface ContractTypesMap { ${Array.from(duplicateContractNames) - .map((name) => `${name}: never;`) - .join("\n ")} + .map((name) => `${name}: never;`) + .join("\n ")} } } `; @@ -284,11 +284,17 @@ declare module "hardhat/types/artifacts" { interface ContractTypesMap { ${contractTypeData - .map((ctd) => `["${ctd.contractName}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`) - .join("\n ")} + .map( + (ctd) => + `["${ctd.contractName}"]: GetContractReturnType<${ctd.typeName}["abi"]>;` + ) + .join("\n ")} ${contractTypeData - .map((ctd) => `["${ctd.fqn}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`) - .join("\n ")} + .map( + (ctd) => + `["${ctd.fqn}"]: GetContractReturnType<${ctd.typeName}["abi"]>;` + ) + .join("\n ")} } } `;