From b5f958fc6a4b7599c5224385fa7322d5a5595cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 16:23:29 +0100 Subject: [PATCH 1/7] Etherlink/Kernel/Deposit: extract receiver parsing --- etherlink/kernel_evm/kernel/src/bridge.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/etherlink/kernel_evm/kernel/src/bridge.rs b/etherlink/kernel_evm/kernel/src/bridge.rs index 0fd6fa892475..b1afe83c9a03 100644 --- a/etherlink/kernel_evm/kernel/src/bridge.rs +++ b/etherlink/kernel_evm/kernel/src/bridge.rs @@ -55,6 +55,15 @@ pub struct Deposit { } impl Deposit { + fn parse_receiver(input: MichelsonBytes) -> Result { + let input_bytes = input.0; + if input_bytes.len() != std::mem::size_of::() { + return Err(BridgeError::InvalidDepositReceiver(input_bytes)); + } + let receiver = H160::from_slice(&input_bytes); + Ok(receiver) + } + /// Parses a deposit from a ticket transfer (internal inbox message). /// The "entrypoint" type is pair of ticket (FA2.1) and bytes (receiver address). #[cfg_attr(feature = "benchmark", inline(never))] @@ -74,11 +83,7 @@ impl Deposit { let amount: U256 = eth_from_mutez(amount_mutez); // EVM address - let receiver_bytes = receiver.0; - if receiver_bytes.len() != std::mem::size_of::() { - return Err(BridgeError::InvalidDepositReceiver(receiver_bytes)); - } - let receiver = H160::from_slice(&receiver_bytes); + let receiver = Self::parse_receiver(receiver)?; Ok(Self { amount, -- GitLab From 9459e3dd46c2e474ee2f9f57d706f29cbe8a20d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 16:41:43 +0100 Subject: [PATCH 2/7] Etherlink/Kernel/Deposit: parsing of chain id --- etherlink/kernel_evm/kernel/src/bridge.rs | 50 +++++++++++++++------- etherlink/kernel_evm/kernel/src/inbox.rs | 7 ++- etherlink/kernel_evm/kernel/src/parsing.rs | 6 +-- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/etherlink/kernel_evm/kernel/src/bridge.rs b/etherlink/kernel_evm/kernel/src/bridge.rs index b1afe83c9a03..e5b8644c80aa 100644 --- a/etherlink/kernel_evm/kernel/src/bridge.rs +++ b/etherlink/kernel_evm/kernel/src/bridge.rs @@ -55,13 +55,29 @@ pub struct Deposit { } impl Deposit { - fn parse_receiver(input: MichelsonBytes) -> Result { + const RECEIVER_LENGTH: usize = std::mem::size_of::(); + + const RECEIVER_AND_CHAIN_ID_LENGTH: usize = + Self::RECEIVER_LENGTH + std::mem::size_of::(); + + fn parse_receiver( + input: MichelsonBytes, + ) -> Result<(H160, Option), BridgeError> { let input_bytes = input.0; - if input_bytes.len() != std::mem::size_of::() { - return Err(BridgeError::InvalidDepositReceiver(input_bytes)); + let input_length = input_bytes.len(); + if input_length == Self::RECEIVER_LENGTH { + // Legacy format, input is exactly the receiver EVM address + let receiver = H160::from_slice(&input_bytes); + Ok((receiver, None)) + } else if input_length == Self::RECEIVER_AND_CHAIN_ID_LENGTH { + // input is receiver followed by chain id + let receiver = H160::from_slice(&input_bytes[..Self::RECEIVER_LENGTH]); + let chain_id = + U256::from_little_endian(&input_bytes[Self::RECEIVER_LENGTH..]); + Ok((receiver, Some(chain_id))) + } else { + Err(BridgeError::InvalidDepositReceiver(input_bytes)) } - let receiver = H160::from_slice(&input_bytes); - Ok(receiver) } /// Parses a deposit from a ticket transfer (internal inbox message). @@ -72,7 +88,7 @@ impl Deposit { receiver: MichelsonBytes, inbox_level: u32, inbox_msg_id: u32, - ) -> Result { + ) -> Result<(Self, Option), BridgeError> { // Amount let (_sign, amount_bytes) = ticket.amount().to_bytes_le(); // We use the `U256::from_little_endian` as it takes arbitrary long @@ -82,15 +98,19 @@ impl Deposit { let amount_mutez: u64 = U256::from_little_endian(&amount_bytes).as_u64(); let amount: U256 = eth_from_mutez(amount_mutez); - // EVM address - let receiver = Self::parse_receiver(receiver)?; - - Ok(Self { - amount, - receiver, - inbox_level, - inbox_msg_id, - }) + // EVM address of the receiver and chain id both come from the + // Michelson byte parameter. + let (receiver, chain_id) = Self::parse_receiver(receiver)?; + + Ok(( + Self { + amount, + receiver, + inbox_level, + inbox_msg_id, + }, + chain_id, + )) } /// Returns log structure for an implicit deposit event. diff --git a/etherlink/kernel_evm/kernel/src/inbox.rs b/etherlink/kernel_evm/kernel/src/inbox.rs index e176cc528b75..e9c63b668942 100644 --- a/etherlink/kernel_evm/kernel/src/inbox.rs +++ b/etherlink/kernel_evm/kernel/src/inbox.rs @@ -239,6 +239,7 @@ where fn handle_deposit( host: &mut Host, deposit: Deposit, + chain_id: Option, inbox_content: &mut Self::Inbox, ) -> anyhow::Result<()>; @@ -285,6 +286,7 @@ impl InputHandler for ProxyInput { fn handle_deposit( host: &mut Host, deposit: Deposit, + _chain_id: Option, inbox_content: &mut Self::Inbox, ) -> anyhow::Result<()> { inbox_content @@ -401,6 +403,7 @@ impl InputHandler for SequencerInput { fn handle_deposit( host: &mut Host, deposit: Deposit, + _chain_id: Option, delayed_inbox: &mut Self::Inbox, ) -> anyhow::Result<()> { let previous_timestamp = read_last_info_per_level_timestamp(host)?; @@ -539,7 +542,9 @@ pub fn handle_input( store_last_info_per_level_timestamp(host, info.info.predecessor_timestamp)?; store_l1_level(host, info.level)? } - Input::Deposit(deposit) => Mode::handle_deposit(host, deposit, inbox_content)?, + Input::Deposit((deposit, chain_id)) => { + Mode::handle_deposit(host, deposit, chain_id, inbox_content)? + } Input::FaDeposit(fa_deposit) => { Mode::handle_fa_deposit(host, fa_deposit, inbox_content)? } diff --git a/etherlink/kernel_evm/kernel/src/parsing.rs b/etherlink/kernel_evm/kernel/src/parsing.rs index 95cbcd08f8cd..d7a7f33ee443 100644 --- a/etherlink/kernel_evm/kernel/src/parsing.rs +++ b/etherlink/kernel_evm/kernel/src/parsing.rs @@ -130,7 +130,7 @@ pub enum SequencerInput { #[derive(Debug, PartialEq, Clone)] pub enum Input { ModeSpecific(Mode), - Deposit(Deposit), + Deposit((Deposit, Option)), FaDeposit(FaDeposit), Upgrade(KernelUpgrade), SequencerUpgrade(SequencerUpgrade), @@ -678,9 +678,9 @@ impl InputResult { // directly. We prefer to overapproximate rather than under approximate. Mode::on_deposit(context); match Deposit::try_parse(ticket, receiver, inbox_level, inbox_msg_id) { - Ok(deposit) => { + Ok((deposit, chain_id)) => { log!(host, Info, "Parsed from input: {}", deposit.display()); - Self::Input(Input::Deposit(deposit)) + Self::Input(Input::Deposit((deposit, chain_id))) } Err(err) => { log!( -- GitLab From 0ed2ccd32d9d1d88f3d9f490289275dc1130f78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 16:50:10 +0100 Subject: [PATCH 3/7] Etherlink/Kernel/FA deposit: parsing of chain id --- .../evm_execution/src/fa_bridge/deposit.rs | 63 +++++++++++++------ etherlink/kernel_evm/kernel/src/inbox.rs | 7 ++- etherlink/kernel_evm/kernel/src/parsing.rs | 6 +- 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs index da282d641cac..ec4bf2f25980 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs @@ -78,19 +78,22 @@ impl FaDeposit { routing_info: MichelsonBytes, inbox_level: u32, inbox_msg_id: u32, - ) -> Result { + ) -> Result<(Self, Option), FaBridgeError> { let amount = bigint_to_u256(ticket.amount())?; - let (receiver, proxy) = parse_l2_routing_info(routing_info)?; + let (receiver, proxy, chain_id) = parse_l2_routing_info(routing_info)?; let ticket_hash = ticket_hash(&ticket)?; - Ok(FaDeposit { - amount, - receiver, - proxy, - ticket_hash, - inbox_level, - inbox_msg_id, - }) + Ok(( + FaDeposit { + amount, + receiver, + proxy, + ticket_hash, + inbox_level, + inbox_msg_id, + }, + chain_id, + )) } /// Returns calldata for the proxy (ERC wrapper) contract. @@ -171,16 +174,35 @@ impl FaDeposit { } } -/// Split routing info (raw bytes passed along with the ticket) into receiver and optional proxy addresses. +const RECEIVER_LENGTH: usize = std::mem::size_of::(); + +const RECEIVER_AND_PROXY_LENGTH: usize = RECEIVER_LENGTH + std::mem::size_of::(); + +const RECEIVER_PROXY_AND_CHAIN_ID_LENGTH: usize = + RECEIVER_AND_PROXY_LENGTH + std::mem::size_of::(); + +/// Split routing info (raw bytes passed along with the ticket) into receiver and optional proxy address and chain id. fn parse_l2_routing_info( routing_info: MichelsonBytes, -) -> Result<(H160, Option), FaBridgeError> { - if routing_info.0.len() == 20 { - Ok((H160::from_slice(&routing_info.0), None)) - } else if routing_info.0.len() == 40 { +) -> Result<(H160, Option, Option), FaBridgeError> { + let routing_info_len = routing_info.0.len(); + if routing_info_len == RECEIVER_LENGTH { + Ok((H160::from_slice(&routing_info.0), None, None)) + } else if routing_info_len == RECEIVER_AND_PROXY_LENGTH { + Ok(( + H160::from_slice(&routing_info.0[..RECEIVER_LENGTH]), + Some(H160::from_slice(&routing_info.0[RECEIVER_LENGTH..])), + None, + )) + } else if routing_info_len == RECEIVER_PROXY_AND_CHAIN_ID_LENGTH { Ok(( - H160::from_slice(&routing_info.0[..20]), - Some(H160::from_slice(&routing_info.0[20..])), + H160::from_slice(&routing_info.0[..RECEIVER_LENGTH]), + Some(H160::from_slice( + &routing_info.0[RECEIVER_LENGTH..RECEIVER_AND_PROXY_LENGTH], + )), + Some(U256::from_little_endian( + &routing_info.0[RECEIVER_AND_PROXY_LENGTH..], + )), )) } else { Err(FaBridgeError::InvalidRoutingInfo("invalid length")) @@ -235,7 +257,7 @@ mod tests { let ticket = create_fa_ticket("KT18amZmM5W7qDWVt2pH6uj7sCEd3kbzLrHT", 1, &[0u8], 2.into()); let routing_info = MichelsonBytes([[1u8; 20], [0u8; 20]].concat().to_vec()); - let deposit = + let (deposit, chain_id) = FaDeposit::try_parse(ticket, routing_info, 1, 0).expect("Failed to parse"); pretty_assertions::assert_eq!( @@ -251,7 +273,8 @@ mod tests { ) .unwrap(), } - ) + ); + pretty_assertions::assert_eq!(chain_id, None) } #[test] @@ -292,7 +315,7 @@ mod tests { create_fa_ticket("KT1TxqZ8QtKvLu3V3JH7Gx58n7Co8pgtpQU5", 1, &[0u8], 1.into()); let routing_info = MichelsonBytes([0u8; 20].to_vec()); - let res = FaDeposit::try_parse(ticket, routing_info, 1, 0).unwrap(); + let (res, _chain_id) = FaDeposit::try_parse(ticket, routing_info, 1, 0).unwrap(); assert_eq!(res.receiver, H160::zero()); assert!(res.proxy.is_none()); } diff --git a/etherlink/kernel_evm/kernel/src/inbox.rs b/etherlink/kernel_evm/kernel/src/inbox.rs index e9c63b668942..c47ef7ed9eef 100644 --- a/etherlink/kernel_evm/kernel/src/inbox.rs +++ b/etherlink/kernel_evm/kernel/src/inbox.rs @@ -246,6 +246,7 @@ where fn handle_fa_deposit( host: &mut Host, fa_deposit: FaDeposit, + chain_id: Option, inbox_content: &mut Self::Inbox, ) -> anyhow::Result<()>; } @@ -299,6 +300,7 @@ impl InputHandler for ProxyInput { fn handle_fa_deposit( host: &mut Host, fa_deposit: FaDeposit, + _chain_id: Option, inbox_content: &mut Self::Inbox, ) -> anyhow::Result<()> { inbox_content @@ -416,6 +418,7 @@ impl InputHandler for SequencerInput { fn handle_fa_deposit( host: &mut Host, fa_deposit: FaDeposit, + _chain_id: Option, delayed_inbox: &mut Self::Inbox, ) -> anyhow::Result<()> { let previous_timestamp = read_last_info_per_level_timestamp(host)?; @@ -545,8 +548,8 @@ pub fn handle_input( Input::Deposit((deposit, chain_id)) => { Mode::handle_deposit(host, deposit, chain_id, inbox_content)? } - Input::FaDeposit(fa_deposit) => { - Mode::handle_fa_deposit(host, fa_deposit, inbox_content)? + Input::FaDeposit((fa_deposit, chain_id)) => { + Mode::handle_fa_deposit(host, fa_deposit, chain_id, inbox_content)? } Input::ForceKernelUpgrade => force_kernel_upgrade(host)?, } diff --git a/etherlink/kernel_evm/kernel/src/parsing.rs b/etherlink/kernel_evm/kernel/src/parsing.rs index d7a7f33ee443..b32aa6852285 100644 --- a/etherlink/kernel_evm/kernel/src/parsing.rs +++ b/etherlink/kernel_evm/kernel/src/parsing.rs @@ -131,7 +131,7 @@ pub enum SequencerInput { pub enum Input { ModeSpecific(Mode), Deposit((Deposit, Option)), - FaDeposit(FaDeposit), + FaDeposit((FaDeposit, Option)), Upgrade(KernelUpgrade), SequencerUpgrade(SequencerUpgrade), RemoveSequencer, @@ -650,9 +650,9 @@ impl InputResult { // directly. We prefer to overapproximate rather than under approximate. Mode::on_fa_deposit(context); match FaDeposit::try_parse(ticket, routing_info, inbox_level, inbox_msg_id) { - Ok(fa_deposit) => { + Ok((fa_deposit, chain_id)) => { log!(host, Debug, "Parsed from input: {}", fa_deposit.display()); - InputResult::Input(Input::FaDeposit(fa_deposit)) + InputResult::Input(Input::FaDeposit((fa_deposit, chain_id))) } Err(err) => { log!( -- GitLab From dd1e5d287ca7323becf05226eb682b95c8aa515b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 22:13:45 +0100 Subject: [PATCH 4/7] Etherlink/Kernel/Tests: FA deposit parsing --- .../evm_execution/src/fa_bridge/deposit.rs | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs index ec4bf2f25980..156e6868a5ab 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs @@ -253,7 +253,7 @@ mod tests { } #[test] - fn fa_deposit_parsing_success() { + fn fa_deposit_parsing_success_no_chain_id() { let ticket = create_fa_ticket("KT18amZmM5W7qDWVt2pH6uj7sCEd3kbzLrHT", 1, &[0u8], 2.into()); let routing_info = MichelsonBytes([[1u8; 20], [0u8; 20]].concat().to_vec()); @@ -277,6 +277,36 @@ mod tests { pretty_assertions::assert_eq!(chain_id, None) } + #[test] + fn fa_deposit_parsing_success() { + let ticket = + create_fa_ticket("KT18amZmM5W7qDWVt2pH6uj7sCEd3kbzLrHT", 1, &[0u8], 2.into()); + let mut routing_info = vec![]; + routing_info.extend([1u8; 20]); + routing_info.extend([0u8; 20]); + routing_info.extend([1u8]); + routing_info.extend([0u8; 31]); + let routing_info = MichelsonBytes(routing_info); + let (deposit, chain_id) = + FaDeposit::try_parse(ticket, routing_info, 1, 0).expect("Failed to parse"); + + pretty_assertions::assert_eq!( + deposit, + FaDeposit { + amount: 2.into(), + proxy: Some(H160([0u8; 20])), + receiver: H160([1u8; 20]), + inbox_level: 1, + inbox_msg_id: 0, + ticket_hash: H256::from_str( + "e0027297584c9e4162c872e072f1cc75b527023f9c0eda44ad4c732762b0b897", + ) + .unwrap(), + } + ); + pretty_assertions::assert_eq!(chain_id, Some(U256::one())) + } + #[test] fn fa_deposit_parsing_error_amount_overflow() { let ticket = create_fa_ticket( -- GitLab From b14fe3c9bc829f58093274bb1515dfa606cbd0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 22:12:56 +0100 Subject: [PATCH 5/7] Etherlink/Kernel/Tests: move create_fa_ticket to test_utils So that it can be used for regular deposits too. --- .../evm_execution/src/fa_bridge/deposit.rs | 21 +------------------ .../evm_execution/src/fa_bridge/test_utils.rs | 20 +++++++++++++++++- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs index 156e6868a5ab..548d133a5056 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/deposit.rs @@ -227,31 +227,12 @@ pub fn ticket_hash(ticket: &FA2_1Ticket) -> Result { mod tests { use std::str::FromStr; + use crate::fa_bridge::test_utils::create_fa_ticket; use num_bigint::BigInt; use sha3::{Digest, Keccak256}; - use tezos_crypto_rs::hash::ContractKt1Hash; - use tezos_smart_rollup_encoding::{ - contract::Contract, - michelson::{MichelsonNat, MichelsonOption, MichelsonPair}, - }; use super::*; - fn create_fa_ticket( - ticketer: &str, - token_id: u64, - metadata: &[u8], - amount: BigInt, - ) -> FA2_1Ticket { - let creator = - Contract::Originated(ContractKt1Hash::from_base58_check(ticketer).unwrap()); - let contents = MichelsonPair( - MichelsonNat::new(BigInt::from(token_id).into()).unwrap(), - MichelsonOption(Some(MichelsonBytes(metadata.to_vec()))), - ); - FA2_1Ticket::new(creator, contents, amount).unwrap() - } - #[test] fn fa_deposit_parsing_success_no_chain_id() { let ticket = diff --git a/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs b/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs index a6674b864487..38d874928511 100644 --- a/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs +++ b/etherlink/kernel_evm/evm_execution/src/fa_bridge/test_utils.rs @@ -7,6 +7,7 @@ pub use alloy_sol_types::SolCall; use alloy_sol_types::{sol, SolConstructor}; use crypto::hash::ContractKt1Hash; use evm::Config; +use num_bigint::BigInt; use primitive_types::{H160, H256, U256}; use tezos_data_encoding::enc::BinWriter; use tezos_ethereum::{ @@ -17,7 +18,9 @@ use tezos_evm_runtime::runtime::MockKernelHost; use tezos_evm_runtime::runtime::Runtime; use tezos_smart_rollup_encoding::{ contract::Contract, - michelson::{ticket::FA2_1Ticket, MichelsonOption, MichelsonPair}, + michelson::{ + ticket::FA2_1Ticket, MichelsonBytes, MichelsonNat, MichelsonOption, MichelsonPair, + }, }; use tezos_storage::read_u256_le_default; @@ -420,3 +423,18 @@ pub fn fa_bridge_precompile_call_withdraw( handler.end_initial_transaction(execution_result).unwrap() } + +pub fn create_fa_ticket( + ticketer: &str, + token_id: u64, + metadata: &[u8], + amount: BigInt, +) -> FA2_1Ticket { + let creator = + Contract::Originated(ContractKt1Hash::from_base58_check(ticketer).unwrap()); + let contents = MichelsonPair( + MichelsonNat::new(BigInt::from(token_id).into()).unwrap(), + MichelsonOption(Some(MichelsonBytes(metadata.to_vec()))), + ); + FA2_1Ticket::new(creator, contents, amount).unwrap() +} -- GitLab From 2175b1bc51bf237a9e4cf9b59ad2ffec293d5dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 21:53:49 +0100 Subject: [PATCH 6/7] Etherlink/Kernel/Tests: deposit parsing --- etherlink/kernel_evm/kernel/src/bridge.rs | 44 +++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/etherlink/kernel_evm/kernel/src/bridge.rs b/etherlink/kernel_evm/kernel/src/bridge.rs index e5b8644c80aa..5d705cbd5820 100644 --- a/etherlink/kernel_evm/kernel/src/bridge.rs +++ b/etherlink/kernel_evm/kernel/src/bridge.rs @@ -246,9 +246,11 @@ pub fn execute_deposit( mod tests { use alloy_sol_types::SolEvent; use evm_execution::account_storage::init_account_storage; + use evm_execution::fa_bridge::test_utils::create_fa_ticket; use primitive_types::{H160, U256}; use rlp::Decodable; use tezos_evm_runtime::runtime::MockKernelHost; + use tezos_smart_rollup_encoding::michelson::MichelsonBytes; use crate::{bridge::DEPOSIT_EVENT_TOPIC, CONFIG}; @@ -279,6 +281,48 @@ mod tests { assert_eq!(events::Deposit::SIGNATURE_HASH.0, DEPOSIT_EVENT_TOPIC); } + #[test] + fn deposit_parsing_no_chain_id() { + let ticket = + create_fa_ticket("KT18amZmM5W7qDWVt2pH6uj7sCEd3kbzLrHT", 0, &[0u8], 2.into()); + let receiver = MichelsonBytes(vec![1u8; 20]); + let (deposit, chain_id) = + Deposit::try_parse(ticket, receiver, 0, 0).expect("Failed to parse"); + pretty_assertions::assert_eq!( + deposit, + Deposit { + amount: tezos_ethereum::wei::eth_from_mutez(2), + receiver: H160([1u8; 20]), + inbox_level: 0, + inbox_msg_id: 0, + } + ); + pretty_assertions::assert_eq!(chain_id, None) + } + + #[test] + fn deposit_parsing_chain_id() { + let ticket = + create_fa_ticket("KT18amZmM5W7qDWVt2pH6uj7sCEd3kbzLrHT", 0, &[0u8], 2.into()); + let mut receiver_and_chain_id = vec![]; + receiver_and_chain_id.extend(vec![1u8; 20]); + receiver_and_chain_id.extend(vec![1u8]); + receiver_and_chain_id.extend(vec![0u8; 31]); + let receiver_and_chain_id = MichelsonBytes(receiver_and_chain_id); + let (deposit, chain_id) = Deposit::try_parse(ticket, receiver_and_chain_id, 0, 0) + .expect("Failed to parse"); + pretty_assertions::assert_eq!( + deposit, + Deposit { + amount: tezos_ethereum::wei::eth_from_mutez(2), + receiver: H160([1u8; 20]), + inbox_level: 0, + inbox_msg_id: 0, + } + ); + pretty_assertions::assert_eq!(chain_id, Some(U256::one())) + } + #[test] fn deposit_decode_legacy() { let mut stream = rlp::RlpStream::new_list(2); -- GitLab From 8d0de1c389c71685c41af0051ac369146d8c9c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Wed, 8 Jan 2025 17:10:52 +0100 Subject: [PATCH 7/7] Etherlink/Kernel/Changes: mention !16153 --- etherlink/CHANGES_KERNEL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/etherlink/CHANGES_KERNEL.md b/etherlink/CHANGES_KERNEL.md index 3ea8896ee4b5..496362ad5edc 100644 --- a/etherlink/CHANGES_KERNEL.md +++ b/etherlink/CHANGES_KERNEL.md @@ -42,6 +42,7 @@ - The option to limit the block production to at most one block per Tezos level, which was added in version ec7c3b349624896b269e179384d0a45cf39e1145, has been removed. (!16302) +- Deposits can now specify a chain id, but it is currently ignored. (!16153) ### Bug fixes -- GitLab