diff --git a/crates/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs index a9d0c3533d..33c94a898b 100644 --- a/crates/evm-helpers/src/contracts.rs +++ b/crates/evm-helpers/src/contracts.rs @@ -25,13 +25,13 @@ use tokio::sync::Mutex; static NONCE_LOCK: Lazy> = Lazy::new(|| Mutex::new(())); -pub async fn next_pending_nonce

(provider: &P) -> eyre::Result +/// Get the next pending nonce for a given address from the provider +async fn get_next_nonce

(provider: &P, address: Address) -> eyre::Result where P: Provider + Send + Sync, { - let from = provider.get_accounts().await?[0]; provider - .get_transaction_count(from) + .get_transaction_count(address) .pending() .await .map_err(Into::into) @@ -174,6 +174,7 @@ impl ProviderType for ReadWrite { pub struct EnclaveContract { pub provider: Arc, pub contract_address: Address, + pub wallet_address: Option

, _marker: PhantomData, } @@ -225,13 +226,10 @@ pub type EnclaveReadOnlyProvider = FillProvider< pub type EnclaveWriteProvider = FillProvider< JoinFill< JoinFill< - JoinFill< - Identity, - JoinFill>>, - >, - WalletFiller, + Identity, + JoinFill>>, >, - NonceFiller, + WalletFiller, >, RootProvider, Ethereum, @@ -254,16 +252,17 @@ impl EnclaveContractFactory { let contract_address = contract_address.parse()?; let signer: PrivateKeySigner = private_key.parse()?; + let wallet_address = signer.address(); let wallet = EthereumWallet::from(signer); let provider = ProviderBuilder::new() .wallet(wallet) - .with_cached_nonce_management() .connect(http_rpc_url) .await?; Ok(EnclaveContract:: { provider: Arc::new(provider), contract_address, + wallet_address: Some(wallet_address), _marker: PhantomData, }) } @@ -280,6 +279,7 @@ impl EnclaveContractFactory { Ok(EnclaveContract:: { provider: Arc::new(provider), contract_address, + wallet_address: None, _marker: PhantomData, }) } @@ -347,7 +347,10 @@ impl EnclaveWrite for EnclaveContract { compute_provider_params: Bytes, ) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let e3_request = E3RequestParams { filter, @@ -371,7 +374,10 @@ impl EnclaveWrite for EnclaveContract { async fn activate(&self, e3_id: U256, pub_key: Bytes) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.activate(e3_id, pub_key).nonce(nonce); @@ -382,7 +388,10 @@ impl EnclaveWrite for EnclaveContract { async fn enable_e3_program(&self, e3_program: Address) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.enableE3Program(e3_program).nonce(nonce); @@ -393,7 +402,10 @@ impl EnclaveWrite for EnclaveContract { async fn publish_input(&self, e3_id: U256, data: Bytes) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract.publishInput(e3_id, data).nonce(nonce); @@ -409,7 +421,10 @@ impl EnclaveWrite for EnclaveContract { proof: Bytes, ) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract @@ -427,7 +442,10 @@ impl EnclaveWrite for EnclaveContract { proof: Bytes, ) -> Result { let _guard = NONCE_LOCK.lock().await; - let nonce = next_pending_nonce(&*self.provider).await?; + let wallet_addr = self + .wallet_address + .ok_or_else(|| eyre::eyre!("No wallet address configured"))?; + let nonce = get_next_nonce(&*self.provider, wallet_addr).await?; let contract = Enclave::new(self.contract_address, &self.provider); let builder = contract diff --git a/crates/support/contracts/ImageID.sol b/crates/support/contracts/ImageID.sol index 192c94c9e6..2522b6d98a 100644 --- a/crates/support/contracts/ImageID.sol +++ b/crates/support/contracts/ImageID.sol @@ -19,5 +19,8 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = bytes32(0x281708e32ec4018495d0efb9e6c5e36c238927c23afc9743fd4f20c67f47b489); + bytes32 public constant PROGRAM_ID = + bytes32( + 0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2 + ); } diff --git a/examples/CRISP/contracts/ImageID.sol b/examples/CRISP/contracts/ImageID.sol index 43853038a2..7bff45a61e 100755 --- a/examples/CRISP/contracts/ImageID.sol +++ b/examples/CRISP/contracts/ImageID.sol @@ -19,8 +19,5 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = - bytes32( - 0x281708e32ec4018495d0efb9e6c5e36c238927c23afc9743fd4f20c67f47b489 - ); + bytes32 public constant PROGRAM_ID = bytes32(0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2); } diff --git a/packages/enclave-contracts/deployed_contracts.json b/packages/enclave-contracts/deployed_contracts.json index 906896bb54..a011838132 100644 --- a/packages/enclave-contracts/deployed_contracts.json +++ b/packages/enclave-contracts/deployed_contracts.json @@ -3,28 +3,47 @@ "Enclave": { "constructorArgs": { "params": "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001", - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B", "maxDuration": "2592000", "registry": "0x0000000000000000000000000000000000000001" }, - "blockNumber": 9181738, - "address": "0xD43c70A343E631475d8470d0403e0c4b43c76927" + "blockNumber": 9375734, + "address": "0x7aF55D944285cc6f417Ddfda05393FA18679046d" }, "CiphernodeRegistry": { "constructorArgs": { - "enclaveAddress": "0xD43c70A343E631475d8470d0403e0c4b43c76927", - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" + "enclaveAddress": "0x7aF55D944285cc6f417Ddfda05393FA18679046d", + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B" }, - "blockNumber": 9181748, - "address": "0x5ABDfCbA0366ABF2893D3f2465F4C97908488A6d" + "blockNumber": 9375745, + "address": "0x772CED56a1aA2dFBF53e9ad65D2b2De227F7CEBE" }, "NaiveRegistryFilter": { "constructorArgs": { - "ciphernodeRegistryAddress": "0x5ABDfCbA0366ABF2893D3f2465F4C97908488A6d", - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" + "ciphernodeRegistryAddress": "0x772CED56a1aA2dFBF53e9ad65D2b2De227F7CEBE", + "owner": "0x8837e47c4Bb520ADE83AAB761C3B60679443af1B" }, - "blockNumber": 9181753, - "address": "0x58708A1bf1AEdf8e75755FDa1882F8dc46985009" + "blockNumber": 9375774, + "address": "0x6FD987C9CC35bfc5a9Dfc3B89EFd787985C262A5" + }, + "MockComputeProvider": { + "blockNumber": 9377000, + "address": "0x473c9ac12C0F8265657741f7300b7C89D927A673" + }, + "MockDecryptionVerifier": { + "blockNumber": 9377008, + "address": "0x64962f93cF88B391572D81c4A1eaAA59c6A0D12c" + }, + "MockInputValidator": { + "blockNumber": 9377014, + "address": "0x910680dB8F077dd07977B9A9725A485170e5bb8a" + }, + "MockE3Program": { + "constructorArgs": { + "mockInputValidator": "0x910680dB8F077dd07977B9A9725A485170e5bb8a" + }, + "blockNumber": 9377020, + "address": "0x7e6F82A4367Abd4A8f1C54E38C850b59094DcD9a" } } } diff --git a/packages/enclave-contracts/scripts/deployEnclave.ts b/packages/enclave-contracts/scripts/deployEnclave.ts index ead1aea1b6..27b6b1f176 100644 --- a/packages/enclave-contracts/scripts/deployEnclave.ts +++ b/packages/enclave-contracts/scripts/deployEnclave.ts @@ -32,6 +32,7 @@ export const deployEnclave = async (withMocks?: boolean) => { const THIRTY_DAYS_IN_SECONDS = 60 * 60 * 24 * 30; const addressOne = "0x0000000000000000000000000000000000000001"; + console.log("Deploying Enclave"); const { enclave } = await deployAndSaveEnclave({ params: encoded, owner: ownerAddress, @@ -42,6 +43,7 @@ export const deployEnclave = async (withMocks?: boolean) => { const enclaveAddress = await enclave.getAddress(); + console.log("Deploying CiphernodeRegistry"); const { ciphernodeRegistry } = await deployAndSaveCiphernodeRegistryOwnable({ enclaveAddress: enclaveAddress, owner: ownerAddress, @@ -50,6 +52,7 @@ export const deployEnclave = async (withMocks?: boolean) => { const ciphernodeRegistryAddress = await ciphernodeRegistry.getAddress(); + console.log("Deploying NaiveRegistryFilter"); const { naiveRegistryFilter } = await deployAndSaveNaiveRegistryFilter({ ciphernodeRegistryAddress: ciphernodeRegistryAddress, owner: ownerAddress, @@ -60,6 +63,7 @@ export const deployEnclave = async (withMocks?: boolean) => { const registryAddress = await enclave.ciphernodeRegistry(); + console.log("Setting CiphernodeRegistry in Enclave"); if (registryAddress === ciphernodeRegistryAddress) { console.log(`Enclave contract already has registry`); } else { @@ -81,6 +85,7 @@ export const deployEnclave = async (withMocks?: boolean) => { const shouldDeployMocks = process.env.DEPLOY_MOCKS === "true" || withMocks; if (shouldDeployMocks) { + console.log("Deploying Mocks"); const { decryptionVerifierAddress, e3ProgramAddress } = await deployMocks(); const encryptionSchemeId = ethers.keccak256( diff --git a/packages/enclave-contracts/scripts/deployMocks.ts b/packages/enclave-contracts/scripts/deployMocks.ts index 72f33d5adc..f9155fbcb3 100644 --- a/packages/enclave-contracts/scripts/deployMocks.ts +++ b/packages/enclave-contracts/scripts/deployMocks.ts @@ -23,18 +23,22 @@ export interface MockDeployments { * @returns The addresses of the mock contracts. */ export const deployMocks = async (): Promise => { + console.log("Deploying Compute Provider"); const { computeProvider } = await deployAndSaveMockComputeProvider(hre); const computeProviderAddress = await computeProvider.getAddress(); + console.log("Deploying Decryption Verifier"); const { decryptionVerifier } = await deployAndSaveMockDecryptionVerifier(hre); const decryptionVerifierAddress = await decryptionVerifier.getAddress(); + console.log("Deploying Input Validator"); const { inputValidator } = await deployAndSaveMockInputValidator(hre); const inputValidatorAddress = await inputValidator.getAddress(); + console.log("Deploying E3 Program"); const { e3Program } = await deployAndSaveMockProgram({ mockInputValidator: inputValidatorAddress, hre,