diff --git a/ismp-testsuite/src/mocks.rs b/ismp-testsuite/src/mocks.rs index dfcc7eb..1d5c93a 100644 --- a/ismp-testsuite/src/mocks.rs +++ b/ismp-testsuite/src/mocks.rs @@ -3,6 +3,7 @@ use ismp::{ ConsensusClient, ConsensusClientId, ConsensusStateId, StateCommitment, StateMachineClient, StateMachineHeight, StateMachineId, }, + contracts::Gas, error::Error, host::{IsmpHost, StateMachine}, messaging::{Proof, StateCommitmentHeight}, @@ -21,7 +22,6 @@ use std::{ sync::Arc, time::{Duration, SystemTime, UNIX_EPOCH}, }; -use ismp::module::Gas; #[derive(Default)] pub struct MockClient; diff --git a/ismp/src/contracts.rs b/ismp/src/contracts.rs new file mode 100644 index 0000000..466f957 --- /dev/null +++ b/ismp/src/contracts.rs @@ -0,0 +1,27 @@ +//! Contains ismp primitives for contract support +use alloc::vec::Vec; +use codec::{Decode, Encode}; + +/// A return type that indicates the gas consumed by the contract executor +#[derive(PartialEq, Eq, Debug)] +pub struct Gas { + /// Gas consumed when executing the contract call + pub gas_used: Option, + /// Gas limit passed to the contract executor + pub gas_limit: Option, +} + +impl From<()> for Gas { + fn from(_: ()) -> Self { + Self { gas_used: None, gas_limit: None } + } +} + +/// The contract data to provide additional metadata for the contract executor +#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq)] +pub struct ContractData { + /// Opaque bytes that would be decoded by the contract + pub data: Vec, + /// The gas limit the executor should use when executing the contract call + pub gas_limit: u64, +} diff --git a/ismp/src/handlers/request.rs b/ismp/src/handlers/request.rs index 9d55b4d..12f0e5a 100644 --- a/ismp/src/handlers/request.rs +++ b/ismp/src/handlers/request.rs @@ -54,10 +54,11 @@ where let cb = router.module_for_id(request.to.clone())?; let res = cb .on_accept(request.clone()) - .map(|_| DispatchSuccess { + .map(|gas| DispatchSuccess { dest_chain: request.dest_chain, source_chain: request.source_chain, nonce: request.nonce, + gas, }) .map_err(|e| DispatchError { msg: format!("{e:?}"), diff --git a/ismp/src/handlers/response.rs b/ismp/src/handlers/response.rs index 6e158e2..2944db6 100644 --- a/ismp/src/handlers/response.rs +++ b/ismp/src/handlers/response.rs @@ -64,10 +64,11 @@ where let cb = router.module_for_id(response.destination_module())?; let res = cb .on_response(response.clone()) - .map(|_| DispatchSuccess { + .map(|gas| DispatchSuccess { dest_chain: response.dest_chain(), source_chain: response.source_chain(), nonce: response.nonce(), + gas, }) .map_err(|e| DispatchError { msg: format!("{e:?}"), @@ -109,10 +110,11 @@ where get: request.get_request()?, values, })) - .map(|_| DispatchSuccess { + .map(|gas| DispatchSuccess { dest_chain: request.dest_chain(), source_chain: request.source_chain(), nonce: request.nonce(), + gas, }) .map_err(|e| DispatchError { msg: format!("{e:?}"), diff --git a/ismp/src/handlers/timeout.rs b/ismp/src/handlers/timeout.rs index a6b3a96..df2edd3 100644 --- a/ismp/src/handlers/timeout.rs +++ b/ismp/src/handlers/timeout.rs @@ -65,10 +65,11 @@ where let cb = router.module_for_id(request.source_module())?; let res = cb .on_timeout(request.clone()) - .map(|_| DispatchSuccess { + .map(|gas| DispatchSuccess { dest_chain: request.dest_chain(), source_chain: request.source_chain(), nonce: request.nonce(), + gas, }) .map_err(|e| DispatchError { msg: format!("{e:?}"), @@ -104,10 +105,11 @@ where let cb = router.module_for_id(request.source_module())?; let res = cb .on_timeout(request.clone()) - .map(|_| DispatchSuccess { + .map(|gas| DispatchSuccess { dest_chain: request.dest_chain(), source_chain: request.source_chain(), nonce: request.nonce(), + gas, }) .map_err(|e| DispatchError { msg: format!("{e:?}"), diff --git a/ismp/src/lib.rs b/ismp/src/lib.rs index 7cac4fc..4677e62 100644 --- a/ismp/src/lib.rs +++ b/ismp/src/lib.rs @@ -27,6 +27,7 @@ extern crate alloc; extern crate core; pub mod consensus; +pub mod contracts; pub mod error; pub mod handlers; pub mod host; diff --git a/ismp/src/module.rs b/ismp/src/module.rs index dd45be1..0873c88 100644 --- a/ismp/src/module.rs +++ b/ismp/src/module.rs @@ -16,6 +16,7 @@ //! ISMPModule definition use crate::{ + contracts::Gas, error::Error, host::StateMachine, router::{Post as PostRequest, Request, Response}, @@ -31,6 +32,8 @@ pub struct DispatchSuccess { pub source_chain: StateMachine, /// Request nonce pub nonce: u64, + /// Gas used by contract executor; + pub gas: Gas, } /// The result of unsuccessfully dispatching a request or response @@ -64,19 +67,3 @@ pub trait IsmpModule { /// sent but have now timed-out fn on_timeout(&self, request: Request) -> Result; } - -pub struct Gas { - /// Gas consumed when executing the contract call - pub gas_used: Option, - /// Gas limit passed to the contract executor - pub gas_limit: Option -} - -impl From<()> for Gas { - fn from(_: ()) -> Self { - Self { - gas_used: None, - gas_limit: None - } - } -}