Repository: NomicFoundation/hardhat-ignition
Pull request #681 (2024-01-25 18:18:51)

Release:2024-01-25
## 0.13.2 - 2024-01-25

### Fixed

- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667))

### Added

- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642))
- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673))


Patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 760e09ed..1564b461 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -22,7 +22,7 @@ jobs:
       - name: Build
         run: npm run build
       - name: Run tests
-        run: npm run test
+        run: npm run test:coverage
       - name: Run tests in examples
         run: npm run test:examples
 
@@ -40,7 +40,7 @@ jobs:
       - name: Build
         run: npm run build
       - name: Run tests
-        run: npm run test
+        run: npm run test:coverage
       - name: Run tests in examples
         run: npm run test:examples
 
@@ -61,7 +61,7 @@ jobs:
       - name: Build
         run: npm run build
       - name: Run tests
-        run: npm run test
+        run: npm run test:coverage
       - name: Run tests in examples
         run: npm run test:examples
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1fdefcb8..b24586e0 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,7 +4,7 @@ This document contains some tips on how to collaborate in this project.
 
 ## Filing an issue
 
-If you find a bug or want to propose a new feature, please open an issue. Pull requests are welcome, but we recommend you discuss it in an issue first, especially for big changes. This will increase the odds that we can accept your PR.
+If you find a bug or want to propose a new feature, please [open an issue](https://github.com/nomicfoundation/hardhat-ignition/issues/new). Pull requests are welcome, but we recommend you discuss it in an issue first, especially for big changes. This will increase the odds that we can accept your PR.
 
 ## Project Structure
 
@@ -60,12 +60,26 @@ npm run lint
 
 ## Clean
 
-If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from clean:
+If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from a clean slate:
 
 ```shell
 npm run clean
 ```
 
+## Branching
+
+We work on two branches, [main](https://github.com/nomicfoundation/hardhat-ignition/tree/main) and [development](https://github.com/nomicfoundation/hardhat-ignition/tree/development).
+
+The development branch is the default branch. It's where we merge all pull requests and is the branch that all contributing PRs should be based on.
+
+The main branch is meant to be kept in sync with the latest released version of each package. It's where we publish new releases from, and should only be merged into when a new release is being made.
+
+### Documentation
+
+Ignition's documentation lives inside the [main Hardhat repo](https://github.com/nomicfoundation/hardhat/tree/main). If your change requires a documentation change, please submit a separate PR to the Hardhat repo, following their contributing guidelines, and link to it from your PR.
+
+If you are working purely on the documentation, not as a result of a technical change, you should submit a PR to the Hardhat repo directly.
+
 ## Publish
 
 To publish ignition:
diff --git a/examples/complete/package.json b/examples/complete/package.json
index da4c7144..9e021988 100644
--- a/examples/complete/package.json
+++ b/examples/complete/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@nomicfoundation/ignition-complete-example",
   "private": true,
-  "version": "0.13.1",
+  "version": "0.13.2",
   "scripts": {
     "test": "hardhat test",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -10,7 +10,7 @@
     "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\""
   },
   "devDependencies": {
-    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
     "@nomicfoundation/hardhat-toolbox": "4.0.0",
     "hardhat": "^2.18.0",
     "prettier-plugin-solidity": "1.1.3"
diff --git a/examples/ens/package.json b/examples/ens/package.json
index 7f4e1296..29b3b5f1 100644
--- a/examples/ens/package.json
+++ b/examples/ens/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@nomicfoundation/ignition-ens-example",
   "private": true,
-  "version": "0.13.1",
+  "version": "0.13.2",
   "scripts": {
     "test": "hardhat test",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -10,7 +10,7 @@
     "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\""
   },
   "devDependencies": {
-    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
     "@nomicfoundation/hardhat-toolbox": "4.0.0",
     "hardhat": "^2.18.0",
     "prettier-plugin-solidity": "1.1.3"
diff --git a/examples/sample/package.json b/examples/sample/package.json
index 3c630a0d..8eac6c8f 100644
--- a/examples/sample/package.json
+++ b/examples/sample/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@nomicfoundation/ignition-sample-example",
   "private": true,
-  "version": "0.13.1",
+  "version": "0.13.2",
   "scripts": {
     "test": "hardhat test",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -10,7 +10,7 @@
     "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\""
   },
   "devDependencies": {
-    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
     "@nomicfoundation/hardhat-toolbox": "4.0.0",
     "hardhat": "^2.18.0",
     "prettier-plugin-solidity": "1.1.3"
diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json
index 23cacccb..d9660d81 100644
--- a/examples/ts-sample/package.json
+++ b/examples/ts-sample/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@nomicfoundation/ignition-ts-sample-example",
   "private": true,
-  "version": "0.13.1",
+  "version": "0.13.2",
   "scripts": {
     "test": "hardhat test",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -10,7 +10,7 @@
     "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\""
   },
   "devDependencies": {
-    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
     "@nomicfoundation/hardhat-toolbox": "4.0.0",
     "hardhat": "^2.18.0",
     "prettier-plugin-solidity": "1.1.3"
diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json
index 5a88d0e2..bf6d28fb 100644
--- a/examples/viem-sample/package.json
+++ b/examples/viem-sample/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@nomicfoundation/ignition-viem-sample-example",
   "private": true,
-  "version": "0.13.1",
+  "version": "0.13.2",
   "scripts": {
     "test": "hardhat test",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -10,7 +10,7 @@
     "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\""
   },
   "devDependencies": {
-    "@nomicfoundation/hardhat-ignition-viem": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition-viem": "^0.13.2",
     "@nomicfoundation/hardhat-toolbox-viem": "2.0.0",
     "hardhat": "^2.18.0",
     "prettier-plugin-solidity": "1.1.3"
diff --git a/package-lock.json b/package-lock.json
index 42a115af..29a90c3b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -56,9 +56,9 @@
     },
     "examples/complete": {
       "name": "@nomicfoundation/ignition-complete-example",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "devDependencies": {
-        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
         "@nomicfoundation/hardhat-toolbox": "4.0.0",
         "hardhat": "^2.18.0",
         "prettier-plugin-solidity": "1.1.3"
@@ -66,12 +66,12 @@
     },
     "examples/ens": {
       "name": "@nomicfoundation/ignition-ens-example",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "dependencies": {
         "@ensdomains/ens-contracts": "0.0.11"
       },
       "devDependencies": {
-        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
         "@nomicfoundation/hardhat-toolbox": "4.0.0",
         "hardhat": "^2.18.0",
         "prettier-plugin-solidity": "1.1.3"
@@ -79,9 +79,9 @@
     },
     "examples/sample": {
       "name": "@nomicfoundation/ignition-sample-example",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "devDependencies": {
-        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
         "@nomicfoundation/hardhat-toolbox": "4.0.0",
         "hardhat": "^2.18.0",
         "prettier-plugin-solidity": "1.1.3"
@@ -89,9 +89,9 @@
     },
     "examples/ts-sample": {
       "name": "@nomicfoundation/ignition-ts-sample-example",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "devDependencies": {
-        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2",
         "@nomicfoundation/hardhat-toolbox": "4.0.0",
         "hardhat": "^2.18.0",
         "prettier-plugin-solidity": "1.1.3"
@@ -99,9 +99,9 @@
     },
     "examples/viem-sample": {
       "name": "@nomicfoundation/ignition-viem-sample-example",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "devDependencies": {
-        "@nomicfoundation/hardhat-ignition-viem": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition-viem": "^0.13.2",
         "@nomicfoundation/hardhat-toolbox-viem": "2.0.0",
         "hardhat": "^2.18.0",
         "prettier-plugin-solidity": "1.1.3"
@@ -19860,7 +19860,7 @@
     },
     "packages/core": {
       "name": "@nomicfoundation/ignition-core",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "license": "MIT",
       "dependencies": {
         "@ethersproject/address": "5.6.1",
@@ -19912,11 +19912,11 @@
     },
     "packages/hardhat-plugin": {
       "name": "@nomicfoundation/hardhat-ignition",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "license": "MIT",
       "dependencies": {
-        "@nomicfoundation/ignition-core": "^0.13.1",
-        "@nomicfoundation/ignition-ui": "^0.13.1",
+        "@nomicfoundation/ignition-core": "^0.13.2",
+        "@nomicfoundation/ignition-ui": "^0.13.2",
         "chalk": "^4.0.0",
         "debug": "^4.3.2",
         "fs-extra": "^10.0.0",
@@ -19937,7 +19937,7 @@
     },
     "packages/hardhat-plugin-ethers": {
       "name": "@nomicfoundation/hardhat-ignition-ethers",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "license": "MIT",
       "devDependencies": {
         "@nomicfoundation/hardhat-ethers": "^3.0.4",
@@ -19947,15 +19947,15 @@
       },
       "peerDependencies": {
         "@nomicfoundation/hardhat-ethers": "^3.0.4",
-        "@nomicfoundation/hardhat-ignition": "^0.13.1",
-        "@nomicfoundation/ignition-core": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition": "^0.13.2",
+        "@nomicfoundation/ignition-core": "^0.13.2",
         "ethers": "^6.7.0",
         "hardhat": "^2.18.0"
       }
     },
     "packages/hardhat-plugin-viem": {
       "name": "@nomicfoundation/hardhat-ignition-viem",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "license": "MIT",
       "devDependencies": {
         "@nomicfoundation/hardhat-viem": "^1.0.0",
@@ -19964,9 +19964,9 @@
         "@types/sinon": "^10.0.13"
       },
       "peerDependencies": {
-        "@nomicfoundation/hardhat-ignition": "^0.13.1",
+        "@nomicfoundation/hardhat-ignition": "^0.13.2",
         "@nomicfoundation/hardhat-viem": "^1.0.0",
-        "@nomicfoundation/ignition-core": "^0.13.1",
+        "@nomicfoundation/ignition-core": "^0.13.2",
         "hardhat": "^2.18.0",
         "viem": "^1.18.1"
       }
@@ -20005,10 +20005,10 @@
     },
     "packages/ui": {
       "name": "@nomicfoundation/ignition-ui",
-      "version": "0.13.1",
+      "version": "0.13.2",
       "devDependencies": {
         "@fontsource/roboto": "^5.0.8",
-        "@nomicfoundation/ignition-core": "^0.13.1",
+        "@nomicfoundation/ignition-core": "^0.13.2",
         "@types/chai": "^4.2.22",
         "@types/chai-as-promised": "^7.1.5",
         "@types/react": "^18.0.28",
diff --git a/packages/core/.npmignore b/packages/core/.npmignore
index 7de3b8a1..be9a7c52 100644
--- a/packages/core/.npmignore
+++ b/packages/core/.npmignore
@@ -6,10 +6,11 @@ coverage/
 .nycrc
 .prettierignore
 .prettierrc
+src/
 !dist
+!dist/src
 dist/test
 dist/test-integrations
 test/
-src/
 temp
 test-integrations/
diff --git a/packages/core/.nycrc b/packages/core/.nycrc
index a511180e..05a77b2b 100644
--- a/packages/core/.nycrc
+++ b/packages/core/.nycrc
@@ -1,19 +1,12 @@
 {
   "extends": "@istanbuljs/nyc-config-typescript",
   "check-coverage": true,
-  "statements": 35,
-  "branches": 25,
-  "functions": 30,
-  "lines": 35,
+  "statements": 80,
+  "branches": 65,
+  "functions": 75,
+  "lines": 75,
   "all": true,
-  "include": [
-    "src/**/*.ts"
-  ],
-  "reporter": [
-    "html",
-    "lcov",
-    "text",
-    "text-summary"
-  ],
+  "include": ["src/**/*.ts"],
+  "reporter": ["html", "lcov", "text", "text-summary"],
   "report-dir": "coverage"
 }
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index 2ddc2a9d..ca214539 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.13.2 - 2024-01-25
+
+### Fixed
+
+- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667))
+
+### Added
+
+- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642))
+- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673))
+
 ## 0.13.1 - 2023-12-19
 
 ### Fixed
diff --git a/packages/core/package.json b/packages/core/package.json
index 666c5b96..f82c747e 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@nomicfoundation/ignition-core",
-  "version": "0.13.1",
+  "version": "0.13.2",
   "license": "MIT",
   "author": "Nomic Foundation",
   "homepage": "https://hardhat.org",
diff --git a/packages/core/src/build-module.ts b/packages/core/src/build-module.ts
index 5d1a4b9b..30f37a30 100644
--- a/packages/core/src/build-module.ts
+++ b/packages/core/src/build-module.ts
@@ -1,5 +1,5 @@
 import { IgnitionError } from "./errors";
-import { ERRORS } from "./errors-list";
+import { ERRORS } from "./internal/errors-list";
 import { ModuleConstructor } from "./internal/module-builder";
 import { isValidIgnitionIdentifier } from "./internal/utils/identifier-validators";
 import { IgnitionModule, IgnitionModuleResult } from "./types/module";
diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts
index 82caf6b1..62ba6b88 100644
--- a/packages/core/src/deploy.ts
+++ b/packages/core/src/deploy.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "./errors";
-import { ERRORS } from "./errors-list";
 import {
   DEFAULT_AUTOMINE_REQUIRED_CONFIRMATIONS,
   defaultConfig,
@@ -7,6 +6,7 @@ import {
 import { Deployer } from "./internal/deployer";
 import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemeral-deployment-loader";
 import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader";
+import { ERRORS } from "./internal/errors-list";
 import { BasicExecutionStrategy } from "./internal/execution/basic-execution-strategy";
 import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client";
 import { equalAddresses } from "./internal/execution/utils/address";
diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts
index 65147342..c3fe5747 100644
--- a/packages/core/src/errors.ts
+++ b/packages/core/src/errors.ts
@@ -1,10 +1,11 @@
-import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list";
+import { ERRORS, getErrorCode } from "./internal/errors-list";
+import { ErrorDescriptor } from "./types/errors";
 
 /**
  * Base error class extended by all custom errors.
  * Placeholder to allow us to customize error output formatting in the future.
  *
- * @alpha
+ * @beta
  */
 export class CustomError extends Error {
   constructor(message: string, cause?: Error) {
@@ -17,7 +18,7 @@ export class CustomError extends Error {
  * All exceptions intentionally thrown with Ignition-core
  * extend this class.
  *
- * @alpha
+ * @beta
  */
 export class IgnitionError extends CustomError {
   // We store the error descriptor as private field to avoid
@@ -35,9 +36,10 @@ export class IgnitionError extends CustomError {
     cause?: Error
   ) {
     const prefix = `${getErrorCode(errorDescriptor)}: `;
-    const formattedMessage = applyErrorMessageTemplate(
+    const formattedMessage = _applyErrorMessageTemplate(
       errorDescriptor.message,
-      messageArguments
+      messageArguments,
+      false
     );
 
     super(prefix + formattedMessage, cause);
@@ -53,7 +55,7 @@ export class IgnitionError extends CustomError {
 /**
  * This class is used to throw errors from Ignition plugins made by third parties.
  *
- * @alpha
+ * @beta
  */
 export class IgnitionPluginError extends CustomError {
   public static isIgnitionPluginError(
@@ -80,7 +82,7 @@ export class IgnitionPluginError extends CustomError {
  * This class is used to throw errors from *core* Ignition plugins.
  * If you are developing a third-party plugin, use IgnitionPluginError instead.
  *
- * @alpha
+ * @beta
  */
 export class NomicIgnitionPluginError extends IgnitionPluginError {
   public static isNomicIgnitionPluginError(
@@ -96,30 +98,6 @@ export class NomicIgnitionPluginError extends IgnitionPluginError {
   private readonly _isNomicIgnitionPluginError = true;
 }
 
-/**
- * This function applies error messages templates like this:
- *
- *  - Template is a string which contains a variable tags. A variable tag is a
- *    a variable name surrounded by %. Eg: %plugin1%
- *  - A variable name is a string of alphanumeric ascii characters.
- *  - Every variable tag is replaced by its value.
- *  - %% is replaced by %.
- *  - Values can't contain variable tags.
- *  - If a variable is not present in the template, but present in the values
- *    object, an error is thrown.
- *
- * @param template - The template string.
- * @param values - A map of variable names to their values.
- *
- * @alpha
- */
-export function applyErrorMessageTemplate(
-  template: string,
-  values: { [templateVar: string]: any }
-): string {
-  return _applyErrorMessageTemplate(template, values, false);
-}
-
 function _applyErrorMessageTemplate(
   template: string,
   values: { [templateVar: string]: any },
diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts
index b55c5963..ceb475f8 100644
--- a/packages/core/src/ignition-module-serializer.ts
+++ b/packages/core/src/ignition-module-serializer.ts
@@ -1,5 +1,5 @@
 import { IgnitionError } from "./errors";
-import { ERRORS } from "./errors-list";
+import { ERRORS } from "./internal/errors-list";
 import {
   AccountRuntimeValueImplementation,
   ArtifactContractAtFutureImplementation,
@@ -804,7 +804,7 @@ export class IgnitionModuleDeserializer {
               )
             ? (this._deserializeModuleParameterRuntimeValue(
                 serializedFuture.address
-              ) as ModuleParameterRuntimeValue<string>) // This is unsafe, but we only serialize valid valus
+              ) as ModuleParameterRuntimeValue<string>) // This is unsafe, but we only serialize valid values
             : serializedFuture.address,
           serializedFuture.artifact
         );
@@ -839,7 +839,7 @@ export class IgnitionModuleDeserializer {
             : this._isSerializedModuleParameterRuntimeValue(serializedFuture.to)
             ? (this._deserializeModuleParameterRuntimeValue(
                 serializedFuture.to
-              ) as ModuleParameterRuntimeValue<string>) // This is unsafe, but we only serialize valid valus
+              ) as ModuleParameterRuntimeValue<string>) // This is unsafe, but we only serialize valid values
             : this._isSerializedAccountRuntimeValue(serializedFuture.to)
             ? this._deserializeAccountRuntimeValue(serializedFuture.to)
             : serializedFuture.to,
@@ -897,10 +897,24 @@ export class IgnitionModuleDeserializer {
   ): ModuleParameterRuntimeValue<ModuleParameterType> {
     let defaultValue: ModuleParameterType | undefined;
     if (serialized.defaultValue !== undefined) {
-      // We cast here because we receive an `unknow`, but we known it came from serializing a ModuleParameterType
-      defaultValue = this._jsonParseWithBigint(
+      // We cast here because we receive an `unknown`, but we known it came from
+      // serializing a ModuleParameterType
+      const parsedDefaultValue = this._jsonParseWithBigint(
         serialized.defaultValue
-      ) as ModuleParameterType;
+      );
+
+      if (
+        typeof parsedDefaultValue === "object" &&
+        parsedDefaultValue !== null &&
+        "accountIndex" in parsedDefaultValue &&
+        typeof parsedDefaultValue.accountIndex === "number"
+      ) {
+        defaultValue = new AccountRuntimeValueImplementation(
+          parsedDefaultValue.accountIndex
+        );
+      } else {
+        defaultValue = parsedDefaultValue as ModuleParameterType;
+      }
     }
 
     return new ModuleParameterRuntimeValueImplementation(
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 4d260e19..dbbe347f 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -2,13 +2,13 @@ export { batches } from "./batches";
 export { buildModule } from "./build-module";
 export { deploy } from "./deploy";
 export * from "./errors";
-export { ErrorDescriptor } from "./errors-list";
 export { IgnitionModuleSerializer } from "./ignition-module-serializer";
 export { formatSolidityParameter } from "./internal/formatters";
 export { status } from "./status";
 export * from "./type-guards";
 export * from "./types/artifact";
 export * from "./types/deploy";
+export * from "./types/errors";
 export * from "./types/execution-events";
 export * from "./types/module";
 export * from "./types/module-builder";
diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts
index 371536c6..b8c25ce0 100644
--- a/packages/core/src/internal/deployer.ts
+++ b/packages/core/src/internal/deployer.ts
@@ -1,7 +1,6 @@
 import type { IgnitionModule, IgnitionModuleResult } from "../types/module";
 
 import { IgnitionError } from "../errors";
-import { ERRORS } from "../errors-list";
 import { isContractFuture } from "../type-guards";
 import { ArtifactResolver } from "../types/artifact";
 import {
@@ -20,6 +19,7 @@ import {
 
 import { Batcher } from "./batcher";
 import { DeploymentLoader } from "./deployment-loader/types";
+import { ERRORS } from "./errors-list";
 import {
   initializeDeploymentState,
   loadDeploymentState,
diff --git a/packages/core/src/errors-list.ts b/packages/core/src/internal/errors-list.ts
similarity index 97%
rename from packages/core/src/errors-list.ts
rename to packages/core/src/internal/errors-list.ts
index 0d00a48a..b8cbb08c 100644
--- a/packages/core/src/errors-list.ts
+++ b/packages/core/src/internal/errors-list.ts
@@ -1,16 +1,6 @@
-export const ERROR_PREFIX = "IGN";
+import { ErrorDescriptor } from "../types/errors";
 
-/**
- * ErrorDescriptor is a type that describes an error.
- * It's used to generate error codes and messages.
- *
- * @beta
- */
-export interface ErrorDescriptor {
-  number: number;
-  // Message can use templates. See applyErrorMessageTemplate
-  message: string;
-}
+export const ERROR_PREFIX = "IGN";
 
 export function getErrorCode(error: ErrorDescriptor): string {
   return `${ERROR_PREFIX}${error.number}`;
diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts
index 1e1a27d4..3e80188e 100644
--- a/packages/core/src/internal/execution/abi.ts
+++ b/packages/core/src/internal/execution/abi.ts
@@ -8,9 +8,9 @@ import type {
 } from "ethers";
 
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
 import { Artifact } from "../../types/artifact";
 import { ArgumentType, SolidityParameterType } from "../../types/module";
+import { ERRORS } from "../errors-list";
 import { assertIgnitionInvariant } from "../utils/assertions";
 
 import { linkLibraries } from "./libraries";
diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts
index 2f9638ae..a0528271 100644
--- a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts
+++ b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts
@@ -1,5 +1,7 @@
+import setupDebug from "debug";
+
 import { IgnitionError } from "../../../../errors";
-import { ERRORS } from "../../../../errors-list";
+import { ERRORS } from "../../../errors-list";
 import { assertIgnitionInvariant } from "../../../utils/assertions";
 import { JsonRpcClient } from "../../jsonrpc-client";
 import { TransactionTrackingTimer } from "../../transaction-tracking-timer";
@@ -8,13 +10,24 @@ import {
   DeploymentExecutionState,
   SendDataExecutionState,
 } from "../../types/execution-state";
+import { Transaction } from "../../types/jsonrpc";
 import {
   JournalMessageType,
   OnchainInteractionBumpFeesMessage,
   OnchainInteractionTimeoutMessage,
   TransactionConfirmMessage,
 } from "../../types/messages";
-import { NetworkInteractionType } from "../../types/network-interaction";
+import {
+  NetworkInteractionType,
+  OnchainInteraction,
+} from "../../types/network-interaction";
+
+const debug = setupDebug("hardhat-ignition:onchain-interaction-monitor");
+
+export interface GetTransactionRetryConfig {
+  maxRetries: number;
+  retryInterval: number;
+}
 
 /**
  * Checks the transactions of the latest network interaction of the execution state,
@@ -51,7 +64,11 @@ export async function monitorOnchainInteraction(
   transactionTrackingTimer: TransactionTrackingTimer,
   requiredConfirmations: number,
   millisecondBeforeBumpingFees: number,
-  maxFeeBumps: number
+  maxFeeBumps: number,
+  getTransactionRetryConfig: GetTransactionRetryConfig = {
+    maxRetries: 10,
+    retryInterval: 1000,
+  }
 ): Promise<
   | TransactionConfirmMessage
   | OnchainInteractionBumpFeesMessage
@@ -75,14 +92,13 @@ export async function monitorOnchainInteraction(
     `No transaction found in OnchainInteraction ${exState.id}/${lastNetworkInteraction.id} when trying to check its transactions`
   );
 
-  const transactions = await Promise.all(
-    lastNetworkInteraction.transactions.map((tx) =>
-      jsonRpcClient.getTransaction(tx.hash)
-    )
+  const transaction = await _getTransactionWithRetry(
+    jsonRpcClient,
+    lastNetworkInteraction,
+    getTransactionRetryConfig,
+    exState.id
   );
 
-  const transaction = transactions.find((tx) => tx !== undefined);
-
   // We do not try to recover from dopped transactions mid-execution
   if (transaction === undefined) {
     throw new IgnitionError(ERRORS.EXECUTION.DROPPED_TRANSACTION, {
@@ -141,3 +157,45 @@ export async function monitorOnchainInteraction(
     networkInteractionId: lastNetworkInteraction.id,
   };
 }
+
+async function _getTransactionWithRetry(
+  jsonRpcClient: JsonRpcClient,
+  onchainInteraction: OnchainInteraction,
+  retryConfig: GetTransactionRetryConfig,
+  futureId: string
+): Promise<Transaction | undefined> {
+  let transaction: Transaction | undefined;
+
+  // Small retry loop for up to X seconds to handle blockchain nodes
+  // that are slow to propagate transactions.
+  // See https://github.com/NomicFoundation/hardhat-ignition/issues/665
+  for (let i = 0; i < retryConfig.maxRetries; i++) {
+    debug(
+      `Retrieving transaction for interaction ${futureId}/${
+        onchainInteraction.id
+      } from mempool (attempt ${i + 1}/${retryConfig.maxRetries})`
+    );
+
+    const transactions = await Promise.all(
+      onchainInteraction.transactions.map((tx) =>
+        jsonRpcClient.getTransaction(tx.hash)
+      )
+    );
+
+    transaction = transactions.find((tx) => tx !== undefined);
+
+    if (transaction !== undefined) {
+      break;
+    }
+
+    debug(
+      `Transaction lookup for ${futureId}/${onchainInteraction.id} not found in mempool, waiting ${retryConfig.retryInterval} seconds before retrying`
+    );
+
+    await new Promise((resolve) =>
+      setTimeout(resolve, retryConfig.retryInterval)
+    );
+  }
+
+  return transaction;
+}
diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts
index 9dc540f6..09b810cd 100644
--- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts
+++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts
@@ -55,7 +55,8 @@ export async function buildInitializeMessageFor(
             value: resolveValue(
               future.value,
               deploymentParameters,
-              deploymentState
+              deploymentState,
+              accounts
             ),
             from: resolveFutureFrom(future.from, accounts, defaultSender),
           }
@@ -103,7 +104,8 @@ export async function buildInitializeMessageFor(
             value: resolveValue(
               future.value,
               deploymentParameters,
-              deploymentState
+              deploymentState,
+              accounts
             ),
             from: resolveFutureFrom(future.from, accounts, defaultSender),
           }
@@ -150,7 +152,8 @@ export async function buildInitializeMessageFor(
             contractAddress: resolveAddressLike(
               future.address,
               deploymentState,
-              deploymentParameters
+              deploymentParameters,
+              accounts
             ),
             artifactId: future.id,
           }
@@ -204,7 +207,8 @@ export async function buildInitializeMessageFor(
             value: resolveValue(
               future.value,
               deploymentParameters,
-              deploymentState
+              deploymentState,
+              accounts
             ),
             data: future.data ?? "0x",
             from: resolveFutureFrom(future.from, accounts, defaultSender),
diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts
index 657150c4..cae1c658 100644
--- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts
+++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts
@@ -42,7 +42,8 @@ export function resolveValue(
     | StaticCallFuture<string, string>
     | ReadEventArgumentFuture,
   deploymentParameters: DeploymentParameters,
-  deploymentState: DeploymentState
+  deploymentState: DeploymentState,
+  accounts: string[]
 ): bigint {
   if (typeof givenValue === "bigint") {
     return givenValue;
@@ -54,6 +55,7 @@ export function resolveValue(
   } else {
     result = resolveModuleParameter(givenValue, {
       deploymentParameters,
+      accounts,
     });
   }
 
@@ -85,7 +87,10 @@ export function resolveArgs(
         return resolveAccountRuntimeValue(arv, accounts);
       },
       moduleParameterRuntimeValue: (mprv) => {
-        return resolveModuleParameter(mprv, { deploymentParameters });
+        return resolveModuleParameter(mprv, {
+          deploymentParameters,
+          accounts,
+        });
       },
     });
 
@@ -174,7 +179,12 @@ export function resolveSendToAddress(
     return resolveAccountRuntimeValue(to, accounts);
   }
 
-  return resolveAddressLike(to, deploymentState, deploymentParameters);
+  return resolveAddressLike(
+    to,
+    deploymentState,
+    deploymentParameters,
+    accounts
+  );
 }
 
 /**
@@ -188,7 +198,8 @@ export function resolveAddressLike(
     | AddressResolvableFuture
     | ModuleParameterRuntimeValue<string>,
   deploymentState: DeploymentState,
-  deploymentParameters: DeploymentParameters
+  deploymentParameters: DeploymentParameters,
+  accounts: string[]
 ): string {
   if (typeof addressLike === "string") {
     return addressLike;
@@ -197,6 +208,7 @@ export function resolveAddressLike(
   if (isModuleParameterRuntimeValue(addressLike)) {
     const addressFromParam = resolveModuleParameter(addressLike, {
       deploymentParameters,
+      accounts,
     });
 
     assertIgnitionInvariant(
diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts
index cecf4757..280fe36d 100644
--- a/packages/core/src/internal/execution/jsonrpc-client.ts
+++ b/packages/core/src/internal/execution/jsonrpc-client.ts
@@ -1,6 +1,6 @@
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
 import { EIP1193Provider } from "../../types/provider";
+import { ERRORS } from "../errors-list";
 
 import {
   NetworkFees,
@@ -78,7 +78,8 @@ export interface JsonRpcClient {
    * Returns the balance of an account.
    *
    * @param address The account's address.
-   * @param blockTag Weather if we should fetch the latest block balance or the pending balance.
+   * @param blockTag Whether we should fetch the latest block balance or the
+   * pending balance.
    */
   getBalance: (
     address: string,
@@ -88,7 +89,8 @@ export interface JsonRpcClient {
   /**
    * Performs an `eth_call` JSON-RPC request, and returns the result or an error
    * object with the return data and a boolean indicating if the request failed
-   * with an error message that telling that the call failed with a custom error.
+   * with an error message that telling that the call failed with a custom
+   * error.
    *
    * @param callParams The params for the call.
    * @param blockTag The block tag to use for the call.
@@ -121,7 +123,8 @@ export interface JsonRpcClient {
    * Returns the transaction count of an account.
    *
    * @param address The account's address.
-   * @param blockTag The block to use for the count. If "pending", the mempool is taken into account.
+   * @param blockTag The block to use for the count. If "pending", the mempool
+   * is taken into account.
    */
   getTransactionCount: (
     address: string,
diff --git a/packages/core/src/internal/execution/libraries.ts b/packages/core/src/internal/execution/libraries.ts
index c686cf76..4782de38 100644
--- a/packages/core/src/internal/execution/libraries.ts
+++ b/packages/core/src/internal/execution/libraries.ts
@@ -14,8 +14,8 @@
  */
 
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
 import { Artifact } from "../../types/artifact";
+import { ERRORS } from "../errors-list";
 import { assertIgnitionInvariant } from "../utils/assertions";
 
 /**
diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts
index d74d3f08..d9f95c3d 100644
--- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts
+++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts
@@ -1,7 +1,6 @@
 import uniq from "lodash/uniq";
 
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isArtifactContractAtFuture,
   isNamedContractAtFuture,
@@ -12,6 +11,7 @@ import {
   IgnitionModule,
   IgnitionModuleResult,
 } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { getFuturesFromModule } from "../../utils/get-futures-from-module";
 import { getPendingOnchainInteraction } from "../../views/execution-state/get-pending-onchain-interaction";
 import { resolveFutureFrom } from "../future-processor/helpers/future-resolvers";
diff --git a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts
index ad0fa4f4..de39f5e2 100644
--- a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts
+++ b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts
@@ -1,5 +1,5 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
+import { ERRORS } from "../../errors-list";
 import { JsonRpcClient } from "../jsonrpc-client";
 
 /**
diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts
index c00c9470..d8974631 100644
--- a/packages/core/src/internal/execution/types/execution-strategy.ts
+++ b/packages/core/src/internal/execution/types/execution-strategy.ts
@@ -155,7 +155,7 @@ export type StaticCallStrategyGenerator = AsyncGenerator<
  *
  * Execution strategies are also use to resume a partial execution, hence, they must be
  * prepared to receive the results of their requests immediately. This affects to the
- * process of requestsing `OnchainInteraction`s, which differs weather if the request
+ * process of requestsing `OnchainInteraction`s, which differs whether if the request
  * has already being resolved or not. See below for more details.
  *
  * There are two types of request, which follow a different protocol:
diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts
index 611b5fa4..b9e52d64 100644
--- a/packages/core/src/internal/module-builder.ts
+++ b/packages/core/src/internal/module-builder.ts
@@ -1,7 +1,6 @@
 import { inspect } from "util";
 
 import { IgnitionError } from "../errors";
-import { ERRORS } from "../errors-list";
 import {
   isAccountRuntimeValue,
   isAddressResolvableFuture,
@@ -48,6 +47,7 @@ import {
   StaticCallOptions,
 } from "../types/module-builder";
 
+import { ERRORS } from "./errors-list";
 import { equalAddresses, isAddress } from "./execution/utils/address";
 import {
   AccountRuntimeValueImplementation,
diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts
index 23e16d05..b3873187 100644
--- a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts
+++ b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts
@@ -19,7 +19,8 @@ export function reconcileAddress(
   const resolvedAddress = resolveAddressLike(
     future.address,
     context.deploymentState,
-    context.deploymentParameters
+    context.deploymentParameters,
+    context.accounts
   );
 
   return compare(future, "Address", exState.contractAddress, resolvedAddress);
diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts
index c1292106..bb4b8549 100644
--- a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts
+++ b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts
@@ -19,7 +19,8 @@ export function reconcileContract(
   const resolvedAddress = resolveAddressLike(
     future.contract,
     context.deploymentState,
-    context.deploymentParameters
+    context.deploymentParameters,
+    context.accounts
   );
 
   return compare(
diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts
index f5a46b9c..b883d9eb 100644
--- a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts
+++ b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts
@@ -1,6 +1,6 @@
 import {
-  ContractDeploymentFuture,
   ContractCallFuture,
+  ContractDeploymentFuture,
   NamedArtifactContractDeploymentFuture,
   SendDataFuture,
 } from "../../../types/module";
@@ -32,7 +32,8 @@ export function reconcileValue(
   const resolvedValue = resolveValue(
     future.value,
     context.deploymentParameters,
-    context.deploymentState
+    context.deploymentState,
+    context.accounts
   );
 
   return compare(future, "Value", exState.value, resolvedValue);
diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts
index beead0a0..f1d90430 100644
--- a/packages/core/src/internal/reconciliation/reconciler.ts
+++ b/packages/core/src/internal/reconciliation/reconciler.ts
@@ -1,9 +1,9 @@
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
 import { ArtifactResolver } from "../../types/artifact";
 import { DeploymentParameters } from "../../types/deploy";
 import { Future, IgnitionModule } from "../../types/module";
 import { DeploymentLoader } from "../deployment-loader/types";
+import { ERRORS } from "../errors-list";
 import { DeploymentState } from "../execution/types/deployment-state";
 import {
   ExecutionState,
diff --git a/packages/core/src/internal/utils/assertions.ts b/packages/core/src/internal/utils/assertions.ts
index a413355b..5a540865 100644
--- a/packages/core/src/internal/utils/assertions.ts
+++ b/packages/core/src/internal/utils/assertions.ts
@@ -1,5 +1,5 @@
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
+import { ERRORS } from "../errors-list";
 
 export function assertIgnitionInvariant(
   invariant: boolean,
diff --git a/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/core/src/internal/utils/resolve-module-parameter.ts
index be216af4..0ff3cbff 100644
--- a/packages/core/src/internal/utils/resolve-module-parameter.ts
+++ b/packages/core/src/internal/utils/resolve-module-parameter.ts
@@ -1,22 +1,25 @@
+import { isAccountRuntimeValue } from "../../type-guards";
 import { DeploymentParameters } from "../../types/deploy";
 import {
   ModuleParameterRuntimeValue,
   ModuleParameterType,
+  SolidityParameterType,
 } from "../../types/module";
+import { resolveAccountRuntimeValue } from "../execution/future-processor/helpers/future-resolvers";
 
 import { assertIgnitionInvariant } from "./assertions";
 
 export function resolveModuleParameter(
   moduleParamRuntimeValue: ModuleParameterRuntimeValue<ModuleParameterType>,
-  context: { deploymentParameters: DeploymentParameters }
-): ModuleParameterType {
+  context: { deploymentParameters: DeploymentParameters; accounts: string[] }
+): SolidityParameterType {
   if (context.deploymentParameters === undefined) {
     assertIgnitionInvariant(
       moduleParamRuntimeValue.defaultValue !== undefined,
       `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}`
     );
 
-    return moduleParamRuntimeValue.defaultValue;
+    return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts);
   }
 
   const moduleParameters =
@@ -28,19 +31,33 @@ export function resolveModuleParameter(
       `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}`
     );
 
-    return moduleParamRuntimeValue.defaultValue;
+    return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts);
   }
 
   const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name];
 
   if (moduleParamValue === undefined) {
-    assertIgnitionInvariant(
-      moduleParamRuntimeValue.defaultValue !== undefined,
-      `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}`
-    );
-
-    return moduleParamRuntimeValue.defaultValue;
+    return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts);
   }
 
   return moduleParamValue;
 }
+
+function _resolveDefaultValue(
+  moduleParamRuntimeValue: ModuleParameterRuntimeValue<ModuleParameterType>,
+  accounts: string[]
+): SolidityParameterType {
+  assertIgnitionInvariant(
+    moduleParamRuntimeValue.defaultValue !== undefined,
+    `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}`
+  );
+
+  if (isAccountRuntimeValue(moduleParamRuntimeValue.defaultValue)) {
+    return resolveAccountRuntimeValue(
+      moduleParamRuntimeValue.defaultValue,
+      accounts
+    );
+  }
+
+  return moduleParamRuntimeValue.defaultValue;
+}
diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts
index 8f3e4794..4408fff9 100644
--- a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts
+++ b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts
@@ -1,9 +1,9 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import { isModuleParameterRuntimeValue } from "../../../type-guards";
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { ContractAtFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 
 export async function validateArtifactContractAt(
   future: ContractAtFuture,
diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts
index 70e9dec0..d45f7ee3 100644
--- a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts
+++ b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isAccountRuntimeValue,
   isModuleParameterRuntimeValue,
@@ -7,9 +6,11 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { ContractDeploymentFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateContractConstructorArgsLength } from "../../execution/abi";
 import { validateLibraryNames } from "../../execution/libraries";
 import {
+  filterToAccountRuntimeValues,
   retrieveNestedRuntimeValues,
   validateAccountRuntimeValue,
 } from "../utils";
@@ -41,7 +42,7 @@ export async function validateArtifactContractDeployment(
   const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs);
   const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue);
   const accountParams = [
-    ...runtimeValues.filter(isAccountRuntimeValue),
+    ...filterToAccountRuntimeValues(runtimeValues),
     ...(isAccountRuntimeValue(future.from) ? [future.from] : []),
   ];
 
diff --git a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts
index 8d17fcd8..6e09a5d5 100644
--- a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts
+++ b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isArtifactType,
   isModuleParameterRuntimeValue,
@@ -7,6 +6,7 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { NamedArtifactContractAtFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 
 export async function validateNamedContractAt(
   future: NamedArtifactContractAtFuture<string>,
diff --git a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts
index 553beb60..31e081b6 100644
--- a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts
+++ b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isAccountRuntimeValue,
   isArtifactType,
@@ -8,8 +7,10 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { ContractCallFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateArtifactFunction } from "../../execution/abi";
 import {
+  filterToAccountRuntimeValues,
   retrieveNestedRuntimeValues,
   validateAccountRuntimeValue,
 } from "../utils";
@@ -52,7 +53,7 @@ export async function validateNamedContractCall(
   const runtimeValues = retrieveNestedRuntimeValues(future.args);
   const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue);
   const accountParams = [
-    ...runtimeValues.filter(isAccountRuntimeValue),
+    ...filterToAccountRuntimeValues(runtimeValues),
     ...(isAccountRuntimeValue(future.from) ? [future.from] : []),
   ];
 
diff --git a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts
index 44803e26..f10b72b8 100644
--- a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts
+++ b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isAccountRuntimeValue,
   isArtifactType,
@@ -8,9 +7,11 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { NamedArtifactContractDeploymentFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateContractConstructorArgsLength } from "../../execution/abi";
 import { validateLibraryNames } from "../../execution/libraries";
 import {
+  filterToAccountRuntimeValues,
   retrieveNestedRuntimeValues,
   validateAccountRuntimeValue,
 } from "../utils";
@@ -52,7 +53,7 @@ export async function validateNamedContractDeployment(
   const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs);
   const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue);
   const accountParams = [
-    ...runtimeValues.filter(isAccountRuntimeValue),
+    ...filterToAccountRuntimeValues(runtimeValues),
     ...(isAccountRuntimeValue(future.from) ? [future.from] : []),
   ];
 
diff --git a/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts
index c8ddb35c..ff0ba2c2 100644
--- a/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts
+++ b/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts
@@ -1,9 +1,9 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import { isAccountRuntimeValue, isArtifactType } from "../../../type-guards";
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateLibraryNames } from "../../execution/libraries";
 import { validateAccountRuntimeValue } from "../utils";
 
diff --git a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts
index d4009d2f..4d41d063 100644
--- a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts
+++ b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isAccountRuntimeValue,
   isArtifactType,
@@ -8,11 +7,13 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { StaticCallFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import {
   validateArtifactFunction,
   validateFunctionArgumentParamType,
 } from "../../execution/abi";
 import {
+  filterToAccountRuntimeValues,
   retrieveNestedRuntimeValues,
   validateAccountRuntimeValue,
 } from "../utils";
@@ -64,7 +65,7 @@ export async function validateNamedStaticCall(
   const runtimeValues = retrieveNestedRuntimeValues(future.args);
   const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue);
   const accountParams = [
-    ...runtimeValues.filter(isAccountRuntimeValue),
+    ...filterToAccountRuntimeValues(runtimeValues),
     ...(isAccountRuntimeValue(future.from) ? [future.from] : []),
   ];
 
diff --git a/packages/core/src/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/internal/validation/futures/validateReadEventArgument.ts
index 85d178b6..d4f72573 100644
--- a/packages/core/src/internal/validation/futures/validateReadEventArgument.ts
+++ b/packages/core/src/internal/validation/futures/validateReadEventArgument.ts
@@ -1,9 +1,9 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import { isArtifactType } from "../../../type-guards";
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { ReadEventArgumentFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateArtifactEventArgumentParams } from "../../execution/abi";
 
 export async function validateReadEventArgument(
diff --git a/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/core/src/internal/validation/futures/validateSendData.ts
index f4d45dfe..9a941117 100644
--- a/packages/core/src/internal/validation/futures/validateSendData.ts
+++ b/packages/core/src/internal/validation/futures/validateSendData.ts
@@ -1,5 +1,4 @@
 import { IgnitionError } from "../../../errors";
-import { ERRORS } from "../../../errors-list";
 import {
   isAccountRuntimeValue,
   isModuleParameterRuntimeValue,
@@ -7,6 +6,7 @@ import {
 import { ArtifactResolver } from "../../../types/artifact";
 import { DeploymentParameters } from "../../../types/deploy";
 import { SendDataFuture } from "../../../types/module";
+import { ERRORS } from "../../errors-list";
 import { validateAccountRuntimeValue } from "../utils";
 
 export async function validateSendData(
diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts
index b60773ab..527b228d 100644
--- a/packages/core/src/internal/validation/utils.ts
+++ b/packages/core/src/internal/validation/utils.ts
@@ -1,11 +1,15 @@
 import { IgnitionError } from "../../errors";
-import { ERRORS } from "../../errors-list";
-import { isFuture, isRuntimeValue } from "../../type-guards";
+import {
+  isAccountRuntimeValue,
+  isFuture,
+  isRuntimeValue,
+} from "../../type-guards";
 import {
   AccountRuntimeValue,
   ArgumentType,
   RuntimeValue,
 } from "../../types/module";
+import { ERRORS } from "../errors-list";
 
 export function validateAccountRuntimeValue(
   arv: AccountRuntimeValue,
@@ -29,6 +33,22 @@ export function validateAccountRuntimeValue(
   return errors;
 }
 
+export function filterToAccountRuntimeValues(
+  runtimeValues: RuntimeValue[]
+): AccountRuntimeValue[] {
+  return runtimeValues
+    .map((rv) => {
+      if (isAccountRuntimeValue(rv)) {
+        return rv;
+      } else if (isAccountRuntimeValue(rv.defaultValue)) {
+        return rv.defaultValue;
+      } else {
+        return undefined;
+      }
+    })
+    .filter((rv): rv is AccountRuntimeValue => rv !== undefined);
+}
+
 export function retrieveNestedRuntimeValues(
   args: ArgumentType[]
 ): RuntimeValue[] {
diff --git a/packages/core/src/internal/wiper.ts b/packages/core/src/internal/wiper.ts
index ef2d20e6..c9ea92ce 100644
--- a/packages/core/src/internal/wiper.ts
+++ b/packages/core/src/internal/wiper.ts
@@ -1,7 +1,7 @@
 import { IgnitionError } from "../errors";
-import { ERRORS } from "../errors-list";
 
 import { DeploymentLoader } from "./deployment-loader/types";
+import { ERRORS } from "./errors-list";
 import {
   applyNewMessage,
   loadDeploymentState,
diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts
index 133c39d2..7ec89f2d 100644
--- a/packages/core/src/status.ts
+++ b/packages/core/src/status.ts
@@ -1,6 +1,6 @@
 import { IgnitionError } from "./errors";
-import { ERRORS } from "./errors-list";
 import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader";
+import { ERRORS } from "./internal/errors-list";
 import { loadDeploymentState } from "./internal/execution/deployment-state-helpers";
 import { findDeployedContracts } from "./internal/views/find-deployed-contracts";
 import { findStatus } from "./internal/views/find-status";
diff --git a/packages/core/src/types/errors.ts b/packages/core/src/types/errors.ts
new file mode 100644
index 00000000..a2854d2a
--- /dev/null
+++ b/packages/core/src/types/errors.ts
@@ -0,0 +1,11 @@
+/**
+ * ErrorDescriptor is a type that describes an error.
+ * It's used to generate error codes and messages.
+ *
+ * @beta
+ */
+export interface ErrorDescriptor {
+  number: number;
+  // Message can use templates. See applyErrorMessageTemplate
+  message: string;
+}
diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts
index 761359cb..dee18f61 100644
--- a/packages/core/src/types/module-builder.ts
+++ b/packages/core/src/types/module-builder.ts
@@ -28,14 +28,33 @@ import {
  * @beta
  */
 export interface ContractOptions {
+  /**
+   * The future id.
+   */
   id?: string;
+
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
+
+  /**
+   * The libraries to link to the contract.
+   */
   libraries?: Record<string, ContractFuture<string>>;
+
+  /**
+   * The value in wei to send with the transaction.
+   */
   value?:
     | bigint
     | ModuleParameterRuntimeValue<bigint>
     | StaticCallFuture<string, string>
     | ReadEventArgumentFuture;
+
+  /**
+   * The account to send the transaction from.
+   */
   from?: string | AccountRuntimeValue;
 }
 
@@ -45,9 +64,24 @@ export interface ContractOptions {
  * @beta
  */
 export interface LibraryOptions {
+  /**
+   * The future id.
+   */
   id?: string;
+
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
+
+  /**
+   * The libraries to link to the contract.
+   */
   libraries?: Record<string, ContractFuture<string>>;
+
+  /**
+   * The account to send the transaction from.
+   */
   from?: string | AccountRuntimeValue;
 }
 
@@ -57,13 +91,28 @@ export interface LibraryOptions {
  * @beta
  */
 export interface CallOptions {
+  /**
+   * The future id.
+   */
   id?: string;
+
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
+
+  /**
+   * The value in wei to send with the transaction.
+   */
   value?:
     | bigint
     | ModuleParameterRuntimeValue<bigint>
     | StaticCallFuture<string, string>
     | ReadEventArgumentFuture;
+
+  /**
+   * The account to send the transaction from.
+   */
   from?: string | AccountRuntimeValue;
 }
 
@@ -73,8 +122,19 @@ export interface CallOptions {
  * @beta
  */
 export interface StaticCallOptions {
+  /**
+   * The future id.
+   */
   id?: string;
+
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
+
+  /**
+   * The account to send the transaction from.
+   */
   from?: string | AccountRuntimeValue;
 }
 
@@ -84,7 +144,14 @@ export interface StaticCallOptions {
  * @beta
  */
 export interface ContractAtOptions {
+  /**
+   * The future id.
+   */
   id?: string;
+
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
 }
 
@@ -100,8 +167,8 @@ export interface ReadEventArgumentOptions {
   id?: string;
 
   /**
-   * The contract that emitted the event. If omitted the contract associated with
-   * the future you are reading the event from will be used.
+   * The contract that emitted the event. If omitted the contract associated
+   * with the future you are reading the event from will be used.
    */
   emitter?: ContractFuture<string>;
 
@@ -118,7 +185,14 @@ export interface ReadEventArgumentOptions {
  * @beta
  */
 export interface SendDataOptions {
+  /**
+   * The futures to execute before this one.
+   */
   after?: Future[];
+
+  /**
+   * The account to send the transaction from.
+   */
   from?: string | AccountRuntimeValue;
 }
 
@@ -128,19 +202,72 @@ export interface SendDataOptions {
  * @beta
  */
 export interface IgnitionModuleBuilder {
+  /**
+   * Returns an account runtime value representing the
+   * Hardhat account the underlying transactions for a
+   * future will be sent from.
+   *
+   * @param accountIndex - The index of the account to return
+   *
+   * @example
+   * ```
+   * const owner = m.getAccount(1);
+   * const myContract = m.contract("MyContract", { from: owner });
+   * // can also be used anywhere an address is expected
+   * m.send("sendToOwner", owner, { value: 100 });
+   * ```
+   */
   getAccount(accountIndex: number): AccountRuntimeValue;
 
+  /**
+   * A parameter whose value can be set at deployment.
+   *
+   * @param parameterName - The name of the parameter
+   * @param defaultValue - The default value to use if the parameter is not
+   * provided
+   *
+   * @example
+   * ```
+   * const amount = m.getParameter("amount", 100);
+   * const myContract = m.contract("MyContract", { value: amount });
+   * ```
+   */
   getParameter<ParamTypeT extends ModuleParameterType = any>(
     parameterName: string,
     defaultValue?: ParamTypeT
   ): ModuleParameterRuntimeValue<ParamTypeT>;
 
+  /**
+   * Deploy a contract.
+   *
+   * @param contractName - The name of the contract to deploy
+   * @param args - The arguments to pass to the contract constructor
+   * @param options - The options for the deployment
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract", [], { value: 100 });
+   * ```
+   */
   contract<ContractNameT extends string>(
     contractName: ContractNameT,
     args?: ArgumentType[],
     options?: ContractOptions
   ): NamedArtifactContractDeploymentFuture<ContractNameT>;
 
+  /**
+   * Deploy a contract.
+   *
+   * @param contractName - The name of the contract to deploy
+   * @param artifact - The artifact of the contract to deploy
+   * @param args - The arguments to pass to the contract constructor
+   * @param options - The options for the deployment
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract", [], { value: 100 });
+   * ```
+   */
   contract<const AbiT extends Abi>(
     contractName: string,
     artifact: Artifact<AbiT>,
@@ -148,17 +275,60 @@ export interface IgnitionModuleBuilder {
     options?: ContractOptions
   ): ContractDeploymentFuture<AbiT>;
 
+  /**
+   * Deploy a library.
+   *
+   * @param libraryName - The name of the library to deploy
+   * @param options - The options for the deployment
+   *
+   * @example
+   * ```
+   * const owner = m.getAccount(1);
+   * const myLibrary = m.library("MyLibrary", { from: owner } );
+   * ```
+   */
   library<LibraryNameT extends string>(
     libraryName: LibraryNameT,
     options?: LibraryOptions
   ): NamedArtifactLibraryDeploymentFuture<LibraryNameT>;
 
+  /**
+   * Deploy a library.
+   *
+   * @param libraryName - The name of the library to deploy
+   * @param artifact - The artifact of the library to deploy
+   * @param options - The options for the deployment
+   *
+   * @example
+   * ```
+   * const owner = m.getAccount(1);
+   * const myLibrary = m.library(
+   *   "MyLibrary",
+   *   myLibraryArtifact,
+   *   { from: owner }
+   * );
+   * ```
+   */
   library<const AbiT extends Abi>(
     libraryName: string,
     artifact: Artifact<AbiT>,
     options?: LibraryOptions
   ): LibraryDeploymentFuture<AbiT>;
 
+  /**
+   * Call a contract function.
+   *
+   * @param contractFuture - The contract to call
+   * @param functionName - The name of the function to call
+   * @param args - The arguments to pass to the function
+   * @param options - The options for the call
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract");
+   * const myContractCall = m.call(myContract, "updateCounter", [100]);
+   * ```
+   */
   call<ContractNameT extends string, FunctionNameT extends string>(
     contractFuture: CallableContractFuture<ContractNameT>,
     functionName: FunctionNameT,
@@ -166,6 +336,30 @@ export interface IgnitionModuleBuilder {
     options?: CallOptions
   ): ContractCallFuture<ContractNameT, FunctionNameT>;
 
+  /**
+   * Statically call a contract function and return the result.
+   *
+   * This allows you to read data from a contract without sending a transaction.
+   * This is only supported for functions that are marked as `view` or `pure`,
+   * or variables marked `public`.
+   *
+   * @param contractFuture - The contract to call
+   * @param functionName - The name of the function to call
+   * @param args - The arguments to pass to the function
+   * @param nameOrIndex - The name or index of the return argument to read
+   * @param options - The options for the call
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract");
+   * const counter = m.staticCall(
+   *   myContract,
+   *   "getCounterAndOwner",
+   *   [],
+   *   "counter"
+   * );
+   * ```
+   */
   staticCall<ContractNameT extends string, FunctionNameT extends string>(
     contractFuture: CallableContractFuture<ContractNameT>,
     functionName: FunctionNameT,
@@ -174,6 +368,22 @@ export interface IgnitionModuleBuilder {
     options?: StaticCallOptions
   ): StaticCallFuture<ContractNameT, FunctionNameT>;
 
+  /**
+   * Create a future for an existing deployed contract so that it can be
+   * referenced in subsequent futures.
+   *
+   * The resulting future can be used anywhere a contract future or address
+   * is expected.
+   *
+   * @param contractName - The name of the contract
+   * @param address - The address of the contract
+   * @param options - The options for the instance
+   *
+   * @example
+   * ```
+   * const myContract = m.contractAt("MyContract", "0x1234...");
+   * ```
+   */
   contractAt<ContractNameT extends string>(
     contractName: ContractNameT,
     address:
@@ -183,6 +393,27 @@ export interface IgnitionModuleBuilder {
     options?: ContractAtOptions
   ): NamedArtifactContractAtFuture<ContractNameT>;
 
+  /**
+   * Create a future for an existing deployed contract so that it can be
+   * referenced in subsequent futures.
+   *
+   * The resulting future can be used anywhere a contract future or address is
+   * expected.
+   *
+   * @param contractName - The name of the contract
+   * @param artifact - The artifact of the contract
+   * @param address - The address of the contract
+   * @param options - The options for the instance
+   *
+   * @example
+   * ```
+   * const myContract = m.contractAt(
+   *   "MyContract",
+   *   myContractArtifact,
+   *   "0x1234..."
+   * );
+   * ```
+   */
   contractAt<const AbiT extends Abi>(
     contractName: string,
     artifact: Artifact<AbiT>,
@@ -193,6 +424,35 @@ export interface IgnitionModuleBuilder {
     options?: ContractAtOptions
   ): ContractAtFuture<AbiT>;
 
+  /**
+   * Read an event argument from a contract.
+   *
+   * The resulting value can be used wherever a value of the same type is
+   * expected i.e. contract function arguments, `send` value, etc.
+   *
+   * @param futureToReadFrom - The future to read the event from
+   * @param eventName - The name of the event
+   * @param nameOrIndex - The name or index of the event argument to read
+   * @param options - The options for the event
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract");
+   * // assuming the event is emitted by the constructor of MyContract
+   * const owner = m.readEventArgument(myContract, "ContractCreated", "owner");
+   *
+   * // or, if the event is emitted during a function call:
+   * const myContractCall = m.call(myContract, "updateCounter", [100]);
+   * const counter = m.readEventArgument(
+   *   myContractCall,
+   *   "CounterUpdated",
+   *   "counter",
+   *   {
+   *     emitter: myContract
+   *   }
+   * );
+   * ```
+   */
   readEventArgument(
     futureToReadFrom:
       | NamedArtifactContractDeploymentFuture<string>
@@ -204,6 +464,28 @@ export interface IgnitionModuleBuilder {
     options?: ReadEventArgumentOptions
   ): ReadEventArgumentFuture;
 
+  /**
+   * Send an arbitrary transaction.
+   *
+   * Can be used to transfer ether and/or send raw data to an address.
+   *
+   * @param id - A custom id for the Future
+   * @param to - The address to send the transaction to
+   * @param value - The amount of wei to send
+   * @param data - The data to send
+   * @param options - The options for the transaction
+   *
+   * @example
+   * ```
+   * const myContract = m.contract("MyContract");
+   * m.send("sendToMyContract", myContract, 100);
+   *
+   * // you can also send to an address directly
+   * const owner = m.getAccount(1);
+   * const otherAccount = m.getAccount(2);
+   * m.send("sendToOwner", owner, 100, undefined, { from: otherAccount });
+   * ```
+   */
   send(
     id: string,
     to:
@@ -216,6 +498,27 @@ export interface IgnitionModuleBuilder {
     options?: SendDataOptions
   ): SendDataFuture;
 
+  /**
+   * Allows you to deploy then use the results of another module within this
+   * module.
+   *
+   * @param ignitionSubmodule - The submodule to use
+   *
+   * @example
+   * ```
+   * const otherModule = buildModule("otherModule", (m) => {
+   *  const myContract = m.contract("MyContract");
+   *
+   *  return { myContract };
+   * });
+   *
+   * const mainModule = buildModule("mainModule", (m) => {
+   *  const { myContract } = m.useModule(otherModule);
+   *
+   *  const myContractCall = m.call(myContract, "updateCounter", [100]);
+   * });
+   * ```
+   */
   useModule<
     ModuleIdT extends string,
     ContractNameT extends string,
diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts
index 8dc30761..2b603d88 100644
--- a/packages/core/src/types/module.ts
+++ b/packages/core/src/types/module.ts
@@ -344,7 +344,7 @@ export type SolidityParameterType =
  *
  * @beta
  */
-export type ModuleParameterType = SolidityParameterType;
+export type ModuleParameterType = SolidityParameterType | AccountRuntimeValue;
 
 /**
  * The different runtime values supported by Ignition.
@@ -395,7 +395,7 @@ export interface ModuleParameterRuntimeValue<
  * @beta
  */
 export interface ModuleParameters {
-  [parameterName: string]: ModuleParameterType;
+  [parameterName: string]: SolidityParameterType;
 }
 
 /**
diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts
index 482de0bf..adcb9630 100644
--- a/packages/core/src/verify.ts
+++ b/packages/core/src/verify.ts
@@ -1,7 +1,7 @@
 import { IgnitionError } from "./errors";
-import { ERRORS } from "./errors-list";
 import { builtinChains } from "./internal/chain-config";
 import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader";
+import { ERRORS } from "./internal/errors-list";
 import { encodeDeploymentArguments } from "./internal/execution/abi";
 import { loadDeploymentState } from "./internal/execution/deployment-state-helpers";
 import { DeploymentState } from "./internal/execution/types/deployment-state";
diff --git a/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-plugin-ethers/.npmignore
index 77b73f35..ecceab5f 100644
--- a/packages/hardhat-plugin-ethers/.npmignore
+++ b/packages/hardhat-plugin-ethers/.npmignore
@@ -7,7 +7,6 @@ post-build.js
 .nycrc
 .prettierignore
 .prettierrc
-!dist
 dist/test
 src/
 test/
diff --git a/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-plugin-ethers/.nycrc
index c573ff2a..e427e0b3 100644
--- a/packages/hardhat-plugin-ethers/.nycrc
+++ b/packages/hardhat-plugin-ethers/.nycrc
@@ -1,19 +1,12 @@
 {
   "extends": "@istanbuljs/nyc-config-typescript",
-  "check-coverage": false,
-  "statements": 50,
-  "branches": 30,
-  "functions": 42,
-  "lines": 50,
+  "check-coverage": true,
+  "statements": 90,
+  "branches": 85,
+  "functions": 100,
+  "lines": 90,
   "all": true,
-  "include": [
-    "src/**/*.ts"
-  ],
-  "reporter": [
-    "html",
-    "lcov",
-    "text",
-    "text-summary"
-  ],
+  "include": ["src/**/*.ts"],
+  "reporter": ["html", "lcov", "text", "text-summary"],
   "report-dir": "coverage"
 }
diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md
index 755bc876..76a4944c 100644
--- a/packages/hardhat-plugin-ethers/CHANGELOG.md
+++ b/packages/hardhat-plugin-ethers/CHANGELOG.md
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.13.2 - 2024-01-25
+
+### Fixed
+
+- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667))
+
+### Added
+
+- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642))
+- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673))
+
 ## 0.13.1 - 2023-12-19
 
 ### Added
diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json
index c5a2fa05..b8c1b7be 100644
--- a/packages/hardhat-plugin-ethers/package.json
+++ b/packages/hardhat-plugin-ethers/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@nomicfoundation/hardhat-ignition-ethers",
-  "version": "0.13.1",
+  "version": "0.13.2",
   "license": "MIT",
   "author": "Nomic Foundation",
   "homepage": "https://hardhat.org",
@@ -19,13 +19,6 @@
   ],
   "main": "dist/src/index.js",
   "types": "dist/src/index.d.ts",
-  "files": [
-    "dist/src/",
-    "src/",
-    "LICENSE",
-    "README.md",
-    "CHANGELOG.md"
-  ],
   "scripts": {
     "build": "tsc --build",
     "lint": "npm run prettier -- --check && npm run eslint",
@@ -47,8 +40,8 @@
   },
   "peerDependencies": {
     "@nomicfoundation/hardhat-ethers": "^3.0.4",
-    "@nomicfoundation/hardhat-ignition": "^0.13.1",
-    "@nomicfoundation/ignition-core": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition": "^0.13.2",
+    "@nomicfoundation/ignition-core": "^0.13.2",
     "ethers": "^6.7.0",
     "hardhat": "^2.18.0"
   }
diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts
index 2f32444c..a3fef768 100644
--- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts
+++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts
@@ -51,6 +51,15 @@ export class EthersIgnitionHelper {
     this._deploymentDir = deploymentDir;
   }
 
+  /**
+   * Deploys the given Ignition module and returns the results of the module as
+   * Ethers contract instances.
+   *
+   * @param ignitionModule - The Ignition module to deploy.
+   * @param options - The options to use for the deployment.
+   * @returns Ethers contract instances for each contract returned by the
+   * module.
+   */
   public async deploy<
     ModuleIdT extends string,
     ContractNameT extends string,
diff --git a/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-plugin-viem/.npmignore
index 77b73f35..05c3ff7c 100644
--- a/packages/hardhat-plugin-viem/.npmignore
+++ b/packages/hardhat-plugin-viem/.npmignore
@@ -7,8 +7,8 @@ post-build.js
 .nycrc
 .prettierignore
 .prettierrc
-!dist
 dist/test
 src/
 test/
+scripts/
 esbuild.js
diff --git a/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-plugin-viem/.nycrc
index c573ff2a..d17e9894 100644
--- a/packages/hardhat-plugin-viem/.nycrc
+++ b/packages/hardhat-plugin-viem/.nycrc
@@ -1,19 +1,12 @@
 {
   "extends": "@istanbuljs/nyc-config-typescript",
-  "check-coverage": false,
-  "statements": 50,
-  "branches": 30,
-  "functions": 42,
-  "lines": 50,
+  "check-coverage": true,
+  "statements": 85,
+  "branches": 80,
+  "functions": 100,
+  "lines": 85,
   "all": true,
-  "include": [
-    "src/**/*.ts"
-  ],
-  "reporter": [
-    "html",
-    "lcov",
-    "text",
-    "text-summary"
-  ],
+  "include": ["src/**/*.ts"],
+  "reporter": ["html", "lcov", "text", "text-summary"],
   "report-dir": "coverage"
 }
diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md
index d7aeb5cb..e50b2a23 100644
--- a/packages/hardhat-plugin-viem/CHANGELOG.md
+++ b/packages/hardhat-plugin-viem/CHANGELOG.md
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.13.2 - 2024-01-25
+
+### Fixed
+
+- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667))
+
+### Added
+
+- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642))
+- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673))
+
 ## 0.13.1 - 2023-12-19
 
 ### Added
diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json
index 240a8270..850311f3 100644
--- a/packages/hardhat-plugin-viem/package.json
+++ b/packages/hardhat-plugin-viem/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@nomicfoundation/hardhat-ignition-viem",
-  "version": "0.13.1",
+  "version": "0.13.2",
   "license": "MIT",
   "author": "Nomic Foundation",
   "homepage": "https://hardhat.org",
@@ -19,13 +19,6 @@
   ],
   "main": "dist/src/index.js",
   "types": "dist/src/index.d.ts",
-  "files": [
-    "dist/src/",
-    "src/",
-    "LICENSE",
-    "README.md",
-    "CHANGELOG.md"
-  ],
   "scripts": {
     "prebuild": "ts-node ./scripts/compile-test-fixture-projects.ts",
     "build": "tsc --build",
@@ -47,9 +40,9 @@
     "@types/sinon": "^10.0.13"
   },
   "peerDependencies": {
-    "@nomicfoundation/hardhat-ignition": "^0.13.1",
+    "@nomicfoundation/hardhat-ignition": "^0.13.2",
     "@nomicfoundation/hardhat-viem": "^1.0.0",
-    "@nomicfoundation/ignition-core": "^0.13.1",
+    "@nomicfoundation/ignition-core": "^0.13.2",
     "hardhat": "^2.18.0",
     "viem": "^1.18.1"
   }
diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts
index 2096175c..4fae696c 100644
--- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts
+++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts
@@ -45,6 +45,14 @@ export class ViemIgnitionHelper {
     this._deploymentDir = deploymentDir;
   }
 
+  /**
+   * Deploys the given Ignition module and returns the results of the module
+   * as Viem contract instances.
+   *
+   * @param ignitionModule - The Ignition module to deploy.
+   * @param options - The options to use for the deployment.
+   * @returns Viem contract instances for each contract returned by the module.
+   */
   public async deploy<
     ModuleIdT extends string,
     ContractNameT extends string,
diff --git a/packages/hardhat-plugin/.npmignore b/packages/hardhat-plugin/.npmignore
index 77b73f35..ecceab5f 100644
--- a/packages/hardhat-plugin/.npmignore
+++ b/packages/hardhat-plugin/.npmignore
@@ -7,7 +7,6 @@ post-build.js
 .nycrc
 .prettierignore
 .prettierrc
-!dist
 dist/test
 src/
 test/
diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-plugin/.nycrc
index c573ff2a..0f9e436c 100644
--- a/packages/hardhat-plugin/.nycrc
+++ b/packages/hardhat-plugin/.nycrc
@@ -1,19 +1,12 @@
 {
   "extends": "@istanbuljs/nyc-config-typescript",
-  "check-coverage": false,
-  "statements": 50,
-  "branches": 30,
-  "functions": 42,
-  "lines": 50,
+  "check-coverage": true,
+  "statements": 70,
+  "branches": 50,
+  "functions": 60,
+  "lines": 70,
   "all": true,
-  "include": [
-    "src/**/*.ts"
-  ],
-  "reporter": [
-    "html",
-    "lcov",
-    "text",
-    "text-summary"
-  ],
+  "include": ["src/**/*.ts"],
+  "reporter": ["html", "lcov", "text", "text-summary"],
   "report-dir": "coverage"
 }
diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md
index 46a6e365..e7714cce 100644
--- a/packages/hardhat-plugin/CHANGELOG.md
+++ b/packages/hardhat-plugin/CHANGELOG.md
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
+## 0.13.2 - 2024-01-25
+
+### Fixed
+
+- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667))
+
+### Added
+
+- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642))
+- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673))
+
 ## 0.13.1 - 2023-12-19
 
 ### Added
diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json
index 10c7d46a..77e53836 100644
--- a/packages/hardhat-plugin/package.json
+++ b/packages/hardhat-plugin/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@nomicfoundation/hardhat-ignition",
-  "version": "0.13.1",
+  "version": "0.13.2",
   "license": "MIT",
   "author": "Nomic Foundation",
   "homepage": "https://hardhat.org",
@@ -18,13 +18,6 @@
   ],
   "main": "dist/src/index.js",
   "types": "dist/src/index.d.ts",
-  "files": [
-    "dist/src/",
-    "src/",
-    "LICENSE",
-    "README.md",
-    "CHANGELOG.md"
-  ],
   "exports": {
     ".": "./dist/src/index.js",
     "./modules": "./dist/src/modules.js",
@@ -66,8 +59,8 @@
     "hardhat": "^2.18.0"
   },
   "dependencies": {
-    "@nomicfoundation/ignition-core": "^0.13.1",
-    "@nomicfoundation/ignition-ui": "^0.13.1",
+    "@nomicfoundation/ignition-core": "^0.13.2",
+    "@nomicfoundation/ignition-ui": "^0.13.2",
     "chalk": "^4.0.0",
     "debug": "^4.3.2",
     "fs-extra": "^10.0.0",
diff --git a/packages/ui/.nycrc b/packages/ui/.nycrc
new file mode 100644
index 00000000..d4e4aca7
--- /dev/null
+++ b/packages/ui/.nycrc
@@ -0,0 +1,12 @@
+{
+  "extends": "@istanbuljs/nyc-config-typescript",
+  "check-coverage": false,
+  "statements": 10,
+  "branches": 10,
+  "functions": 10,
+  "lines": 10,
+  "all": true,
+  "include": ["src/**/*.ts", "test/**/*.ts"],
+  "reporter": ["html", "lcov", "text", "text-summary"],
+  "report-dir": "coverage"
+}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 68865c21..d1238b8f 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -1,12 +1,13 @@
 {
   "name": "@nomicfoundation/ignition-ui",
-  "version": "0.13.1",
+  "version": "0.13.2",
   "type": "module",
   "scripts": {
     "predev": "npm run regenerate-deployment-example",
     "dev": "vite --force",
     "build": "tsc && vite build",
     "test": "mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"",
+    "test:coverage": "nyc mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"",
     "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js",
     "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
     "preview": "vite preview",
@@ -16,7 +17,7 @@
   "dependencies": {},
   "devDependencies": {
     "@fontsource/roboto": "^5.0.8",
-    "@nomicfoundation/ignition-core": "^0.13.1",
+    "@nomicfoundation/ignition-core": "^0.13.2",
     "@types/chai": "^4.2.22",
     "@types/chai-as-promised": "^7.1.5",
     "@types/react": "^18.0.28",


Test patch:
diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts
index 82b3280d..8991329d 100644
--- a/packages/core/test/call.ts
+++ b/packages/core/test/call.ts
@@ -844,6 +844,93 @@ m.call(..., { id: "MyUniqueId"})`
       );
     });
 
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "b",
+                type: "address",
+              },
+            ],
+            name: "test",
+            outputs: [],
+            stateMutability: "nonpayable",
+            type: "function",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+
+        const another = m.contract("Another", fakerArtifact, []);
+        m.call(another, "test", [p]);
+
+        return { another };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.CONTRACT_CALL
+      );
+
+      await assert.isFulfilled(
+        validateNamedContractCall(
+          future as any,
+          setupMockArtifactResolver({ Another: fakeArtifact }),
+          {},
+          []
+        )
+      );
+    });
+
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "b",
+                type: "address",
+              },
+            ],
+            name: "test",
+            outputs: [],
+            stateMutability: "nonpayable",
+            type: "function",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(-1));
+
+        const another = m.contract("Another", fakerArtifact, []);
+        m.call(another, "test", [p]);
+
+        return { another };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.CONTRACT_CALL
+      );
+
+      assertValidationError(
+        await validateNamedContractCall(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        ),
+        "Account index cannot be a negative number"
+      );
+    });
+
     it("should not validate a negative account index", async () => {
       const fakerArtifact: Artifact = {
         ...fakeArtifact,
diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts
index a5eda6d3..99861efa 100644
--- a/packages/core/test/contract.ts
+++ b/packages/core/test/contract.ts
@@ -777,6 +777,81 @@ m.contract(..., { id: "MyUniqueId"})`
       );
     });
 
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "p",
+                type: "address",
+              },
+            ],
+            stateMutability: "payable",
+            type: "constructor",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+        const contract1 = m.contract("Test", [p]);
+
+        return { contract1 };
+      });
+
+      const [future] = getFuturesFromModule(module);
+
+      await assert.isFulfilled(
+        validateNamedContractDeployment(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        )
+      );
+    });
+
+    it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "p",
+                type: "address",
+              },
+            ],
+            stateMutability: "payable",
+            type: "constructor",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(-1));
+        const contract1 = m.contract("Test", [p]);
+
+        return { contract1 };
+      });
+
+      const [future] = getFuturesFromModule(module);
+
+      assertValidationError(
+        await validateNamedContractDeployment(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        ),
+        "Account index cannot be a negative number"
+      );
+    });
+
     it("should not validate a negative account index", async () => {
       const module = buildModule("Module1", (m) => {
         const account = m.getAccount(-1);
diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts
index 176e5265..e42917a3 100644
--- a/packages/core/test/contractFromArtifact.ts
+++ b/packages/core/test/contractFromArtifact.ts
@@ -699,6 +699,85 @@ m.contract(..., { id: "MyUniqueId"})`
       );
     });
 
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "p",
+                type: "address",
+              },
+            ],
+            stateMutability: "payable",
+            type: "constructor",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+        const contract1 = m.contract("Test", fakerArtifact, [p]);
+
+        return { contract1 };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.CONTRACT_DEPLOYMENT
+      );
+
+      await assert.isFulfilled(
+        validateArtifactContractDeployment(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        )
+      );
+    });
+
+    it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "p",
+                type: "address",
+              },
+            ],
+            stateMutability: "payable",
+            type: "constructor",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(-1));
+        const contract1 = m.contract("Test", fakerArtifact, [p]);
+
+        return { contract1 };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.CONTRACT_DEPLOYMENT
+      );
+
+      assertValidationError(
+        await validateArtifactContractDeployment(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        ),
+        "Account index cannot be a negative number"
+      );
+    });
+
     it("should not validate a negative account index", async () => {
       const module = buildModule("Module1", (m) => {
         const account = m.getAccount(-1);
diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts
index 20524cc2..6c80ac2e 100644
--- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts
+++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts
@@ -1,23 +1,37 @@
 import { assert } from "chai";
 
+import {
+  GetTransactionRetryConfig,
+  monitorOnchainInteraction,
+} from "../../../../src/internal/execution/future-processor/handlers/monitor-onchain-interaction";
 import { runStaticCall } from "../../../../src/internal/execution/future-processor/helpers/network-interaction-execution";
 import {
-  JsonRpcClient,
+  Block,
   CallParams,
   EstimateGasParams,
+  JsonRpcClient,
   TransactionParams,
-  Block,
 } from "../../../../src/internal/execution/jsonrpc-client";
+import { TransactionTrackingTimer } from "../../../../src/internal/execution/transaction-tracking-timer";
+import {
+  DeploymentExecutionState,
+  ExecutionSateType,
+  ExecutionStatus,
+} from "../../../../src/internal/execution/types/execution-state";
 import {
   NetworkFees,
   RawStaticCallResult,
   Transaction,
   TransactionReceipt,
+  TransactionReceiptStatus,
 } from "../../../../src/internal/execution/types/jsonrpc";
+import { JournalMessageType } from "../../../../src/internal/execution/types/messages";
 import {
   NetworkInteractionType,
   StaticCall,
 } from "../../../../src/internal/execution/types/network-interaction";
+import { FutureType } from "../../../../src/types/module";
+import { exampleAccounts } from "../../../helpers";
 
 class StubJsonRpcClient implements JsonRpcClient {
   public async getChainId(): Promise<number> {
@@ -31,6 +45,7 @@ class StubJsonRpcClient implements JsonRpcClient {
   public async getLatestBlock(): Promise<Block> {
     throw new Error("Mock not implemented.");
   }
+
   public async getBalance(
     _address: string,
     _blockTag: "latest" | "pending"
@@ -122,6 +137,133 @@ describe("Network interactions", () => {
     });
   });
 
+  describe("monitorOnchainInteraction", () => {
+    const requiredConfirmations = 1;
+    const millisecondBeforeBumpingFees = 1;
+    const maxFeeBumps = 1;
+
+    const testGetTransactionRetryConfig: GetTransactionRetryConfig = {
+      maxRetries: 10,
+      retryInterval: 1,
+    };
+
+    let mockClient: MockGetTransactionJsonRpcClient;
+    let fakeTransactionTrackingTimer: FakeTransactionTrackingTimer;
+
+    const exampleDeploymentExecutionState: DeploymentExecutionState = {
+      id: "test",
+      type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE,
+      futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT,
+      strategy: "basic",
+      status: ExecutionStatus.STARTED,
+      dependencies: new Set<string>(),
+      artifactId: "./artifact.json",
+      contractName: "Contract1",
+      value: 0n,
+      constructorArgs: [],
+      libraries: {},
+      from: exampleAccounts[0],
+      networkInteractions: [],
+    };
+
+    beforeEach(() => {
+      mockClient = new MockGetTransactionJsonRpcClient();
+      fakeTransactionTrackingTimer = new FakeTransactionTrackingTimer();
+    });
+
+    it("Should succeed even if transaction takes time to propagate to the mempool", async () => {
+      const deploymentExecutionState: DeploymentExecutionState = {
+        ...exampleDeploymentExecutionState,
+        networkInteractions: [
+          {
+            id: 1,
+            type: NetworkInteractionType.ONCHAIN_INTERACTION,
+            to: exampleAccounts[1],
+            value: 0n,
+            data: "0x",
+            shouldBeResent: true,
+            transactions: [
+              {
+                hash: "0x1234",
+                fees: {
+                  maxFeePerGas: 0n,
+                  maxPriorityFeePerGas: 0n,
+                },
+              },
+            ],
+          },
+        ],
+      };
+
+      mockClient.callToFindResult = 4;
+      mockClient.result = {
+        hash: "0x1234",
+        fees: {
+          maxFeePerGas: 0n,
+          maxPriorityFeePerGas: 0n,
+        },
+      };
+
+      const message = await monitorOnchainInteraction(
+        deploymentExecutionState,
+        mockClient,
+        fakeTransactionTrackingTimer,
+        requiredConfirmations,
+        millisecondBeforeBumpingFees,
+        maxFeeBumps,
+        testGetTransactionRetryConfig
+      );
+
+      if (message === undefined) {
+        return assert.fail("No message returned from monitoring");
+      }
+
+      assert.isDefined(message);
+      assert.equal(message.type, JournalMessageType.TRANSACTION_CONFIRM);
+      assert.equal(message.futureId, deploymentExecutionState.id);
+    });
+
+    it("Should error when no transaction in the mempool even after awaiting propagation", async () => {
+      const deploymentExecutionState: DeploymentExecutionState = {
+        ...exampleDeploymentExecutionState,
+        networkInteractions: [
+          {
+            id: 1,
+            type: NetworkInteractionType.ONCHAIN_INTERACTION,
+            to: exampleAccounts[1],
+            value: 0n,
+            data: "0x",
+            shouldBeResent: true,
+            transactions: [
+              {
+                hash: "0x1234",
+                fees: {
+                  maxFeePerGas: 0n,
+                  maxPriorityFeePerGas: 0n,
+                },
+              },
+            ],
+          },
+        ],
+      };
+
+      await assert.isRejected(
+        monitorOnchainInteraction(
+          deploymentExecutionState,
+          mockClient,
+          fakeTransactionTrackingTimer,
+          requiredConfirmations,
+          millisecondBeforeBumpingFees,
+          maxFeeBumps,
+          testGetTransactionRetryConfig
+        ),
+        /IGN401: Error while executing test: all the transactions of its network interaction 1 were dropped\. Please try rerunning Hardhat Ignition\./
+      );
+
+      assert.equal(mockClient.calls, 10);
+    });
+  });
+
   describe("sendTransactionForOnchainInteraction", () => {
     describe("First transaction", () => {
       it("Should allocate a nonce for the onchain interaction's sender", async () => {
@@ -180,3 +322,46 @@ describe("Network interactions", () => {
     });
   });
 });
+
+class MockGetTransactionJsonRpcClient extends StubJsonRpcClient {
+  public calls: number = 0;
+  public callToFindResult: number = Number.MAX_SAFE_INTEGER;
+  public result: Omit<Transaction, "receipt"> | undefined = undefined;
+
+  public async getTransaction(
+    _txHash: string
+  ): Promise<Omit<Transaction, "receipt"> | undefined> {
+    if (this.calls === this.callToFindResult) {
+      return this.result;
+    }
+
+    this.calls += 1;
+
+    return undefined;
+  }
+
+  public async getLatestBlock(): Promise<Block> {
+    return {
+      hash: "0xblockhas",
+      number: 34,
+    };
+  }
+
+  public async getTransactionReceipt(
+    _txHash: string
+  ): Promise<TransactionReceipt | undefined> {
+    return {
+      blockHash: "0xblockhash",
+      blockNumber: 34,
+      contractAddress: "0xcontractaddress",
+      logs: [],
+      status: TransactionReceiptStatus.SUCCESS,
+    };
+  }
+}
+
+class FakeTransactionTrackingTimer extends TransactionTrackingTimer {
+  public getTransactionTrackingTime(_txHash: string): number {
+    return 0;
+  }
+}
diff --git a/packages/core/test/getParameter.ts b/packages/core/test/getParameter.ts
index 2f5bea21..7af27fc3 100644
--- a/packages/core/test/getParameter.ts
+++ b/packages/core/test/getParameter.ts
@@ -3,7 +3,7 @@ import { assert } from "chai";
 
 import { buildModule } from "../src/build-module";
 import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module";
-import { ModuleParameterType } from "../src/types/module";
+import { SolidityParameterType } from "../src/types/module";
 
 import { assertInstanceOf } from "./helpers";
 
@@ -61,7 +61,7 @@ describe("getParameter", () => {
     });
 
     it("Should accept arrays as deafult", () => {
-      const defaultValue: ModuleParameterType = [1, "dos", 3n, false];
+      const defaultValue: SolidityParameterType = [1, "dos", 3n, false];
       const mod = buildModule("MyModule", (m) => {
         const p = m.getParameter("p", defaultValue);
 
@@ -77,7 +77,7 @@ describe("getParameter", () => {
     });
 
     it("Should accept objects as deafult", () => {
-      const defaultValue: ModuleParameterType = { a: 1, b: "dos", c: 3n };
+      const defaultValue: SolidityParameterType = { a: 1, b: "dos", c: 3n };
       const mod = buildModule("MyModule", (m) => {
         const p = m.getParameter("p", defaultValue);
 
@@ -93,7 +93,7 @@ describe("getParameter", () => {
     });
 
     it("Should accept complex combinations as default", () => {
-      const defaultValue: ModuleParameterType = {
+      const defaultValue: SolidityParameterType = {
         arr: [123, { a: [{ o: true }] }],
       };
       const mod = buildModule("MyModule", (m) => {
@@ -109,5 +109,23 @@ describe("getParameter", () => {
       assert.equal(param.name, "p");
       assert.deepEqual(param.defaultValue, defaultValue);
     });
+
+    it("should accept account runtime values as default", () => {
+      const mod = buildModule("MyModule", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+
+        const contract = m.contract("Contract", [p]);
+
+        return { contract };
+      });
+
+      const param = mod.results.contract.constructorArgs[0];
+      assertInstanceOf(param, ModuleParameterRuntimeValueImplementation);
+      assert.equal(param.name, "p");
+      assert.deepEqual(param.defaultValue, {
+        accountIndex: 1,
+        type: "ACCOUNT",
+      });
+    });
   });
 });
diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts
index 16ba67d9..ad8eb0be 100644
--- a/packages/core/test/ignition-module-serializer.ts
+++ b/packages/core/test/ignition-module-serializer.ts
@@ -622,6 +622,17 @@ describe("stored deployment serializer", () => {
 
       assertSerializableModuleIn(module);
     });
+
+    it("should support ModuleParameterRuntimeValue with AccountRuntimeValue default value as arguments", () => {
+      const module = buildModule("Module", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+        const contract1 = m.contract("Contract1", [p]);
+
+        return { contract1 };
+      });
+
+      assertSerializableModuleIn(module);
+    });
   });
 });
 
diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts
index 1f3474c7..3e0b523b 100644
--- a/packages/core/test/reconciliation/reconciler.ts
+++ b/packages/core/test/reconciliation/reconciler.ts
@@ -219,6 +219,53 @@ describe("Reconciliation", () => {
         },
       ]);
     });
+
+    it("should reconcile an unchanged ModuleParameter<AccountRuntimeValue>", async () => {
+      const moduleDefinition = buildModule("Module1", (m) => {
+        const accountParam3 = m.getParameter("account3", m.getAccount(3));
+        const contract1 = m.contract("Contract1", [accountParam3]);
+
+        return { contract1 };
+      });
+
+      const reconiliationResult = await reconcile(
+        moduleDefinition,
+        createDeploymentState({
+          ...exampleDeploymentState,
+          futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT,
+          status: ExecutionStatus.STARTED,
+          constructorArgs: [exampleAccounts[3]],
+        })
+      );
+
+      assert.deepStrictEqual(reconiliationResult.reconciliationFailures, []);
+    });
+
+    it("should flag as unreconsiliable a changed ModuleParameter<AccountRuntimeValue> where the history indicates a different account", async () => {
+      const moduleDefinition = buildModule("Module1", (m) => {
+        const accountParam2 = m.getParameter("account2", m.getAccount(2));
+        const contract1 = m.contract("Contract1", [accountParam2]);
+
+        return { contract1 };
+      });
+
+      const reconiliationResult = await reconcile(
+        moduleDefinition,
+        createDeploymentState({
+          ...exampleDeploymentState,
+          futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT,
+          status: ExecutionStatus.STARTED,
+          constructorArgs: [exampleAccounts[3]],
+        })
+      );
+
+      assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [
+        {
+          futureId: "Module1#Contract1",
+          failure: `Argument at index 0 has been changed`,
+        },
+      ]);
+    });
   });
 
   describe("dependencies", () => {
diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts
index 7fc71618..771477d5 100644
--- a/packages/core/test/staticCall.ts
+++ b/packages/core/test/staticCall.ts
@@ -919,6 +919,93 @@ m.staticCall(..., { id: "MyUniqueId"})`
       );
     });
 
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "b",
+                type: "address",
+              },
+            ],
+            name: "test",
+            outputs: [],
+            stateMutability: "pure",
+            type: "function",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(1));
+
+        const another = m.contract("Another", fakerArtifact, []);
+        m.staticCall(another, "test", [p]);
+
+        return { another };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.STATIC_CALL
+      );
+
+      await assert.isFulfilled(
+        validateNamedStaticCall(
+          future as any,
+          setupMockArtifactResolver({ Another: fakeArtifact }),
+          {},
+          []
+        )
+      );
+    });
+
+    it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => {
+      const fakerArtifact: Artifact = {
+        ...fakeArtifact,
+        abi: [
+          {
+            inputs: [
+              {
+                internalType: "address",
+                name: "b",
+                type: "address",
+              },
+            ],
+            name: "test",
+            outputs: [],
+            stateMutability: "pure",
+            type: "function",
+          },
+        ],
+      };
+
+      const module = buildModule("Module1", (m) => {
+        const p = m.getParameter("p", m.getAccount(-1));
+
+        const another = m.contract("Another", fakerArtifact, []);
+        m.staticCall(another, "test", [p]);
+
+        return { another };
+      });
+
+      const future = getFuturesFromModule(module).find(
+        (v) => v.type === FutureType.STATIC_CALL
+      );
+
+      assertValidationError(
+        await validateNamedStaticCall(
+          future as any,
+          setupMockArtifactResolver({ Test: fakerArtifact }),
+          {},
+          []
+        ),
+        "Account index cannot be a negative number"
+      );
+    });
+
     it("should not validate a negative account index", async () => {
       const fakerArtifact: Artifact = {
         ...fakeArtifact,
diff --git a/packages/core/test/utils/replace-within-arg.ts b/packages/core/test/utils/replace-within-arg.ts
index e714d700..dfb744cc 100644
--- a/packages/core/test/utils/replace-within-arg.ts
+++ b/packages/core/test/utils/replace-within-arg.ts
@@ -1,7 +1,11 @@
 /* eslint-disable import/no-unused-modules */
 import { assert } from "chai";
 
-import { ArgumentType, SolidityParameterType } from "../../src";
+import {
+  ArgumentType,
+  SolidityParameterType,
+  isAccountRuntimeValue,
+} from "../../src";
 import {
   AccountRuntimeValueImplementation,
   ModuleParameterRuntimeValueImplementation,
@@ -25,7 +29,15 @@ describe("Arg resolution", () => {
           _kind: "ModuleParameterRuntimeValue",
           moduleId: mprv.moduleId,
           name: mprv.name,
-          defaultValue: mprv.defaultValue ?? "na",
+          defaultValue:
+            mprv.defaultValue === undefined
+              ? "na"
+              : isAccountRuntimeValue(mprv.defaultValue)
+              ? {
+                  _kind: "AccountRuntimeValue",
+                  accountIndex: mprv.defaultValue.accountIndex,
+                }
+              : mprv.defaultValue,
         }),
         bigint: (bi) => `${bi.toString()}n`,
         future: (f) => ({ _kind: "FutureToken", futureId: f.id }),
diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol
new file mode 100644
index 00000000..67f06f80
--- /dev/null
+++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+contract Owner {
+  address public owner;
+
+  constructor() {
+    owner = msg.sender;
+  }
+
+  function setOwner(address _owner) public {
+    owner = _owner;
+  }
+}
diff --git a/packages/hardhat-plugin/test/module-api/params.ts b/packages/hardhat-plugin/test/module-api/params.ts
index 9ea00b73..d76c90bb 100644
--- a/packages/hardhat-plugin/test/module-api/params.ts
+++ b/packages/hardhat-plugin/test/module-api/params.ts
@@ -82,6 +82,52 @@ describe("module parameters", () => {
 
     assert.equal(await result.greeter.read.getGreeting(), "NotExample");
   });
+
+  it("should be able to retrieve a default AccountRuntimeValue", async function () {
+    const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => {
+      const newOwner = m.getParameter("newOwner", m.getAccount(1));
+
+      const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) });
+
+      m.call(ownerContract, "setOwner", [newOwner]);
+
+      return { ownerContract };
+    });
+
+    const result = await this.hre.ignition.deploy(moduleDefinition);
+
+    const v = (await result.ownerContract.read.owner()) as string;
+
+    const accounts = await this.hre.network.provider.send("eth_accounts");
+
+    assert.equal(v.toLowerCase(), accounts[1]);
+  });
+
+  it("should be able to override a default AccountRuntimeValue", async function () {
+    const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => {
+      const newOwner = m.getParameter("newOwner", m.getAccount(1));
+
+      const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) });
+
+      m.call(ownerContract, "setOwner", [newOwner]);
+
+      return { ownerContract };
+    });
+
+    const accounts = await this.hre.network.provider.send("eth_accounts");
+
+    const result = await this.hre.ignition.deploy(moduleDefinition, {
+      parameters: {
+        WithDefaultAccountModule: {
+          newOwner: accounts[2],
+        },
+      },
+    });
+
+    const v = (await result.ownerContract.read.owner()) as string;
+
+    assert.equal(v.toLowerCase(), accounts[2]);
+  });
 });
 
 describe("params validation", () => {