diff --git a/src/kernel_evm_mockup/src/blueprint.rs b/src/kernel_evm_mockup/src/blueprint.rs new file mode 100644 index 0000000000000000000000000000000000000000..5002bb10f7532b7e945ab073f857f1dbd526fa4b --- /dev/null +++ b/src/kernel_evm_mockup/src/blueprint.rs @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: 2022-2023 TriliTech +// SPDX-FileCopyrightText: 2023 Nomadic Labs +// +// SPDX-License-Identifier: MIT + +#![allow(dead_code)] + +use crate::inbox::Messages; + +pub struct Queue { + // In our case, to make it simple and straightforward it will be + // an array of pendings transactions even though it'll be only a + // singleton for our needs. + pub proposal: Vec, +} + +impl Queue { + pub fn add(mut queue: Queue, messages: Messages) { + queue.proposal.push(messages) + } +} diff --git a/src/kernel_evm_mockup/src/inbox.rs b/src/kernel_evm_mockup/src/inbox.rs new file mode 100644 index 0000000000000000000000000000000000000000..ab5b32412d2ed8e4e8c1df89f1090a3fc08f2023 --- /dev/null +++ b/src/kernel_evm_mockup/src/inbox.rs @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2022-2023 TriliTech +// SPDX-FileCopyrightText: 2023 Nomadic Labs +// +// SPDX-License-Identifier: MIT + +#![allow(dead_code)] + +use host::input::Message; +use host::rollup_core::RawRollupCore; +use host::runtime::Runtime; + +pub struct Transaction { + pub level: i32, + pub tx: Vec, +} + +pub struct EthereumTransaction { + pub transactions: Vec, +} + +pub enum Messages { + // This enum structure is intended to be extended with Internal at + // some point. + External(EthereumTransaction), +} + +pub enum Error { + ReadInputError, +} + +impl Messages { + pub fn new(transaction: Transaction) -> Messages { + // messages is actually a tx singleton for now + let eth_tx = EthereumTransaction { + transactions: vec![transaction], + }; + Messages::External(eth_tx) + } + + pub fn of_raw_input(input: Message) -> Result { + let tx = Message::as_ref(&input).to_vec(); + let transaction = Transaction { + level: input.level, + tx, + }; + Ok(Messages::new(transaction)) + } +} + +pub struct Inbox { + pub messages: Messages, +} + +impl Inbox { + pub fn read_input( + host: &mut Host, + max_bytes: usize, + ) -> Result { + match Runtime::read_input(host, max_bytes) { + Ok(Some(input)) => Messages::of_raw_input(input), + _ => Err(Error::ReadInputError), + } + } +} diff --git a/src/kernel_evm_mockup/src/lib.rs b/src/kernel_evm_mockup/src/lib.rs index 8f7c88ef0a625fd1df90d5848f93fdd667d6736e..8be3cbe9649cfe56205839b71beb0e9d20108c02 100644 --- a/src/kernel_evm_mockup/src/lib.rs +++ b/src/kernel_evm_mockup/src/lib.rs @@ -8,15 +8,25 @@ use host::runtime::Runtime; use kernel::kernel_entry; use crate::account::Account; +use crate::blueprint::Queue; use crate::error::Error; +use crate::inbox::Inbox; use crate::storage::store_account; use crate::wei::{from_eth, Wei}; mod account; +mod blueprint; mod error; +mod inbox; mod storage; mod wei; +pub fn stage_one(host: &mut Host, max_bytes: usize, queue: Queue) { + if let Ok(messages) = Inbox::read_input(host, max_bytes) { + Queue::add(queue, messages) + } +} + pub fn init_mock_account(host: &mut Host) -> Result<(), Error> { let hash = ("6471a723296395cf1dcc568941affd7a390f94ce").to_ascii_lowercase();