From 216aabaaf035f51b43820295ec626a019bc3356c Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 23 Apr 2025 18:04:31 +0200 Subject: [PATCH 1/2] feat: enhance environment configuration and add new variables for deployment --- packages/sharing-smart-contract/.env.template | 8 +++- packages/sharing-smart-contract/config/env.js | 39 +++++++++++++++++++ .../sharing-smart-contract/scripts/deploy.js | 15 ++++--- .../scripts/fillCollection.js | 3 +- .../scripts/updateEnv.js | 4 +- .../scripts/upgrade-local-fork.js | 4 +- .../sharing-smart-contract/scripts/upgrade.js | 3 +- packages/smart-contract/config/env.ts | 8 ++-- 8 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 packages/sharing-smart-contract/config/env.js diff --git a/packages/sharing-smart-contract/.env.template b/packages/sharing-smart-contract/.env.template index a172caa64..4c6302e73 100644 --- a/packages/sharing-smart-contract/.env.template +++ b/packages/sharing-smart-contract/.env.template @@ -1,7 +1,7 @@ # wallet used for transactions WALLET_PRIVATE_KEY=... -# environment to use for configuration (prod/staging) +# environment to use for configuration (prod/staging). The default is prod. ENV=... # IExec PoCo contract address override (deploy script only) @@ -9,3 +9,9 @@ POCO_ADDRESS=... # DatasetRegistry contract address override (deploy script only) DATASET_REGISTRY_ADDRESS=... + +## RPC URL for the network +RPC_URL= + +## Mnemonic for the network +MNEMONIC= diff --git a/packages/sharing-smart-contract/config/env.js b/packages/sharing-smart-contract/config/env.js new file mode 100644 index 000000000..3ede68f29 --- /dev/null +++ b/packages/sharing-smart-contract/config/env.js @@ -0,0 +1,39 @@ +import 'dotenv/config.js'; +import { z } from 'zod'; + +const addressRegex = /(^|\b)(0x)?[0-9a-fA-F]{64}(\b|$)/; +const privateKeyRegex = /(^|\b)(0x)?[0-9a-fA-F]{64}(\b|$)/; + +const envSchema = z.object({ + // Private key of the wallet used for transactions + WALLET_PRIVATE_KEY: z + .string() + .regex(privateKeyRegex, 'Invalid private key format') + .optional() + .or(z.literal('')), + + // environment to use for configuration (prod/staging) + ENV: z.enum(['prod', 'staging'], 'ENV must be either "prod" or "staging"').default('prod'), + + // Address of the PoCo contract + POCO_ADDRESS: z + .string() + .regex(addressRegex, 'Invalid Ethereum address format') + .optional() + .or(z.literal('')), + + // Address of the DatasetRegistry + DATASET_REGISTRY_ADDRESS: z + .string() + .regex(addressRegex, 'Invalid Ethereum address format') + .optional() + .or(z.literal('')), + + // URL of the RPC used for network connection + RPC_URL: z.string().url('RPC_URL must be a valid URL').optional().or(z.literal('')), + + // Mnemonic for deployment or network interaction + MNEMONIC: z.string().min(1, 'MNEMONIC cannot be empty').optional().or(z.literal('')), +}); + +export const env = envSchema.parse(process.env); diff --git a/packages/sharing-smart-contract/scripts/deploy.js b/packages/sharing-smart-contract/scripts/deploy.js index 39a087b5a..f2c837ccd 100644 --- a/packages/sharing-smart-contract/scripts/deploy.js +++ b/packages/sharing-smart-contract/scripts/deploy.js @@ -5,6 +5,7 @@ import { POCO_ADDRESS as defaultPocoAddress, } from '../config/config.js'; import { saveDeployment } from '../utils/utils.js'; +import { env } from '../config/env.js'; const { ethers, upgrades } = hre; @@ -13,13 +14,11 @@ async function main() { const [deployer] = await ethers.getSigners(); console.log('Deploying contracts with the account:', deployer.address); - const { - POCO_ADDRESS = defaultPocoAddress, - DATASET_REGISTRY_ADDRESS = defaultDatasetRegistryAddress, - } = process.env; + const pocoAddress = env.POCO_ADDRESS || defaultPocoAddress; + const datasetRegistryAddress = env.DATASET_REGISTRY_ADDRESS || defaultDatasetRegistryAddress; - console.log(`Using poco at ${POCO_ADDRESS}`); - console.log(`Using dataset registry at ${DATASET_REGISTRY_ADDRESS}`); + console.log(`Using poco at ${pocoAddress}`); + console.log(`Using dataset registry at ${datasetRegistryAddress}`); const AddOnlyAppWhitelistRegistryFactory = await ethers.getContractFactory( 'AddOnlyAppWhitelistRegistry', @@ -47,8 +46,8 @@ async function main() { const DataProtectorSharingFactory = await ethers.getContractFactory('DataProtectorSharing'); const dataProtectorSharingConstructorArgs = [ - DATASET_REGISTRY_ADDRESS, - POCO_ADDRESS, + datasetRegistryAddress, + pocoAddress, addOnlyAppWhitelistRegistryAddress, ]; const dataProtectorSharingContract = await upgrades.deployProxy(DataProtectorSharingFactory, { diff --git a/packages/sharing-smart-contract/scripts/fillCollection.js b/packages/sharing-smart-contract/scripts/fillCollection.js index ddb013c32..8dbefcabb 100644 --- a/packages/sharing-smart-contract/scripts/fillCollection.js +++ b/packages/sharing-smart-contract/scripts/fillCollection.js @@ -3,6 +3,7 @@ /* eslint-disable no-await-in-loop */ import { getEnvironment } from '@iexec/dataprotector-environments'; import pkg from 'hardhat'; +import { env } from '../config/env.js'; import { createAppFor } from './singleFunction/app.js'; import { createDatasetFor } from './singleFunction/dataset.js'; import { createWorkerpool, createWorkerpoolOrder } from './singleFunction/workerpool.js'; @@ -13,7 +14,7 @@ const { ethers } = pkg; const rpcURL = pkg.network.config.url; async function main() { - const { ENV } = process.env; + const { ENV } = env; console.log(`using ENV: ${ENV}`); const { dataprotectorSharingContractAddress } = getEnvironment(ENV); diff --git a/packages/sharing-smart-contract/scripts/updateEnv.js b/packages/sharing-smart-contract/scripts/updateEnv.js index e8bfeb4b9..eb7be8f2f 100644 --- a/packages/sharing-smart-contract/scripts/updateEnv.js +++ b/packages/sharing-smart-contract/scripts/updateEnv.js @@ -1,11 +1,11 @@ /* eslint-disable no-console */ import { getEnvironment } from '@iexec/dataprotector-environments'; import pkg from 'hardhat'; - +import { env } from '../config/env.js'; const { ethers } = pkg; async function main() { - const { ENV } = process.env; + const { ENV } = env; console.log(`using ENV: ${ENV}`); const { dataprotectorSharingContractAddress, resultProxyUrl } = getEnvironment(ENV); diff --git a/packages/sharing-smart-contract/scripts/upgrade-local-fork.js b/packages/sharing-smart-contract/scripts/upgrade-local-fork.js index 5974e21e0..08cb3ee5a 100644 --- a/packages/sharing-smart-contract/scripts/upgrade-local-fork.js +++ b/packages/sharing-smart-contract/scripts/upgrade-local-fork.js @@ -2,12 +2,12 @@ import { getEnvironment } from '@iexec/dataprotector-environments'; import hre from 'hardhat'; import { DATASET_REGISTRY_ADDRESS, POCO_ADDRESS } from '../config/config.js'; +import { env } from '../config/env.js'; import { impersonate, stopImpersonate } from './singleFunction/utils.js'; - const { ethers, upgrades } = hre; async function main() { - const { ENV } = process.env; + const { ENV } = env; console.log(`using ENV: ${ENV}`); const rpcUrl = hre.network.config.url; diff --git a/packages/sharing-smart-contract/scripts/upgrade.js b/packages/sharing-smart-contract/scripts/upgrade.js index ebb79d62a..340e16f32 100644 --- a/packages/sharing-smart-contract/scripts/upgrade.js +++ b/packages/sharing-smart-contract/scripts/upgrade.js @@ -2,11 +2,12 @@ import { getEnvironment } from '@iexec/dataprotector-environments'; import hre from 'hardhat'; import { DATASET_REGISTRY_ADDRESS, POCO_ADDRESS } from '../config/config.js'; +import { env } from '../config/env.js'; const { ethers, upgrades } = hre; async function main() { - const { ENV } = process.env; + const { ENV } = env; console.log(`Using ENV: ${ENV}`); const { dataprotectorSharingContractAddress, addOnlyAppWhitelistRegistryContractAddress } = diff --git a/packages/smart-contract/config/env.ts b/packages/smart-contract/config/env.ts index c1333a9fb..b62654f30 100644 --- a/packages/smart-contract/config/env.ts +++ b/packages/smart-contract/config/env.ts @@ -5,24 +5,24 @@ const addressRegex = /(^|\b)(0x)?[0-9a-fA-F]{64}(\b|$)/; const privateKeyRegex = /(^|\b)(0x)?[0-9a-fA-F]{64}(\b|$)/; const envSchema = z.object({ - // Clé privée du wallet utilisé pour les transactions + // Private key of the wallet used for transactions WALLET_PRIVATE_KEY: z .string() .regex(privateKeyRegex, 'Invalid private key format') .optional() .or(z.literal('')), - // Adresse du DatasetRegistry (override) + // DatasetRegistry address (override) DATASET_REGISTRY_ADDRESS: z .string() .regex(addressRegex, 'Invalid Ethereum address format') .optional() .or(z.literal('')), - // URL du RPC utilisé pour la connexion réseau + // RPC URL used for network connection RPC_URL: z.string().url('RPC_URL must be a valid URL').optional().or(z.literal('')), - // Mnemonic de déploiement ou interaction réseau + // Mnemonic for deployment or network interaction MNEMONIC: z.string().min(1, 'MNEMONIC cannot be empty').optional().or(z.literal('')), // Arbiscan API key From e5833942a15bb8be3e1860a888a6cf1de4bb55e8 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 23 Apr 2025 18:09:14 +0200 Subject: [PATCH 2/2] fix: reorder import statements for consistency --- packages/sharing-smart-contract/scripts/deploy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sharing-smart-contract/scripts/deploy.js b/packages/sharing-smart-contract/scripts/deploy.js index f2c837ccd..9fdd6498a 100644 --- a/packages/sharing-smart-contract/scripts/deploy.js +++ b/packages/sharing-smart-contract/scripts/deploy.js @@ -4,8 +4,8 @@ import { DATASET_REGISTRY_ADDRESS as defaultDatasetRegistryAddress, POCO_ADDRESS as defaultPocoAddress, } from '../config/config.js'; -import { saveDeployment } from '../utils/utils.js'; import { env } from '../config/env.js'; +import { saveDeployment } from '../utils/utils.js'; const { ethers, upgrades } = hre;