Skip to main content

snarkvm_console_program/data/dynamic/future/
bytes.rs

1// Copyright (c) 2019-2026 Provable Inc.
2// This file is part of the snarkVM library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use super::*;
17
18impl<N: Network> FromBytes for DynamicFuture<N> {
19    /// Reads in a dynamic future from a buffer.
20    fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
21        // Read the version.
22        let version = u8::read_le(&mut reader)?;
23        // Validate the version.
24        if version != 1 {
25            return Err(error(format!("Invalid dynamic future version: {version}")));
26        }
27        // Read the program name.
28        let program_name = Field::read_le(&mut reader)?;
29        // Read the program network.
30        let program_network = Field::read_le(&mut reader)?;
31        // Read the function name.
32        let function_name = Field::read_le(&mut reader)?;
33        // Read the argument checksum.
34        let checksum = Field::read_le(&mut reader)?;
35        // Return the dynamic future.
36        Ok(Self::new_unchecked(program_name, program_network, function_name, checksum, None))
37    }
38}
39
40impl<N: Network> ToBytes for DynamicFuture<N> {
41    /// Writes a dynamic future to a buffer.
42    fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
43        // Write the version.
44        1u8.write_le(&mut writer)?;
45        // Write the program name.
46        self.program_name.write_le(&mut writer)?;
47        // Write the program network.
48        self.program_network.write_le(&mut writer)?;
49        // Write the function name.
50        self.function_name.write_le(&mut writer)?;
51        // Write the argument checksum.
52        self.checksum.write_le(&mut writer)?;
53
54        Ok(())
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use crate::{Argument, Future, Plaintext};
62    use snarkvm_console_network::MainnetV0;
63
64    use core::str::FromStr;
65
66    type CurrentNetwork = MainnetV0;
67
68    #[test]
69    fn test_bytes() {
70        // Create a static future.
71        let future = Future::<CurrentNetwork>::new(
72            crate::ProgramID::from_str("test.aleo").unwrap(),
73            crate::Identifier::from_str("foo").unwrap(),
74            vec![Argument::Plaintext(Plaintext::from_str("100u64").unwrap())],
75        );
76
77        // Convert to dynamic future.
78        let expected = DynamicFuture::from_future(&future).unwrap();
79
80        // Check the byte representation.
81        let expected_bytes = expected.to_bytes_le().unwrap();
82        let candidate = DynamicFuture::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
83
84        // Verify the fields match.
85        assert_eq!(expected.program_name(), candidate.program_name());
86        assert_eq!(expected.program_network(), candidate.program_network());
87        assert_eq!(expected.function_name(), candidate.function_name());
88        assert_eq!(expected.checksum(), candidate.checksum());
89    }
90
91    #[test]
92    fn test_bytes_no_arguments() {
93        // Create a static future with no arguments.
94        let future = Future::<CurrentNetwork>::new(
95            crate::ProgramID::from_str("credits.aleo").unwrap(),
96            crate::Identifier::from_str("transfer").unwrap(),
97            vec![],
98        );
99
100        // Convert to dynamic future.
101        let expected = DynamicFuture::from_future(&future).unwrap();
102
103        // Check the byte representation.
104        let expected_bytes = expected.to_bytes_le().unwrap();
105        let candidate = DynamicFuture::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
106
107        // Verify the fields match.
108        assert_eq!(expected.program_name(), candidate.program_name());
109        assert_eq!(expected.program_network(), candidate.program_network());
110        assert_eq!(expected.function_name(), candidate.function_name());
111        assert_eq!(expected.checksum(), candidate.checksum());
112    }
113
114    #[test]
115    fn test_bytes_multiple_arguments() {
116        // Create a static future with multiple arguments.
117        let future = Future::<CurrentNetwork>::new(
118            crate::ProgramID::from_str("test.aleo").unwrap(),
119            crate::Identifier::from_str("bar").unwrap(),
120            vec![
121                Argument::Plaintext(Plaintext::from_str("100u64").unwrap()),
122                Argument::Plaintext(Plaintext::from_str("200u64").unwrap()),
123                Argument::Plaintext(Plaintext::from_str("true").unwrap()),
124            ],
125        );
126
127        // Convert to dynamic future.
128        let expected = DynamicFuture::from_future(&future).unwrap();
129
130        // Check the byte representation.
131        let expected_bytes = expected.to_bytes_le().unwrap();
132        let candidate = DynamicFuture::<CurrentNetwork>::read_le(&expected_bytes[..]).unwrap();
133
134        // Verify the fields match.
135        assert_eq!(expected.program_name(), candidate.program_name());
136        assert_eq!(expected.program_network(), candidate.program_network());
137        assert_eq!(expected.function_name(), candidate.function_name());
138        assert_eq!(expected.checksum(), candidate.checksum());
139    }
140}