// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Pezkuwi. // Pezkuwi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Pezkuwi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Pezkuwi. If not, see . //! XCM utils for internal use. use crate::MAX_INSTRUCTIONS_TO_DECODE; use alloc::vec::Vec; use codec::{decode_vec_with_len, Compact, Decode}; environmental::environmental!(instructions_count: u8); /// Decode a `vec` of XCM instructions. /// /// This function keeps track of nested XCM instructions and enforces a total limit of /// `MAX_INSTRUCTIONS_TO_DECODE`. pub fn decode_xcm_instructions( input: &mut I, ) -> Result, codec::Error> { instructions_count::using_once(&mut 0, || { let vec_len: u32 = >::decode(input)?.into(); instructions_count::with(|count| { *count = count.saturating_add(vec_len as u8); if *count > MAX_INSTRUCTIONS_TO_DECODE { return Err(codec::Error::from("Max instructions exceeded")); } Ok(()) }) .unwrap_or(Err(codec::Error::from("Error calling `instructions_count::with()`")))?; let decoded_instructions = decode_vec_with_len(input, vec_len as usize)?; Ok(decoded_instructions) }) }