/ console / program / src / data / register / mod.rs
mod.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphavm library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  mod bytes;
 20  mod parse;
 21  mod serialize;
 22  
 23  use crate::Access;
 24  use alphavm_console_network::prelude::*;
 25  
 26  /// A register contains the location data to a value in memory.
 27  #[derive(Clone, PartialEq, Eq, Hash)]
 28  pub enum Register<N: Network> {
 29      /// A register contains its locator in memory.
 30      Locator(u64),
 31      /// A register access contains its locator and access(es) in memory.
 32      Access(u64, Vec<Access<N>>),
 33  }
 34  
 35  impl<N: Network> Register<N> {
 36      /// Returns the locator of the register.
 37      #[inline]
 38      pub const fn locator(&self) -> u64 {
 39          match self {
 40              Self::Locator(locator) => *locator,
 41              Self::Access(locator, _) => *locator,
 42          }
 43      }
 44  }
 45  
 46  impl<N: Network> Ord for Register<N> {
 47      /// Ordering is determined by the register locator (any accesses are ignored).
 48      fn cmp(&self, other: &Self) -> Ordering {
 49          self.locator().cmp(&other.locator())
 50      }
 51  }
 52  
 53  impl<N: Network> PartialOrd for Register<N> {
 54      /// Ordering is determined by the register locator (any accesses are ignored).
 55      fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
 56          Some(self.cmp(other))
 57      }
 58  }
 59  
 60  #[cfg(test)]
 61  mod tests {
 62      use super::*;
 63      use crate::{Identifier, U32};
 64      use alphavm_console_network::MainnetV0;
 65  
 66      type CurrentNetwork = MainnetV0;
 67  
 68      #[test]
 69      fn test_register_partial_ord() -> Result<()> {
 70          // Register::Locator
 71          assert_eq!(
 72              Some(Ordering::Equal),
 73              Register::<CurrentNetwork>::Locator(0).partial_cmp(&Register::<CurrentNetwork>::Locator(0))
 74          );
 75          assert_eq!(
 76              Some(Ordering::Less),
 77              Register::<CurrentNetwork>::Locator(0).partial_cmp(&Register::<CurrentNetwork>::Locator(1))
 78          );
 79          assert_eq!(
 80              Some(Ordering::Greater),
 81              Register::<CurrentNetwork>::Locator(1).partial_cmp(&Register::<CurrentNetwork>::Locator(0))
 82          );
 83  
 84          // Register::Access with Access::Member
 85          assert_eq!(
 86              Some(Ordering::Equal),
 87              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp(
 88                  &Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)])
 89              )
 90          );
 91          assert_eq!(
 92              Some(Ordering::Less),
 93              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp(
 94                  &Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)])
 95              )
 96          );
 97          assert_eq!(
 98              Some(Ordering::Greater),
 99              Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp(
100                  &Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)])
101              )
102          );
103  
104          // Register::Access with Access::Index
105          assert_eq!(
106              Some(Ordering::Equal),
107              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::<
108                  CurrentNetwork,
109              >::Access(
110                  0,
111                  vec![Access::Index(U32::new(0))]
112              ))
113          );
114          assert_eq!(
115              Some(Ordering::Less),
116              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::<
117                  CurrentNetwork,
118              >::Access(
119                  1,
120                  vec![Access::Index(U32::new(0))]
121              ))
122          );
123          assert_eq!(
124              Some(Ordering::Greater),
125              Register::<CurrentNetwork>::Access(1, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::<
126                  CurrentNetwork,
127              >::Access(
128                  0,
129                  vec![Access::Index(U32::new(0))]
130              ))
131          );
132  
133          // Register::Access with a combination of Access::Member and Access::Index
134          assert_eq!(
135              Some(Ordering::Equal),
136              Register::<CurrentNetwork>::Access(0, vec![
137                  Access::Member(Identifier::from_str("owner")?),
138                  Access::Index(U32::new(0))
139              ])
140              .partial_cmp(&Register::<CurrentNetwork>::Access(0, vec![
141                  Access::Member(Identifier::from_str("owner")?),
142                  Access::Index(U32::new(0))
143              ]))
144          );
145          assert_eq!(
146              Some(Ordering::Less),
147              Register::<CurrentNetwork>::Access(0, vec![
148                  Access::Member(Identifier::from_str("owner")?),
149                  Access::Index(U32::new(0))
150              ])
151              .partial_cmp(&Register::<CurrentNetwork>::Access(1, vec![
152                  Access::Member(Identifier::from_str("owner")?),
153                  Access::Index(U32::new(0))
154              ]))
155          );
156          assert_eq!(
157              Some(Ordering::Greater),
158              Register::<CurrentNetwork>::Access(1, vec![
159                  Access::Member(Identifier::from_str("owner")?),
160                  Access::Index(U32::new(0))
161              ])
162              .partial_cmp(&Register::<CurrentNetwork>::Access(0, vec![
163                  Access::Member(Identifier::from_str("owner")?),
164                  Access::Index(U32::new(0))
165              ]))
166          );
167  
168          Ok(())
169      }
170  
171      #[test]
172      fn test_register_eq() -> Result<()> {
173          // Register::Locator
174          assert_eq!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(0));
175          assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(1));
176          assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(2));
177          assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(3));
178          assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(4));
179  
180          // Register::Access with Access::Member
181          assert_eq!(
182              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]),
183              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)])
184          );
185          assert_ne!(
186              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]),
187              Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)])
188          );
189          assert_ne!(
190              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]),
191              Register::<CurrentNetwork>::Access(2, vec![Access::Member(Identifier::from_str("owner")?)])
192          );
193          assert_ne!(
194              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]),
195              Register::<CurrentNetwork>::Access(3, vec![Access::Member(Identifier::from_str("owner")?)])
196          );
197          assert_ne!(
198              Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]),
199              Register::<CurrentNetwork>::Access(4, vec![Access::Member(Identifier::from_str("owner")?)])
200          );
201  
202          // Register::Access with Access::Index
203          assert_eq!(
204              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]),
205              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))])
206          );
207          assert_ne!(
208              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]),
209              Register::<CurrentNetwork>::Access(1, vec![Access::Index(U32::new(0))])
210          );
211          assert_ne!(
212              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]),
213              Register::<CurrentNetwork>::Access(2, vec![Access::Index(U32::new(0))])
214          );
215          assert_ne!(
216              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]),
217              Register::<CurrentNetwork>::Access(3, vec![Access::Index(U32::new(0))])
218          );
219          assert_ne!(
220              Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]),
221              Register::<CurrentNetwork>::Access(4, vec![Access::Index(U32::new(0))])
222          );
223  
224          // Register::Access with a combination of Access::Member and Access::Index
225          assert_eq!(
226              Register::<CurrentNetwork>::Access(0, vec![
227                  Access::Member(Identifier::from_str("owner")?),
228                  Access::Index(U32::new(0))
229              ]),
230              Register::<CurrentNetwork>::Access(0, vec![
231                  Access::Member(Identifier::from_str("owner")?),
232                  Access::Index(U32::new(0))
233              ])
234          );
235          assert_ne!(
236              Register::<CurrentNetwork>::Access(0, vec![
237                  Access::Member(Identifier::from_str("owner")?),
238                  Access::Index(U32::new(0))
239              ]),
240              Register::<CurrentNetwork>::Access(1, vec![
241                  Access::Member(Identifier::from_str("owner")?),
242                  Access::Index(U32::new(0))
243              ])
244          );
245          assert_ne!(
246              Register::<CurrentNetwork>::Access(0, vec![
247                  Access::Member(Identifier::from_str("owner")?),
248                  Access::Index(U32::new(0))
249              ]),
250              Register::<CurrentNetwork>::Access(2, vec![
251                  Access::Member(Identifier::from_str("owner")?),
252                  Access::Index(U32::new(0))
253              ])
254          );
255          assert_ne!(
256              Register::<CurrentNetwork>::Access(0, vec![
257                  Access::Member(Identifier::from_str("owner")?),
258                  Access::Index(U32::new(0))
259              ]),
260              Register::<CurrentNetwork>::Access(3, vec![
261                  Access::Member(Identifier::from_str("owner")?),
262                  Access::Index(U32::new(0))
263              ])
264          );
265          assert_ne!(
266              Register::<CurrentNetwork>::Access(0, vec![
267                  Access::Member(Identifier::from_str("owner")?),
268                  Access::Index(U32::new(0))
269              ]),
270              Register::<CurrentNetwork>::Access(4, vec![
271                  Access::Member(Identifier::from_str("owner")?),
272                  Access::Index(U32::new(0))
273              ])
274          );
275  
276          Ok(())
277      }
278  }