diff --git a/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainACL.sol b/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainACL.sol new file mode 100644 index 0000000000..15bfee9b27 --- /dev/null +++ b/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainACL.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: BSD-3-Clause-Clear +pragma solidity ^0.8.24; + +/// @title MultichainACL smart contract +/// @dev sources: +/// - github.com/zama-ai/fhevm/blob/main/gateway-contracts/contracts/MultichainACL.sol +/// - github.com/zama-ai/fhevm/blob/main/gateway-contracts/contracts/interfaces/IMultichainACL.sol +/// @notice This contract is a mock of the MultichainACL contract from L2. +contract MultichainACL { + error CoprocessorAlreadyAllowedAccount(bytes32 ctHandle, address account, address txSender); + error CoprocessorAlreadyAllowedPublicDecrypt(bytes32 ctHandle, address txSender); + + event AllowAccount(bytes32 indexed ctHandle, address accountAddress); + event AllowPublicDecrypt(bytes32 indexed ctHandle); + + bool alreadyAllowedRevert; + + constructor(bool _alreadyAllowedRevert) { + alreadyAllowedRevert = _alreadyAllowedRevert; + } + + function allowAccount(bytes32 ctHandle, address accountAddress, bytes calldata /* extraData */) public { + if (alreadyAllowedRevert) { + revert CoprocessorAlreadyAllowedAccount(ctHandle, accountAddress, msg.sender); + } + emit AllowAccount(ctHandle, accountAddress); + } + + function allowPublicDecrypt(bytes32 ctHandle, bytes calldata /* extraData */) public { + if (alreadyAllowedRevert) { + revert CoprocessorAlreadyAllowedPublicDecrypt(ctHandle, msg.sender); + } + emit AllowPublicDecrypt(ctHandle); + } +} diff --git a/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainAcl.sol b/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainAcl.sol index e8be7b3e62..15bfee9b27 100644 --- a/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainAcl.sol +++ b/coprocessor/fhevm-engine/transaction-sender/contracts/MultichainAcl.sol @@ -1,11 +1,13 @@ // SPDX-License-Identifier: BSD-3-Clause-Clear pragma solidity ^0.8.24; -/// @title MultichainAcl smart contract -/// @dev source: github.com/zama-ai/fhevm-gateway/blob/main/contracts/MultichainAcl.sol -/// @notice This contract is a mock of the MultichainAcl contract from L2. -contract MultichainAcl { - error CoprocessorAlreadyAllowedAccount(bytes32 ctHandle, address account, address coprocessor); +/// @title MultichainACL smart contract +/// @dev sources: +/// - github.com/zama-ai/fhevm/blob/main/gateway-contracts/contracts/MultichainACL.sol +/// - github.com/zama-ai/fhevm/blob/main/gateway-contracts/contracts/interfaces/IMultichainACL.sol +/// @notice This contract is a mock of the MultichainACL contract from L2. +contract MultichainACL { + error CoprocessorAlreadyAllowedAccount(bytes32 ctHandle, address account, address txSender); error CoprocessorAlreadyAllowedPublicDecrypt(bytes32 ctHandle, address txSender); event AllowAccount(bytes32 indexed ctHandle, address accountAddress); diff --git a/coprocessor/fhevm-engine/transaction-sender/src/ops/allow_handle.rs b/coprocessor/fhevm-engine/transaction-sender/src/ops/allow_handle.rs index 9f92b26358..4051cc24f0 100644 --- a/coprocessor/fhevm-engine/transaction-sender/src/ops/allow_handle.rs +++ b/coprocessor/fhevm-engine/transaction-sender/src/ops/allow_handle.rs @@ -27,12 +27,12 @@ use fhevm_engine_common::{tenant_keys::query_tenant_info, types::AllowEvents, ut use sqlx::{Pool, Postgres}; use tokio::task::JoinSet; use tracing::{debug, error, info, warn}; -use MultichainAcl::MultichainAclErrors; +use MultichainACL::MultichainACLErrors; sol!( #[sol(rpc)] - MultichainAcl, - "artifacts/MultichainAcl.sol/MultichainAcl.json" + MultichainACL, + "artifacts/MultichainACL.sol/MultichainACL.json" ); struct Key { @@ -56,7 +56,7 @@ impl Display for Key { } #[derive(Clone)] -pub struct MultichainAclOperation + Clone + 'static> { +pub struct MultichainACLOperation + Clone + 'static> { multichain_acl_address: Address, provider: NonceManagedProvider

, conf: crate::ConfigSettings, @@ -64,7 +64,7 @@ pub struct MultichainAclOperation + Clone + 'static> { db_pool: Pool, } -impl + Clone + 'static> MultichainAclOperation

{ +impl + Clone + 'static> MultichainACLOperation

{ /// Sends a transaction /// /// TODO: Refactor: Avoid code duplication @@ -205,10 +205,10 @@ impl + Clone + 'static> MultichainAclOperation

{ fn already_allowed_error(&self, err: &RpcError) -> Option

{ err.as_error_resp() - .and_then(|payload| payload.as_decoded_interface_error::()) + .and_then(|payload| payload.as_decoded_interface_error::()) .map(|error| match error { - MultichainAclErrors::CoprocessorAlreadyAllowedAccount(c) => c.coprocessor, - MultichainAclErrors::CoprocessorAlreadyAllowedPublicDecrypt(c) => c.txSender, + MultichainACLErrors::CoprocessorAlreadyAllowedAccount(c) => c.txSender, /* coprocessor address */ + MultichainACLErrors::CoprocessorAlreadyAllowedPublicDecrypt(c) => c.txSender, }) } @@ -239,7 +239,7 @@ impl + Clone + 'static> MultichainAclOperation

{ } } -impl + Clone + 'static> MultichainAclOperation

{ +impl + Clone + 'static> MultichainACLOperation

{ pub fn new( multichain_acl_address: Address, provider: NonceManagedProvider

, @@ -250,7 +250,7 @@ impl + Clone + 'static> MultichainAclOperation

{ info!( gas = gas.unwrap_or(0), multichain_acl_address = %multichain_acl_address, - "Creating MultichainAclOperation" + "Creating MultichainACLOperation" ); Self { @@ -349,7 +349,7 @@ impl + Clone + 'static> MultichainAclOperation

{ } #[async_trait] -impl

TransactionOperation

for MultichainAclOperation

+impl

TransactionOperation

for MultichainACLOperation

where P: alloy::providers::Provider + Clone + 'static, { @@ -372,7 +372,7 @@ where .fetch_all(&self.db_pool) .await?; - let multichain_acl = MultichainAcl::new(self.multichain_acl_address, self.provider.inner()); + let multichain_acl = MultichainACL::new(self.multichain_acl_address, self.provider.inner()); info!(rows_count = rows.len(), "Selected rows to process"); diff --git a/coprocessor/fhevm-engine/transaction-sender/src/transaction_sender.rs b/coprocessor/fhevm-engine/transaction-sender/src/transaction_sender.rs index f7a2466821..1d84051889 100644 --- a/coprocessor/fhevm-engine/transaction-sender/src/transaction_sender.rs +++ b/coprocessor/fhevm-engine/transaction-sender/src/transaction_sender.rs @@ -59,7 +59,7 @@ impl + Clone + 'static> TransactionSender

{ gas, db_pool.clone(), )), - Arc::new(ops::allow_handle::MultichainAclOperation::new( + Arc::new(ops::allow_handle::MultichainACLOperation::new( multichain_acl_address, provider.clone(), conf.clone(), diff --git a/coprocessor/fhevm-engine/transaction-sender/tests/allow_handle_tests.rs b/coprocessor/fhevm-engine/transaction-sender/tests/allow_handle_tests.rs index 874aceb57f..611d91716e 100644 --- a/coprocessor/fhevm-engine/transaction-sender/tests/allow_handle_tests.rs +++ b/coprocessor/fhevm-engine/transaction-sender/tests/allow_handle_tests.rs @@ -2,7 +2,7 @@ use alloy::network::TxSigner; use alloy::providers::ProviderBuilder; use alloy::signers::local::PrivateKeySigner; use alloy::{primitives::Address, providers::WsConnect}; -use common::{MultichainAcl, SignerType, TestEnvironment}; +use common::{MultichainACL, SignerType, TestEnvironment}; use fhevm_engine_common::types::AllowEvents; use rand::random; @@ -107,7 +107,7 @@ async fn allow_call( .await?, Some(env.wallet.default_signer().address()), ); - let multichain_acl = MultichainAcl::deploy(&provider_deploy, already_allowed_revert).await?; + let multichain_acl = MultichainACL::deploy(&provider_deploy, already_allowed_revert).await?; let txn_sender = TransactionSender::new( PrivateKeySigner::random().address(), @@ -227,7 +227,7 @@ async fn stop_on_backend_gone(#[case] signer_type: SignerType) -> anyhow::Result Some(env.wallet.default_signer().address()), ); let already_allowed_revert = false; - let multichain_acl = MultichainAcl::deploy(&provider_deploy, already_allowed_revert).await?; + let multichain_acl = MultichainACL::deploy(&provider_deploy, already_allowed_revert).await?; let txn_sender = TransactionSender::new( PrivateKeySigner::random().address(), @@ -326,7 +326,7 @@ async fn retry_on_aws_kms_error(#[case] signer_type: SignerType) -> anyhow::Resu Some(env.wallet.default_signer().address()), ); let already_allowed_revert = false; - let multichain_acl = MultichainAcl::deploy(&provider_deploy, already_allowed_revert).await?; + let multichain_acl = MultichainACL::deploy(&provider_deploy, already_allowed_revert).await?; let txn_sender = TransactionSender::new( PrivateKeySigner::random().address(), diff --git a/coprocessor/fhevm-engine/transaction-sender/tests/common.rs b/coprocessor/fhevm-engine/transaction-sender/tests/common.rs index 04b969e7f7..70663a8555 100644 --- a/coprocessor/fhevm-engine/transaction-sender/tests/common.rs +++ b/coprocessor/fhevm-engine/transaction-sender/tests/common.rs @@ -34,8 +34,8 @@ sol!( sol!( #[sol(rpc)] - MultichainAcl, - "artifacts/MultichainAcl.sol/MultichainAcl.json" + MultichainACL, + "artifacts/MultichainACL.sol/MultichainACL.json" ); pub enum SignerType {