@cofhe/hardhat-plugin 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @cofhe/hardhat-plugin Changelog
2
2
 
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - d4e86ea: Aligns with CTA encrypted variables bytes32 representation.
8
+
9
+ - **@cofhe/hardhat-plugin**: `hre.cofhe.mocks.getTestBed()`, `getMockTaskManager()`, `getMockACL()`, `getMockThresholdNetwork()`, and `getMockZkVerifier()` now return typed contracts (typechain interfaces) instead of untyped `Contract`. `getPlaintext(ctHash)` and `expectPlaintext(ctHash, value)` now accept bytes32 ctHashes as `string` support cofhe-contracts 0.1.0 CTA changes.
10
+ - **@cofhe/mock-contracts**: Export typechain-generated contract types (`TestBed`, `MockACL`, `MockTaskManager`, `MockZkVerifier`, `MockThresholdNetwork`) for use with the hardhat plugin. Typechain is run from artifact ABIs only; factory files are not generated.
11
+ - **@cofhe/abi**: CTA-related types use `bytes32` (string) instead of `uint256`. Decryption and return-type helpers aligned with cofhe-contracts 0.1.0.
12
+ - **@cofhe/sdk**: Decryption APIs (`decryptForTx`, `decryptForView`, and related builders) now also accept `string` for ciphertext hashes (bytes32) as well as `bigint`.
13
+
14
+ - Updated dependencies [d4e86ea]
15
+ - Updated dependencies [0feaf3f]
16
+ - @cofhe/sdk@0.3.2
17
+ - @cofhe/mock-contracts@0.3.2
18
+
3
19
  ## 0.3.1
4
20
 
5
21
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -2,10 +2,10 @@ import { PublicClient, WalletClient } from 'viem';
2
2
  import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';
3
3
  import { CofheInputConfig, CofheConfig, CofheClient } from '@cofhe/sdk';
4
4
  import { HardhatRuntimeEnvironment } from 'hardhat/types';
5
+ import { MockArtifact, MockTaskManager, MockACL, MockThresholdNetwork, MockZkVerifier, TestBed } from '@cofhe/mock-contracts';
5
6
  import * as ethers from 'ethers';
6
7
  import { Contract, ethers as ethers$1 } from 'ethers';
7
8
  import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';
8
- import { MockArtifact } from '@cofhe/mock-contracts';
9
9
 
10
10
  type DeployMocksArgs = {
11
11
  deployTestBed?: boolean;
@@ -20,9 +20,9 @@ declare const TASK_COFHE_MOCKS_DEPLOY = "task:cofhe-mocks:deploy";
20
20
 
21
21
  declare const deployMockContractFromArtifact: (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => Promise<Contract>;
22
22
  declare const getFixedMockContract: (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => Promise<Contract>;
23
- declare const mock_getPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint) => Promise<any>;
24
- declare const mock_getPlaintextExists: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint) => Promise<any>;
25
- declare const mock_expectPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint, expectedValue: bigint) => Promise<void>;
23
+ declare const mock_getPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string) => Promise<any>;
24
+ declare const mock_getPlaintextExists: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string) => Promise<any>;
25
+ declare const mock_expectPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string, expectedValue: bigint) => Promise<void>;
26
26
 
27
27
  /**
28
28
  * Sends funds to the specified address
@@ -163,43 +163,43 @@ declare module 'hardhat/types/runtime' {
163
163
  * **[MOCKS ONLY]**
164
164
  *
165
165
  * Get the plaintext value for a ciphertext hash
166
- * @param {bigint} ctHash - The ciphertext hash to look up
166
+ * @param {bigint | string} ctHash - The ciphertext hash to look up
167
167
  * @returns {Promise<bigint>} The plaintext value
168
168
  */
169
- getPlaintext: (ctHash: bigint) => Promise<bigint>;
169
+ getPlaintext: (ctHash: bigint | string) => Promise<bigint>;
170
170
  /**
171
171
  * **[MOCKS ONLY]**
172
172
  *
173
173
  * Assert that a ciphertext hash represents an expected plaintext value
174
- * @param {bigint} ctHash - The ciphertext hash to check
174
+ * @param {bigint | string} ctHash - The ciphertext hash to check
175
175
  * @param {bigint} expectedValue - The expected plaintext value
176
176
  */
177
- expectPlaintext: (ctHash: bigint, expectedValue: bigint) => Promise<void>;
177
+ expectPlaintext: (ctHash: bigint | string, expectedValue: bigint) => Promise<void>;
178
178
  /**
179
- * Get the MockTaskManager contract
180
- * @returns {Promise<Contract>} The MockTaskManager contract
179
+ * Get the MockTaskManager contract (typed via typechain)
180
+ * @returns {Promise<MockTaskManager>} The MockTaskManager contract
181
181
  */
182
- getMockTaskManager: () => Promise<Contract>;
182
+ getMockTaskManager: () => Promise<MockTaskManager>;
183
183
  /**
184
- * Get the MockACL contract
185
- * @returns {Promise<Contract>} The MockACL contract
184
+ * Get the MockACL contract (typed via typechain)
185
+ * @returns {Promise<MockACL>} The MockACL contract
186
186
  */
187
- getMockACL: () => Promise<Contract>;
187
+ getMockACL: () => Promise<MockACL>;
188
188
  /**
189
- * Get the MockThresholdNetwork contract
190
- * @returns {Promise<Contract>} The MockThresholdNetwork contract
189
+ * Get the MockThresholdNetwork contract (typed via typechain)
190
+ * @returns {Promise<MockThresholdNetwork>} The MockThresholdNetwork contract
191
191
  */
192
- getMockThresholdNetwork: () => Promise<Contract>;
192
+ getMockThresholdNetwork: () => Promise<MockThresholdNetwork>;
193
193
  /**
194
- * Get the MockZkVerifier contract
195
- * @returns {Promise<Contract>} The MockZkVerifier contract
194
+ * Get the MockZkVerifier contract (typed via typechain)
195
+ * @returns {Promise<MockZkVerifier>} The MockZkVerifier contract
196
196
  */
197
- getMockZkVerifier: () => Promise<Contract>;
197
+ getMockZkVerifier: () => Promise<MockZkVerifier>;
198
198
  /**
199
- * Get the TestBed contract
200
- * @returns {Promise<Contract>} The TestBed contract
199
+ * Get the TestBed contract (typed via typechain)
200
+ * @returns {Promise<TestBed>} The TestBed contract
201
201
  */
202
- getTestBed: () => Promise<Contract>;
202
+ getTestBed: () => Promise<TestBed>;
203
203
  };
204
204
  };
205
205
  }
package/dist/index.d.ts CHANGED
@@ -2,10 +2,10 @@ import { PublicClient, WalletClient } from 'viem';
2
2
  import { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';
3
3
  import { CofheInputConfig, CofheConfig, CofheClient } from '@cofhe/sdk';
4
4
  import { HardhatRuntimeEnvironment } from 'hardhat/types';
5
+ import { MockArtifact, MockTaskManager, MockACL, MockThresholdNetwork, MockZkVerifier, TestBed } from '@cofhe/mock-contracts';
5
6
  import * as ethers from 'ethers';
6
7
  import { Contract, ethers as ethers$1 } from 'ethers';
7
8
  import { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';
8
- import { MockArtifact } from '@cofhe/mock-contracts';
9
9
 
10
10
  type DeployMocksArgs = {
11
11
  deployTestBed?: boolean;
@@ -20,9 +20,9 @@ declare const TASK_COFHE_MOCKS_DEPLOY = "task:cofhe-mocks:deploy";
20
20
 
21
21
  declare const deployMockContractFromArtifact: (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => Promise<Contract>;
22
22
  declare const getFixedMockContract: (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => Promise<Contract>;
23
- declare const mock_getPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint) => Promise<any>;
24
- declare const mock_getPlaintextExists: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint) => Promise<any>;
25
- declare const mock_expectPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint, expectedValue: bigint) => Promise<void>;
23
+ declare const mock_getPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string) => Promise<any>;
24
+ declare const mock_getPlaintextExists: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string) => Promise<any>;
25
+ declare const mock_expectPlaintext: (provider: HardhatEthersProvider | ethers$1.JsonRpcProvider, ctHash: bigint | string, expectedValue: bigint) => Promise<void>;
26
26
 
27
27
  /**
28
28
  * Sends funds to the specified address
@@ -163,43 +163,43 @@ declare module 'hardhat/types/runtime' {
163
163
  * **[MOCKS ONLY]**
164
164
  *
165
165
  * Get the plaintext value for a ciphertext hash
166
- * @param {bigint} ctHash - The ciphertext hash to look up
166
+ * @param {bigint | string} ctHash - The ciphertext hash to look up
167
167
  * @returns {Promise<bigint>} The plaintext value
168
168
  */
169
- getPlaintext: (ctHash: bigint) => Promise<bigint>;
169
+ getPlaintext: (ctHash: bigint | string) => Promise<bigint>;
170
170
  /**
171
171
  * **[MOCKS ONLY]**
172
172
  *
173
173
  * Assert that a ciphertext hash represents an expected plaintext value
174
- * @param {bigint} ctHash - The ciphertext hash to check
174
+ * @param {bigint | string} ctHash - The ciphertext hash to check
175
175
  * @param {bigint} expectedValue - The expected plaintext value
176
176
  */
177
- expectPlaintext: (ctHash: bigint, expectedValue: bigint) => Promise<void>;
177
+ expectPlaintext: (ctHash: bigint | string, expectedValue: bigint) => Promise<void>;
178
178
  /**
179
- * Get the MockTaskManager contract
180
- * @returns {Promise<Contract>} The MockTaskManager contract
179
+ * Get the MockTaskManager contract (typed via typechain)
180
+ * @returns {Promise<MockTaskManager>} The MockTaskManager contract
181
181
  */
182
- getMockTaskManager: () => Promise<Contract>;
182
+ getMockTaskManager: () => Promise<MockTaskManager>;
183
183
  /**
184
- * Get the MockACL contract
185
- * @returns {Promise<Contract>} The MockACL contract
184
+ * Get the MockACL contract (typed via typechain)
185
+ * @returns {Promise<MockACL>} The MockACL contract
186
186
  */
187
- getMockACL: () => Promise<Contract>;
187
+ getMockACL: () => Promise<MockACL>;
188
188
  /**
189
- * Get the MockThresholdNetwork contract
190
- * @returns {Promise<Contract>} The MockThresholdNetwork contract
189
+ * Get the MockThresholdNetwork contract (typed via typechain)
190
+ * @returns {Promise<MockThresholdNetwork>} The MockThresholdNetwork contract
191
191
  */
192
- getMockThresholdNetwork: () => Promise<Contract>;
192
+ getMockThresholdNetwork: () => Promise<MockThresholdNetwork>;
193
193
  /**
194
- * Get the MockZkVerifier contract
195
- * @returns {Promise<Contract>} The MockZkVerifier contract
194
+ * Get the MockZkVerifier contract (typed via typechain)
195
+ * @returns {Promise<MockZkVerifier>} The MockZkVerifier contract
196
196
  */
197
- getMockZkVerifier: () => Promise<Contract>;
197
+ getMockZkVerifier: () => Promise<MockZkVerifier>;
198
198
  /**
199
- * Get the TestBed contract
200
- * @returns {Promise<Contract>} The TestBed contract
199
+ * Get the TestBed contract (typed via typechain)
200
+ * @returns {Promise<TestBed>} The TestBed contract
201
201
  */
202
- getTestBed: () => Promise<Contract>;
202
+ getTestBed: () => Promise<TestBed>;
203
203
  };
204
204
  };
205
205
  }
package/dist/index.js CHANGED
@@ -159,7 +159,7 @@ var mock_getPlaintext = async (provider, ctHash) => {
159
159
  ["function mockStorage(uint256) view returns (uint256)"],
160
160
  provider
161
161
  );
162
- const plaintext = await taskManager.mockStorage(ctHash);
162
+ const plaintext = await taskManager.mockStorage(BigInt(ctHash));
163
163
  return plaintext;
164
164
  };
165
165
  var mock_getPlaintextExists = async (provider, ctHash) => {
@@ -170,7 +170,7 @@ var mock_getPlaintextExists = async (provider, ctHash) => {
170
170
  ["function inMockStorage(uint256) view returns (bool)"],
171
171
  provider
172
172
  );
173
- const plaintextExists = await taskManager.inMockStorage(ctHash);
173
+ const plaintextExists = await taskManager.inMockStorage(BigInt(ctHash));
174
174
  return plaintextExists;
175
175
  };
176
176
  var mock_expectPlaintext = async (provider, ctHash, expectedValue) => {
@@ -203,6 +203,10 @@ var deployMocks = async (hre, options = {
203
203
  logDeployment("MockACL", await acl.getAddress());
204
204
  await linkTaskManagerAndACL(taskManager, acl);
205
205
  logSuccess("ACL address set in TaskManager", 2);
206
+ await setVerifierSigner(taskManager);
207
+ logSuccess("Verifier signer set", 2);
208
+ await setDecryptResultSigner(taskManager);
209
+ logSuccess("Decrypt result signer set", 2);
206
210
  await fundZkVerifierSigner(hre);
207
211
  logSuccess(`ZkVerifier signer (${import_sdk2.MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);
208
212
  const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);
@@ -264,6 +268,16 @@ var linkTaskManagerAndACL = async (taskManager, acl) => {
264
268
  const linkAclTx = await taskManager.setACLContract(aclAddress);
265
269
  await linkAclTx.wait();
266
270
  };
271
+ var setVerifierSigner = async (taskManager) => {
272
+ const signer = new import_ethers2.Wallet(import_sdk2.MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY);
273
+ const setSignerTx = await taskManager.setVerifierSigner(signer.address);
274
+ await setSignerTx.wait();
275
+ };
276
+ var setDecryptResultSigner = async (taskManager) => {
277
+ const signer = new import_ethers2.Wallet(import_sdk2.MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY);
278
+ const setSignerTx = await taskManager.setDecryptResultSigner(signer.address);
279
+ await setSignerTx.wait();
280
+ };
267
281
  var deployMockZkVerifier = async (hre) => {
268
282
  const zkVerifier = await deployMockContractFromArtifact(hre, import_mock_contracts.MockZkVerifierArtifact);
269
283
  const zkVerifierExists = await zkVerifier.exists();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fund.ts","../src/consts.ts","../src/deploy.ts","../src/utils.ts","../src/logging.ts"],"sourcesContent":["/* eslint-disable no-empty-pattern */\n/* eslint-disable turbo/no-undeclared-env-vars */\nimport chalk from 'chalk';\nimport { type PublicClient, type WalletClient } from 'viem';\nimport { extendConfig, extendEnvironment, task, types } from 'hardhat/config';\nimport { TASK_TEST, TASK_NODE } from 'hardhat/builtin-tasks/task-names';\nimport { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';\nimport {\n type CofheClient,\n type CofheConfig,\n type CofheInputConfig,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n} from '@cofhe/sdk';\nimport { createCofheClient, createCofheConfig } from '@cofhe/sdk/node';\nimport { HardhatSignerAdapter } from '@cofhe/sdk/adapters';\n\nimport { localcofheFundAccount } from './fund.js';\nimport { TASK_COFHE_MOCKS_DEPLOY, TASK_COFHE_MOCKS_SET_LOG_OPS, TASK_COFHE_USE_FAUCET } from './consts.js';\nimport { deployMocks, type DeployMocksArgs } from './deploy.js';\nimport { mock_setLoggingEnabled, mock_withLogs } from './logging.js';\nimport { getFixedMockContract, mock_expectPlaintext } from './utils.js';\nimport { mock_getPlaintext } from './utils.js';\nimport type { Contract } from 'ethers';\nimport { hardhat } from '@cofhe/sdk/chains';\nimport {\n MockACLArtifact,\n MockThresholdNetworkArtifact,\n MockTaskManagerArtifact,\n MockZkVerifierArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\n/**\n * Configuration interface for the CoFHE Hardhat plugin.\n * Allows users to configure mock logging and gas warning settings.\n */\ndeclare module 'hardhat/types/config' {\n interface HardhatUserConfig {\n cofhe?: {\n /** Whether to log mock operations (default: true) */\n logMocks?: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning?: boolean;\n };\n }\n\n interface HardhatConfig {\n cofhe: {\n /** Whether to log mock operations (default: true) */\n logMocks: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning: boolean;\n };\n }\n}\n\nextendConfig((config, userConfig) => {\n // Allow users to override the localcofhe network config\n if (userConfig.networks && userConfig.networks.localcofhe) {\n return;\n }\n\n // Default config\n config.networks.localcofhe = {\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 10_000,\n httpHeaders: {},\n url: 'http://127.0.0.1:42069',\n accounts: [\n '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',\n ],\n };\n\n // Only add Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['eth-sepolia']) {\n config.networks['eth-sepolia'] = {\n url: process.env.SEPOLIA_RPC_URL ?? 'https://ethereum-sepolia.publicnode.com',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 11155111,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Only add Arbitrum Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['arb-sepolia']) {\n config.networks['arb-sepolia'] = {\n url: process.env.ARBITRUM_SEPOLIA_RPC_URL ?? 'https://sepolia-rollup.arbitrum.io/rpc',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 421614,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Add cofhe config\n config.cofhe = {\n logMocks: userConfig.cofhe?.logMocks ?? true,\n gasWarning: userConfig.cofhe?.gasWarning ?? true,\n };\n});\n\ntype UseFaucetArgs = {\n address?: string;\n};\n\ntask(TASK_COFHE_USE_FAUCET, 'Fund an account from the funder')\n .addOptionalParam('address', 'Address to fund', undefined, types.string)\n .setAction(async ({ address }: UseFaucetArgs, hre) => {\n const { network } = hre;\n const { name: networkName } = network;\n\n if (networkName !== 'localcofhe') {\n console.info(chalk.yellow(`Programmatic faucet only supported for localcofhe`));\n return;\n }\n\n if (!address) {\n console.info(chalk.red(`Failed to get address to fund`));\n return;\n }\n\n console.info(chalk.green(`Getting funds from faucet for ${address}`));\n\n try {\n await localcofheFundAccount(hre, address);\n } catch (e) {\n console.info(chalk.red(`failed to get funds from localcofhe for ${address}: ${e}`));\n }\n });\n\n// DEPLOY TASKS\n\ntask(TASK_COFHE_MOCKS_DEPLOY, 'Deploys the mock contracts on the Hardhat network')\n .addOptionalParam('deployTestBed', 'Whether to deploy the test bed', true, types.boolean)\n .addOptionalParam('silent', 'Whether to suppress output', false, types.boolean)\n .setAction(async ({ deployTestBed, silent }: DeployMocksArgs, hre) => {\n await deployMocks(hre, {\n deployTestBed: deployTestBed ?? true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n silent: silent ?? false,\n });\n });\n\n// Hardhat plugin auto-deploys mocks for every hardhat test run by overriding TASK_TEST and calling deployMocks(...) before runSuper()\ntask(TASK_TEST, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\ntask(TASK_NODE, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\n// SET LOG OPS\n\ntask(TASK_COFHE_MOCKS_SET_LOG_OPS, 'Set logging for the Mock CoFHE contracts')\n .addParam('enable', 'Whether to enable logging', false, types.boolean)\n .setAction(async ({ enable }, hre) => {\n await mock_setLoggingEnabled(hre, enable);\n });\n\n// MOCK UTILS\n\nexport * from './consts.js';\nexport * from './utils.js';\nexport * from './fund.js';\nexport * from './logging.js';\nexport * from './deploy.js';\n\n/**\n * Runtime environment extensions for the CoFHE Hardhat plugin.\n * Provides access to CoFHE initialization, environment checks, and mock utilities.\n */\ndeclare module 'hardhat/types/runtime' {\n export interface HardhatRuntimeEnvironment {\n cofhe: {\n /**\n * Create a CoFHE configuration for use with hre.cofhe.createClient(...)\n * @param {CofheInputConfig} config - The CoFHE input configuration\n * @returns {CofheConfig} The CoFHE configuration\n */\n createConfig: (config: CofheInputConfig) => Promise<CofheConfig>;\n /**\n * Create a CoFHE client instance\n * @param {CofheConfig} config - The CoFHE configuration (use createCofheConfig to create with Node.js defaults)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClient: (config: CofheConfig) => CofheClient;\n /**\n * Create viem clients from a Hardhat ethers signer, to be used with `cofheClient.connect(...)`\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<{ publicClient: PublicClient; walletClient: WalletClient }>} The viem clients\n */\n hardhatSignerAdapter: (\n signer: HardhatEthersSigner\n ) => Promise<{ publicClient: PublicClient; walletClient: WalletClient }>;\n /**\n * Connect a CoFHE client with a Hardhat ethers signer\n * @param {CofheClient} client - The CoFHE client to connect\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<void>}\n */\n connectWithHardhatSigner: (client: CofheClient, signer: HardhatEthersSigner) => Promise<void>;\n /**\n * Create and connect to a batteries included client.\n * Also generates a self-usage a permit for the signer.\n * If customization is needed, use createCofheClient and connectWithHardhatSigner.\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use (optional - defaults to first signer)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClientWithBatteries: (signer?: HardhatEthersSigner) => Promise<CofheClient>;\n\n mocks: {\n /**\n * **[MOCKS ONLY]**\n *\n * Execute a block of code with cofhe mock contracts logging enabled.\n *\n * _(If logging only a function, we recommend passing the function name as the closureName (ex \"counter.increment()\"))_\n *\n * Example usage:\n *\n * ```ts\n * await hre.cofhe.mocks.withLogs(\"counter.increment()\", async () => {\n * await counter.increment();\n * });\n * ```\n *\n * Expected output:\n * ```\n * ┌──────────────────┬──────────────────────────────────────────────────\n * │ [COFHE-MOCKS] │ \"counter.increment()\" logs:\n * ├──────────────────┴──────────────────────────────────────────────────\n * ├ FHE.add | euint32(4473..3424)[0] + euint32(1157..3648)[1] => euint32(1106..1872)[1]\n * ├ FHE.allowThis | euint32(1106..1872)[1] -> 0x663f..6602\n * ├ FHE.allow | euint32(1106..1872)[1] -> 0x3c44..93bc\n * └─────────────────────────────────────────────────────────────────────\n * ```\n * @param {string} closureName - Name of the code block to log within\n * @param {() => Promise<void>} closure - The async function to execute\n */\n withLogs: (closureName: string, closure: () => Promise<void>) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Enable logging from cofhe mock contracts\n * @param {string} closureName - Optional name of the code block to enable logging for\n */\n enableLogs: (closureName?: string) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Disable logging from cofhe mock contracts\n */\n disableLogs: () => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Deploy the cofhe mock contracts (normally this is done automatically)\n * @param {DeployMocksArgs} options - Deployment options\n */\n deployMocks: (options: DeployMocksArgs) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Get the plaintext value for a ciphertext hash\n * @param {bigint} ctHash - The ciphertext hash to look up\n * @returns {Promise<bigint>} The plaintext value\n */\n getPlaintext: (ctHash: bigint) => Promise<bigint>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Assert that a ciphertext hash represents an expected plaintext value\n * @param {bigint} ctHash - The ciphertext hash to check\n * @param {bigint} expectedValue - The expected plaintext value\n */\n expectPlaintext: (ctHash: bigint, expectedValue: bigint) => Promise<void>;\n\n /**\n * Get the MockTaskManager contract\n * @returns {Promise<Contract>} The MockTaskManager contract\n */\n getMockTaskManager: () => Promise<Contract>;\n\n /**\n * Get the MockACL contract\n * @returns {Promise<Contract>} The MockACL contract\n */\n getMockACL: () => Promise<Contract>;\n\n /**\n * Get the MockThresholdNetwork contract\n * @returns {Promise<Contract>} The MockThresholdNetwork contract\n */\n getMockThresholdNetwork: () => Promise<Contract>;\n\n /**\n * Get the MockZkVerifier contract\n * @returns {Promise<Contract>} The MockZkVerifier contract\n */\n getMockZkVerifier: () => Promise<Contract>;\n\n /**\n * Get the TestBed contract\n * @returns {Promise<Contract>} The TestBed contract\n */\n getTestBed: () => Promise<Contract>;\n };\n };\n }\n}\n\n/**\n * Builds the mocks config for the hardhat plugin.\n * Defaults `encryptDelay` to `0` so tests run without artificial wait times,\n * unless the user has explicitly provided a value.\n */\nexport function buildHardhatPluginMocksConfig(\n mocksConfig: CofheInputConfig['mocks']\n): NonNullable<CofheInputConfig['mocks']> {\n return {\n ...mocksConfig,\n encryptDelay: mocksConfig?.encryptDelay ?? 0,\n };\n}\n\nextendEnvironment((hre) => {\n hre.cofhe = {\n createConfig: async (config: CofheInputConfig) => {\n // Create zkv wallet client\n // This wallet interacts with the MockZkVerifier contract so that the user's connected wallet doesn't have to\n const zkvHhSigner = await hre.ethers.getImpersonatedSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n const { walletClient: zkvWalletClient } = await HardhatSignerAdapter(zkvHhSigner);\n\n // Inject zkv wallet client into config\n // Set encryptDelay to 0 on hardhat to avoid waiting for delays during tests\n const configWithZkvWalletClient = {\n environment: 'hardhat' as const,\n ...config,\n mocks: buildHardhatPluginMocksConfig(config.mocks),\n _internal: {\n ...config._internal,\n zkvWalletClient,\n },\n };\n\n return createCofheConfig(configWithZkvWalletClient);\n },\n createClient: (config: CofheConfig) => {\n return createCofheClient(config);\n },\n hardhatSignerAdapter: async (signer: HardhatEthersSigner) => {\n return HardhatSignerAdapter(signer);\n },\n connectWithHardhatSigner: async (client: CofheClient, signer: HardhatEthersSigner) => {\n const { publicClient, walletClient } = await HardhatSignerAdapter(signer);\n return client.connect(publicClient, walletClient);\n },\n createClientWithBatteries: async (signer?: HardhatEthersSigner) => {\n // Get signer if not provided\n if (!signer) {\n [signer] = await hre.ethers.getSigners();\n }\n\n // Create config\n const config = await hre.cofhe.createConfig({\n environment: 'hardhat',\n supportedChains: [hardhat],\n });\n\n // Create client\n const client = hre.cofhe.createClient(config);\n\n // Connect client\n await hre.cofhe.connectWithHardhatSigner(client, signer);\n\n // Create self-usage permit\n await client.permits.createSelf({\n issuer: signer.address,\n });\n\n // Return client\n return client;\n },\n mocks: {\n withLogs: async (closureName: string, closure: () => Promise<void>) => {\n return mock_withLogs(hre, closureName, closure);\n },\n enableLogs: async (closureName?: string) => {\n return mock_setLoggingEnabled(hre, true, closureName);\n },\n disableLogs: async () => {\n return mock_setLoggingEnabled(hre, false);\n },\n deployMocks: async (options: DeployMocksArgs) => {\n return deployMocks(hre, options);\n },\n getPlaintext: async (ctHash: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_getPlaintext(signer.provider, ctHash);\n },\n expectPlaintext: async (ctHash: bigint, expectedValue: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_expectPlaintext(signer.provider, ctHash, expectedValue);\n },\n getMockTaskManager: async () => getFixedMockContract(hre, MockTaskManagerArtifact),\n getMockACL: async () => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const aclAddress = await taskManager.acl();\n return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress);\n },\n getMockThresholdNetwork: async () => getFixedMockContract(hre, MockThresholdNetworkArtifact),\n getMockZkVerifier: async () => getFixedMockContract(hre, MockZkVerifierArtifact),\n getTestBed: async () => getFixedMockContract(hre, TestBedArtifact),\n },\n };\n});\n","/* eslint-disable turbo/no-undeclared-env-vars */\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport '@nomicfoundation/hardhat-ethers';\n\n/**\n * Sends funds to the specified address\n * @param hre Hardhat Runtime Environment\n * @param toAddress Address to send funds to\n * @param amount Amount to send in ETH (default: 10)\n * @returns Transaction receipt or null if failed\n */\nexport async function localcofheFundAccount(hre: HardhatRuntimeEnvironment, toAddress: string, amount: string = '10') {\n // Load private key from environment\n const privateKey =\n process.env.FUNDER_PRIVATE_KEY ?? '0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659';\n if (!privateKey) {\n console.error('Error: FUNDER_PRIVATE_KEY environment variable not set');\n return null;\n }\n\n try {\n // Create wallet from private key\n const wallet = new hre.ethers.Wallet(privateKey, hre.ethers.provider);\n\n // Get wallet balance\n const balance = await hre.ethers.provider.getBalance(wallet.address);\n console.log(`Funder wallet address: ${wallet.address}`);\n console.log(`Funder wallet balance: ${hre.ethers.formatEther(balance)} ETH`);\n\n // Check if wallet has enough funds\n const amountToSend = hre.ethers.parseEther(amount);\n if (balance < amountToSend) {\n console.error(\n `Error: Funder wallet doesn't have enough funds. Current balance: ${hre.ethers.formatEther(balance)} ETH`\n );\n return null;\n }\n\n // Send transaction\n console.log(`Sending ${amount} ETH to ${toAddress}...`);\n const tx = await wallet.sendTransaction({\n to: toAddress,\n value: amountToSend,\n });\n\n console.log(`Transaction sent! Hash: ${tx.hash}`);\n console.log('Waiting for confirmation...');\n\n // Wait for transaction to be mined\n const receipt = await tx.wait();\n console.log(`Transaction confirmed in block ${receipt?.blockNumber}`);\n console.log(`Successfully sent ${amount} ETH to ${toAddress}`);\n\n return receipt;\n } catch (error) {\n console.error('Error sending funds:', error);\n return null;\n }\n}\n\n/**\n * Checks a wallet's balance and funds it if below 1 ETH\n * @param hre Hardhat Runtime Environment\n * @param walletAddress Address of the wallet to check and potentially fund\n * @returns Promise that resolves when the funding operation completes (if needed)\n */\nexport async function localcofheFundWalletIfNeeded(hre: HardhatRuntimeEnvironment, walletAddress: string) {\n // Check wallet balance and fund if needed\n const walletBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet balance: ${hre.ethers.formatEther(walletBalance)} ETH`);\n\n if (walletBalance < hre.ethers.parseEther('1')) {\n console.log(`Wallet balance is less than 1 ETH. Funding ${walletAddress}...`);\n const receipt = await localcofheFundAccount(hre, walletAddress);\n if (receipt) {\n const newBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet new balance: ${hre.ethers.formatEther(newBalance)} ETH`);\n } else {\n console.error(`Failed to fund ${walletAddress}`);\n }\n }\n}\n","export const TASK_COFHE_USE_FAUCET = 'task:cofhe:usefaucet';\nexport const TASK_COFHE_MOCKS_SET_LOG_OPS = 'task:cofhe-mocks:setlogops';\nexport const TASK_COFHE_MOCKS_DEPLOY = 'task:cofhe-mocks:deploy';\n","import { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport chalk from 'chalk';\nimport { Contract } from 'ethers';\n\nimport {\n MockTaskManagerArtifact,\n MockACLArtifact,\n MockZkVerifierArtifact,\n MockThresholdNetworkArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\nimport { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS } from '@cofhe/sdk';\nimport { deployMockContractFromArtifact } from './utils';\n\n// Deployment\n\nexport type DeployMocksArgs = {\n deployTestBed?: boolean;\n gasWarning?: boolean;\n silent?: boolean;\n};\n\nexport const deployMocks = async (\n hre: HardhatRuntimeEnvironment,\n options: DeployMocksArgs = {\n deployTestBed: true,\n gasWarning: true,\n silent: false,\n }\n) => {\n // Check if network is Hardhat, if not log skip message and return\n const isHardhat = await getIsHardhat(hre);\n if (!isHardhat) {\n logSuccess(`cofhe-hardhat-plugin - deploy mocks - skipped on non-hardhat network ${hre.network.name}`, 0);\n return;\n }\n\n isSilent = options.silent ?? false;\n\n // Log start message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: deploy mocks'), 0);\n logEmpty();\n\n // Deploy mock contracts\n const taskManager = await deployMockTaskManager(hre);\n logDeployment('MockTaskManager', await taskManager.getAddress());\n\n const acl = await deployMockACL(hre);\n logDeployment('MockACL', await acl.getAddress());\n\n await linkTaskManagerAndACL(taskManager, acl);\n logSuccess('ACL address set in TaskManager', 2);\n\n await fundZkVerifierSigner(hre);\n logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);\n\n const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);\n logSuccess(`ETH balance: ${zkVerifierSignerBalance.toString()}`, 2);\n\n const zkVerifier = await deployMockZkVerifier(hre);\n logDeployment('MockZkVerifier', await zkVerifier.getAddress());\n\n const thresholdNetwork = await deployMockThresholdNetwork(hre, acl);\n logDeployment('MockThresholdNetwork', await thresholdNetwork.getAddress());\n\n if (options.deployTestBed) {\n logSuccess('TestBed deployment enabled', 2);\n const testBed = await deployTestBedContract(hre);\n logDeployment('TestBed', await testBed.getAddress());\n }\n\n // Log success message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: mocks deployed successfully'), 0);\n\n // Log warning about mocks increased gas costs\n if (options.gasWarning) {\n logEmpty();\n logWarning(\n \"When using mocks, FHE operations (eg FHE.add / FHE.mul) report a higher gas price due to additional on-chain mocking logic. Deploy your contracts on a testnet chain to check the true gas costs.\\n(Disable this warning by setting '@cofhe/sdk.gasWarning' to false in your hardhat config\",\n 0\n );\n }\n\n logEmpty();\n};\n\n// Network\n\nconst getIsHardhat = async (hre: HardhatRuntimeEnvironment) => {\n return hre.network.name === 'hardhat';\n};\n\nconst deployMockTaskManager = async (hre: HardhatRuntimeEnvironment) => {\n const [signer] = await hre.ethers.getSigners();\n\n // Deploy MockTaskManager\n const taskManager = await deployMockContractFromArtifact(hre, MockTaskManagerArtifact);\n\n // Initialize MockTaskManager\n const initTx = await taskManager.initialize(signer.address);\n await initTx.wait();\n\n // Check if MockTaskManager exists\n const tmExists = await taskManager.exists();\n if (!tmExists) {\n throw new Error('MockTaskManager does not exist');\n }\n\n return taskManager;\n};\n\nconst deployMockACL = async (hre: HardhatRuntimeEnvironment): Promise<Contract> => {\n // Deploy MockACL (uses ethers to deploy to ensure constructor called and EIP712 domain set)\n const acl = await deployMockContractFromArtifact(hre, MockACLArtifact);\n\n // Check if ACL exists\n const exists = await acl.exists();\n if (!exists) {\n throw new Error('MockACL does not exist');\n }\n\n return acl;\n};\n\nconst fundZkVerifierSigner = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifierSigner = await hre.ethers.getSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n await hre.network.provider.send('hardhat_setBalance', [\n zkVerifierSigner.address,\n '0x' + hre.ethers.parseEther('10').toString(16),\n ]);\n};\n\nconst getZkVerifierSignerBalance = async (hre: HardhatRuntimeEnvironment) => {\n return hre.ethers.provider.getBalance(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n};\n\nconst linkTaskManagerAndACL = async (taskManager: Contract, acl: Contract) => {\n const aclAddress = await acl.getAddress();\n const linkAclTx = await taskManager.setACLContract(aclAddress);\n await linkAclTx.wait();\n};\n\nconst deployMockZkVerifier = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);\n\n const zkVerifierExists = await zkVerifier.exists();\n if (!zkVerifierExists) {\n throw new Error('MockZkVerifier does not exist');\n }\n\n return zkVerifier;\n};\n\nconst deployMockThresholdNetwork = async (hre: HardhatRuntimeEnvironment, acl: Contract) => {\n const thresholdNetwork = await deployMockContractFromArtifact(hre, MockThresholdNetworkArtifact);\n\n // Initialize MockThresholdNetwork\n const initTx = await thresholdNetwork.initialize(TASK_MANAGER_ADDRESS, await acl.getAddress());\n await initTx.wait();\n\n // Check if MockThresholdNetwork exists\n const exists = await thresholdNetwork.exists();\n if (!exists) {\n throw new Error('MockThresholdNetwork does not exist');\n }\n\n return thresholdNetwork;\n};\n\nconst deployTestBedContract = async (hre: HardhatRuntimeEnvironment) => {\n return deployMockContractFromArtifact(hre, TestBedArtifact);\n};\n\n// Logging\n\nlet isSilent = false;\n\nconst logEmpty = () => {\n if (isSilent) return;\n console.log('');\n};\n\nconst logSuccess = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.green(`${' '.repeat(indent)}✓ ${message}`));\n};\n\nconst logWarning = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.bold(chalk.yellow(`${' '.repeat(indent)}⚠ NOTE:`)), message);\n};\n\nconst logError = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.red(`${' '.repeat(indent)}✗ ${message}`));\n};\n\nconst logDeployment = (contractName: string, address: string) => {\n if (isSilent) return;\n const paddedName = `${contractName} deployed`.padEnd(36);\n logSuccess(`${paddedName} ${chalk.bold(address)}`);\n};\n","import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS } from '@cofhe/sdk';\nimport { expect } from 'chai';\nimport { Contract, ethers } from 'ethers';\nimport { type HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\nimport type { MockArtifact } from '@cofhe/mock-contracts';\nimport type { HardhatRuntimeEnvironment } from 'hardhat/types';\n\n// Deployment utils\n\n/// Deploys a mock contract from a pre-built artifact from the mock-contracts package\n/// If the mock contract should be deployed to a fixed address, `hardhat_setCode` op is used to set the code at the fixed address\n/// Otherwise, we deploy the contract using ethers.js to a non-fixed address\nexport const deployMockContractFromArtifact = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n // Use hardhat_setCode to deploy to fixed address\n if (artifact.isFixed) {\n await hre.network.provider.send('hardhat_setCode', [artifact.fixedAddress, artifact.deployedBytecode]);\n return getFixedMockContract(hre, artifact);\n }\n\n // Use ethers.js to deploy to variable address\n const [signer] = await hre.ethers.getSigners();\n const factory = new hre.ethers.ContractFactory(artifact.abi, artifact.bytecode, signer);\n const contract = await factory.deploy(/* constructor args */);\n await contract.waitForDeployment();\n return contract as Contract;\n};\n\nexport const getFixedMockContract = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n if (!artifact.isFixed) {\n throw new Error('Artifact is not fixed');\n }\n return await hre.ethers.getContractAt(artifact.abi, artifact.fixedAddress);\n};\n\n// Testing utils\n\nconst mock_checkIsTestnet = async (fnName: string, provider: HardhatEthersProvider | ethers.JsonRpcProvider) => {\n // Testnet is checked by testing if MockZkVerifier is deployed\n\n // Get bytecode at ZK_VERIFIER_ADDRESS\n const bytecode = await provider.getCode(MOCKS_ZK_VERIFIER_ADDRESS);\n\n // If bytecode is empty, we are on a testnet\n const isTestnet = bytecode.length === 0;\n\n // Log if we are on a testnet\n if (isTestnet) {\n console.log(`${fnName} - skipped on non-testnet chain`);\n }\n\n return isTestnet;\n};\n\nexport const mock_getPlaintext = async (provider: HardhatEthersProvider | ethers.JsonRpcProvider, ctHash: bigint) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintext.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function mockStorage(uint256) view returns (uint256)'],\n provider\n );\n\n // Fetch the plaintext\n const plaintext = await taskManager.mockStorage(ctHash);\n\n return plaintext;\n};\n\nexport const mock_getPlaintextExists = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintextExists.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function inMockStorage(uint256) view returns (bool)'],\n provider\n );\n\n // Fetch the plaintext exists\n const plaintextExists = await taskManager.inMockStorage(ctHash);\n\n return plaintextExists;\n};\n\nexport const mock_expectPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint,\n expectedValue: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_expectPlaintext.name, provider)) return;\n\n // Expect the plaintext to exist\n const plaintextExists = await mock_getPlaintextExists(provider, ctHash);\n expect(plaintextExists).equal(true, 'Plaintext does not exist');\n\n // Expect the plaintext to have the expected value\n const plaintext = await mock_getPlaintext(provider, ctHash);\n expect(plaintext).equal(expectedValue, 'Plaintext value is incorrect');\n};\n","import chalk from 'chalk';\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport { getFixedMockContract } from './utils';\nimport { MockTaskManagerArtifact } from '@cofhe/mock-contracts';\n\nconst getLoggingEnabled = async (hre: HardhatRuntimeEnvironment): Promise<boolean> => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n return taskManager.logOps();\n};\n\nconst setLoggingEnabled = async (hre: HardhatRuntimeEnvironment, enabled: boolean) => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const tx = await taskManager.setLogOps(enabled);\n await tx.wait();\n};\n\n// prettier-ignore\nconst printLogsEnabledMessage = (closureMessage: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE-MOCKS] │ ${closureMessage}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\n// prettier-ignore\nconst printLogsBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const mock_setLoggingEnabled = async (\n hre: HardhatRuntimeEnvironment,\n enabled: boolean,\n closureName?: string\n) => {\n try {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, enabled);\n\n // Only print if enabling logs\n if (enabled) {\n printLogsEnabledMessage(`${closureName ? `\"${chalk.bold(closureName)}\" logs:` : 'Logs:'}`);\n }\n\n // Only print if disabling logs AND logs currently enabled\n if (!enabled && initiallyEnabled) {\n printLogsBlockEnd();\n }\n } catch (error) {\n console.log(chalk.red('mock_setLoggingEnabled error'), error);\n }\n};\n\nexport const mock_withLogs = async (\n hre: HardhatRuntimeEnvironment,\n closureName: string,\n closure: () => Promise<void>\n) => {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, true);\n printLogsEnabledMessage(`\"${chalk.bold(closureName)}\" logs:`);\n await closure();\n printLogsBlockEnd();\n\n // If logs were disabled, disable them again\n if (!initiallyEnabled) {\n await setLoggingEnabled(hre, false);\n }\n};\n"],"mappings":"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","names":["import_chalk","import_sdk","import_types","import_ethers","import_sdk","chalk","chalk","import_chalk","import_types","import_mock_contracts","chalk","import_mock_contracts","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fund.ts","../src/consts.ts","../src/deploy.ts","../src/utils.ts","../src/logging.ts"],"sourcesContent":["/* eslint-disable no-empty-pattern */\n/* eslint-disable turbo/no-undeclared-env-vars */\nimport chalk from 'chalk';\nimport { type PublicClient, type WalletClient } from 'viem';\nimport { extendConfig, extendEnvironment, task, types } from 'hardhat/config';\nimport { TASK_TEST, TASK_NODE } from 'hardhat/builtin-tasks/task-names';\nimport { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';\nimport {\n type CofheClient,\n type CofheConfig,\n type CofheInputConfig,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n} from '@cofhe/sdk';\nimport { createCofheClient, createCofheConfig } from '@cofhe/sdk/node';\nimport { HardhatSignerAdapter } from '@cofhe/sdk/adapters';\n\nimport { localcofheFundAccount } from './fund.js';\nimport { TASK_COFHE_MOCKS_DEPLOY, TASK_COFHE_MOCKS_SET_LOG_OPS, TASK_COFHE_USE_FAUCET } from './consts.js';\nimport { deployMocks, type DeployMocksArgs } from './deploy.js';\nimport { mock_setLoggingEnabled, mock_withLogs } from './logging.js';\nimport { getFixedMockContract, mock_expectPlaintext } from './utils.js';\nimport { mock_getPlaintext } from './utils.js';\nimport { hardhat } from '@cofhe/sdk/chains';\nimport {\n MockACLArtifact,\n MockThresholdNetworkArtifact,\n MockTaskManagerArtifact,\n MockZkVerifierArtifact,\n TestBedArtifact,\n type MockACL,\n type MockTaskManager,\n type MockThresholdNetwork,\n type MockZkVerifier,\n type TestBed,\n} from '@cofhe/mock-contracts';\n\n/**\n * Configuration interface for the CoFHE Hardhat plugin.\n * Allows users to configure mock logging and gas warning settings.\n */\ndeclare module 'hardhat/types/config' {\n interface HardhatUserConfig {\n cofhe?: {\n /** Whether to log mock operations (default: true) */\n logMocks?: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning?: boolean;\n };\n }\n\n interface HardhatConfig {\n cofhe: {\n /** Whether to log mock operations (default: true) */\n logMocks: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning: boolean;\n };\n }\n}\n\nextendConfig((config, userConfig) => {\n // Allow users to override the localcofhe network config\n if (userConfig.networks && userConfig.networks.localcofhe) {\n return;\n }\n\n // Default config\n config.networks.localcofhe = {\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 10_000,\n httpHeaders: {},\n url: 'http://127.0.0.1:42069',\n accounts: [\n '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',\n ],\n };\n\n // Only add Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['eth-sepolia']) {\n config.networks['eth-sepolia'] = {\n url: process.env.SEPOLIA_RPC_URL ?? 'https://ethereum-sepolia.publicnode.com',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 11155111,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Only add Arbitrum Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['arb-sepolia']) {\n config.networks['arb-sepolia'] = {\n url: process.env.ARBITRUM_SEPOLIA_RPC_URL ?? 'https://sepolia-rollup.arbitrum.io/rpc',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 421614,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Add cofhe config\n config.cofhe = {\n logMocks: userConfig.cofhe?.logMocks ?? true,\n gasWarning: userConfig.cofhe?.gasWarning ?? true,\n };\n});\n\ntype UseFaucetArgs = {\n address?: string;\n};\n\ntask(TASK_COFHE_USE_FAUCET, 'Fund an account from the funder')\n .addOptionalParam('address', 'Address to fund', undefined, types.string)\n .setAction(async ({ address }: UseFaucetArgs, hre) => {\n const { network } = hre;\n const { name: networkName } = network;\n\n if (networkName !== 'localcofhe') {\n console.info(chalk.yellow(`Programmatic faucet only supported for localcofhe`));\n return;\n }\n\n if (!address) {\n console.info(chalk.red(`Failed to get address to fund`));\n return;\n }\n\n console.info(chalk.green(`Getting funds from faucet for ${address}`));\n\n try {\n await localcofheFundAccount(hre, address);\n } catch (e) {\n console.info(chalk.red(`failed to get funds from localcofhe for ${address}: ${e}`));\n }\n });\n\n// DEPLOY TASKS\n\ntask(TASK_COFHE_MOCKS_DEPLOY, 'Deploys the mock contracts on the Hardhat network')\n .addOptionalParam('deployTestBed', 'Whether to deploy the test bed', true, types.boolean)\n .addOptionalParam('silent', 'Whether to suppress output', false, types.boolean)\n .setAction(async ({ deployTestBed, silent }: DeployMocksArgs, hre) => {\n await deployMocks(hre, {\n deployTestBed: deployTestBed ?? true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n silent: silent ?? false,\n });\n });\n\n// Hardhat plugin auto-deploys mocks for every hardhat test run by overriding TASK_TEST and calling deployMocks(...) before runSuper()\ntask(TASK_TEST, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\ntask(TASK_NODE, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\n// SET LOG OPS\n\ntask(TASK_COFHE_MOCKS_SET_LOG_OPS, 'Set logging for the Mock CoFHE contracts')\n .addParam('enable', 'Whether to enable logging', false, types.boolean)\n .setAction(async ({ enable }, hre) => {\n await mock_setLoggingEnabled(hre, enable);\n });\n\n// MOCK UTILS\n\nexport * from './consts.js';\nexport * from './utils.js';\nexport * from './fund.js';\nexport * from './logging.js';\nexport * from './deploy.js';\n\n/**\n * Runtime environment extensions for the CoFHE Hardhat plugin.\n * Provides access to CoFHE initialization, environment checks, and mock utilities.\n */\ndeclare module 'hardhat/types/runtime' {\n export interface HardhatRuntimeEnvironment {\n cofhe: {\n /**\n * Create a CoFHE configuration for use with hre.cofhe.createClient(...)\n * @param {CofheInputConfig} config - The CoFHE input configuration\n * @returns {CofheConfig} The CoFHE configuration\n */\n createConfig: (config: CofheInputConfig) => Promise<CofheConfig>;\n /**\n * Create a CoFHE client instance\n * @param {CofheConfig} config - The CoFHE configuration (use createCofheConfig to create with Node.js defaults)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClient: (config: CofheConfig) => CofheClient;\n /**\n * Create viem clients from a Hardhat ethers signer, to be used with `cofheClient.connect(...)`\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<{ publicClient: PublicClient; walletClient: WalletClient }>} The viem clients\n */\n hardhatSignerAdapter: (\n signer: HardhatEthersSigner\n ) => Promise<{ publicClient: PublicClient; walletClient: WalletClient }>;\n /**\n * Connect a CoFHE client with a Hardhat ethers signer\n * @param {CofheClient} client - The CoFHE client to connect\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<void>}\n */\n connectWithHardhatSigner: (client: CofheClient, signer: HardhatEthersSigner) => Promise<void>;\n /**\n * Create and connect to a batteries included client.\n * Also generates a self-usage a permit for the signer.\n * If customization is needed, use createCofheClient and connectWithHardhatSigner.\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use (optional - defaults to first signer)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClientWithBatteries: (signer?: HardhatEthersSigner) => Promise<CofheClient>;\n\n mocks: {\n /**\n * **[MOCKS ONLY]**\n *\n * Execute a block of code with cofhe mock contracts logging enabled.\n *\n * _(If logging only a function, we recommend passing the function name as the closureName (ex \"counter.increment()\"))_\n *\n * Example usage:\n *\n * ```ts\n * await hre.cofhe.mocks.withLogs(\"counter.increment()\", async () => {\n * await counter.increment();\n * });\n * ```\n *\n * Expected output:\n * ```\n * ┌──────────────────┬──────────────────────────────────────────────────\n * │ [COFHE-MOCKS] │ \"counter.increment()\" logs:\n * ├──────────────────┴──────────────────────────────────────────────────\n * ├ FHE.add | euint32(4473..3424)[0] + euint32(1157..3648)[1] => euint32(1106..1872)[1]\n * ├ FHE.allowThis | euint32(1106..1872)[1] -> 0x663f..6602\n * ├ FHE.allow | euint32(1106..1872)[1] -> 0x3c44..93bc\n * └─────────────────────────────────────────────────────────────────────\n * ```\n * @param {string} closureName - Name of the code block to log within\n * @param {() => Promise<void>} closure - The async function to execute\n */\n withLogs: (closureName: string, closure: () => Promise<void>) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Enable logging from cofhe mock contracts\n * @param {string} closureName - Optional name of the code block to enable logging for\n */\n enableLogs: (closureName?: string) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Disable logging from cofhe mock contracts\n */\n disableLogs: () => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Deploy the cofhe mock contracts (normally this is done automatically)\n * @param {DeployMocksArgs} options - Deployment options\n */\n deployMocks: (options: DeployMocksArgs) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Get the plaintext value for a ciphertext hash\n * @param {bigint | string} ctHash - The ciphertext hash to look up\n * @returns {Promise<bigint>} The plaintext value\n */\n getPlaintext: (ctHash: bigint | string) => Promise<bigint>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Assert that a ciphertext hash represents an expected plaintext value\n * @param {bigint | string} ctHash - The ciphertext hash to check\n * @param {bigint} expectedValue - The expected plaintext value\n */\n expectPlaintext: (ctHash: bigint | string, expectedValue: bigint) => Promise<void>;\n\n /**\n * Get the MockTaskManager contract (typed via typechain)\n * @returns {Promise<MockTaskManager>} The MockTaskManager contract\n */\n getMockTaskManager: () => Promise<MockTaskManager>;\n\n /**\n * Get the MockACL contract (typed via typechain)\n * @returns {Promise<MockACL>} The MockACL contract\n */\n getMockACL: () => Promise<MockACL>;\n\n /**\n * Get the MockThresholdNetwork contract (typed via typechain)\n * @returns {Promise<MockThresholdNetwork>} The MockThresholdNetwork contract\n */\n getMockThresholdNetwork: () => Promise<MockThresholdNetwork>;\n\n /**\n * Get the MockZkVerifier contract (typed via typechain)\n * @returns {Promise<MockZkVerifier>} The MockZkVerifier contract\n */\n getMockZkVerifier: () => Promise<MockZkVerifier>;\n\n /**\n * Get the TestBed contract (typed via typechain)\n * @returns {Promise<TestBed>} The TestBed contract\n */\n getTestBed: () => Promise<TestBed>;\n };\n };\n }\n}\n\n/**\n * Builds the mocks config for the hardhat plugin.\n * Defaults `encryptDelay` to `0` so tests run without artificial wait times,\n * unless the user has explicitly provided a value.\n */\nexport function buildHardhatPluginMocksConfig(\n mocksConfig: CofheInputConfig['mocks']\n): NonNullable<CofheInputConfig['mocks']> {\n return {\n ...mocksConfig,\n encryptDelay: mocksConfig?.encryptDelay ?? 0,\n };\n}\n\nextendEnvironment((hre) => {\n hre.cofhe = {\n createConfig: async (config: CofheInputConfig) => {\n // Create zkv wallet client\n // This wallet interacts with the MockZkVerifier contract so that the user's connected wallet doesn't have to\n const zkvHhSigner = await hre.ethers.getImpersonatedSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n const { walletClient: zkvWalletClient } = await HardhatSignerAdapter(zkvHhSigner);\n\n // Inject zkv wallet client into config\n // Set encryptDelay to 0 on hardhat to avoid waiting for delays during tests\n const configWithZkvWalletClient = {\n environment: 'hardhat' as const,\n ...config,\n mocks: buildHardhatPluginMocksConfig(config.mocks),\n _internal: {\n ...config._internal,\n zkvWalletClient,\n },\n };\n\n return createCofheConfig(configWithZkvWalletClient);\n },\n createClient: (config: CofheConfig) => {\n return createCofheClient(config);\n },\n hardhatSignerAdapter: async (signer: HardhatEthersSigner) => {\n return HardhatSignerAdapter(signer);\n },\n connectWithHardhatSigner: async (client: CofheClient, signer: HardhatEthersSigner) => {\n const { publicClient, walletClient } = await HardhatSignerAdapter(signer);\n return client.connect(publicClient, walletClient);\n },\n createClientWithBatteries: async (signer?: HardhatEthersSigner) => {\n // Get signer if not provided\n if (!signer) {\n [signer] = await hre.ethers.getSigners();\n }\n\n // Create config\n const config = await hre.cofhe.createConfig({\n environment: 'hardhat',\n supportedChains: [hardhat],\n });\n\n // Create client\n const client = hre.cofhe.createClient(config);\n\n // Connect client\n await hre.cofhe.connectWithHardhatSigner(client, signer);\n\n // Create self-usage permit\n await client.permits.createSelf({\n issuer: signer.address,\n });\n\n // Return client\n return client;\n },\n mocks: {\n withLogs: async (closureName: string, closure: () => Promise<void>) => {\n return mock_withLogs(hre, closureName, closure);\n },\n enableLogs: async (closureName?: string) => {\n return mock_setLoggingEnabled(hre, true, closureName);\n },\n disableLogs: async () => {\n return mock_setLoggingEnabled(hre, false);\n },\n deployMocks: async (options: DeployMocksArgs) => {\n return deployMocks(hre, options);\n },\n getPlaintext: async (ctHash: bigint | string) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_getPlaintext(signer.provider, ctHash);\n },\n expectPlaintext: async (ctHash: bigint | string, expectedValue: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_expectPlaintext(signer.provider, ctHash, expectedValue);\n },\n getMockTaskManager: async () =>\n getFixedMockContract(hre, MockTaskManagerArtifact) as unknown as Promise<MockTaskManager>,\n getMockACL: async () => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const aclAddress = await taskManager.acl();\n return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress) as unknown as MockACL;\n },\n getMockThresholdNetwork: async () =>\n getFixedMockContract(hre, MockThresholdNetworkArtifact) as unknown as Promise<MockThresholdNetwork>,\n getMockZkVerifier: async () =>\n getFixedMockContract(hre, MockZkVerifierArtifact) as unknown as Promise<MockZkVerifier>,\n getTestBed: async () => getFixedMockContract(hre, TestBedArtifact) as unknown as Promise<TestBed>,\n },\n };\n});\n","/* eslint-disable turbo/no-undeclared-env-vars */\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport '@nomicfoundation/hardhat-ethers';\n\n/**\n * Sends funds to the specified address\n * @param hre Hardhat Runtime Environment\n * @param toAddress Address to send funds to\n * @param amount Amount to send in ETH (default: 10)\n * @returns Transaction receipt or null if failed\n */\nexport async function localcofheFundAccount(hre: HardhatRuntimeEnvironment, toAddress: string, amount: string = '10') {\n // Load private key from environment\n const privateKey =\n process.env.FUNDER_PRIVATE_KEY ?? '0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659';\n if (!privateKey) {\n console.error('Error: FUNDER_PRIVATE_KEY environment variable not set');\n return null;\n }\n\n try {\n // Create wallet from private key\n const wallet = new hre.ethers.Wallet(privateKey, hre.ethers.provider);\n\n // Get wallet balance\n const balance = await hre.ethers.provider.getBalance(wallet.address);\n console.log(`Funder wallet address: ${wallet.address}`);\n console.log(`Funder wallet balance: ${hre.ethers.formatEther(balance)} ETH`);\n\n // Check if wallet has enough funds\n const amountToSend = hre.ethers.parseEther(amount);\n if (balance < amountToSend) {\n console.error(\n `Error: Funder wallet doesn't have enough funds. Current balance: ${hre.ethers.formatEther(balance)} ETH`\n );\n return null;\n }\n\n // Send transaction\n console.log(`Sending ${amount} ETH to ${toAddress}...`);\n const tx = await wallet.sendTransaction({\n to: toAddress,\n value: amountToSend,\n });\n\n console.log(`Transaction sent! Hash: ${tx.hash}`);\n console.log('Waiting for confirmation...');\n\n // Wait for transaction to be mined\n const receipt = await tx.wait();\n console.log(`Transaction confirmed in block ${receipt?.blockNumber}`);\n console.log(`Successfully sent ${amount} ETH to ${toAddress}`);\n\n return receipt;\n } catch (error) {\n console.error('Error sending funds:', error);\n return null;\n }\n}\n\n/**\n * Checks a wallet's balance and funds it if below 1 ETH\n * @param hre Hardhat Runtime Environment\n * @param walletAddress Address of the wallet to check and potentially fund\n * @returns Promise that resolves when the funding operation completes (if needed)\n */\nexport async function localcofheFundWalletIfNeeded(hre: HardhatRuntimeEnvironment, walletAddress: string) {\n // Check wallet balance and fund if needed\n const walletBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet balance: ${hre.ethers.formatEther(walletBalance)} ETH`);\n\n if (walletBalance < hre.ethers.parseEther('1')) {\n console.log(`Wallet balance is less than 1 ETH. Funding ${walletAddress}...`);\n const receipt = await localcofheFundAccount(hre, walletAddress);\n if (receipt) {\n const newBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet new balance: ${hre.ethers.formatEther(newBalance)} ETH`);\n } else {\n console.error(`Failed to fund ${walletAddress}`);\n }\n }\n}\n","export const TASK_COFHE_USE_FAUCET = 'task:cofhe:usefaucet';\nexport const TASK_COFHE_MOCKS_SET_LOG_OPS = 'task:cofhe-mocks:setlogops';\nexport const TASK_COFHE_MOCKS_DEPLOY = 'task:cofhe-mocks:deploy';\n","import { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport chalk from 'chalk';\nimport { Contract, Wallet } from 'ethers';\n\nimport {\n MockTaskManagerArtifact,\n MockACLArtifact,\n MockZkVerifierArtifact,\n MockThresholdNetworkArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\nimport {\n TASK_MANAGER_ADDRESS,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY,\n MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY,\n} from '@cofhe/sdk';\nimport { deployMockContractFromArtifact } from './utils';\n\n// Deployment\n\nexport type DeployMocksArgs = {\n deployTestBed?: boolean;\n gasWarning?: boolean;\n silent?: boolean;\n};\n\nexport const deployMocks = async (\n hre: HardhatRuntimeEnvironment,\n options: DeployMocksArgs = {\n deployTestBed: true,\n gasWarning: true,\n silent: false,\n }\n) => {\n // Check if network is Hardhat, if not log skip message and return\n const isHardhat = await getIsHardhat(hre);\n if (!isHardhat) {\n logSuccess(`cofhe-hardhat-plugin - deploy mocks - skipped on non-hardhat network ${hre.network.name}`, 0);\n return;\n }\n\n isSilent = options.silent ?? false;\n\n // Log start message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: deploy mocks'), 0);\n logEmpty();\n\n // Deploy mock contracts\n const taskManager = await deployMockTaskManager(hre);\n logDeployment('MockTaskManager', await taskManager.getAddress());\n\n const acl = await deployMockACL(hre);\n logDeployment('MockACL', await acl.getAddress());\n\n await linkTaskManagerAndACL(taskManager, acl);\n logSuccess('ACL address set in TaskManager', 2);\n\n await setVerifierSigner(taskManager);\n logSuccess('Verifier signer set', 2);\n\n await setDecryptResultSigner(taskManager);\n logSuccess('Decrypt result signer set', 2);\n\n await fundZkVerifierSigner(hre);\n logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);\n\n const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);\n logSuccess(`ETH balance: ${zkVerifierSignerBalance.toString()}`, 2);\n\n const zkVerifier = await deployMockZkVerifier(hre);\n logDeployment('MockZkVerifier', await zkVerifier.getAddress());\n\n const thresholdNetwork = await deployMockThresholdNetwork(hre, acl);\n logDeployment('MockThresholdNetwork', await thresholdNetwork.getAddress());\n\n if (options.deployTestBed) {\n logSuccess('TestBed deployment enabled', 2);\n const testBed = await deployTestBedContract(hre);\n logDeployment('TestBed', await testBed.getAddress());\n }\n\n // Log success message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: mocks deployed successfully'), 0);\n\n // Log warning about mocks increased gas costs\n if (options.gasWarning) {\n logEmpty();\n logWarning(\n \"When using mocks, FHE operations (eg FHE.add / FHE.mul) report a higher gas price due to additional on-chain mocking logic. Deploy your contracts on a testnet chain to check the true gas costs.\\n(Disable this warning by setting '@cofhe/sdk.gasWarning' to false in your hardhat config\",\n 0\n );\n }\n\n logEmpty();\n};\n\n// Network\n\nconst getIsHardhat = async (hre: HardhatRuntimeEnvironment) => {\n return hre.network.name === 'hardhat';\n};\n\nconst deployMockTaskManager = async (hre: HardhatRuntimeEnvironment) => {\n const [signer] = await hre.ethers.getSigners();\n\n // Deploy MockTaskManager\n const taskManager = await deployMockContractFromArtifact(hre, MockTaskManagerArtifact);\n\n // Initialize MockTaskManager\n const initTx = await taskManager.initialize(signer.address);\n await initTx.wait();\n\n // Check if MockTaskManager exists\n const tmExists = await taskManager.exists();\n if (!tmExists) {\n throw new Error('MockTaskManager does not exist');\n }\n\n return taskManager;\n};\n\nconst deployMockACL = async (hre: HardhatRuntimeEnvironment): Promise<Contract> => {\n // Deploy MockACL (uses ethers to deploy to ensure constructor called and EIP712 domain set)\n const acl = await deployMockContractFromArtifact(hre, MockACLArtifact);\n\n // Check if ACL exists\n const exists = await acl.exists();\n if (!exists) {\n throw new Error('MockACL does not exist');\n }\n\n return acl;\n};\n\nconst fundZkVerifierSigner = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifierSigner = await hre.ethers.getSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n await hre.network.provider.send('hardhat_setBalance', [\n zkVerifierSigner.address,\n '0x' + hre.ethers.parseEther('10').toString(16),\n ]);\n};\n\nconst getZkVerifierSignerBalance = async (hre: HardhatRuntimeEnvironment) => {\n return hre.ethers.provider.getBalance(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n};\n\nconst linkTaskManagerAndACL = async (taskManager: Contract, acl: Contract) => {\n const aclAddress = await acl.getAddress();\n const linkAclTx = await taskManager.setACLContract(aclAddress);\n await linkAclTx.wait();\n};\n\nconst setVerifierSigner = async (taskManager: Contract) => {\n const signer = new Wallet(MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY);\n const setSignerTx = await taskManager.setVerifierSigner(signer.address);\n await setSignerTx.wait();\n};\n\nconst setDecryptResultSigner = async (taskManager: Contract) => {\n const signer = new Wallet(MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY);\n const setSignerTx = await taskManager.setDecryptResultSigner(signer.address);\n await setSignerTx.wait();\n};\n\nconst deployMockZkVerifier = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);\n\n const zkVerifierExists = await zkVerifier.exists();\n if (!zkVerifierExists) {\n throw new Error('MockZkVerifier does not exist');\n }\n\n return zkVerifier;\n};\n\nconst deployMockThresholdNetwork = async (hre: HardhatRuntimeEnvironment, acl: Contract) => {\n const thresholdNetwork = await deployMockContractFromArtifact(hre, MockThresholdNetworkArtifact);\n\n // Initialize MockThresholdNetwork\n const initTx = await thresholdNetwork.initialize(TASK_MANAGER_ADDRESS, await acl.getAddress());\n await initTx.wait();\n\n // Check if MockThresholdNetwork exists\n const exists = await thresholdNetwork.exists();\n if (!exists) {\n throw new Error('MockThresholdNetwork does not exist');\n }\n\n return thresholdNetwork;\n};\n\nconst deployTestBedContract = async (hre: HardhatRuntimeEnvironment) => {\n return deployMockContractFromArtifact(hre, TestBedArtifact);\n};\n\n// Logging\n\nlet isSilent = false;\n\nconst logEmpty = () => {\n if (isSilent) return;\n console.log('');\n};\n\nconst logSuccess = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.green(`${' '.repeat(indent)}✓ ${message}`));\n};\n\nconst logWarning = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.bold(chalk.yellow(`${' '.repeat(indent)}⚠ NOTE:`)), message);\n};\n\nconst logError = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.red(`${' '.repeat(indent)}✗ ${message}`));\n};\n\nconst logDeployment = (contractName: string, address: string) => {\n if (isSilent) return;\n const paddedName = `${contractName} deployed`.padEnd(36);\n logSuccess(`${paddedName} ${chalk.bold(address)}`);\n};\n","import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS } from '@cofhe/sdk';\nimport { expect } from 'chai';\nimport { Contract, ethers } from 'ethers';\nimport { type HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\nimport type { MockArtifact } from '@cofhe/mock-contracts';\nimport type { HardhatRuntimeEnvironment } from 'hardhat/types';\n\n// Deployment utils\n\n/// Deploys a mock contract from a pre-built artifact from the mock-contracts package\n/// If the mock contract should be deployed to a fixed address, `hardhat_setCode` op is used to set the code at the fixed address\n/// Otherwise, we deploy the contract using ethers.js to a non-fixed address\nexport const deployMockContractFromArtifact = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n // Use hardhat_setCode to deploy to fixed address\n if (artifact.isFixed) {\n await hre.network.provider.send('hardhat_setCode', [artifact.fixedAddress, artifact.deployedBytecode]);\n return getFixedMockContract(hre, artifact);\n }\n\n // Use ethers.js to deploy to variable address\n const [signer] = await hre.ethers.getSigners();\n const factory = new hre.ethers.ContractFactory(artifact.abi, artifact.bytecode, signer);\n const contract = await factory.deploy(/* constructor args */);\n await contract.waitForDeployment();\n return contract as Contract;\n};\n\nexport const getFixedMockContract = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n if (!artifact.isFixed) {\n throw new Error('Artifact is not fixed');\n }\n return await hre.ethers.getContractAt(artifact.abi, artifact.fixedAddress);\n};\n\n// Testing utils\n\nconst mock_checkIsTestnet = async (fnName: string, provider: HardhatEthersProvider | ethers.JsonRpcProvider) => {\n // Testnet is checked by testing if MockZkVerifier is deployed\n\n // Get bytecode at ZK_VERIFIER_ADDRESS\n const bytecode = await provider.getCode(MOCKS_ZK_VERIFIER_ADDRESS);\n\n // If bytecode is empty, we are on a testnet\n const isTestnet = bytecode.length === 0;\n\n // Log if we are on a testnet\n if (isTestnet) {\n console.log(`${fnName} - skipped on non-testnet chain`);\n }\n\n return isTestnet;\n};\n\nexport const mock_getPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintext.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function mockStorage(uint256) view returns (uint256)'],\n provider\n );\n\n // Fetch the plaintext\n const plaintext = await taskManager.mockStorage(BigInt(ctHash));\n\n return plaintext;\n};\n\nexport const mock_getPlaintextExists = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintextExists.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function inMockStorage(uint256) view returns (bool)'],\n provider\n );\n\n // Fetch the plaintext exists\n const plaintextExists = await taskManager.inMockStorage(BigInt(ctHash));\n\n return plaintextExists;\n};\n\nexport const mock_expectPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string,\n expectedValue: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_expectPlaintext.name, provider)) return;\n\n // Expect the plaintext to exist\n const plaintextExists = await mock_getPlaintextExists(provider, ctHash);\n expect(plaintextExists).equal(true, 'Plaintext does not exist');\n\n // Expect the plaintext to have the expected value\n const plaintext = await mock_getPlaintext(provider, ctHash);\n expect(plaintext).equal(expectedValue, 'Plaintext value is incorrect');\n};\n","import chalk from 'chalk';\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport { getFixedMockContract } from './utils';\nimport { MockTaskManagerArtifact } from '@cofhe/mock-contracts';\n\nconst getLoggingEnabled = async (hre: HardhatRuntimeEnvironment): Promise<boolean> => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n return taskManager.logOps();\n};\n\nconst setLoggingEnabled = async (hre: HardhatRuntimeEnvironment, enabled: boolean) => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const tx = await taskManager.setLogOps(enabled);\n await tx.wait();\n};\n\n// prettier-ignore\nconst printLogsEnabledMessage = (closureMessage: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE-MOCKS] │ ${closureMessage}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\n// prettier-ignore\nconst printLogsBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const mock_setLoggingEnabled = async (\n hre: HardhatRuntimeEnvironment,\n enabled: boolean,\n closureName?: string\n) => {\n try {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, enabled);\n\n // Only print if enabling logs\n if (enabled) {\n printLogsEnabledMessage(`${closureName ? `\"${chalk.bold(closureName)}\" logs:` : 'Logs:'}`);\n }\n\n // Only print if disabling logs AND logs currently enabled\n if (!enabled && initiallyEnabled) {\n printLogsBlockEnd();\n }\n } catch (error) {\n console.log(chalk.red('mock_setLoggingEnabled error'), error);\n }\n};\n\nexport const mock_withLogs = async (\n hre: HardhatRuntimeEnvironment,\n closureName: string,\n closure: () => Promise<void>\n) => {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, true);\n printLogsEnabledMessage(`\"${chalk.bold(closureName)}\" logs:`);\n await closure();\n printLogsBlockEnd();\n\n // If logs were disabled, disable them again\n if (!initiallyEnabled) {\n await setLoggingEnabled(hre, false);\n }\n};\n"],"mappings":"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","names":["import_chalk","import_sdk","import_types","import_ethers","import_sdk","chalk","chalk","import_chalk","import_types","import_mock_contracts","chalk","import_mock_contracts","chalk"]}
package/dist/index.mjs CHANGED
@@ -70,7 +70,7 @@ var TASK_COFHE_MOCKS_DEPLOY = "task:cofhe-mocks:deploy";
70
70
  // src/deploy.ts
71
71
  import "hardhat/types";
72
72
  import chalk from "chalk";
73
- import "ethers";
73
+ import { Wallet } from "ethers";
74
74
  import {
75
75
  MockTaskManagerArtifact,
76
76
  MockACLArtifact,
@@ -78,7 +78,12 @@ import {
78
78
  MockThresholdNetworkArtifact,
79
79
  TestBedArtifact
80
80
  } from "@cofhe/mock-contracts";
81
- import { TASK_MANAGER_ADDRESS as TASK_MANAGER_ADDRESS2, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS } from "@cofhe/sdk";
81
+ import {
82
+ TASK_MANAGER_ADDRESS as TASK_MANAGER_ADDRESS2,
83
+ MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,
84
+ MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY,
85
+ MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY
86
+ } from "@cofhe/sdk";
82
87
 
83
88
  // src/utils.ts
84
89
  import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS } from "@cofhe/sdk";
@@ -120,7 +125,7 @@ var mock_getPlaintext = async (provider, ctHash) => {
120
125
  ["function mockStorage(uint256) view returns (uint256)"],
121
126
  provider
122
127
  );
123
- const plaintext = await taskManager.mockStorage(ctHash);
128
+ const plaintext = await taskManager.mockStorage(BigInt(ctHash));
124
129
  return plaintext;
125
130
  };
126
131
  var mock_getPlaintextExists = async (provider, ctHash) => {
@@ -131,7 +136,7 @@ var mock_getPlaintextExists = async (provider, ctHash) => {
131
136
  ["function inMockStorage(uint256) view returns (bool)"],
132
137
  provider
133
138
  );
134
- const plaintextExists = await taskManager.inMockStorage(ctHash);
139
+ const plaintextExists = await taskManager.inMockStorage(BigInt(ctHash));
135
140
  return plaintextExists;
136
141
  };
137
142
  var mock_expectPlaintext = async (provider, ctHash, expectedValue) => {
@@ -164,6 +169,10 @@ var deployMocks = async (hre, options = {
164
169
  logDeployment("MockACL", await acl.getAddress());
165
170
  await linkTaskManagerAndACL(taskManager, acl);
166
171
  logSuccess("ACL address set in TaskManager", 2);
172
+ await setVerifierSigner(taskManager);
173
+ logSuccess("Verifier signer set", 2);
174
+ await setDecryptResultSigner(taskManager);
175
+ logSuccess("Decrypt result signer set", 2);
167
176
  await fundZkVerifierSigner(hre);
168
177
  logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);
169
178
  const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);
@@ -225,6 +234,16 @@ var linkTaskManagerAndACL = async (taskManager, acl) => {
225
234
  const linkAclTx = await taskManager.setACLContract(aclAddress);
226
235
  await linkAclTx.wait();
227
236
  };
237
+ var setVerifierSigner = async (taskManager) => {
238
+ const signer = new Wallet(MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY);
239
+ const setSignerTx = await taskManager.setVerifierSigner(signer.address);
240
+ await setSignerTx.wait();
241
+ };
242
+ var setDecryptResultSigner = async (taskManager) => {
243
+ const signer = new Wallet(MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY);
244
+ const setSignerTx = await taskManager.setDecryptResultSigner(signer.address);
245
+ await setSignerTx.wait();
246
+ };
228
247
  var deployMockZkVerifier = async (hre) => {
229
248
  const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);
230
249
  const zkVerifierExists = await zkVerifier.exists();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fund.ts","../src/consts.ts","../src/deploy.ts","../src/utils.ts","../src/logging.ts"],"sourcesContent":["/* eslint-disable no-empty-pattern */\n/* eslint-disable turbo/no-undeclared-env-vars */\nimport chalk from 'chalk';\nimport { type PublicClient, type WalletClient } from 'viem';\nimport { extendConfig, extendEnvironment, task, types } from 'hardhat/config';\nimport { TASK_TEST, TASK_NODE } from 'hardhat/builtin-tasks/task-names';\nimport { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';\nimport {\n type CofheClient,\n type CofheConfig,\n type CofheInputConfig,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n} from '@cofhe/sdk';\nimport { createCofheClient, createCofheConfig } from '@cofhe/sdk/node';\nimport { HardhatSignerAdapter } from '@cofhe/sdk/adapters';\n\nimport { localcofheFundAccount } from './fund.js';\nimport { TASK_COFHE_MOCKS_DEPLOY, TASK_COFHE_MOCKS_SET_LOG_OPS, TASK_COFHE_USE_FAUCET } from './consts.js';\nimport { deployMocks, type DeployMocksArgs } from './deploy.js';\nimport { mock_setLoggingEnabled, mock_withLogs } from './logging.js';\nimport { getFixedMockContract, mock_expectPlaintext } from './utils.js';\nimport { mock_getPlaintext } from './utils.js';\nimport type { Contract } from 'ethers';\nimport { hardhat } from '@cofhe/sdk/chains';\nimport {\n MockACLArtifact,\n MockThresholdNetworkArtifact,\n MockTaskManagerArtifact,\n MockZkVerifierArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\n/**\n * Configuration interface for the CoFHE Hardhat plugin.\n * Allows users to configure mock logging and gas warning settings.\n */\ndeclare module 'hardhat/types/config' {\n interface HardhatUserConfig {\n cofhe?: {\n /** Whether to log mock operations (default: true) */\n logMocks?: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning?: boolean;\n };\n }\n\n interface HardhatConfig {\n cofhe: {\n /** Whether to log mock operations (default: true) */\n logMocks: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning: boolean;\n };\n }\n}\n\nextendConfig((config, userConfig) => {\n // Allow users to override the localcofhe network config\n if (userConfig.networks && userConfig.networks.localcofhe) {\n return;\n }\n\n // Default config\n config.networks.localcofhe = {\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 10_000,\n httpHeaders: {},\n url: 'http://127.0.0.1:42069',\n accounts: [\n '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',\n ],\n };\n\n // Only add Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['eth-sepolia']) {\n config.networks['eth-sepolia'] = {\n url: process.env.SEPOLIA_RPC_URL ?? 'https://ethereum-sepolia.publicnode.com',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 11155111,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Only add Arbitrum Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['arb-sepolia']) {\n config.networks['arb-sepolia'] = {\n url: process.env.ARBITRUM_SEPOLIA_RPC_URL ?? 'https://sepolia-rollup.arbitrum.io/rpc',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 421614,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Add cofhe config\n config.cofhe = {\n logMocks: userConfig.cofhe?.logMocks ?? true,\n gasWarning: userConfig.cofhe?.gasWarning ?? true,\n };\n});\n\ntype UseFaucetArgs = {\n address?: string;\n};\n\ntask(TASK_COFHE_USE_FAUCET, 'Fund an account from the funder')\n .addOptionalParam('address', 'Address to fund', undefined, types.string)\n .setAction(async ({ address }: UseFaucetArgs, hre) => {\n const { network } = hre;\n const { name: networkName } = network;\n\n if (networkName !== 'localcofhe') {\n console.info(chalk.yellow(`Programmatic faucet only supported for localcofhe`));\n return;\n }\n\n if (!address) {\n console.info(chalk.red(`Failed to get address to fund`));\n return;\n }\n\n console.info(chalk.green(`Getting funds from faucet for ${address}`));\n\n try {\n await localcofheFundAccount(hre, address);\n } catch (e) {\n console.info(chalk.red(`failed to get funds from localcofhe for ${address}: ${e}`));\n }\n });\n\n// DEPLOY TASKS\n\ntask(TASK_COFHE_MOCKS_DEPLOY, 'Deploys the mock contracts on the Hardhat network')\n .addOptionalParam('deployTestBed', 'Whether to deploy the test bed', true, types.boolean)\n .addOptionalParam('silent', 'Whether to suppress output', false, types.boolean)\n .setAction(async ({ deployTestBed, silent }: DeployMocksArgs, hre) => {\n await deployMocks(hre, {\n deployTestBed: deployTestBed ?? true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n silent: silent ?? false,\n });\n });\n\n// Hardhat plugin auto-deploys mocks for every hardhat test run by overriding TASK_TEST and calling deployMocks(...) before runSuper()\ntask(TASK_TEST, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\ntask(TASK_NODE, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\n// SET LOG OPS\n\ntask(TASK_COFHE_MOCKS_SET_LOG_OPS, 'Set logging for the Mock CoFHE contracts')\n .addParam('enable', 'Whether to enable logging', false, types.boolean)\n .setAction(async ({ enable }, hre) => {\n await mock_setLoggingEnabled(hre, enable);\n });\n\n// MOCK UTILS\n\nexport * from './consts.js';\nexport * from './utils.js';\nexport * from './fund.js';\nexport * from './logging.js';\nexport * from './deploy.js';\n\n/**\n * Runtime environment extensions for the CoFHE Hardhat plugin.\n * Provides access to CoFHE initialization, environment checks, and mock utilities.\n */\ndeclare module 'hardhat/types/runtime' {\n export interface HardhatRuntimeEnvironment {\n cofhe: {\n /**\n * Create a CoFHE configuration for use with hre.cofhe.createClient(...)\n * @param {CofheInputConfig} config - The CoFHE input configuration\n * @returns {CofheConfig} The CoFHE configuration\n */\n createConfig: (config: CofheInputConfig) => Promise<CofheConfig>;\n /**\n * Create a CoFHE client instance\n * @param {CofheConfig} config - The CoFHE configuration (use createCofheConfig to create with Node.js defaults)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClient: (config: CofheConfig) => CofheClient;\n /**\n * Create viem clients from a Hardhat ethers signer, to be used with `cofheClient.connect(...)`\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<{ publicClient: PublicClient; walletClient: WalletClient }>} The viem clients\n */\n hardhatSignerAdapter: (\n signer: HardhatEthersSigner\n ) => Promise<{ publicClient: PublicClient; walletClient: WalletClient }>;\n /**\n * Connect a CoFHE client with a Hardhat ethers signer\n * @param {CofheClient} client - The CoFHE client to connect\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<void>}\n */\n connectWithHardhatSigner: (client: CofheClient, signer: HardhatEthersSigner) => Promise<void>;\n /**\n * Create and connect to a batteries included client.\n * Also generates a self-usage a permit for the signer.\n * If customization is needed, use createCofheClient and connectWithHardhatSigner.\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use (optional - defaults to first signer)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClientWithBatteries: (signer?: HardhatEthersSigner) => Promise<CofheClient>;\n\n mocks: {\n /**\n * **[MOCKS ONLY]**\n *\n * Execute a block of code with cofhe mock contracts logging enabled.\n *\n * _(If logging only a function, we recommend passing the function name as the closureName (ex \"counter.increment()\"))_\n *\n * Example usage:\n *\n * ```ts\n * await hre.cofhe.mocks.withLogs(\"counter.increment()\", async () => {\n * await counter.increment();\n * });\n * ```\n *\n * Expected output:\n * ```\n * ┌──────────────────┬──────────────────────────────────────────────────\n * │ [COFHE-MOCKS] │ \"counter.increment()\" logs:\n * ├──────────────────┴──────────────────────────────────────────────────\n * ├ FHE.add | euint32(4473..3424)[0] + euint32(1157..3648)[1] => euint32(1106..1872)[1]\n * ├ FHE.allowThis | euint32(1106..1872)[1] -> 0x663f..6602\n * ├ FHE.allow | euint32(1106..1872)[1] -> 0x3c44..93bc\n * └─────────────────────────────────────────────────────────────────────\n * ```\n * @param {string} closureName - Name of the code block to log within\n * @param {() => Promise<void>} closure - The async function to execute\n */\n withLogs: (closureName: string, closure: () => Promise<void>) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Enable logging from cofhe mock contracts\n * @param {string} closureName - Optional name of the code block to enable logging for\n */\n enableLogs: (closureName?: string) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Disable logging from cofhe mock contracts\n */\n disableLogs: () => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Deploy the cofhe mock contracts (normally this is done automatically)\n * @param {DeployMocksArgs} options - Deployment options\n */\n deployMocks: (options: DeployMocksArgs) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Get the plaintext value for a ciphertext hash\n * @param {bigint} ctHash - The ciphertext hash to look up\n * @returns {Promise<bigint>} The plaintext value\n */\n getPlaintext: (ctHash: bigint) => Promise<bigint>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Assert that a ciphertext hash represents an expected plaintext value\n * @param {bigint} ctHash - The ciphertext hash to check\n * @param {bigint} expectedValue - The expected plaintext value\n */\n expectPlaintext: (ctHash: bigint, expectedValue: bigint) => Promise<void>;\n\n /**\n * Get the MockTaskManager contract\n * @returns {Promise<Contract>} The MockTaskManager contract\n */\n getMockTaskManager: () => Promise<Contract>;\n\n /**\n * Get the MockACL contract\n * @returns {Promise<Contract>} The MockACL contract\n */\n getMockACL: () => Promise<Contract>;\n\n /**\n * Get the MockThresholdNetwork contract\n * @returns {Promise<Contract>} The MockThresholdNetwork contract\n */\n getMockThresholdNetwork: () => Promise<Contract>;\n\n /**\n * Get the MockZkVerifier contract\n * @returns {Promise<Contract>} The MockZkVerifier contract\n */\n getMockZkVerifier: () => Promise<Contract>;\n\n /**\n * Get the TestBed contract\n * @returns {Promise<Contract>} The TestBed contract\n */\n getTestBed: () => Promise<Contract>;\n };\n };\n }\n}\n\n/**\n * Builds the mocks config for the hardhat plugin.\n * Defaults `encryptDelay` to `0` so tests run without artificial wait times,\n * unless the user has explicitly provided a value.\n */\nexport function buildHardhatPluginMocksConfig(\n mocksConfig: CofheInputConfig['mocks']\n): NonNullable<CofheInputConfig['mocks']> {\n return {\n ...mocksConfig,\n encryptDelay: mocksConfig?.encryptDelay ?? 0,\n };\n}\n\nextendEnvironment((hre) => {\n hre.cofhe = {\n createConfig: async (config: CofheInputConfig) => {\n // Create zkv wallet client\n // This wallet interacts with the MockZkVerifier contract so that the user's connected wallet doesn't have to\n const zkvHhSigner = await hre.ethers.getImpersonatedSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n const { walletClient: zkvWalletClient } = await HardhatSignerAdapter(zkvHhSigner);\n\n // Inject zkv wallet client into config\n // Set encryptDelay to 0 on hardhat to avoid waiting for delays during tests\n const configWithZkvWalletClient = {\n environment: 'hardhat' as const,\n ...config,\n mocks: buildHardhatPluginMocksConfig(config.mocks),\n _internal: {\n ...config._internal,\n zkvWalletClient,\n },\n };\n\n return createCofheConfig(configWithZkvWalletClient);\n },\n createClient: (config: CofheConfig) => {\n return createCofheClient(config);\n },\n hardhatSignerAdapter: async (signer: HardhatEthersSigner) => {\n return HardhatSignerAdapter(signer);\n },\n connectWithHardhatSigner: async (client: CofheClient, signer: HardhatEthersSigner) => {\n const { publicClient, walletClient } = await HardhatSignerAdapter(signer);\n return client.connect(publicClient, walletClient);\n },\n createClientWithBatteries: async (signer?: HardhatEthersSigner) => {\n // Get signer if not provided\n if (!signer) {\n [signer] = await hre.ethers.getSigners();\n }\n\n // Create config\n const config = await hre.cofhe.createConfig({\n environment: 'hardhat',\n supportedChains: [hardhat],\n });\n\n // Create client\n const client = hre.cofhe.createClient(config);\n\n // Connect client\n await hre.cofhe.connectWithHardhatSigner(client, signer);\n\n // Create self-usage permit\n await client.permits.createSelf({\n issuer: signer.address,\n });\n\n // Return client\n return client;\n },\n mocks: {\n withLogs: async (closureName: string, closure: () => Promise<void>) => {\n return mock_withLogs(hre, closureName, closure);\n },\n enableLogs: async (closureName?: string) => {\n return mock_setLoggingEnabled(hre, true, closureName);\n },\n disableLogs: async () => {\n return mock_setLoggingEnabled(hre, false);\n },\n deployMocks: async (options: DeployMocksArgs) => {\n return deployMocks(hre, options);\n },\n getPlaintext: async (ctHash: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_getPlaintext(signer.provider, ctHash);\n },\n expectPlaintext: async (ctHash: bigint, expectedValue: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_expectPlaintext(signer.provider, ctHash, expectedValue);\n },\n getMockTaskManager: async () => getFixedMockContract(hre, MockTaskManagerArtifact),\n getMockACL: async () => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const aclAddress = await taskManager.acl();\n return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress);\n },\n getMockThresholdNetwork: async () => getFixedMockContract(hre, MockThresholdNetworkArtifact),\n getMockZkVerifier: async () => getFixedMockContract(hre, MockZkVerifierArtifact),\n getTestBed: async () => getFixedMockContract(hre, TestBedArtifact),\n },\n };\n});\n","/* eslint-disable turbo/no-undeclared-env-vars */\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport '@nomicfoundation/hardhat-ethers';\n\n/**\n * Sends funds to the specified address\n * @param hre Hardhat Runtime Environment\n * @param toAddress Address to send funds to\n * @param amount Amount to send in ETH (default: 10)\n * @returns Transaction receipt or null if failed\n */\nexport async function localcofheFundAccount(hre: HardhatRuntimeEnvironment, toAddress: string, amount: string = '10') {\n // Load private key from environment\n const privateKey =\n process.env.FUNDER_PRIVATE_KEY ?? '0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659';\n if (!privateKey) {\n console.error('Error: FUNDER_PRIVATE_KEY environment variable not set');\n return null;\n }\n\n try {\n // Create wallet from private key\n const wallet = new hre.ethers.Wallet(privateKey, hre.ethers.provider);\n\n // Get wallet balance\n const balance = await hre.ethers.provider.getBalance(wallet.address);\n console.log(`Funder wallet address: ${wallet.address}`);\n console.log(`Funder wallet balance: ${hre.ethers.formatEther(balance)} ETH`);\n\n // Check if wallet has enough funds\n const amountToSend = hre.ethers.parseEther(amount);\n if (balance < amountToSend) {\n console.error(\n `Error: Funder wallet doesn't have enough funds. Current balance: ${hre.ethers.formatEther(balance)} ETH`\n );\n return null;\n }\n\n // Send transaction\n console.log(`Sending ${amount} ETH to ${toAddress}...`);\n const tx = await wallet.sendTransaction({\n to: toAddress,\n value: amountToSend,\n });\n\n console.log(`Transaction sent! Hash: ${tx.hash}`);\n console.log('Waiting for confirmation...');\n\n // Wait for transaction to be mined\n const receipt = await tx.wait();\n console.log(`Transaction confirmed in block ${receipt?.blockNumber}`);\n console.log(`Successfully sent ${amount} ETH to ${toAddress}`);\n\n return receipt;\n } catch (error) {\n console.error('Error sending funds:', error);\n return null;\n }\n}\n\n/**\n * Checks a wallet's balance and funds it if below 1 ETH\n * @param hre Hardhat Runtime Environment\n * @param walletAddress Address of the wallet to check and potentially fund\n * @returns Promise that resolves when the funding operation completes (if needed)\n */\nexport async function localcofheFundWalletIfNeeded(hre: HardhatRuntimeEnvironment, walletAddress: string) {\n // Check wallet balance and fund if needed\n const walletBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet balance: ${hre.ethers.formatEther(walletBalance)} ETH`);\n\n if (walletBalance < hre.ethers.parseEther('1')) {\n console.log(`Wallet balance is less than 1 ETH. Funding ${walletAddress}...`);\n const receipt = await localcofheFundAccount(hre, walletAddress);\n if (receipt) {\n const newBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet new balance: ${hre.ethers.formatEther(newBalance)} ETH`);\n } else {\n console.error(`Failed to fund ${walletAddress}`);\n }\n }\n}\n","export const TASK_COFHE_USE_FAUCET = 'task:cofhe:usefaucet';\nexport const TASK_COFHE_MOCKS_SET_LOG_OPS = 'task:cofhe-mocks:setlogops';\nexport const TASK_COFHE_MOCKS_DEPLOY = 'task:cofhe-mocks:deploy';\n","import { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport chalk from 'chalk';\nimport { Contract } from 'ethers';\n\nimport {\n MockTaskManagerArtifact,\n MockACLArtifact,\n MockZkVerifierArtifact,\n MockThresholdNetworkArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\nimport { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS } from '@cofhe/sdk';\nimport { deployMockContractFromArtifact } from './utils';\n\n// Deployment\n\nexport type DeployMocksArgs = {\n deployTestBed?: boolean;\n gasWarning?: boolean;\n silent?: boolean;\n};\n\nexport const deployMocks = async (\n hre: HardhatRuntimeEnvironment,\n options: DeployMocksArgs = {\n deployTestBed: true,\n gasWarning: true,\n silent: false,\n }\n) => {\n // Check if network is Hardhat, if not log skip message and return\n const isHardhat = await getIsHardhat(hre);\n if (!isHardhat) {\n logSuccess(`cofhe-hardhat-plugin - deploy mocks - skipped on non-hardhat network ${hre.network.name}`, 0);\n return;\n }\n\n isSilent = options.silent ?? false;\n\n // Log start message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: deploy mocks'), 0);\n logEmpty();\n\n // Deploy mock contracts\n const taskManager = await deployMockTaskManager(hre);\n logDeployment('MockTaskManager', await taskManager.getAddress());\n\n const acl = await deployMockACL(hre);\n logDeployment('MockACL', await acl.getAddress());\n\n await linkTaskManagerAndACL(taskManager, acl);\n logSuccess('ACL address set in TaskManager', 2);\n\n await fundZkVerifierSigner(hre);\n logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);\n\n const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);\n logSuccess(`ETH balance: ${zkVerifierSignerBalance.toString()}`, 2);\n\n const zkVerifier = await deployMockZkVerifier(hre);\n logDeployment('MockZkVerifier', await zkVerifier.getAddress());\n\n const thresholdNetwork = await deployMockThresholdNetwork(hre, acl);\n logDeployment('MockThresholdNetwork', await thresholdNetwork.getAddress());\n\n if (options.deployTestBed) {\n logSuccess('TestBed deployment enabled', 2);\n const testBed = await deployTestBedContract(hre);\n logDeployment('TestBed', await testBed.getAddress());\n }\n\n // Log success message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: mocks deployed successfully'), 0);\n\n // Log warning about mocks increased gas costs\n if (options.gasWarning) {\n logEmpty();\n logWarning(\n \"When using mocks, FHE operations (eg FHE.add / FHE.mul) report a higher gas price due to additional on-chain mocking logic. Deploy your contracts on a testnet chain to check the true gas costs.\\n(Disable this warning by setting '@cofhe/sdk.gasWarning' to false in your hardhat config\",\n 0\n );\n }\n\n logEmpty();\n};\n\n// Network\n\nconst getIsHardhat = async (hre: HardhatRuntimeEnvironment) => {\n return hre.network.name === 'hardhat';\n};\n\nconst deployMockTaskManager = async (hre: HardhatRuntimeEnvironment) => {\n const [signer] = await hre.ethers.getSigners();\n\n // Deploy MockTaskManager\n const taskManager = await deployMockContractFromArtifact(hre, MockTaskManagerArtifact);\n\n // Initialize MockTaskManager\n const initTx = await taskManager.initialize(signer.address);\n await initTx.wait();\n\n // Check if MockTaskManager exists\n const tmExists = await taskManager.exists();\n if (!tmExists) {\n throw new Error('MockTaskManager does not exist');\n }\n\n return taskManager;\n};\n\nconst deployMockACL = async (hre: HardhatRuntimeEnvironment): Promise<Contract> => {\n // Deploy MockACL (uses ethers to deploy to ensure constructor called and EIP712 domain set)\n const acl = await deployMockContractFromArtifact(hre, MockACLArtifact);\n\n // Check if ACL exists\n const exists = await acl.exists();\n if (!exists) {\n throw new Error('MockACL does not exist');\n }\n\n return acl;\n};\n\nconst fundZkVerifierSigner = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifierSigner = await hre.ethers.getSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n await hre.network.provider.send('hardhat_setBalance', [\n zkVerifierSigner.address,\n '0x' + hre.ethers.parseEther('10').toString(16),\n ]);\n};\n\nconst getZkVerifierSignerBalance = async (hre: HardhatRuntimeEnvironment) => {\n return hre.ethers.provider.getBalance(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n};\n\nconst linkTaskManagerAndACL = async (taskManager: Contract, acl: Contract) => {\n const aclAddress = await acl.getAddress();\n const linkAclTx = await taskManager.setACLContract(aclAddress);\n await linkAclTx.wait();\n};\n\nconst deployMockZkVerifier = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);\n\n const zkVerifierExists = await zkVerifier.exists();\n if (!zkVerifierExists) {\n throw new Error('MockZkVerifier does not exist');\n }\n\n return zkVerifier;\n};\n\nconst deployMockThresholdNetwork = async (hre: HardhatRuntimeEnvironment, acl: Contract) => {\n const thresholdNetwork = await deployMockContractFromArtifact(hre, MockThresholdNetworkArtifact);\n\n // Initialize MockThresholdNetwork\n const initTx = await thresholdNetwork.initialize(TASK_MANAGER_ADDRESS, await acl.getAddress());\n await initTx.wait();\n\n // Check if MockThresholdNetwork exists\n const exists = await thresholdNetwork.exists();\n if (!exists) {\n throw new Error('MockThresholdNetwork does not exist');\n }\n\n return thresholdNetwork;\n};\n\nconst deployTestBedContract = async (hre: HardhatRuntimeEnvironment) => {\n return deployMockContractFromArtifact(hre, TestBedArtifact);\n};\n\n// Logging\n\nlet isSilent = false;\n\nconst logEmpty = () => {\n if (isSilent) return;\n console.log('');\n};\n\nconst logSuccess = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.green(`${' '.repeat(indent)}✓ ${message}`));\n};\n\nconst logWarning = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.bold(chalk.yellow(`${' '.repeat(indent)}⚠ NOTE:`)), message);\n};\n\nconst logError = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.red(`${' '.repeat(indent)}✗ ${message}`));\n};\n\nconst logDeployment = (contractName: string, address: string) => {\n if (isSilent) return;\n const paddedName = `${contractName} deployed`.padEnd(36);\n logSuccess(`${paddedName} ${chalk.bold(address)}`);\n};\n","import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS } from '@cofhe/sdk';\nimport { expect } from 'chai';\nimport { Contract, ethers } from 'ethers';\nimport { type HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\nimport type { MockArtifact } from '@cofhe/mock-contracts';\nimport type { HardhatRuntimeEnvironment } from 'hardhat/types';\n\n// Deployment utils\n\n/// Deploys a mock contract from a pre-built artifact from the mock-contracts package\n/// If the mock contract should be deployed to a fixed address, `hardhat_setCode` op is used to set the code at the fixed address\n/// Otherwise, we deploy the contract using ethers.js to a non-fixed address\nexport const deployMockContractFromArtifact = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n // Use hardhat_setCode to deploy to fixed address\n if (artifact.isFixed) {\n await hre.network.provider.send('hardhat_setCode', [artifact.fixedAddress, artifact.deployedBytecode]);\n return getFixedMockContract(hre, artifact);\n }\n\n // Use ethers.js to deploy to variable address\n const [signer] = await hre.ethers.getSigners();\n const factory = new hre.ethers.ContractFactory(artifact.abi, artifact.bytecode, signer);\n const contract = await factory.deploy(/* constructor args */);\n await contract.waitForDeployment();\n return contract as Contract;\n};\n\nexport const getFixedMockContract = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n if (!artifact.isFixed) {\n throw new Error('Artifact is not fixed');\n }\n return await hre.ethers.getContractAt(artifact.abi, artifact.fixedAddress);\n};\n\n// Testing utils\n\nconst mock_checkIsTestnet = async (fnName: string, provider: HardhatEthersProvider | ethers.JsonRpcProvider) => {\n // Testnet is checked by testing if MockZkVerifier is deployed\n\n // Get bytecode at ZK_VERIFIER_ADDRESS\n const bytecode = await provider.getCode(MOCKS_ZK_VERIFIER_ADDRESS);\n\n // If bytecode is empty, we are on a testnet\n const isTestnet = bytecode.length === 0;\n\n // Log if we are on a testnet\n if (isTestnet) {\n console.log(`${fnName} - skipped on non-testnet chain`);\n }\n\n return isTestnet;\n};\n\nexport const mock_getPlaintext = async (provider: HardhatEthersProvider | ethers.JsonRpcProvider, ctHash: bigint) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintext.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function mockStorage(uint256) view returns (uint256)'],\n provider\n );\n\n // Fetch the plaintext\n const plaintext = await taskManager.mockStorage(ctHash);\n\n return plaintext;\n};\n\nexport const mock_getPlaintextExists = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintextExists.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function inMockStorage(uint256) view returns (bool)'],\n provider\n );\n\n // Fetch the plaintext exists\n const plaintextExists = await taskManager.inMockStorage(ctHash);\n\n return plaintextExists;\n};\n\nexport const mock_expectPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint,\n expectedValue: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_expectPlaintext.name, provider)) return;\n\n // Expect the plaintext to exist\n const plaintextExists = await mock_getPlaintextExists(provider, ctHash);\n expect(plaintextExists).equal(true, 'Plaintext does not exist');\n\n // Expect the plaintext to have the expected value\n const plaintext = await mock_getPlaintext(provider, ctHash);\n expect(plaintext).equal(expectedValue, 'Plaintext value is incorrect');\n};\n","import chalk from 'chalk';\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport { getFixedMockContract } from './utils';\nimport { MockTaskManagerArtifact } from '@cofhe/mock-contracts';\n\nconst getLoggingEnabled = async (hre: HardhatRuntimeEnvironment): Promise<boolean> => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n return taskManager.logOps();\n};\n\nconst setLoggingEnabled = async (hre: HardhatRuntimeEnvironment, enabled: boolean) => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const tx = await taskManager.setLogOps(enabled);\n await tx.wait();\n};\n\n// prettier-ignore\nconst printLogsEnabledMessage = (closureMessage: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE-MOCKS] │ ${closureMessage}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\n// prettier-ignore\nconst printLogsBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const mock_setLoggingEnabled = async (\n hre: HardhatRuntimeEnvironment,\n enabled: boolean,\n closureName?: string\n) => {\n try {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, enabled);\n\n // Only print if enabling logs\n if (enabled) {\n printLogsEnabledMessage(`${closureName ? `\"${chalk.bold(closureName)}\" logs:` : 'Logs:'}`);\n }\n\n // Only print if disabling logs AND logs currently enabled\n if (!enabled && initiallyEnabled) {\n printLogsBlockEnd();\n }\n } catch (error) {\n console.log(chalk.red('mock_setLoggingEnabled error'), error);\n }\n};\n\nexport const mock_withLogs = async (\n hre: HardhatRuntimeEnvironment,\n closureName: string,\n closure: () => Promise<void>\n) => {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, true);\n printLogsEnabledMessage(`\"${chalk.bold(closureName)}\" logs:`);\n await closure();\n printLogsBlockEnd();\n\n // If logs were disabled, disable them again\n if (!initiallyEnabled) {\n await setLoggingEnabled(hre, false);\n }\n};\n"],"mappings":"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","names":["chalk","MOCKS_ZK_VERIFIER_SIGNER_ADDRESS","TASK_MANAGER_ADDRESS","TASK_MANAGER_ADDRESS","chalk","MockTaskManagerArtifact","chalk","MockACLArtifact","MockThresholdNetworkArtifact","MockTaskManagerArtifact","MockZkVerifierArtifact","TestBedArtifact","chalk","MOCKS_ZK_VERIFIER_SIGNER_ADDRESS"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fund.ts","../src/consts.ts","../src/deploy.ts","../src/utils.ts","../src/logging.ts"],"sourcesContent":["/* eslint-disable no-empty-pattern */\n/* eslint-disable turbo/no-undeclared-env-vars */\nimport chalk from 'chalk';\nimport { type PublicClient, type WalletClient } from 'viem';\nimport { extendConfig, extendEnvironment, task, types } from 'hardhat/config';\nimport { TASK_TEST, TASK_NODE } from 'hardhat/builtin-tasks/task-names';\nimport { HardhatEthersSigner } from '@nomicfoundation/hardhat-ethers/signers';\nimport {\n type CofheClient,\n type CofheConfig,\n type CofheInputConfig,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n} from '@cofhe/sdk';\nimport { createCofheClient, createCofheConfig } from '@cofhe/sdk/node';\nimport { HardhatSignerAdapter } from '@cofhe/sdk/adapters';\n\nimport { localcofheFundAccount } from './fund.js';\nimport { TASK_COFHE_MOCKS_DEPLOY, TASK_COFHE_MOCKS_SET_LOG_OPS, TASK_COFHE_USE_FAUCET } from './consts.js';\nimport { deployMocks, type DeployMocksArgs } from './deploy.js';\nimport { mock_setLoggingEnabled, mock_withLogs } from './logging.js';\nimport { getFixedMockContract, mock_expectPlaintext } from './utils.js';\nimport { mock_getPlaintext } from './utils.js';\nimport { hardhat } from '@cofhe/sdk/chains';\nimport {\n MockACLArtifact,\n MockThresholdNetworkArtifact,\n MockTaskManagerArtifact,\n MockZkVerifierArtifact,\n TestBedArtifact,\n type MockACL,\n type MockTaskManager,\n type MockThresholdNetwork,\n type MockZkVerifier,\n type TestBed,\n} from '@cofhe/mock-contracts';\n\n/**\n * Configuration interface for the CoFHE Hardhat plugin.\n * Allows users to configure mock logging and gas warning settings.\n */\ndeclare module 'hardhat/types/config' {\n interface HardhatUserConfig {\n cofhe?: {\n /** Whether to log mock operations (default: true) */\n logMocks?: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning?: boolean;\n };\n }\n\n interface HardhatConfig {\n cofhe: {\n /** Whether to log mock operations (default: true) */\n logMocks: boolean;\n /** Whether to show gas usage warnings for mock operations (default: true) */\n gasWarning: boolean;\n };\n }\n}\n\nextendConfig((config, userConfig) => {\n // Allow users to override the localcofhe network config\n if (userConfig.networks && userConfig.networks.localcofhe) {\n return;\n }\n\n // Default config\n config.networks.localcofhe = {\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 10_000,\n httpHeaders: {},\n url: 'http://127.0.0.1:42069',\n accounts: [\n '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',\n '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d',\n '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',\n '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',\n ],\n };\n\n // Only add Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['eth-sepolia']) {\n config.networks['eth-sepolia'] = {\n url: process.env.SEPOLIA_RPC_URL ?? 'https://ethereum-sepolia.publicnode.com',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 11155111,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Only add Arbitrum Sepolia config if user hasn't defined it\n if (!userConfig.networks?.['arb-sepolia']) {\n config.networks['arb-sepolia'] = {\n url: process.env.ARBITRUM_SEPOLIA_RPC_URL ?? 'https://sepolia-rollup.arbitrum.io/rpc',\n accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],\n chainId: 421614,\n gas: 'auto',\n gasMultiplier: 1.2,\n gasPrice: 'auto',\n timeout: 60_000,\n httpHeaders: {},\n };\n }\n\n // Add cofhe config\n config.cofhe = {\n logMocks: userConfig.cofhe?.logMocks ?? true,\n gasWarning: userConfig.cofhe?.gasWarning ?? true,\n };\n});\n\ntype UseFaucetArgs = {\n address?: string;\n};\n\ntask(TASK_COFHE_USE_FAUCET, 'Fund an account from the funder')\n .addOptionalParam('address', 'Address to fund', undefined, types.string)\n .setAction(async ({ address }: UseFaucetArgs, hre) => {\n const { network } = hre;\n const { name: networkName } = network;\n\n if (networkName !== 'localcofhe') {\n console.info(chalk.yellow(`Programmatic faucet only supported for localcofhe`));\n return;\n }\n\n if (!address) {\n console.info(chalk.red(`Failed to get address to fund`));\n return;\n }\n\n console.info(chalk.green(`Getting funds from faucet for ${address}`));\n\n try {\n await localcofheFundAccount(hre, address);\n } catch (e) {\n console.info(chalk.red(`failed to get funds from localcofhe for ${address}: ${e}`));\n }\n });\n\n// DEPLOY TASKS\n\ntask(TASK_COFHE_MOCKS_DEPLOY, 'Deploys the mock contracts on the Hardhat network')\n .addOptionalParam('deployTestBed', 'Whether to deploy the test bed', true, types.boolean)\n .addOptionalParam('silent', 'Whether to suppress output', false, types.boolean)\n .setAction(async ({ deployTestBed, silent }: DeployMocksArgs, hre) => {\n await deployMocks(hre, {\n deployTestBed: deployTestBed ?? true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n silent: silent ?? false,\n });\n });\n\n// Hardhat plugin auto-deploys mocks for every hardhat test run by overriding TASK_TEST and calling deployMocks(...) before runSuper()\ntask(TASK_TEST, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\ntask(TASK_NODE, 'Deploy mock contracts on hardhat').setAction(async ({}, hre, runSuper) => {\n const skipAutoDeploy = (() => {\n const raw = process.env.COFHE_SKIP_MOCKS_DEPLOY ?? '';\n const normalized = raw.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n })();\n\n if (!skipAutoDeploy) {\n await deployMocks(hre, {\n deployTestBed: true,\n gasWarning: hre.config.cofhe.gasWarning ?? true,\n });\n }\n return runSuper();\n});\n\n// SET LOG OPS\n\ntask(TASK_COFHE_MOCKS_SET_LOG_OPS, 'Set logging for the Mock CoFHE contracts')\n .addParam('enable', 'Whether to enable logging', false, types.boolean)\n .setAction(async ({ enable }, hre) => {\n await mock_setLoggingEnabled(hre, enable);\n });\n\n// MOCK UTILS\n\nexport * from './consts.js';\nexport * from './utils.js';\nexport * from './fund.js';\nexport * from './logging.js';\nexport * from './deploy.js';\n\n/**\n * Runtime environment extensions for the CoFHE Hardhat plugin.\n * Provides access to CoFHE initialization, environment checks, and mock utilities.\n */\ndeclare module 'hardhat/types/runtime' {\n export interface HardhatRuntimeEnvironment {\n cofhe: {\n /**\n * Create a CoFHE configuration for use with hre.cofhe.createClient(...)\n * @param {CofheInputConfig} config - The CoFHE input configuration\n * @returns {CofheConfig} The CoFHE configuration\n */\n createConfig: (config: CofheInputConfig) => Promise<CofheConfig>;\n /**\n * Create a CoFHE client instance\n * @param {CofheConfig} config - The CoFHE configuration (use createCofheConfig to create with Node.js defaults)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClient: (config: CofheConfig) => CofheClient;\n /**\n * Create viem clients from a Hardhat ethers signer, to be used with `cofheClient.connect(...)`\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<{ publicClient: PublicClient; walletClient: WalletClient }>} The viem clients\n */\n hardhatSignerAdapter: (\n signer: HardhatEthersSigner\n ) => Promise<{ publicClient: PublicClient; walletClient: WalletClient }>;\n /**\n * Connect a CoFHE client with a Hardhat ethers signer\n * @param {CofheClient} client - The CoFHE client to connect\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use\n * @returns {Promise<void>}\n */\n connectWithHardhatSigner: (client: CofheClient, signer: HardhatEthersSigner) => Promise<void>;\n /**\n * Create and connect to a batteries included client.\n * Also generates a self-usage a permit for the signer.\n * If customization is needed, use createCofheClient and connectWithHardhatSigner.\n * @param {HardhatEthersSigner} signer - The Hardhat ethers signer to use (optional - defaults to first signer)\n * @returns {Promise<CofheClient>} The CoFHE client instance\n */\n createClientWithBatteries: (signer?: HardhatEthersSigner) => Promise<CofheClient>;\n\n mocks: {\n /**\n * **[MOCKS ONLY]**\n *\n * Execute a block of code with cofhe mock contracts logging enabled.\n *\n * _(If logging only a function, we recommend passing the function name as the closureName (ex \"counter.increment()\"))_\n *\n * Example usage:\n *\n * ```ts\n * await hre.cofhe.mocks.withLogs(\"counter.increment()\", async () => {\n * await counter.increment();\n * });\n * ```\n *\n * Expected output:\n * ```\n * ┌──────────────────┬──────────────────────────────────────────────────\n * │ [COFHE-MOCKS] │ \"counter.increment()\" logs:\n * ├──────────────────┴──────────────────────────────────────────────────\n * ├ FHE.add | euint32(4473..3424)[0] + euint32(1157..3648)[1] => euint32(1106..1872)[1]\n * ├ FHE.allowThis | euint32(1106..1872)[1] -> 0x663f..6602\n * ├ FHE.allow | euint32(1106..1872)[1] -> 0x3c44..93bc\n * └─────────────────────────────────────────────────────────────────────\n * ```\n * @param {string} closureName - Name of the code block to log within\n * @param {() => Promise<void>} closure - The async function to execute\n */\n withLogs: (closureName: string, closure: () => Promise<void>) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Enable logging from cofhe mock contracts\n * @param {string} closureName - Optional name of the code block to enable logging for\n */\n enableLogs: (closureName?: string) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Disable logging from cofhe mock contracts\n */\n disableLogs: () => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Deploy the cofhe mock contracts (normally this is done automatically)\n * @param {DeployMocksArgs} options - Deployment options\n */\n deployMocks: (options: DeployMocksArgs) => Promise<void>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Get the plaintext value for a ciphertext hash\n * @param {bigint | string} ctHash - The ciphertext hash to look up\n * @returns {Promise<bigint>} The plaintext value\n */\n getPlaintext: (ctHash: bigint | string) => Promise<bigint>;\n\n /**\n * **[MOCKS ONLY]**\n *\n * Assert that a ciphertext hash represents an expected plaintext value\n * @param {bigint | string} ctHash - The ciphertext hash to check\n * @param {bigint} expectedValue - The expected plaintext value\n */\n expectPlaintext: (ctHash: bigint | string, expectedValue: bigint) => Promise<void>;\n\n /**\n * Get the MockTaskManager contract (typed via typechain)\n * @returns {Promise<MockTaskManager>} The MockTaskManager contract\n */\n getMockTaskManager: () => Promise<MockTaskManager>;\n\n /**\n * Get the MockACL contract (typed via typechain)\n * @returns {Promise<MockACL>} The MockACL contract\n */\n getMockACL: () => Promise<MockACL>;\n\n /**\n * Get the MockThresholdNetwork contract (typed via typechain)\n * @returns {Promise<MockThresholdNetwork>} The MockThresholdNetwork contract\n */\n getMockThresholdNetwork: () => Promise<MockThresholdNetwork>;\n\n /**\n * Get the MockZkVerifier contract (typed via typechain)\n * @returns {Promise<MockZkVerifier>} The MockZkVerifier contract\n */\n getMockZkVerifier: () => Promise<MockZkVerifier>;\n\n /**\n * Get the TestBed contract (typed via typechain)\n * @returns {Promise<TestBed>} The TestBed contract\n */\n getTestBed: () => Promise<TestBed>;\n };\n };\n }\n}\n\n/**\n * Builds the mocks config for the hardhat plugin.\n * Defaults `encryptDelay` to `0` so tests run without artificial wait times,\n * unless the user has explicitly provided a value.\n */\nexport function buildHardhatPluginMocksConfig(\n mocksConfig: CofheInputConfig['mocks']\n): NonNullable<CofheInputConfig['mocks']> {\n return {\n ...mocksConfig,\n encryptDelay: mocksConfig?.encryptDelay ?? 0,\n };\n}\n\nextendEnvironment((hre) => {\n hre.cofhe = {\n createConfig: async (config: CofheInputConfig) => {\n // Create zkv wallet client\n // This wallet interacts with the MockZkVerifier contract so that the user's connected wallet doesn't have to\n const zkvHhSigner = await hre.ethers.getImpersonatedSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n const { walletClient: zkvWalletClient } = await HardhatSignerAdapter(zkvHhSigner);\n\n // Inject zkv wallet client into config\n // Set encryptDelay to 0 on hardhat to avoid waiting for delays during tests\n const configWithZkvWalletClient = {\n environment: 'hardhat' as const,\n ...config,\n mocks: buildHardhatPluginMocksConfig(config.mocks),\n _internal: {\n ...config._internal,\n zkvWalletClient,\n },\n };\n\n return createCofheConfig(configWithZkvWalletClient);\n },\n createClient: (config: CofheConfig) => {\n return createCofheClient(config);\n },\n hardhatSignerAdapter: async (signer: HardhatEthersSigner) => {\n return HardhatSignerAdapter(signer);\n },\n connectWithHardhatSigner: async (client: CofheClient, signer: HardhatEthersSigner) => {\n const { publicClient, walletClient } = await HardhatSignerAdapter(signer);\n return client.connect(publicClient, walletClient);\n },\n createClientWithBatteries: async (signer?: HardhatEthersSigner) => {\n // Get signer if not provided\n if (!signer) {\n [signer] = await hre.ethers.getSigners();\n }\n\n // Create config\n const config = await hre.cofhe.createConfig({\n environment: 'hardhat',\n supportedChains: [hardhat],\n });\n\n // Create client\n const client = hre.cofhe.createClient(config);\n\n // Connect client\n await hre.cofhe.connectWithHardhatSigner(client, signer);\n\n // Create self-usage permit\n await client.permits.createSelf({\n issuer: signer.address,\n });\n\n // Return client\n return client;\n },\n mocks: {\n withLogs: async (closureName: string, closure: () => Promise<void>) => {\n return mock_withLogs(hre, closureName, closure);\n },\n enableLogs: async (closureName?: string) => {\n return mock_setLoggingEnabled(hre, true, closureName);\n },\n disableLogs: async () => {\n return mock_setLoggingEnabled(hre, false);\n },\n deployMocks: async (options: DeployMocksArgs) => {\n return deployMocks(hre, options);\n },\n getPlaintext: async (ctHash: bigint | string) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_getPlaintext(signer.provider, ctHash);\n },\n expectPlaintext: async (ctHash: bigint | string, expectedValue: bigint) => {\n const [signer] = await hre.ethers.getSigners();\n return mock_expectPlaintext(signer.provider, ctHash, expectedValue);\n },\n getMockTaskManager: async () =>\n getFixedMockContract(hre, MockTaskManagerArtifact) as unknown as Promise<MockTaskManager>,\n getMockACL: async () => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const aclAddress = await taskManager.acl();\n return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress) as unknown as MockACL;\n },\n getMockThresholdNetwork: async () =>\n getFixedMockContract(hre, MockThresholdNetworkArtifact) as unknown as Promise<MockThresholdNetwork>,\n getMockZkVerifier: async () =>\n getFixedMockContract(hre, MockZkVerifierArtifact) as unknown as Promise<MockZkVerifier>,\n getTestBed: async () => getFixedMockContract(hre, TestBedArtifact) as unknown as Promise<TestBed>,\n },\n };\n});\n","/* eslint-disable turbo/no-undeclared-env-vars */\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport '@nomicfoundation/hardhat-ethers';\n\n/**\n * Sends funds to the specified address\n * @param hre Hardhat Runtime Environment\n * @param toAddress Address to send funds to\n * @param amount Amount to send in ETH (default: 10)\n * @returns Transaction receipt or null if failed\n */\nexport async function localcofheFundAccount(hre: HardhatRuntimeEnvironment, toAddress: string, amount: string = '10') {\n // Load private key from environment\n const privateKey =\n process.env.FUNDER_PRIVATE_KEY ?? '0xb6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659';\n if (!privateKey) {\n console.error('Error: FUNDER_PRIVATE_KEY environment variable not set');\n return null;\n }\n\n try {\n // Create wallet from private key\n const wallet = new hre.ethers.Wallet(privateKey, hre.ethers.provider);\n\n // Get wallet balance\n const balance = await hre.ethers.provider.getBalance(wallet.address);\n console.log(`Funder wallet address: ${wallet.address}`);\n console.log(`Funder wallet balance: ${hre.ethers.formatEther(balance)} ETH`);\n\n // Check if wallet has enough funds\n const amountToSend = hre.ethers.parseEther(amount);\n if (balance < amountToSend) {\n console.error(\n `Error: Funder wallet doesn't have enough funds. Current balance: ${hre.ethers.formatEther(balance)} ETH`\n );\n return null;\n }\n\n // Send transaction\n console.log(`Sending ${amount} ETH to ${toAddress}...`);\n const tx = await wallet.sendTransaction({\n to: toAddress,\n value: amountToSend,\n });\n\n console.log(`Transaction sent! Hash: ${tx.hash}`);\n console.log('Waiting for confirmation...');\n\n // Wait for transaction to be mined\n const receipt = await tx.wait();\n console.log(`Transaction confirmed in block ${receipt?.blockNumber}`);\n console.log(`Successfully sent ${amount} ETH to ${toAddress}`);\n\n return receipt;\n } catch (error) {\n console.error('Error sending funds:', error);\n return null;\n }\n}\n\n/**\n * Checks a wallet's balance and funds it if below 1 ETH\n * @param hre Hardhat Runtime Environment\n * @param walletAddress Address of the wallet to check and potentially fund\n * @returns Promise that resolves when the funding operation completes (if needed)\n */\nexport async function localcofheFundWalletIfNeeded(hre: HardhatRuntimeEnvironment, walletAddress: string) {\n // Check wallet balance and fund if needed\n const walletBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet balance: ${hre.ethers.formatEther(walletBalance)} ETH`);\n\n if (walletBalance < hre.ethers.parseEther('1')) {\n console.log(`Wallet balance is less than 1 ETH. Funding ${walletAddress}...`);\n const receipt = await localcofheFundAccount(hre, walletAddress);\n if (receipt) {\n const newBalance = await hre.ethers.provider.getBalance(walletAddress);\n console.log(`Wallet new balance: ${hre.ethers.formatEther(newBalance)} ETH`);\n } else {\n console.error(`Failed to fund ${walletAddress}`);\n }\n }\n}\n","export const TASK_COFHE_USE_FAUCET = 'task:cofhe:usefaucet';\nexport const TASK_COFHE_MOCKS_SET_LOG_OPS = 'task:cofhe-mocks:setlogops';\nexport const TASK_COFHE_MOCKS_DEPLOY = 'task:cofhe-mocks:deploy';\n","import { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport chalk from 'chalk';\nimport { Contract, Wallet } from 'ethers';\n\nimport {\n MockTaskManagerArtifact,\n MockACLArtifact,\n MockZkVerifierArtifact,\n MockThresholdNetworkArtifact,\n TestBedArtifact,\n} from '@cofhe/mock-contracts';\n\nimport {\n TASK_MANAGER_ADDRESS,\n MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,\n MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY,\n MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY,\n} from '@cofhe/sdk';\nimport { deployMockContractFromArtifact } from './utils';\n\n// Deployment\n\nexport type DeployMocksArgs = {\n deployTestBed?: boolean;\n gasWarning?: boolean;\n silent?: boolean;\n};\n\nexport const deployMocks = async (\n hre: HardhatRuntimeEnvironment,\n options: DeployMocksArgs = {\n deployTestBed: true,\n gasWarning: true,\n silent: false,\n }\n) => {\n // Check if network is Hardhat, if not log skip message and return\n const isHardhat = await getIsHardhat(hre);\n if (!isHardhat) {\n logSuccess(`cofhe-hardhat-plugin - deploy mocks - skipped on non-hardhat network ${hre.network.name}`, 0);\n return;\n }\n\n isSilent = options.silent ?? false;\n\n // Log start message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: deploy mocks'), 0);\n logEmpty();\n\n // Deploy mock contracts\n const taskManager = await deployMockTaskManager(hre);\n logDeployment('MockTaskManager', await taskManager.getAddress());\n\n const acl = await deployMockACL(hre);\n logDeployment('MockACL', await acl.getAddress());\n\n await linkTaskManagerAndACL(taskManager, acl);\n logSuccess('ACL address set in TaskManager', 2);\n\n await setVerifierSigner(taskManager);\n logSuccess('Verifier signer set', 2);\n\n await setDecryptResultSigner(taskManager);\n logSuccess('Decrypt result signer set', 2);\n\n await fundZkVerifierSigner(hre);\n logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);\n\n const zkVerifierSignerBalance = await getZkVerifierSignerBalance(hre);\n logSuccess(`ETH balance: ${zkVerifierSignerBalance.toString()}`, 2);\n\n const zkVerifier = await deployMockZkVerifier(hre);\n logDeployment('MockZkVerifier', await zkVerifier.getAddress());\n\n const thresholdNetwork = await deployMockThresholdNetwork(hre, acl);\n logDeployment('MockThresholdNetwork', await thresholdNetwork.getAddress());\n\n if (options.deployTestBed) {\n logSuccess('TestBed deployment enabled', 2);\n const testBed = await deployTestBedContract(hre);\n logDeployment('TestBed', await testBed.getAddress());\n }\n\n // Log success message\n logEmpty();\n logSuccess(chalk.bold('cofhe-hardhat-plugin :: mocks deployed successfully'), 0);\n\n // Log warning about mocks increased gas costs\n if (options.gasWarning) {\n logEmpty();\n logWarning(\n \"When using mocks, FHE operations (eg FHE.add / FHE.mul) report a higher gas price due to additional on-chain mocking logic. Deploy your contracts on a testnet chain to check the true gas costs.\\n(Disable this warning by setting '@cofhe/sdk.gasWarning' to false in your hardhat config\",\n 0\n );\n }\n\n logEmpty();\n};\n\n// Network\n\nconst getIsHardhat = async (hre: HardhatRuntimeEnvironment) => {\n return hre.network.name === 'hardhat';\n};\n\nconst deployMockTaskManager = async (hre: HardhatRuntimeEnvironment) => {\n const [signer] = await hre.ethers.getSigners();\n\n // Deploy MockTaskManager\n const taskManager = await deployMockContractFromArtifact(hre, MockTaskManagerArtifact);\n\n // Initialize MockTaskManager\n const initTx = await taskManager.initialize(signer.address);\n await initTx.wait();\n\n // Check if MockTaskManager exists\n const tmExists = await taskManager.exists();\n if (!tmExists) {\n throw new Error('MockTaskManager does not exist');\n }\n\n return taskManager;\n};\n\nconst deployMockACL = async (hre: HardhatRuntimeEnvironment): Promise<Contract> => {\n // Deploy MockACL (uses ethers to deploy to ensure constructor called and EIP712 domain set)\n const acl = await deployMockContractFromArtifact(hre, MockACLArtifact);\n\n // Check if ACL exists\n const exists = await acl.exists();\n if (!exists) {\n throw new Error('MockACL does not exist');\n }\n\n return acl;\n};\n\nconst fundZkVerifierSigner = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifierSigner = await hre.ethers.getSigner(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n await hre.network.provider.send('hardhat_setBalance', [\n zkVerifierSigner.address,\n '0x' + hre.ethers.parseEther('10').toString(16),\n ]);\n};\n\nconst getZkVerifierSignerBalance = async (hre: HardhatRuntimeEnvironment) => {\n return hre.ethers.provider.getBalance(MOCKS_ZK_VERIFIER_SIGNER_ADDRESS);\n};\n\nconst linkTaskManagerAndACL = async (taskManager: Contract, acl: Contract) => {\n const aclAddress = await acl.getAddress();\n const linkAclTx = await taskManager.setACLContract(aclAddress);\n await linkAclTx.wait();\n};\n\nconst setVerifierSigner = async (taskManager: Contract) => {\n const signer = new Wallet(MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY);\n const setSignerTx = await taskManager.setVerifierSigner(signer.address);\n await setSignerTx.wait();\n};\n\nconst setDecryptResultSigner = async (taskManager: Contract) => {\n const signer = new Wallet(MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY);\n const setSignerTx = await taskManager.setDecryptResultSigner(signer.address);\n await setSignerTx.wait();\n};\n\nconst deployMockZkVerifier = async (hre: HardhatRuntimeEnvironment) => {\n const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);\n\n const zkVerifierExists = await zkVerifier.exists();\n if (!zkVerifierExists) {\n throw new Error('MockZkVerifier does not exist');\n }\n\n return zkVerifier;\n};\n\nconst deployMockThresholdNetwork = async (hre: HardhatRuntimeEnvironment, acl: Contract) => {\n const thresholdNetwork = await deployMockContractFromArtifact(hre, MockThresholdNetworkArtifact);\n\n // Initialize MockThresholdNetwork\n const initTx = await thresholdNetwork.initialize(TASK_MANAGER_ADDRESS, await acl.getAddress());\n await initTx.wait();\n\n // Check if MockThresholdNetwork exists\n const exists = await thresholdNetwork.exists();\n if (!exists) {\n throw new Error('MockThresholdNetwork does not exist');\n }\n\n return thresholdNetwork;\n};\n\nconst deployTestBedContract = async (hre: HardhatRuntimeEnvironment) => {\n return deployMockContractFromArtifact(hre, TestBedArtifact);\n};\n\n// Logging\n\nlet isSilent = false;\n\nconst logEmpty = () => {\n if (isSilent) return;\n console.log('');\n};\n\nconst logSuccess = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.green(`${' '.repeat(indent)}✓ ${message}`));\n};\n\nconst logWarning = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.bold(chalk.yellow(`${' '.repeat(indent)}⚠ NOTE:`)), message);\n};\n\nconst logError = (message: string, indent = 1) => {\n if (isSilent) return;\n console.log(chalk.red(`${' '.repeat(indent)}✗ ${message}`));\n};\n\nconst logDeployment = (contractName: string, address: string) => {\n if (isSilent) return;\n const paddedName = `${contractName} deployed`.padEnd(36);\n logSuccess(`${paddedName} ${chalk.bold(address)}`);\n};\n","import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS } from '@cofhe/sdk';\nimport { expect } from 'chai';\nimport { Contract, ethers } from 'ethers';\nimport { type HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\nimport type { MockArtifact } from '@cofhe/mock-contracts';\nimport type { HardhatRuntimeEnvironment } from 'hardhat/types';\n\n// Deployment utils\n\n/// Deploys a mock contract from a pre-built artifact from the mock-contracts package\n/// If the mock contract should be deployed to a fixed address, `hardhat_setCode` op is used to set the code at the fixed address\n/// Otherwise, we deploy the contract using ethers.js to a non-fixed address\nexport const deployMockContractFromArtifact = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n // Use hardhat_setCode to deploy to fixed address\n if (artifact.isFixed) {\n await hre.network.provider.send('hardhat_setCode', [artifact.fixedAddress, artifact.deployedBytecode]);\n return getFixedMockContract(hre, artifact);\n }\n\n // Use ethers.js to deploy to variable address\n const [signer] = await hre.ethers.getSigners();\n const factory = new hre.ethers.ContractFactory(artifact.abi, artifact.bytecode, signer);\n const contract = await factory.deploy(/* constructor args */);\n await contract.waitForDeployment();\n return contract as Contract;\n};\n\nexport const getFixedMockContract = async (hre: HardhatRuntimeEnvironment, artifact: MockArtifact) => {\n if (!artifact.isFixed) {\n throw new Error('Artifact is not fixed');\n }\n return await hre.ethers.getContractAt(artifact.abi, artifact.fixedAddress);\n};\n\n// Testing utils\n\nconst mock_checkIsTestnet = async (fnName: string, provider: HardhatEthersProvider | ethers.JsonRpcProvider) => {\n // Testnet is checked by testing if MockZkVerifier is deployed\n\n // Get bytecode at ZK_VERIFIER_ADDRESS\n const bytecode = await provider.getCode(MOCKS_ZK_VERIFIER_ADDRESS);\n\n // If bytecode is empty, we are on a testnet\n const isTestnet = bytecode.length === 0;\n\n // Log if we are on a testnet\n if (isTestnet) {\n console.log(`${fnName} - skipped on non-testnet chain`);\n }\n\n return isTestnet;\n};\n\nexport const mock_getPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintext.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function mockStorage(uint256) view returns (uint256)'],\n provider\n );\n\n // Fetch the plaintext\n const plaintext = await taskManager.mockStorage(BigInt(ctHash));\n\n return plaintext;\n};\n\nexport const mock_getPlaintextExists = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_getPlaintextExists.name, provider)) return;\n\n // Connect to MockTaskManager\n const taskManager = new ethers.Contract(\n TASK_MANAGER_ADDRESS,\n ['function inMockStorage(uint256) view returns (bool)'],\n provider\n );\n\n // Fetch the plaintext exists\n const plaintextExists = await taskManager.inMockStorage(BigInt(ctHash));\n\n return plaintextExists;\n};\n\nexport const mock_expectPlaintext = async (\n provider: HardhatEthersProvider | ethers.JsonRpcProvider,\n ctHash: bigint | string,\n expectedValue: bigint\n) => {\n // Skip with log if called on a non-testnet chain\n if (await mock_checkIsTestnet(mock_expectPlaintext.name, provider)) return;\n\n // Expect the plaintext to exist\n const plaintextExists = await mock_getPlaintextExists(provider, ctHash);\n expect(plaintextExists).equal(true, 'Plaintext does not exist');\n\n // Expect the plaintext to have the expected value\n const plaintext = await mock_getPlaintext(provider, ctHash);\n expect(plaintext).equal(expectedValue, 'Plaintext value is incorrect');\n};\n","import chalk from 'chalk';\nimport { type HardhatRuntimeEnvironment } from 'hardhat/types';\nimport { getFixedMockContract } from './utils';\nimport { MockTaskManagerArtifact } from '@cofhe/mock-contracts';\n\nconst getLoggingEnabled = async (hre: HardhatRuntimeEnvironment): Promise<boolean> => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n return taskManager.logOps();\n};\n\nconst setLoggingEnabled = async (hre: HardhatRuntimeEnvironment, enabled: boolean) => {\n const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);\n const tx = await taskManager.setLogOps(enabled);\n await tx.wait();\n};\n\n// prettier-ignore\nconst printLogsEnabledMessage = (closureMessage: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE-MOCKS] │ ${closureMessage}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\n// prettier-ignore\nconst printLogsBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const mock_setLoggingEnabled = async (\n hre: HardhatRuntimeEnvironment,\n enabled: boolean,\n closureName?: string\n) => {\n try {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, enabled);\n\n // Only print if enabling logs\n if (enabled) {\n printLogsEnabledMessage(`${closureName ? `\"${chalk.bold(closureName)}\" logs:` : 'Logs:'}`);\n }\n\n // Only print if disabling logs AND logs currently enabled\n if (!enabled && initiallyEnabled) {\n printLogsBlockEnd();\n }\n } catch (error) {\n console.log(chalk.red('mock_setLoggingEnabled error'), error);\n }\n};\n\nexport const mock_withLogs = async (\n hre: HardhatRuntimeEnvironment,\n closureName: string,\n closure: () => Promise<void>\n) => {\n const initiallyEnabled = await getLoggingEnabled(hre);\n\n await setLoggingEnabled(hre, true);\n printLogsEnabledMessage(`\"${chalk.bold(closureName)}\" logs:`);\n await closure();\n printLogsBlockEnd();\n\n // If logs were disabled, disable them again\n if (!initiallyEnabled) {\n await setLoggingEnabled(hre, false);\n }\n};\n"],"mappings":"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","names":["chalk","MOCKS_ZK_VERIFIER_SIGNER_ADDRESS","TASK_MANAGER_ADDRESS","TASK_MANAGER_ADDRESS","chalk","MockTaskManagerArtifact","chalk","MockACLArtifact","MockThresholdNetworkArtifact","MockTaskManagerArtifact","MockZkVerifierArtifact","TestBedArtifact","chalk","MOCKS_ZK_VERIFIER_SIGNER_ADDRESS"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cofhe/hardhat-plugin",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -21,8 +21,8 @@
21
21
  "fast-glob": "^3.3.2",
22
22
  "viem": "^2.38.6",
23
23
  "chai": "^4.2.0",
24
- "@cofhe/sdk": "0.3.1",
25
- "@cofhe/mock-contracts": "0.3.1"
24
+ "@cofhe/sdk": "0.3.2",
25
+ "@cofhe/mock-contracts": "0.3.2"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@nomicfoundation/hardhat-ethers": "^3.0.5",
@@ -46,7 +46,7 @@
46
46
  "hardhat": "^2.0.0",
47
47
  "@nomicfoundation/hardhat-ethers": "^3.0.0",
48
48
  "ethers": "^5.0.0 || ^6.0.0",
49
- "@fhenixprotocol/cofhe-contracts": ">=0.0.13",
49
+ "@fhenixprotocol/cofhe-contracts": ">=0.1.0",
50
50
  "@openzeppelin/contracts": "^5.0.0"
51
51
  },
52
52
  "peerDependenciesMeta": {
package/src/deploy.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type HardhatRuntimeEnvironment } from 'hardhat/types';
2
2
  import chalk from 'chalk';
3
- import { Contract } from 'ethers';
3
+ import { Contract, Wallet } from 'ethers';
4
4
 
5
5
  import {
6
6
  MockTaskManagerArtifact,
@@ -10,7 +10,12 @@ import {
10
10
  TestBedArtifact,
11
11
  } from '@cofhe/mock-contracts';
12
12
 
13
- import { TASK_MANAGER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS } from '@cofhe/sdk';
13
+ import {
14
+ TASK_MANAGER_ADDRESS,
15
+ MOCKS_ZK_VERIFIER_SIGNER_ADDRESS,
16
+ MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY,
17
+ MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY,
18
+ } from '@cofhe/sdk';
14
19
  import { deployMockContractFromArtifact } from './utils';
15
20
 
16
21
  // Deployment
@@ -53,6 +58,12 @@ export const deployMocks = async (
53
58
  await linkTaskManagerAndACL(taskManager, acl);
54
59
  logSuccess('ACL address set in TaskManager', 2);
55
60
 
61
+ await setVerifierSigner(taskManager);
62
+ logSuccess('Verifier signer set', 2);
63
+
64
+ await setDecryptResultSigner(taskManager);
65
+ logSuccess('Decrypt result signer set', 2);
66
+
56
67
  await fundZkVerifierSigner(hre);
57
68
  logSuccess(`ZkVerifier signer (${MOCKS_ZK_VERIFIER_SIGNER_ADDRESS}) funded`, 1);
58
69
 
@@ -143,6 +154,18 @@ const linkTaskManagerAndACL = async (taskManager: Contract, acl: Contract) => {
143
154
  await linkAclTx.wait();
144
155
  };
145
156
 
157
+ const setVerifierSigner = async (taskManager: Contract) => {
158
+ const signer = new Wallet(MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY);
159
+ const setSignerTx = await taskManager.setVerifierSigner(signer.address);
160
+ await setSignerTx.wait();
161
+ };
162
+
163
+ const setDecryptResultSigner = async (taskManager: Contract) => {
164
+ const signer = new Wallet(MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY);
165
+ const setSignerTx = await taskManager.setDecryptResultSigner(signer.address);
166
+ await setSignerTx.wait();
167
+ };
168
+
146
169
  const deployMockZkVerifier = async (hre: HardhatRuntimeEnvironment) => {
147
170
  const zkVerifier = await deployMockContractFromArtifact(hre, MockZkVerifierArtifact);
148
171
 
package/src/index.ts CHANGED
@@ -20,7 +20,6 @@ import { deployMocks, type DeployMocksArgs } from './deploy.js';
20
20
  import { mock_setLoggingEnabled, mock_withLogs } from './logging.js';
21
21
  import { getFixedMockContract, mock_expectPlaintext } from './utils.js';
22
22
  import { mock_getPlaintext } from './utils.js';
23
- import type { Contract } from 'ethers';
24
23
  import { hardhat } from '@cofhe/sdk/chains';
25
24
  import {
26
25
  MockACLArtifact,
@@ -28,6 +27,11 @@ import {
28
27
  MockTaskManagerArtifact,
29
28
  MockZkVerifierArtifact,
30
29
  TestBedArtifact,
30
+ type MockACL,
31
+ type MockTaskManager,
32
+ type MockThresholdNetwork,
33
+ type MockZkVerifier,
34
+ type TestBed,
31
35
  } from '@cofhe/mock-contracts';
32
36
 
33
37
  /**
@@ -303,49 +307,49 @@ declare module 'hardhat/types/runtime' {
303
307
  * **[MOCKS ONLY]**
304
308
  *
305
309
  * Get the plaintext value for a ciphertext hash
306
- * @param {bigint} ctHash - The ciphertext hash to look up
310
+ * @param {bigint | string} ctHash - The ciphertext hash to look up
307
311
  * @returns {Promise<bigint>} The plaintext value
308
312
  */
309
- getPlaintext: (ctHash: bigint) => Promise<bigint>;
313
+ getPlaintext: (ctHash: bigint | string) => Promise<bigint>;
310
314
 
311
315
  /**
312
316
  * **[MOCKS ONLY]**
313
317
  *
314
318
  * Assert that a ciphertext hash represents an expected plaintext value
315
- * @param {bigint} ctHash - The ciphertext hash to check
319
+ * @param {bigint | string} ctHash - The ciphertext hash to check
316
320
  * @param {bigint} expectedValue - The expected plaintext value
317
321
  */
318
- expectPlaintext: (ctHash: bigint, expectedValue: bigint) => Promise<void>;
322
+ expectPlaintext: (ctHash: bigint | string, expectedValue: bigint) => Promise<void>;
319
323
 
320
324
  /**
321
- * Get the MockTaskManager contract
322
- * @returns {Promise<Contract>} The MockTaskManager contract
325
+ * Get the MockTaskManager contract (typed via typechain)
326
+ * @returns {Promise<MockTaskManager>} The MockTaskManager contract
323
327
  */
324
- getMockTaskManager: () => Promise<Contract>;
328
+ getMockTaskManager: () => Promise<MockTaskManager>;
325
329
 
326
330
  /**
327
- * Get the MockACL contract
328
- * @returns {Promise<Contract>} The MockACL contract
331
+ * Get the MockACL contract (typed via typechain)
332
+ * @returns {Promise<MockACL>} The MockACL contract
329
333
  */
330
- getMockACL: () => Promise<Contract>;
334
+ getMockACL: () => Promise<MockACL>;
331
335
 
332
336
  /**
333
- * Get the MockThresholdNetwork contract
334
- * @returns {Promise<Contract>} The MockThresholdNetwork contract
337
+ * Get the MockThresholdNetwork contract (typed via typechain)
338
+ * @returns {Promise<MockThresholdNetwork>} The MockThresholdNetwork contract
335
339
  */
336
- getMockThresholdNetwork: () => Promise<Contract>;
340
+ getMockThresholdNetwork: () => Promise<MockThresholdNetwork>;
337
341
 
338
342
  /**
339
- * Get the MockZkVerifier contract
340
- * @returns {Promise<Contract>} The MockZkVerifier contract
343
+ * Get the MockZkVerifier contract (typed via typechain)
344
+ * @returns {Promise<MockZkVerifier>} The MockZkVerifier contract
341
345
  */
342
- getMockZkVerifier: () => Promise<Contract>;
346
+ getMockZkVerifier: () => Promise<MockZkVerifier>;
343
347
 
344
348
  /**
345
- * Get the TestBed contract
346
- * @returns {Promise<Contract>} The TestBed contract
349
+ * Get the TestBed contract (typed via typechain)
350
+ * @returns {Promise<TestBed>} The TestBed contract
347
351
  */
348
- getTestBed: () => Promise<Contract>;
352
+ getTestBed: () => Promise<TestBed>;
349
353
  };
350
354
  };
351
355
  }
@@ -436,23 +440,26 @@ extendEnvironment((hre) => {
436
440
  deployMocks: async (options: DeployMocksArgs) => {
437
441
  return deployMocks(hre, options);
438
442
  },
439
- getPlaintext: async (ctHash: bigint) => {
443
+ getPlaintext: async (ctHash: bigint | string) => {
440
444
  const [signer] = await hre.ethers.getSigners();
441
445
  return mock_getPlaintext(signer.provider, ctHash);
442
446
  },
443
- expectPlaintext: async (ctHash: bigint, expectedValue: bigint) => {
447
+ expectPlaintext: async (ctHash: bigint | string, expectedValue: bigint) => {
444
448
  const [signer] = await hre.ethers.getSigners();
445
449
  return mock_expectPlaintext(signer.provider, ctHash, expectedValue);
446
450
  },
447
- getMockTaskManager: async () => getFixedMockContract(hre, MockTaskManagerArtifact),
451
+ getMockTaskManager: async () =>
452
+ getFixedMockContract(hre, MockTaskManagerArtifact) as unknown as Promise<MockTaskManager>,
448
453
  getMockACL: async () => {
449
454
  const taskManager = await getFixedMockContract(hre, MockTaskManagerArtifact);
450
455
  const aclAddress = await taskManager.acl();
451
- return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress);
456
+ return hre.ethers.getContractAt(MockACLArtifact.abi, aclAddress) as unknown as MockACL;
452
457
  },
453
- getMockThresholdNetwork: async () => getFixedMockContract(hre, MockThresholdNetworkArtifact),
454
- getMockZkVerifier: async () => getFixedMockContract(hre, MockZkVerifierArtifact),
455
- getTestBed: async () => getFixedMockContract(hre, TestBedArtifact),
458
+ getMockThresholdNetwork: async () =>
459
+ getFixedMockContract(hre, MockThresholdNetworkArtifact) as unknown as Promise<MockThresholdNetwork>,
460
+ getMockZkVerifier: async () =>
461
+ getFixedMockContract(hre, MockZkVerifierArtifact) as unknown as Promise<MockZkVerifier>,
462
+ getTestBed: async () => getFixedMockContract(hre, TestBedArtifact) as unknown as Promise<TestBed>,
456
463
  },
457
464
  };
458
465
  });
package/src/utils.ts CHANGED
@@ -51,7 +51,10 @@ const mock_checkIsTestnet = async (fnName: string, provider: HardhatEthersProvid
51
51
  return isTestnet;
52
52
  };
53
53
 
54
- export const mock_getPlaintext = async (provider: HardhatEthersProvider | ethers.JsonRpcProvider, ctHash: bigint) => {
54
+ export const mock_getPlaintext = async (
55
+ provider: HardhatEthersProvider | ethers.JsonRpcProvider,
56
+ ctHash: bigint | string
57
+ ) => {
55
58
  // Skip with log if called on a non-testnet chain
56
59
  if (await mock_checkIsTestnet(mock_getPlaintext.name, provider)) return;
57
60
 
@@ -63,14 +66,14 @@ export const mock_getPlaintext = async (provider: HardhatEthersProvider | ethers
63
66
  );
64
67
 
65
68
  // Fetch the plaintext
66
- const plaintext = await taskManager.mockStorage(ctHash);
69
+ const plaintext = await taskManager.mockStorage(BigInt(ctHash));
67
70
 
68
71
  return plaintext;
69
72
  };
70
73
 
71
74
  export const mock_getPlaintextExists = async (
72
75
  provider: HardhatEthersProvider | ethers.JsonRpcProvider,
73
- ctHash: bigint
76
+ ctHash: bigint | string
74
77
  ) => {
75
78
  // Skip with log if called on a non-testnet chain
76
79
  if (await mock_checkIsTestnet(mock_getPlaintextExists.name, provider)) return;
@@ -83,14 +86,14 @@ export const mock_getPlaintextExists = async (
83
86
  );
84
87
 
85
88
  // Fetch the plaintext exists
86
- const plaintextExists = await taskManager.inMockStorage(ctHash);
89
+ const plaintextExists = await taskManager.inMockStorage(BigInt(ctHash));
87
90
 
88
91
  return plaintextExists;
89
92
  };
90
93
 
91
94
  export const mock_expectPlaintext = async (
92
95
  provider: HardhatEthersProvider | ethers.JsonRpcProvider,
93
- ctHash: bigint,
96
+ ctHash: bigint | string,
94
97
  expectedValue: bigint
95
98
  ) => {
96
99
  // Skip with log if called on a non-testnet chain