From 4b6d67ae2cc2b5ee0ba1e4aece61b6a5218757fc Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 23 May 2025 20:56:17 +0200 Subject: [PATCH 01/40] add more state builders and adaptors --- api/src/builders.rs | 5 +- api/src/state/adaptors.rs | 113 +++++++++++++++++++++++++++++++++-- api/src/state/aggregators.rs | 65 +++++++++++++------- src/state.rs | 15 +++-- src/stl.rs | 2 +- stl/SONIC.vesper | 78 +++++++++++++++++------- stl/SONIC@0.12.0.sta | 63 ++++++++++--------- stl/SONIC@0.12.0.stl | Bin 5933 -> 6394 bytes stl/SONIC@0.12.0.sty | 23 ++++--- 9 files changed, 276 insertions(+), 88 deletions(-) diff --git a/api/src/builders.rs b/api/src/builders.rs index 4563670..2f56d88 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -211,9 +211,10 @@ impl Builder { api: &Api, sys: &TypeSystem, ) -> Self { + let name = name.into(); let data = api - .build_immutable(name, data, raw, sys) - .expect("invalid immutable state"); + .build_immutable(name.clone(), data, raw, sys) + .unwrap_or_else(|e| panic!("invalid immutable state '{name}'; {e}")); self.immutable_out .push(data) .expect("too many state elements"); diff --git a/api/src/state/adaptors.rs b/api/src/state/adaptors.rs index 68d39bd..05e72d6 100644 --- a/api/src/state/adaptors.rs +++ b/api/src/state/adaptors.rs @@ -23,14 +23,15 @@ use std::io; -use amplify::confinement::ConfinedBlob; +use amplify::confinement::{Confined, ConfinedBlob}; use amplify::num::u256; use sonic_callreq::StateName; use strict_encoding::{SerializeError, StreamReader}; +use strict_types::value::{EnumTag, StrictNum}; use strict_types::{decode, typify, SemId, StrictVal, TypeSystem}; use ultrasonic::StateValue; -use crate::{StateTy, LIB_NAME_SONIC}; +use crate::{fe256, StateTy, LIB_NAME_SONIC}; pub(super) const USED_FIEL_BYTES: usize = u256::BYTES as usize - 2; pub(super) const TOTAL_BYTES: usize = USED_FIEL_BYTES * 3; @@ -41,7 +42,13 @@ pub(super) const TOTAL_BYTES: usize = USED_FIEL_BYTES * 3; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum StateConvertor { #[strict_type(tag = 0x00)] + Unit, + + #[strict_type(tag = 0x10)] TypedEncoder(StateTy), + + #[strict_type(tag = 0x11)] + TypedFieldEncoder(StateTy), // In the future we can add more adaptors: // - doing more compact encoding (storing type in bits, not a full field element); // - using just a specific range of field element bits, not a full value - such that multiple APIs may read @@ -57,7 +64,10 @@ impl StateConvertor { sys: &TypeSystem, ) -> Result, StateConvertError> { match self { + Self::Unit if StateValue::None == value => Ok(Some(StrictVal::Unit)), + Self::Unit => Err(StateConvertError::UnitState), Self::TypedEncoder(ty) => typed_convert(*ty, sem_id, value, sys), + Self::TypedFieldEncoder(ty) => typed_field_convert(*ty, sem_id, value, sys), } } } @@ -68,7 +78,13 @@ impl StateConvertor { #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum StateBuilder { #[strict_type(tag = 0x00)] + Unit, + + #[strict_type(tag = 0x10)] TypedEncoder(StateTy), + + #[strict_type(tag = 0x11)] + TypedFieldEncoder(StateTy), // In the future we can add more adaptors: // - doing more compact encoding (storing type in bits, not a full field element); // - using a Turing complete grammar with some VM (AluVM? RISC-V? WASM?). @@ -78,9 +94,14 @@ impl StateBuilder { #[allow(clippy::result_large_err)] pub fn build(&self, sem_id: SemId, value: StrictVal, sys: &TypeSystem) -> Result { let typed = sys.typify(value, sem_id)?; - let ser = sys.strict_serialize_value::(&typed)?; Ok(match self { - Self::TypedEncoder(ty) => typed_build(*ty, ser), + Self::Unit if typed.as_val() == &StrictVal::Unit => StateValue::None, + Self::Unit => return Err(StateBuildError::InvalidUnit), + Self::TypedEncoder(ty) => { + let ser = sys.strict_serialize_value::(&typed)?; + typed_build(*ty, ser) + } + Self::TypedFieldEncoder(ty) => typed_field_build(*ty, typed.unbox())?, }) } } @@ -98,8 +119,14 @@ pub enum StateBuildError { #[display("state data is too large to be encoded")] TooLarge, + #[display("state data ({0:?}) have an unsupported type for the encoding")] + UnsupportedValue(StrictVal), + #[from] Serialize(SerializeError), + + #[display("the provided value doesn't match the required unit type")] + InvalidUnit, } #[derive(Clone, Eq, PartialEq, Debug, Display, Error, From)] @@ -114,7 +141,7 @@ pub enum StateConvertError { #[display("state value is not fully consumed")] NotEntirelyConsumed, - #[display("state has not data")] + #[display("state has no data")] UnitState, } @@ -158,6 +185,28 @@ fn typed_convert( Ok(Some(val)) } +fn typed_field_convert( + ty: StateTy, + sem_id: SemId, + value: StateValue, + sys: &TypeSystem, +) -> Result, StateConvertError> { + let from_ty = value.get(0).ok_or(StateConvertError::UnitState)?.to_u256(); + // State type does not match + if from_ty != ty { + return Ok(None); + } + + let mut items = vec![]; + for el in value.into_iter().skip(1) { + let mut cursor = StreamReader::cursor::(el.to_u256().to_le_bytes()); + let val = sys.strict_read_type(sem_id, &mut cursor)?.unbox(); + items.push(val); + } + + Ok(Some(StrictVal::List(items))) +} + fn typed_build(ty: StateTy, ser: ConfinedBlob<0, TOTAL_BYTES>) -> StateValue { let mut elems = Vec::with_capacity(4); elems.push(ty); @@ -169,3 +218,57 @@ fn typed_build(ty: StateTy, ser: ConfinedBlob<0, TOTAL_BYTES>) -> StateValue { StateValue::from_iter(elems) } + +fn typed_field_build(ty: StateTy, val: StrictVal) -> Result { + let mut elems = Vec::with_capacity(4); + elems.push(ty); + + Ok(match val { + StrictVal::Unit => StateValue::Single { first: fe256::from(ty) }, + StrictVal::Number(StrictNum::Uint(i)) => StateValue::Double { first: fe256::from(ty), second: fe256::from(i) }, + StrictVal::String(s) if s.len() < TOTAL_BYTES => { + typed_build(ty, Confined::from_iter_checked(s.as_bytes().iter().cloned())) + } + StrictVal::Bytes(b) if b.len() < TOTAL_BYTES => typed_build(ty, Confined::from_checked(b.0)), + StrictVal::Struct(fields) if fields.len() <= 3 => typed_field_build_items(ty, fields.into_values())?, + StrictVal::Enum(EnumTag::Ord(tag)) => StateValue::Double { first: fe256::from(ty), second: fe256::from(tag) }, + StrictVal::List(items) | StrictVal::Set(items) | StrictVal::Tuple(items) if items.len() <= 3 => { + typed_field_build_items(ty, items)? + } + _ => return Err(StateBuildError::UnsupportedValue(val)), + }) +} + +fn typed_field_build_items( + ty: StateTy, + vals: impl IntoIterator, +) -> Result { + let mut items = Vec::with_capacity(4); + items.push(ty); + for val in vals { + if let Some(val) = typed_field_build_item(val)? { + items.push(val); + } + } + Ok(StateValue::from_iter(items)) +} + +fn typed_field_build_item(val: StrictVal) -> Result, StateBuildError> { + Ok(match val { + StrictVal::Unit => None, + StrictVal::Tuple(items) if items.len() == 1 => typed_field_build_item(items[0].clone())?, + StrictVal::Number(StrictNum::Uint(i)) => Some(u256::from(i)), + StrictVal::String(s) if s.len() < USED_FIEL_BYTES => { + let mut buf = [0u8; u256::BYTES as usize]; + buf[..s.len()].copy_from_slice(s.as_bytes()); + Some(u256::from_le_bytes(buf)) + } + StrictVal::Bytes(b) if b.len() < USED_FIEL_BYTES => { + let mut buf = [0u8; u256::BYTES as usize]; + buf[..b.len()].copy_from_slice(&b.0); + Some(u256::from_le_bytes(buf)) + } + StrictVal::Enum(EnumTag::Ord(tag)) => Some(u256::from(tag)), + _ => return Err(StateBuildError::UnsupportedValue(val)), + }) +} diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 96c3150..e249053 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -21,7 +21,9 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. +use amplify::confinement::TinyBlob; use sonic_callreq::StateName; +use strict_encoding::StrictDumb; use strict_types::value::StrictNum; use strict_types::StrictVal; @@ -32,18 +34,31 @@ use crate::{StateAtom, LIB_NAME_SONIC}; #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Count(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum StateAggregator { - // #[strict_type(tag = 0)] - // Const(StrictVal), + #[strict_type(tag = 0)] + Unit, + #[strict_type(tag = 1)] + Const(TinyBlob), + + #[strict_type(tag = 2)] Count(StateName), /// Sum over verifiable field-element-based part of state. /// - /// If any of the verifiable state is absent or not in a form of unsigned integer, it is treated - /// as zero. - #[strict_type(tag = 2)] + /// If any of the verifiable state is absent or not in the form of unsigned integer, + /// it is treated as zero. + #[strict_type(tag = 3)] SumV(StateName), + #[strict_type(tag = 4)] + Sum(StateName, StateName), + + #[strict_type(tag = 5)] + Diff(StateName, StateName), + + #[strict_type(tag = 0x10)] + ToSome(StateName), + /* /// Count values which verifiable field-element part binary representation is prefixed with a /// given byte string. @@ -64,8 +79,9 @@ pub enum StateAggregator { } impl StateAggregator { - pub fn read<'s, I: IntoIterator>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { + pub fn read<'s, I: IntoIterator>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { match self { + StateAggregator::Unit => StrictVal::Unit, //EmbeddedReaders::Const(val) => val.clone(), StateAggregator::Count(name) => { let count = state(name).into_iter().count(); @@ -107,6 +123,10 @@ impl StateAggregator { } StrictVal::Map(map) } + StateAggregator::Const(_) => todo!(), + StateAggregator::Sum(_, _) => todo!(), + StateAggregator::Diff(_, _) => todo!(), + StateAggregator::ToSome(_) => todo!(), } } } @@ -131,22 +151,22 @@ mod test { assert_eq!( adaptor.read(|name| { assert_eq!(name.as_str(), "test1"); - state.iter() + state.clone().into_iter() }), svnum!(6u64) ); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), StrictVal::Map(none!())); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), StrictVal::Map(none!())); } #[test] @@ -161,19 +181,22 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svnum!(6u64)); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(6u64)); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svnum!(0u64)); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(0u64)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svlist!([(), (), (), (), (), ()])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([(), (), (), (), (), ()])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svset!([()])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([()])); let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), StrictVal::Map(vec![(StrictVal::Unit, svnum!(5u64)),])); + assert_eq!( + adaptor.read(|_| { state.clone().into_iter() }), + StrictVal::Map(vec![(StrictVal::Unit, svnum!(5u64)),]) + ); } #[test] @@ -188,20 +211,20 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svnum!(6u64)); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(6u64)); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor.read(|_| { state.iter() }), + adaptor.read(|_| { state.clone().into_iter() }), StrictVal::Map(vec![ (svnum!(5u64), svstr!("state 1")), (svnum!(1u64), svstr!("state 2")), diff --git a/src/state.rs b/src/state.rs index efeee28..1d081f9 100644 --- a/src/state.rs +++ b/src/state.rs @@ -247,12 +247,19 @@ impl ProcessedState { } pub(super) fn aggregate(&mut self, api: &Api) { - let empty = bmap![]; self.aggregated = bmap! {}; for (name, aggregator) in api.aggregators() { - let val = aggregator.read(|state_name| match self.immutable(state_name) { - None => empty.values(), - Some(src) => src.values(), + let val = aggregator.read(|state_name| { + match self + .immutable(state_name) + .map(|map| map.values().cloned().collect::>()) + .or_else(|| { + let verified = self.aggregated.get(state_name)?.clone(); + Some(vec![StateAtom { verified, unverified: None }]) + }) { + None => vec![], + Some(src) => src, + } }); self.aggregated.insert(name.clone(), val); } diff --git a/src/stl.rs b/src/stl.rs index 23c0fd4..a3bb621 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:UbCQQ8_w-HU0Pv~L-dwNVHSM-TBrsBQC-N_vdFIG-DYFnUjs#page-ventura-shelf"; +pub const LIB_ID_SONIC: &str = "stl:Lgb8Hs_Q-iB4SN_b-9h3E1~_-q8~i1Du-6~d62vm-2q76aKE#shock-jackson-pluto"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 5d26c87..2df3064 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -38,9 +38,13 @@ rec Articles bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union builder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -51,20 +55,35 @@ rec Articles bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union builder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 0 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -88,9 +107,13 @@ rec Articles bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union builder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -101,20 +124,35 @@ rec Articles bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 union builder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder - is typedEncoder, U256, wrapped, tag 0 + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 0 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 04cb3bc..e67c810 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:UbCQQ8_w-HU0Pv~L-dwNVHSM-TBrsBQC-N_vdFIG-DYFnUjs#page-ventura-shelf +Id: stl:Lgb8Hs_Q-iB4SN_b-9h3E1~_-q8~i1Du-6~d62vm-2q76aKE#shock-jackson-pluto Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 51ebeec2ece1cc4224690d1f571b20f2ee7ce457e9ad25311f0cf22560373fe6 +Check-SHA256: 79edc5d9f472b26fad8fab2569041fd58665a5775a5ba2e540bd4165dcc51777 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -53,22 +53,22 @@ dk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u2xD(D) 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 delta 499 zcmexmxK?k&aV~`}Uc<7MsXW$S`kUDmt2Q4veOmNw*6K<_UFM=yZ~QObpZuIFQDODp zQjPAOJ$k1%@?1W%;Gt09l)2(ne4-5LewJ&l?|7RzIfFYvAz)j?#!p4nCvO-lh0nH| zE97@1E$03-b6f59d)GEjo~^$51vfLJfGWK_5>`@i3b`}Jqmcl+1(e4WyK?`7oLHjN)AHy=uvs`PqU z=;rx+o0&YXzO9%j{9dy|vyRoxWR@}irj5@9@7^&>yu)!@*Pi`u6?;-?W==|K5#y#U zhDP}_RxUOEdG&97`Fqpo7ET4V$pM*CPZi8gm~iZzJX7b6EN zBWrSgX UltraSONIC.StateCell} From 6d8d6e51707c9fa23e4e1211d3fbd6865d6dab2a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 24 May 2025 18:18:58 +0200 Subject: [PATCH 02/40] api: restructure API versioning --- api/src/api.rs | 26 ++---- api/src/articles.rs | 60 +++++++++---- api/src/builders.rs | 5 +- api/src/issuer.rs | 10 ++- api/src/lib.rs | 4 +- examples/dao/main.rs | 7 +- persistence/fs/src/fs.rs | 6 +- src/ledger.rs | 4 +- src/state.rs | 8 +- src/stl.rs | 2 +- stl/SONIC.vesper | 15 ++-- stl/SONIC@0.12.0.sta | 183 +++++++++++++++++++-------------------- stl/SONIC@0.12.0.stl | Bin 6394 -> 6072 bytes stl/SONIC@0.12.0.sty | 31 +++---- tests/dao.rs | 7 +- tests/reorgs.rs | 7 +- 16 files changed, 188 insertions(+), 187 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index d8ab339..4951c8d 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -21,7 +21,7 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -//! API defines how a contract can be interfaced by software. +//! API defines how software can interface a contract. //! //! SONIC provides four types of actions for working with contract (ROVT): //! 1. _Read_ the state of the contract; @@ -37,13 +37,13 @@ use core::cmp::Ordering; use core::fmt::Debug; use core::hash::{Hash, Hasher}; -use amplify::confinement::{TinyOrdMap, TinyString}; +use amplify::confinement::{TinyOrdMap, TinyOrdSet, TinyString}; use amplify::num::u256; use amplify::Bytes32; -use commit_verify::{CommitId, ReservedBytes}; +use commit_verify::CommitId; use sonic_callreq::{CallState, MethodName, StateName}; -use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, TypeName, TypeSystem}; -use ultrasonic::{CallId, CodexId, Identity, StateData, StateValue}; +use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, TypeSystem}; +use ultrasonic::{CallId, CodexId, StateData, StateValue}; use crate::{ RawBuilder, RawConvertor, StateAggregator, StateArithm, StateAtom, StateBuildError, StateBuilder, StateCalc, @@ -65,19 +65,12 @@ use crate::{ #[commit_encode(strategy = strict, id = ApiId)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", bound = ""))] pub struct Api { - /// Version of the API structure. - #[getter(as_copy)] - pub version: ReservedBytes<1>, - /// Commitment to the codex under which the API is valid. #[getter(as_copy)] pub codex_id: CodexId, - /// Developer identity string. - pub developer: Identity, - - /// Interface standard to which the API conforms. - pub conforms: Option, + /// Interface standards to which the API conforms. + pub conforms: TinyOrdSet, /// Name for the default API call and destructible state name. pub default_call: Option, @@ -106,10 +99,6 @@ pub struct Api { /// Maps error type reported by a contract verifier via `EA` value to an error description taken /// from the interfaces. pub errors: TinyOrdMap, - - /// Reserved for future use. - #[getter(skip)] - pub reserved: ReservedBytes<8>, } impl PartialEq for Api { @@ -229,6 +218,7 @@ impl Api { } } +/// TODO: Change to the issuer id #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] #[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] diff --git a/api/src/articles.rs b/api/src/articles.rs index de6629b..ae02f69 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -48,23 +48,40 @@ pub struct ArticlesCommitment { pub custom_api_ids: SmallOrdMap, } -/// A helper structure to store all API-related data. +/// A helper structure to store the contract semantics. /// /// A contract may have multiple APIs defined. All of them a summarized in this structure. +/// The structure also holds a set of AluVM libraries for the codex and type system used by the +/// API. #[derive(Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub struct ApiDescriptor { +pub struct Semantics { + /// Backward-compatible version number for the issuer. + /// + /// This version number is used to decide which contract APIs to apply if multiple + /// contract APIs are available. + pub version: u16, + /// The default API. pub default: Api, + /// The custom named APIs. + /// + /// The mechanism of the custom APIs allows a contract to have multiple implementations + /// of the same interface. + /// + /// For instance, a contract may provide multiple tokens using different token names. pub custom: SmallOrdMap, + /// A set of zk-AluVM libraries called from the contract codex. pub libs: SmallOrdSet, + /// The type system used by the contract APIs. pub types: TypeSystem, /// Signature from the contract issuer (`issue.meta.issuer`) over the articles' id. pub sig: Option, } -impl ApiDescriptor { +impl Semantics { + /// Iterates over all APIs, including default and named ones. pub fn all(&self) -> impl Iterator { [&self.default].into_iter().chain(self.custom.values()) } } @@ -72,7 +89,7 @@ impl ApiDescriptor { /// /// # Invariance /// -/// The structure provides the following invariance garantees: +/// The structure provides the following invariance guarantees: /// - all the API codex matches the codex under which the contract was issued; /// - all the API ids are unique; /// - the only type of API adapter VM which can be used is [`crate::embedded::EmbeddedProc`] (see @@ -81,21 +98,21 @@ impl ApiDescriptor { #[derive(StrictType, StrictDumb, StrictEncode)] #[strict_type(lib = LIB_NAME_SONIC)] pub struct Articles { - apis: ApiDescriptor, + semantics: Semantics, issue: Issue, } impl Articles { fn articles_id(&self) -> ArticlesId { let custom_api_ids = SmallOrdMap::from_iter_checked( - self.apis + self.semantics .custom .iter() .map(|(name, api)| (name.clone(), api.api_id())), ); ArticlesCommitment { contract_id: self.contract_id(), - default_api_id: self.apis.default.api_id(), + default_api_id: self.semantics.default.api_id(), custom_api_ids, } .commit_id() @@ -105,16 +122,16 @@ impl Articles { pub fn codex_id(&self) -> CodexId { self.issue.codex_id() } pub fn genesis_opid(&self) -> Opid { self.issue.genesis_opid() } - pub fn apis(&self) -> &ApiDescriptor { &self.apis } - pub fn default_api(&self) -> &Api { &self.apis.default } - pub fn custom_apis(&self) -> impl Iterator { self.apis.custom.iter() } - pub fn types(&self) -> &TypeSystem { &self.apis.types } + pub fn apis(&self) -> &Semantics { &self.semantics } + pub fn default_api(&self) -> &Api { &self.semantics.default } + pub fn custom_apis(&self) -> impl Iterator { self.semantics.custom.iter() } + pub fn types(&self) -> &TypeSystem { &self.semantics.types } pub fn issue(&self) -> &Issue { &self.issue } pub fn codex(&self) -> &Codex { &self.issue.codex } pub fn genesis(&self) -> &Genesis { &self.issue.genesis } - pub fn with(apis: ApiDescriptor, issue: Issue) -> Result { + pub fn with(apis: Semantics, issue: Issue) -> Result { let mut ids = bset![]; for api in apis.all() { if api.codex_id != issue.codex_id() { @@ -126,7 +143,7 @@ impl Articles { } } - Ok(Self { apis, issue }) + Ok(Self { semantics: apis, issue }) } pub fn merge(&mut self, other: Self, sig_validator: impl SigValidator) -> Result { @@ -135,7 +152,7 @@ impl Articles { } let ts1 = self - .apis + .semantics .sig .as_ref() .and_then(|sig| { @@ -144,13 +161,15 @@ impl Articles { .ok() }) .unwrap_or_default(); - let Some(sig) = &other.apis.sig else { return Ok(false) }; + let Some(sig) = &other.semantics.sig else { + return Ok(false); + }; let ts2 = sig_validator .validate_sig(other.articles_id().to_byte_array(), &other.issue.meta.issuer, sig) .map_err(|_| ArticlesError::InvalidSignature)?; if ts2 > ts1 { - self.apis = other.apis; + self.semantics = other.semantics; } Ok(true) @@ -164,7 +183,7 @@ impl Articles { pub fn call_id(&self, method: impl Into) -> CallId { let method = method.into(); let name = method.to_string(); - self.apis + self.semantics .default .verifier(method) .unwrap_or_else(|| panic!("requesting a method `{name}` absent in the contract API")) @@ -172,7 +191,12 @@ impl Articles { } impl LibRepo for Articles { - fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { self.apis.libs.iter().find(|lib| lib.lib_id() == lib_id) } + fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { + self.semantics + .libs + .iter() + .find(|lib| lib.lib_id() == lib_id) + } } #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] diff --git a/api/src/builders.rs b/api/src/builders.rs index 2f56d88..38d9897 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -34,7 +34,7 @@ use ultrasonic::{ Input, Issue, Operation, StateCell, StateData, StateValue, }; -use crate::{Api, ApiDescriptor, Articles, DataCell, Issuer, MethodName, StateAtom, StateName}; +use crate::{Api, Articles, DataCell, Issuer, MethodName, Semantics, StateAtom, StateName}; #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -182,7 +182,8 @@ impl IssueBuilder { }; let genesis = self.builder.issue_genesis(self.issuer.codex.codex_id()); let issue = Issue { version: default!(), meta, codex: self.issuer.codex, genesis }; - let apis = ApiDescriptor { + let apis = Semantics { + version: self.issuer.version, default: self.issuer.api, custom: none!(), libs: self.issuer.libs, diff --git a/api/src/issuer.rs b/api/src/issuer.rs index a5c39be..ae344a6 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -43,10 +43,15 @@ pub const ISSUER_VERSION: [u8; 2] = [0x00, 0x01]; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub struct Issuer { pub codex: Codex, + /// Backward-compatible version number for the issuer. + /// + /// This version number is used to decide which contract APIs to apply if multiple + /// contract APIs are available. + pub version: u16, pub api: Api, pub libs: SmallOrdSet, pub types: TypeSystem, - /// Signature of the `codex.developer` over the API Id. + /// Signature of a developer (`codex.developer`) over the [`IssuerId`]. pub sig: Option, } @@ -55,8 +60,9 @@ impl LibRepo for Issuer { } impl Issuer { - pub fn new(codex: Codex, api: Api, libs: impl IntoIterator, types: TypeSystem) -> Self { + pub fn new(version: u16, codex: Codex, api: Api, libs: impl IntoIterator, types: TypeSystem) -> Self { Issuer { + version, codex, api, libs: SmallOrdSet::from_iter_checked(libs), diff --git a/api/src/lib.rs b/api/src/lib.rs index d01a5e2..e18656b 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -61,8 +61,8 @@ mod state; pub use api::{Api, ApiId, DestructibleApi, ImmutableApi, StateUnknown}; pub use articles::{ - ApiDescriptor, Articles, ArticlesCommitment, ArticlesError, ArticlesId, SigBlob, SigValidator, - ARTICLES_MAGIC_NUMBER, ARTICLES_VERSION, + Articles, ArticlesCommitment, ArticlesError, ArticlesId, Semantics, SigBlob, SigValidator, ARTICLES_MAGIC_NUMBER, + ARTICLES_VERSION, }; pub use builders::{Builder, BuilderRef, CoreParams, IssueParams, NamedState, OpBuilder, OpBuilderRef}; pub use issuer::{Issuer, ISSUER_MAGIC_NUMBER, ISSUER_VERSION}; diff --git a/examples/dao/main.rs b/examples/dao/main.rs index 66cee9f..e21da92 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -68,10 +68,8 @@ fn api() -> Api { let codex = codex(); Api { - version: default!(), codex_id: codex.codex_id(), - developer: Identity::default(), - conforms: None, + conforms: none!(), default_call: None, immutable: tiny_bmap! { vname!("_parties") => ImmutableApi { @@ -121,7 +119,6 @@ fn api() -> Api { vname!("castVote") => 2, }, errors: Default::default(), - reserved: Default::default(), } } @@ -132,7 +129,7 @@ fn main() { let api = api(); // Creating DAO with three participants - let issuer = Issuer::new(codex, api, [libs::success()], types.type_system()); + let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); let filename = "examples/dao/data/SimpleDAO.issuer"; fs::remove_file(filename).ok(); issuer diff --git a/persistence/fs/src/fs.rs b/persistence/fs/src/fs.rs index 76497cd..77ad77d 100644 --- a/persistence/fs/src/fs.rs +++ b/persistence/fs/src/fs.rs @@ -32,8 +32,8 @@ use aora::file::{FileAoraIndex, FileAoraMap, FileAuraMap}; use aora::{AoraIndex, AoraMap, AuraMap, TransactionalMap}; use binfile::BinFile; use hypersonic::{ - AcceptError, ApiDescriptor, Articles, ArticlesError, AuthToken, CellAddr, EffectiveState, Genesis, Issue, - IssueError, Ledger, Operation, Opid, RawState, SigValidator, Stock, Transition, + AcceptError, Articles, ArticlesError, AuthToken, CellAddr, EffectiveState, Genesis, Issue, IssueError, Ledger, + Operation, Opid, RawState, Semantics, SigValidator, Stock, Transition, }; use strict_encoding::{ DecodeError, StreamReader, StreamWriter, StrictDecode, StrictEncode, StrictReader, StrictWriter, @@ -163,7 +163,7 @@ impl Stock for StockFs { let file = BinFile::::open(path.join(Self::FILENAME_APIS))?; let reader = StreamReader::new::<{ usize::MAX }>(file); - let apis = ApiDescriptor::strict_read(reader)?; + let apis = Semantics::strict_read(reader)?; let file = BinFile::::open(path.join(Self::FILENAME_STATE_RAW))?; let reader = StreamReader::new::<{ usize::MAX }>(file); diff --git a/src/ledger.rs b/src/ledger.rs index 6c2693d..f275088 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -29,7 +29,7 @@ use amplify::hex::ToHex; use amplify::MultiError; use indexmap::IndexSet; use sonic_callreq::MethodName; -use sonicapi::{Api, ApiDescriptor, ArticlesError, NamedState, OpBuilder, SigValidator}; +use sonicapi::{Api, ArticlesError, NamedState, OpBuilder, Semantics, SigValidator}; use strict_encoding::{ DecodeError, ReadRaw, SerializeError, StrictDecode, StrictEncode, StrictReader, StrictWriter, WriteRaw, }; @@ -410,7 +410,7 @@ impl Ledger { } let contract_id = ContractId::strict_decode(reader)?; - let apis = ApiDescriptor::strict_decode(reader)?; + let apis = Semantics::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; let articles = Articles::with(apis, issue)?; if articles.contract_id() != contract_id { diff --git a/src/state.rs b/src/state.rs index 1d081f9..8651330 100644 --- a/src/state.rs +++ b/src/state.rs @@ -25,7 +25,7 @@ use alloc::collections::BTreeMap; use std::mem; use amplify::confinement::{LargeOrdMap, SmallOrdMap}; -use sonicapi::{Api, ApiDescriptor, Articles, StateAtom, StateName}; +use sonicapi::{Api, Articles, Semantics, StateAtom, StateName}; use strict_encoding::{StrictDeserialize, StrictSerialize, TypeName}; use strict_types::{StrictVal, TypeSystem}; use ultrasonic::{AuthToken, CallError, CellAddr, Memory, Opid, StateCell, StateData, StateValue, VerifiedOperation}; @@ -95,7 +95,7 @@ impl EffectiveState { } /// Re-evaluates computable part of the state - pub fn recompute(&mut self, apis: &ApiDescriptor) { + pub fn recompute(&mut self, apis: &Semantics) { self.main.aggregate(&apis.default); self.aux = bmap! {}; for (name, api) in &apis.custom { @@ -106,7 +106,7 @@ impl EffectiveState { } #[must_use] - pub(crate) fn apply(&mut self, op: VerifiedOperation, apis: &ApiDescriptor) -> Transition { + pub(crate) fn apply(&mut self, op: VerifiedOperation, apis: &Semantics) -> Transition { self.main.apply(&op, &apis.default, &apis.types); for (name, api) in &apis.custom { let state = self.aux.entry(name.clone()).or_default(); @@ -115,7 +115,7 @@ impl EffectiveState { self.raw.apply(op) } - pub(crate) fn rollback(&mut self, transition: Transition, apis: &ApiDescriptor) { + pub(crate) fn rollback(&mut self, transition: Transition, apis: &Semantics) { self.main.rollback(&transition, &apis.default, &apis.types); let mut count = 0usize; for (name, api) in &apis.custom { diff --git a/src/stl.rs b/src/stl.rs index a3bb621..18f26c9 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:Lgb8Hs_Q-iB4SN_b-9h3E1~_-q8~i1Du-6~d62vm-2q76aKE#shock-jackson-pluto"; +pub const LIB_ID_SONIC: &str = "stl:tyzJaGG6-0t0y7pw-RrvB~a9-adiS8We-x49ufrL-iZINc_s#hazard-profile-michael"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 2df3064..4d42676 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -23,12 +23,12 @@ rec ArticlesCommitment bytes value, len 32, aka ApiId rec Articles - rec apis, ApiDescriptor + rec semantics, Semantics + is version, U16 rec default, Api - bytes version, len 1, aka ReservedBytes1 bytes codexId, len 32, aka CodexId - ascii developer, aka Identity, first AsciiPrintable, rest AsciiPrintable, len 1..4096 - ascii some, option, wrapped, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100, tag 1 + set conforms, len 0..MAX8 + is element, U16 rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 @@ -90,14 +90,12 @@ rec Articles map errors, len 0..MAX8 is key, U256 str value, len 0..MAX8 - bytes reserved, len 8, aka ReservedBytes8 map custom, len 0..MAX16 ascii key, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100 rec value, Api - bytes version, len 1, aka ReservedBytes1 bytes codexId, len 32, aka CodexId - ascii developer, aka Identity, first AsciiPrintable, rest AsciiPrintable, len 1..4096 - ascii some, option, wrapped, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100, tag 1 + set conforms, len 0..MAX8 + is element, U16 rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 @@ -159,7 +157,6 @@ rec Articles map errors, len 0..MAX8 is key, U256 str value, len 0..MAX8 - bytes reserved, len 8, aka ReservedBytes8 set libs, len 0..MAX16 rec Lib set isae, len 0..MAX8 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index e67c810..bc3b21a 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:Lgb8Hs_Q-iB4SN_b-9h3E1~_-q8~i1Du-6~d62vm-2q76aKE#shock-jackson-pluto +Id: stl:tyzJaGG6-0t0y7pw-RrvB~a9-adiS8We-x49ufrL-iZINc_s#hazard-profile-michael Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 79edc5d9f472b26fad8fab2569041fd58665a5775a5ba2e540bd4165dcc51777 +Check-SHA256: 3a3418e63d8b0c6b6f603fba71bb77d9f8a0cc545546b27a0c93e12877e2f105 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -17,99 +17,94 @@ bY!<#DYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g$Q}Y;{&mz -0|-HmqX$fBVpC~!Weh`aZEb0ER%LQ&W_beullNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o4pL=v -WpZ|9WI}m#WpgphxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%MQe|^xa&~28LV0v$b29#d7D?ZD -zCQez5c=X9w<(f6`q$DH-G17V_XV{1(H;&`Wpib6c4cHjd30rSI15H;ZfSI7MrmbiWB~v%@u@)Mrf2N# -*9;Bok=Lw{#;}1pYA|B&5l=sLg;{n5MrATJHUm?1WCj38z9SbZ=!8X@=Yuq$20sb<4l#S`iz7Vef}@Ca -=a#q*L33kiX;5-$ZggQ{Y-M4FBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_DuvrZ*OdRM~0;jPqm@t -3InIR0Ny%Ft`YGAh^_-OV-~qNrBQ4QL2PhnVMAeXb53<_mBYQsO#)!~acU7f_DL;WP9vC(GXyXN$~M|< -ZtiEa4nb^iXkkuuZA@=uVRLA?gMQ~gu96el>ojDN{iR+YxT1qeJQTRI%yh?{hxxA$L2PhnVMAeXb4+h! -VRLBFJq*Jt8?Abrta^#~Iw-!oZ%zqO(A&rh^vGm~tg_w^L2PhnVN-2kY-~(#WMOk?3sZD*X=8L$d2nTO -4*&^LN2X=Q9=Q)O*QWK$LhgcQkwbf~^M){{|8P%hsRk~m~ep32F151Y4WWC&DwaAi(mZDnMP -)DN(0hN+Kdp}ZAoN($wDX8VgT7DmW3qm%zcviBmGB|7z0dgBIJ4&sCG^VR$+2!VQzGR -(<~&{!{{>E!(#o&^pB98KZhv1GEPn8Orhb4n;8ZMQ)zl>ZfBCy0{K32d-H~a`3x8b375ImR&CF_#3#*g -z1^xtuG$bzVQpn(MrmbiWOGwxZAoO8A%m*X98W>f2s0TH8C&EH;|vtDTYgh)4~t7}WW`YoMQ(L%R$+2! -VQzGDn938Qb#DiI%LhXtBc@pg0t!L7$2{bU&sPXOO(dS=5LRJwX<=@3Np5CuQ)O*QWc?UbbJ9Xwr}~3w -v^yxa@v}v^+kiGSR2X#8M$tG2GZIy9X>V>;VRC6_vj93RHP;Wm9=`bY*P{Rcv%}VN*{|Nkb3-20V5ur0u+o0?}LIOoa(bEuT%$d<#qu_#(K#)`wcVHr!+M; -CFW=`nIc;Wkg|gVV6$1HFC=y{}}R_Q*J0R1B>UK2GYvJ63|a_$rvECDhxw!Zgg^CV{}br -bYYnU{T?dQJ?d;o1M7&`K~vb;q0WUv*UkDBz!||TdTRtvaA{h5j^*S;NLvL<$a$#e1No1*c{_J;U_rqi{QnVN{nRqfLcrXOCpfhv|^|vQ>r$q`=bYXO5R$**)WwVJm -&y+EOWgjT<3G&iWor^UN2TqE@U#9z`!g(#dX9+=dbZAs>Yh`Y=tm{9}qo!Lcbf&x`)m=B!6PPbxdmBJ+ysRCuhj -fe;8oWo&FgWMp#vS;NBVT;TAYsL|^P+?^W;{W$E31sqn+dpk{-*m~XvQek&QVRT^;00TjAX$A`ic4cyN -X>V=D) -VQg#w1OfmAZf|a7000011aog~WdH>M0X%2<`V5Xnw4=-d1_`8fg(m2+l}g^fB0Ix1nd=gGR0(NqZFO{E -Vr*pq3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+L -X<}?;015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^X -ImOPdju4LlF^ImpZLyYlR?!^OTXL3zQ6L+J!aL;kpMB417UqnH0000000000{{R30000003t?wxa%E>> -bZ>HV015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^X -ImOPdju4LlVPD>PWZ#Lo8IC-6`F;9ynVxG|msa?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# -&aRFSj{pDy0000000000{{R300000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000 -{{R30000002y$g}WpZ|9WCFl_aF}ei((p}N63i?Ao#qV|80t8`jX>$Sm -C%2Cz6~ZdqtPwc+ZS@Y$eou^}11mp0i8|)+@a2C6X>)URWda)gZz;O*CD3`V{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR+2rNlD$O59e#ogQsB77jPl+h5j^*S;PWMyVyb!>D&aA`?o0aYcT@|=XRf8Y4DYa&&29Y-Mvv -WCZ~L2LJ#-AOHzNVQg$ubYXO51_B0cWprq7WCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+M +0|-HmqX$fBVpC~!Weh`aZEb0ER%LQ&W_bbtllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o4pL=v +WpZ|9WI}m#WpgphxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%MQe|^xa&~28LV0v$b21A?X>MtB +WkzXbY-9ldG4ZKDyg*2kjAiqI%+Ut?-5Twb%j}W1x95uH8ulNbYunqNWLQ%D(Hkon&*Qw +pawq)`VKLB>Wd>h=Ype%b?2724ncEcX=zY$X>N33Vr*q$h9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQ +llDynLT_(udPjz(4^OqB|1Bk8zGh-IHIi*o-3_)ygXkkNPaC1&|ZI#2l$xQ-a`EhCy +JoZT~T}~sIjxz)>1`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LvR$+2!VQzFzVQpm_ +v{(W1V6JV*{3!yZ{M3XW@z+pX9JtzktHWiJ@1L)babH +ELfN$u@7k>`Uy~SX>DnAX?A5X{h;vIo29B#Zbv)THgnzJqzni;K&ISmvLd)pN>Rl&wr9&I-v?L-&~MrmbiWK(5rNn}$N2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ri +cn_PmXk-Xfd2nS;VQpn(jMNXXYlf+hXQ9AJ%?72#_KJ5v@E-96x!ZDnLeX=Q9=b5mt) +Nn~pTqZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^aqWo=1heaS*6)M5bHCYFUH@63IY`6K;Dlo$g{ +Z6f4)7N~Yk2UcNnX<=@3fzvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd(*pTEa(nZJ +gZT^?2ML$C)mClKyTm8WaJ}8CMy}crPGN0jWJYOaY-Dp&Wo=1hmm!0y(Hu`f(Fijc5*b_M4dVs +Y!8b|ZDhq!3`K5rZB}7&X<=@3bC}8#qjhfwd&>tyAtR<)2LcK~xyL-@iqBUFK20Q^G*lRL(MHiY2Qv~?ZfS3BR$+2!VQzGDQ)O*QWc`7zgMJGK +o2X9f$RGGR>zM`dnhb7^xb +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 +Ry;9kVTK~nd#>4R=asjF)4UI&T84K~YqFcD& +s+ri$U}E3inB`}Z8#25!inIz+VRu4xX>4R=as&YY40CjHX=8LnZewp`WdH>M0_mQT=Q}``f02HLt~iCi +D@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy@cSCP(c4cyOZ*l|y +01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ +t0eX2w~A!Q+0eaZ{MVycPK^muWo=<@bZKLA1_lRqWpZ7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0 +6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W0Zfvf85&<4>eV};M1&000000RR600000000ne;aAk7>>7J73J3yCzk$#1)IEB9}O*pr- +e%zuW2Pj0_vj919NF-00aU61a5C`WdHyG0R(ez +ZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAtoX=g%gZ(;=j00;m8Kmh;%00000000mG +0000001s1iVRU6dXJ>L{XJK@2as&zh1a)p{bN~PV0R>}kZgX@11pxpE002M$00000000300000000002 +1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7? +iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{@nQlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW +2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj}QiQZ&Pn=WdH>M0_mQT=Q}``f02HL +t~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk01qXX>)W|00jX8 +>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+c; +WkPjnY-D9}1OosBb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X +4pVetbY(+tZgypIbZ>G50{{edZfSG?000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?- +asUMZ001BgRB~Z%b7^#GZ*B$x1aEL@WC9xfZz;O*CD3`lC**6;}%ie4wrTWpLzfxZ1 +G^f?j#teS@rN?q$uLxQs2Fvw;u-8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ +^jHyE~h(GNh|Vi7!=pSZ~h3G56V{=H&PTj)(TK+&0`i zpRbeEfioDUfsKv5EVZaOGd~Y#1A9tpT4HHV38T-Xd6H7`GOuo)X4AKReC1W!+>Ap3 gQ&+Jm_S-!ycrdeZGB>Zc0zpM(ye~Ivh+JX;0JxD+!2kdN delta 390 zcmdm?|I2X0Ek;J>$+sEf_5U@AdET$sXZL4@z^_Nr+chWI{~7tyN#9ww{Jbc~ z7nE9@T2z*r;#66ZT5Pe|ifJMn7dLxZYEf}!ejd}r6$+E@Fe*$w!{N!rnUY$Tnv-9U zS~S^!M{%+OhayLEeqLIBQEu_%4ML)mSMe%NKF_1T!<~|vmROoo;+&Y11C$Wk9LlNB z#KlnrwFqQp0wHJdIu>NQq!uR^Wfqj=7qPLjL(OEovDV_N-#tk`p{W@gIg3)(MjzR` z$zayL?{~kbWO|FwR%1&pEiTE=oy4UKbc><_A?1_*3chq>1zP5r!pg|N&cNWHz`)^H zRFavTlUmHi#FAK$S ^ ..0xff ImmutableApi} , destructible {StrictTypes.VariantName -> ^ ..0xff DestructibleApi} , aggregators {StrictTypes.VariantName -> ^ ..0xff StateAggregator} , verifiers {StrictTypes.VariantName -> ^ ..0xff U16} , errors {U256 -> ^ ..0xff [Unicode ^ ..0xff]} - , reserved CommitVerify.ReservedBytes8 - -@mnemonic(felix-dinner-forbid) -data ApiDescriptor : default Api - , custom {StrictTypes.TypeName -> Api} - , libs {AluVM.Lib} - , types StrictTypes.TypeSystem - , sig SigBlob? @mnemonic(sharp-section-left) data ApiId : [Byte ^ 32] -@mnemonic(visible-kinetic-stella) -data Articles : apis ApiDescriptor, issue UltraSONIC.Issue +@mnemonic(stella-empire-rubber) +data Articles : semantics Semantics, issue UltraSONIC.Issue @mnemonic(distant-east-ritual) data ArticlesCommitment : contractId UltraSONIC.ContractId @@ -131,6 +120,14 @@ data RawBuilder : strictEncode StrictTypes.SemId | (|) @mnemonic(tripod-guitar-bishop) data RawConvertor : strictDecode StrictTypes.SemId | (|) +@mnemonic(ballet-serpent-brown) +data Semantics : version U16 + , default Api + , custom {StrictTypes.TypeName -> Api} + , libs {AluVM.Lib} + , types StrictTypes.TypeSystem + , sig SigBlob? + @mnemonic(insect-cello-avalon) data SigBlob : [Byte ^ 1..0x1000] diff --git a/tests/dao.rs b/tests/dao.rs index 82da588..68cd346 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -66,10 +66,8 @@ fn api() -> Api { let codex = codex(); Api { - version: default!(), codex_id: codex.codex_id(), - developer: Identity::default(), - conforms: None, + conforms: none!(), default_call: None, immutable: tiny_bmap! { vname!("_parties") => ImmutableApi { @@ -119,7 +117,6 @@ fn api() -> Api { vname!("castVote") => 2, }, errors: Default::default(), - reserved: Default::default(), } } @@ -129,7 +126,7 @@ fn main() { let api = api(); // Creating DAO with three participants - let issuer = Issuer::new(codex, api, [libs::success()], types.type_system()); + let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); let filename = "examples/dao/data/SimpleDAO.issuer"; fs::remove_file(filename).ok(); issuer diff --git a/tests/reorgs.rs b/tests/reorgs.rs index f2a1559..ebeac7d 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -141,10 +141,8 @@ fn api() -> Api { let codex = codex(); Api { - version: default!(), codex_id: codex.codex_id(), - developer: Identity::default(), - conforms: None, + conforms: none!(), default_call: None, immutable: none!(), destructible: tiny_bmap! { @@ -163,7 +161,6 @@ fn api() -> Api { vname!("transfer") => 1, }, errors: Default::default(), - reserved: Default::default(), } } @@ -172,7 +169,7 @@ fn setup(name: &str) -> LedgerDir { let codex = codex(); let api = api(); - let issuer = Issuer::new(codex, api, [libs::success()], types.type_system()); + let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); let seed = &[0xCA; 30][..]; let mut auth = Sha256::digest(seed); From fb38d71a9baf9b76061d072911ef80b4de6f5c62 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 13:11:31 +0200 Subject: [PATCH 03/40] api: overhaul articles/issuer invariance and sigs --- Cargo.lock | 1 + api/src/api.rs | 317 ++++++++++++++++++++++++------ api/src/articles.rs | 256 ++++++++++-------------- api/src/builders.rs | 25 +-- api/src/issuer.rs | 182 +++++++++++------- api/src/lib.rs | 12 +- callreq/src/data.rs | 2 +- cli/src/cmd.rs | 14 +- cli/src/dump.rs | 2 +- examples/dao/main.rs | 13 +- persistence/fs/Cargo.toml | 1 + persistence/fs/src/fs.rs | 55 +++--- src/bin/sonic-stl.rs | 8 +- src/ledger.rs | 41 ++-- src/state.rs | 13 +- src/stl.rs | 7 +- src/stock.rs | 6 +- stl/SONIC.vesper | 396 +++++++++++++++++++++++++++++++++++++- stl/SONIC@0.12.0.sta | 105 +++++----- stl/SONIC@0.12.0.stl | Bin 6072 -> 6251 bytes stl/SONIC@0.12.0.sty | 38 ++-- tests/dao.rs | 13 +- tests/reorgs.rs | 11 +- 23 files changed, 1059 insertions(+), 459 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 57477c2..cc15c5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -875,6 +875,7 @@ dependencies = [ "amplify", "aora", "binfile", + "commit_verify", "hypersonic", "serde_yaml", "strict_encoding", diff --git a/api/src/api.rs b/api/src/api.rs index 4951c8d..e3777fd 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -34,14 +34,20 @@ //! performed directly, so these two are not covered by an API. use core::cmp::Ordering; -use core::fmt::Debug; +use core::fmt; +use core::fmt::{Debug, Display, Formatter}; use core::hash::{Hash, Hasher}; +use core::str::FromStr; +use std::num::ParseIntError; -use amplify::confinement::{TinyOrdMap, TinyOrdSet, TinyString}; +use aluvm::Lib; +use amplify::confinement::{SmallOrdMap, SmallOrdSet, TinyOrdMap, TinyOrdSet, TinyString}; use amplify::num::u256; -use amplify::Bytes32; -use commit_verify::CommitId; +use amplify::Bytes4; +use baid64::{Baid64ParseError, DisplayBaid64}; +use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, StrictHash}; use sonic_callreq::{CallState, MethodName, StateName}; +use strict_encoding::TypeName; use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, TypeSystem}; use ultrasonic::{CallId, CodexId, StateData, StateValue}; @@ -50,6 +56,235 @@ use crate::{ StateConvertError, StateConvertor, LIB_NAME_SONIC, }; +/// Create a versioned variant of a commitment ID (contract or codex), so information about a +/// specific API version is added. +/// +/// Both contracts and codexes may have multiple API implementations, which may be versioned. +/// Issuers and articles include a specific version of the codex and contract APIs. +/// This structure provides the necessary information for the user about a specific API version +/// known and used by a system, so a user may avoid confusion when an API change due to upgrade +/// happens. +/// +/// # See also +/// +/// - [`ContractId`] +/// - [`CodexId`] +/// - [`crate::ArticlesId`] +/// - [`crate::IssuerId`] +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC)] +#[derive(CommitEncode)] +#[commit_encode(strategy = strict, id = StrictHash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub struct Versioned { + pub id: Id, + pub version: u16, + pub checksum: ApisChecksum, +} + +impl Display for Versioned +where Id: CommitmentId + StrictDumb + StrictEncode + StrictDecode + Display + DisplayBaid64 +{ + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + if Id::MNEMONIC { + write!(f, "{:#}/{}#", self.id, self.version)?; + } else { + write!(f, "{}/{}#", self.id, self.version)?; + } + self.checksum.fmt_baid64(f) + } +} + +impl FromStr for Versioned +where Id: CommitmentId + StrictDumb + StrictEncode + StrictDecode + FromStr +{ + type Err = ParseVersionedError; + fn from_str(s: &str) -> Result { + let (id, remnant) = s + .split_once('/') + .ok_or_else(|| ParseVersionedError::NoVersion(s.to_string()))?; + let (version, api_id) = remnant + .split_once('#') + .ok_or_else(|| ParseVersionedError::NoChecksum(s.to_string()))?; + Ok(Self { + id: id.parse().map_err(ParseVersionedError::Id)?, + version: version.parse().map_err(ParseVersionedError::Version)?, + checksum: api_id.parse().map_err(ParseVersionedError::Checksum)?, + }) + } +} + +/// Errors happening during parsing of a versioned contract or codex ID. +#[derive(Debug, Display, Error, From)] +#[display(doc_comments)] +pub enum ParseVersionedError { + /// the versioned id '{0}' misses the version component, which should be provided after a `/` + /// sign. + NoVersion(String), + /// the versioned id '{0}' misses the API checksum component, which should be provided after a + /// `#` sign. + NoChecksum(String), + /// invalid versioned identifier; {0} + Id(Baid64ParseError), + #[from] + /// invalid versioned number; {0} + Version(ParseIntError), + /// invalid API checksum value; {0} + Checksum(Baid64ParseError), +} + +/// API checksum computed from a set of contract APIs present in [`Semantics`]. +/// +/// # Nota bene +/// +/// This is not a unique identifier! It is created just for UI, so users can easily vissually +/// distinguish different sets of APIs from each other. +/// +/// This type is not - and must not be used in any verification. +#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] +#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC)] +pub struct ApisChecksum( + #[from] + #[from([u8; 4])] + Bytes4, +); + +mod _baid4 { + use core::fmt::{self, Display, Formatter}; + use core::str::FromStr; + + use amplify::ByteArray; + use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; + use commit_verify::{CommitmentId, DigestExt, Sha256}; + + use super::*; + + impl DisplayBaid64<4> for ApisChecksum { + const HRI: &'static str = "api"; + const CHUNKING: bool = false; + const PREFIX: bool = false; + const EMBED_CHECKSUM: bool = false; + const MNEMONIC: bool = false; + fn to_baid64_payload(&self) -> [u8; 4] { self.to_byte_array() } + } + impl FromBaid64Str<4> for ApisChecksum {} + impl FromStr for ApisChecksum { + type Err = Baid64ParseError; + fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } + } + impl Display for ApisChecksum { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } + } + + impl From for ApisChecksum { + fn from(hasher: Sha256) -> Self { + let hash = hasher.finish(); + Self::from_slice_checked(&hash[..4]) + } + } + + impl CommitmentId for ApisChecksum { + const TAG: &'static str = "urn:ubideco:sonic:apis#2025-05-25"; + } + + #[cfg(feature = "serde")] + ultrasonic::impl_serde_str_bin_wrapper!(ApisChecksum, Bytes4); +} + +/// A helper structure to store the contract semantics, made of a set of APIs, corresponding type +/// system, and libs, used by the codex. +/// +/// A contract may have multiple APIs defined; this structure summarizes information about them. +/// The structure also holds a set of AluVM libraries for the codex and type system used by the +/// APIs. +#[derive(Clone, Eq, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub struct Semantics { + /// Backward-compatible version number for the issuer. + /// + /// This version number is used to decide which contract APIs to apply if multiple + /// contract APIs are available. + pub version: u16, + /// The default API. + pub default: Api, + /// The custom named APIs. + /// + /// The mechanism of the custom APIs allows a contract to have multiple implementations + /// of the same interface. + /// + /// For instance, a contract may provide multiple tokens using different token names. + pub custom: SmallOrdMap, + /// A set of zk-AluVM libraries called from the contract codex. + pub libs: SmallOrdSet, + /// The type system used by the contract APIs. + pub types: TypeSystem, +} + +impl PartialEq for Semantics { + fn eq(&self, other: &Self) -> bool { + self.default.codex_id == other.default.codex_id + && self.version == other.version + && self.commit_id() == other.commit_id() + } +} +impl PartialOrd for Semantics { + fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } +} +impl Ord for Semantics { + fn cmp(&self, other: &Self) -> Ordering { + match self.default.codex_id.cmp(&other.default.codex_id) { + Ordering::Equal => match self.version.cmp(&other.version) { + Ordering::Equal => self.commit_id().cmp(&other.commit_id()), + other => other, + }, + other => other, + } + } +} + +impl CommitEncode for Semantics { + type CommitmentId = ApisChecksum; + fn commit_encode(&self, e: &mut CommitEngine) { + e.commit_to_serialized(&self.version); + let apis = SmallOrdMap::from_iter_checked( + self.custom + .iter() + .map(|(name, api)| (name.clone(), api.api_id())), + ); + e.commit_to_linear_map(&apis); + // We do not commit to the libs since thea are not a part of APIs and are commit to inside the + // codes. The fact that there are no other libs is verified in the Articles and Issuer constructors. + e.commit_to_serialized(&self.types.id()); + } +} + +impl Semantics { + pub fn apis_checksum(&self) -> ApisChecksum { self.commit_id() } + + /// Iterates over all APIs, including default and named ones. + pub fn apis(&self) -> impl Iterator { [&self.default].into_iter().chain(self.custom.values()) } + + pub fn check(&self, codex_id: CodexId) -> Result<(), SemanticError> { + let mut ids = bset![]; + for api in self.apis() { + if api.codex_id != codex_id { + return Err(SemanticError::CodexMismatch); + } + let api_id = api.api_id(); + if !ids.insert(api_id) { + return Err(SemanticError::DuplicatedApi(api_id)); + } + } + + Ok(()) + } +} + /// API is an interface implementation. /// /// API should work without requiring runtime to have corresponding interfaces; it should provide @@ -58,11 +293,11 @@ use crate::{ /// /// API does not commit to an interface, since it can match multiple interfaces in the interface /// hierarchy. -#[derive(Clone, Getters, Debug)] +#[derive(Getters, Clone, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC)] #[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = ApiId)] +#[commit_encode(strategy = strict, id = StrictHash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", bound = ""))] pub struct Api { /// Commitment to the codex under which the API is valid. @@ -116,7 +351,7 @@ impl Hash for Api { } impl Api { - pub fn api_id(&self) -> ApiId { self.commit_id() } + pub fn api_id(&self) -> StrictHash { self.commit_id() } pub fn verifier(&self, method: impl Into) -> Option { self.verifiers.get(&method.into()).copied() @@ -218,56 +453,6 @@ impl Api { } } -/// TODO: Change to the issuer id -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] -pub struct ApiId( - #[from] - #[from([u8; 32])] - Bytes32, -); - -mod _baid4 { - use core::fmt::{self, Display, Formatter}; - use core::str::FromStr; - - use amplify::ByteArray; - use baid64::{Baid64ParseError, DisplayBaid64, FromBaid64Str}; - use commit_verify::{CommitmentId, DigestExt, Sha256}; - - use super::*; - - impl DisplayBaid64 for ApiId { - const HRI: &'static str = "api"; - const CHUNKING: bool = true; - const PREFIX: bool = false; - const EMBED_CHECKSUM: bool = false; - const MNEMONIC: bool = true; - fn to_baid64_payload(&self) -> [u8; 32] { self.to_byte_array() } - } - impl FromBaid64Str for ApiId {} - impl FromStr for ApiId { - type Err = Baid64ParseError; - fn from_str(s: &str) -> Result { Self::from_baid64_str(s) } - } - impl Display for ApiId { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { self.fmt_baid64(f) } - } - - impl From for ApiId { - fn from(hasher: Sha256) -> Self { hasher.finish().into() } - } - - impl CommitmentId for ApiId { - const TAG: &'static str = "urn:ubideco:sonic:api#2024-11-20"; - } - - #[cfg(feature = "serde")] - ultrasonic::impl_serde_str_bin_wrapper!(ApiId, Bytes32); -} - /// API for immutable (append-only) state. /// /// API covers two main functions: taking structured data from the user input and _building_ a valid @@ -340,3 +525,21 @@ pub struct DestructibleApi { #[derive(Clone, Eq, PartialEq, Debug, Display, Error, From)] #[display("unknown state name '{0}'")] pub struct StateUnknown(pub StateName); + +/// Errors happening if it is attempted to construct an invalid semantic object [`Semantics`] or +/// upgrade it inside a contract issuer or articles. +#[derive(Clone, Eq, PartialEq, Debug, Display, Error)] +#[display(doc_comments)] +pub enum SemanticError { + /// contract id for the merged contract articles doesn't match. + ContractMismatch, + + /// codex id for the merged articles doesn't match. + CodexMismatch, + + /// articles contain duplicated API {0} under a different name. + DuplicatedApi(StrictHash), + + /// invalid signature over the contract articles. + InvalidSignature, +} diff --git a/api/src/articles.rs b/api/src/articles.rs index ae02f69..3900f56 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -21,69 +21,23 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use core::error::Error; +#![allow(unused_braces)] use aluvm::{Lib, LibId}; -use amplify::confinement::{NonEmptyBlob, SmallOrdMap, SmallOrdSet}; -use amplify::Bytes32; -use commit_verify::{CommitId, CommitmentId, DigestExt, Sha256}; +use amplify::confinement::NonEmptyBlob; +use amplify::Wrapper; +use commit_verify::{CommitId, StrictHash}; use sonic_callreq::MethodName; use strict_encoding::TypeName; use strict_types::TypeSystem; -use ultrasonic::{CallId, Codex, CodexId, ContractId, Genesis, Identity, Issue, LibRepo, Opid}; +use ultrasonic::{ + CallId, Codex, CodexId, ContractId, ContractMeta, ContractName, Genesis, Identity, Issue, LibRepo, Opid, +}; -use crate::{Api, ApiId, LIB_NAME_SONIC}; +use crate::{Api, SemanticError, Semantics, Versioned, LIB_NAME_SONIC}; -pub const ARTICLES_MAGIC_NUMBER: [u8; 8] = *b"ARTICLES"; -pub const ARTICLES_VERSION: [u8; 2] = [0x00, 0x01]; - -#[derive(Clone, Eq, PartialEq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = ArticlesId)] -pub struct ArticlesCommitment { - pub contract_id: ContractId, - pub default_api_id: ApiId, - pub custom_api_ids: SmallOrdMap, -} - -/// A helper structure to store the contract semantics. -/// -/// A contract may have multiple APIs defined. All of them a summarized in this structure. -/// The structure also holds a set of AluVM libraries for the codex and type system used by the -/// API. -#[derive(Clone, Eq, PartialEq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub struct Semantics { - /// Backward-compatible version number for the issuer. - /// - /// This version number is used to decide which contract APIs to apply if multiple - /// contract APIs are available. - pub version: u16, - /// The default API. - pub default: Api, - /// The custom named APIs. - /// - /// The mechanism of the custom APIs allows a contract to have multiple implementations - /// of the same interface. - /// - /// For instance, a contract may provide multiple tokens using different token names. - pub custom: SmallOrdMap, - /// A set of zk-AluVM libraries called from the contract codex. - pub libs: SmallOrdSet, - /// The type system used by the contract APIs. - pub types: TypeSystem, - /// Signature from the contract issuer (`issue.meta.issuer`) over the articles' id. - pub sig: Option, -} - -impl Semantics { - /// Iterates over all APIs, including default and named ones. - pub fn all(&self) -> impl Iterator { [&self.default].into_iter().chain(self.custom.values()) } -} +/// Articles id is a versioned variant for the contract id. +pub type ArticlesId = Versioned; /// Articles contain the contract and all related codex and API information for interacting with it. /// @@ -92,87 +46,118 @@ impl Semantics { /// The structure provides the following invariance guarantees: /// - all the API codex matches the codex under which the contract was issued; /// - all the API ids are unique; -/// - the only type of API adapter VM which can be used is [`crate::embedded::EmbeddedProc`] (see -/// [`crate::Api`] for more details). +/// - all custom APIs have unique names. #[derive(Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode)] +// We must not derive or implement StrictDecode for Issuer, since we cannot validate signature +// inside it #[strict_type(lib = LIB_NAME_SONIC)] pub struct Articles { + /// We can't use [`Issuer`] here since we will duplicate the codex between it and the [`Issue`]. + /// Thus, a dedicated substructure [`Semantics`] is introduced, which keeps a shared part of + /// both [`Issuer`] and [`Articles`]. semantics: Semantics, + /// The contract issue. issue: Issue, + /// Signature from the contract issuer (`issue.meta.issuer`) over the articles' id. + sig: Option, } impl Articles { - fn articles_id(&self) -> ArticlesId { - let custom_api_ids = SmallOrdMap::from_iter_checked( - self.semantics - .custom - .iter() - .map(|(name, api)| (name.clone(), api.api_id())), - ); - ArticlesCommitment { - contract_id: self.contract_id(), - default_api_id: self.semantics.default.api_id(), - custom_api_ids, - } - .commit_id() + /// Construct articles from a contract semantic and the contract issue under that semantics. + pub fn new(semantics: Semantics, issue: Issue) -> Result { + semantics.check(issue.codex_id())?; + Ok(Self { semantics, issue, sig: None }) + } + + /// Construct articles from a signed contract semantic and the contract issue under that + /// semantics. + pub fn with( + semantics: Semantics, + issue: Issue, + sig: SigBlob, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result { + let mut me = Self::new(semantics, issue)?; + let id = me.articles_id().commit_id(); + sig_validator(id, &me.issue.meta.issuer, &sig).map_err(|_| SemanticError::InvalidSignature)?; + me.sig = Some(sig); + Ok(me) } + /// Compute an article id, which includes information about the contract id, API version and + /// checksum. + pub fn articles_id(&self) -> ArticlesId { + ArticlesId { + id: self.issue.contract_id(), + version: self.semantics.version, + checksum: self.semantics.apis_checksum(), + } + } + /// Compute a contract id. pub fn contract_id(&self) -> ContractId { self.issue.contract_id() } + /// Compute a codex id. pub fn codex_id(&self) -> CodexId { self.issue.codex_id() } + /// Compute a genesis opid. pub fn genesis_opid(&self) -> Opid { self.issue.genesis_opid() } - pub fn apis(&self) -> &Semantics { &self.semantics } + /// Get a reference to the contract semantic. + pub fn semantics(&self) -> &Semantics { &self.semantics } + /// Get a reference to the default API. pub fn default_api(&self) -> &Api { &self.semantics.default } + /// Get an iterator over the custom APIs. pub fn custom_apis(&self) -> impl Iterator { self.semantics.custom.iter() } + /// Get a reference to the type system. pub fn types(&self) -> &TypeSystem { &self.semantics.types } + /// Iterates over all APIs, including the default and the named ones. + pub fn apis(&self) -> impl Iterator { self.semantics.apis() } + /// Iterates over all codex libraries. + pub fn libs(&self) -> impl Iterator { self.semantics.libs.iter() } + /// Get a reference to the contract issue information. pub fn issue(&self) -> &Issue { &self.issue } + /// Get a reference to the contract codex. pub fn codex(&self) -> &Codex { &self.issue.codex } + /// Get a reference to the contract genesis. pub fn genesis(&self) -> &Genesis { &self.issue.genesis } + /// Get a reference to the contract meta-information. + pub fn contract_meta(&self) -> &ContractMeta { &self.issue.meta } + /// Get a reference to the contract name. + pub fn contract_name(&self) -> &ContractName { &self.issue.meta.name } - pub fn with(apis: Semantics, issue: Issue) -> Result { - let mut ids = bset![]; - for api in apis.all() { - if api.codex_id != issue.codex_id() { - return Err(ArticlesError::CodexMismatch); - } - let api_id = api.api_id(); - if !ids.insert(api_id) { - return Err(ArticlesError::DuplicatedApi(api_id)); - } - } - - Ok(Self { semantics: apis, issue }) - } + /// Get a reference to a signature over the contract semantics. + pub fn sig(&self) -> &Option { &self.sig } - pub fn merge(&mut self, other: Self, sig_validator: impl SigValidator) -> Result { + /// Upgrades contract APIs if a newer version is available. + /// + /// # Returns + /// + /// Whether the upgrade has happened, i.e. `other` represents a valid later version of the APIs. + pub fn upgrade_apis( + &mut self, + other: Self, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result { if self.contract_id() != other.contract_id() { - return Err(ArticlesError::ContractMismatch); + return Err(SemanticError::ContractMismatch); } - let ts1 = self - .semantics - .sig - .as_ref() - .and_then(|sig| { - sig_validator - .validate_sig(self.articles_id().to_byte_array(), &self.issue.meta.issuer, sig) - .ok() - }) - .unwrap_or_default(); - let Some(sig) = &other.semantics.sig else { - return Ok(false); - }; - let ts2 = sig_validator - .validate_sig(other.articles_id().to_byte_array(), &other.issue.meta.issuer, sig) - .map_err(|_| ArticlesError::InvalidSignature)?; - - if ts2 > ts1 { - self.semantics = other.semantics; + if let Some(sig) = &other.sig { + let id2 = other.articles_id().commit_id(); + sig_validator(id2, &self.issue.meta.issuer, sig).map_err(|_| SemanticError::InvalidSignature)?; } - Ok(true) + Ok(match (&self.sig, &other.sig) { + (None, None) | (Some(_), Some(_)) if other.semantics.version > self.semantics.version => { + self.semantics = other.semantics; + true + } + (None, Some(_)) => { + self.semantics = other.semantics; + true + } + _ => false, // No upgrade + }) } /// Get a [`CallId`] for a method from the default API. @@ -199,58 +184,13 @@ impl LibRepo for Articles { } } -#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] -#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] -pub struct ArticlesId( - #[from] - #[from([u8; 32])] - Bytes32, -); - -impl From for ArticlesId { - fn from(hasher: Sha256) -> Self { hasher.finish().into() } -} - -impl CommitmentId for ArticlesId { - const TAG: &'static str = "urn:ubideco:sonic:articles#2025-05-18"; -} - -pub trait SigValidator { - /// Validate the signature using the provided identity information. - /// - /// # Returns - /// - /// If successful, returns the timestamp of ths signature. - fn validate_sig(&self, message: impl Into<[u8; 32]>, identity: &Identity, sig: &SigBlob) - -> Result; -} - +/// A signature blob. +/// +/// Helps to abstract from a specific signing algorithm. #[derive(Wrapper, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, From, Display)] #[wrapper(Deref, AsSlice, BorrowSlice, Hex)] #[display(LowerHex)] -#[derive(StrictType, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC, dumb = { Self(NonEmptyBlob::with(0)) })] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(transparent))] pub struct SigBlob(NonEmptyBlob<4096>); - -impl Default for SigBlob { - fn default() -> Self { SigBlob(NonEmptyBlob::with(0)) } -} - -#[derive(Clone, Eq, PartialEq, Debug, Display, Error)] -#[display(doc_comments)] -pub enum ArticlesError { - /// contract id for the merged contract articles doesn't match. - ContractMismatch, - - /// codex id for the merged articles doesn't match. - CodexMismatch, - - /// articles contain duplicated API {0} under a different name. - DuplicatedApi(ApiId), - - /// invalid signature over the contract articles. - InvalidSignature, -} diff --git a/api/src/builders.rs b/api/src/builders.rs index 38d9897..9fc5454 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -34,7 +34,7 @@ use ultrasonic::{ Input, Issue, Operation, StateCell, StateData, StateValue, }; -use crate::{Api, Articles, DataCell, Issuer, MethodName, Semantics, StateAtom, StateName}; +use crate::{Api, Articles, DataCell, Issuer, MethodName, StateAtom, StateName}; #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -155,7 +155,7 @@ impl IssueBuilder { pub fn append(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { self.builder = self .builder - .add_immutable(name, data, raw, &self.issuer.api, &self.issuer.types); + .add_immutable(name, data, raw, self.issuer.default_api(), self.issuer.types()); self } @@ -166,9 +166,9 @@ impl IssueBuilder { data: StrictVal, lock: Option, ) -> Self { - self.builder = self - .builder - .add_destructible(name, auth, data, lock, &self.issuer.api, &self.issuer.types); + self.builder = + self.builder + .add_destructible(name, auth, data, lock, self.issuer.default_api(), self.issuer.types()); self } @@ -180,17 +180,10 @@ impl IssueBuilder { name: ContractName::Named(name.into()), issuer: Identity::default(), }; - let genesis = self.builder.issue_genesis(self.issuer.codex.codex_id()); - let issue = Issue { version: default!(), meta, codex: self.issuer.codex, genesis }; - let apis = Semantics { - version: self.issuer.version, - default: self.issuer.api, - custom: none!(), - libs: self.issuer.libs, - types: self.issuer.types, - sig: None, - }; - Articles::with(apis, issue).expect("broken issue builder") + let genesis = self.builder.issue_genesis(self.issuer.codex_id()); + let (codex, semantics) = self.issuer.dismember(); + let issue = Issue { version: default!(), meta, codex, genesis }; + Articles::new(semantics, issue).expect("broken issue builder") } } diff --git a/api/src/issuer.rs b/api/src/issuer.rs index ae344a6..48ab2c1 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -21,55 +21,97 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use std::io; - use aluvm::{Lib, LibId}; -use amplify::confinement::SmallOrdSet; -use amplify::hex::ToHex; +use commit_verify::{CommitId, StrictHash}; use sonic_callreq::MethodName; -use strict_encoding::{DecodeError, ReadRaw, StrictDecode, StrictEncode, StrictReader, StrictWriter, WriteRaw}; +use strict_encoding::TypeName; use strict_types::TypeSystem; -use ultrasonic::{CallId, Codex, LibRepo}; +use ultrasonic::{CallId, Codex, CodexId, Identity, LibRepo}; -use crate::{Api, SigBlob, LIB_NAME_SONIC}; +use crate::{Api, SemanticError, Semantics, SigBlob, Versioned, LIB_NAME_SONIC}; -pub const ISSUER_MAGIC_NUMBER: [u8; 8] = *b"COISSUER"; +/// The magic number used in storing issuer as a binary file. +pub const ISSUER_MAGIC_NUMBER: [u8; 8] = *b"ISSUER "; +/// The issuer encoding version used in storing issuer as a binary file. pub const ISSUER_VERSION: [u8; 2] = [0x00, 0x01]; -/// An issuer contains information required for the creation of a contract. +/// Articles id is a versioned variant for the contract id. +pub type IssuerId = Versioned; + +/// An issuer contains information required for the creation of a contract and interaction with an +/// existing contract. +/// +/// # Invariance +/// +/// The structure provides the following invariance guarantees: +/// - all the API codex matches the codex under which the contract was issued; +/// - all the API ids are unique; +/// - all custom APIs have unique names. #[derive(Clone, Eq, PartialEq, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[derive(StrictType, StrictDumb, StrictEncode)] +// We must not derive or implement StrictDecode for Issuer, since we cannot validate signature +// inside it #[strict_type(lib = LIB_NAME_SONIC)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub struct Issuer { - pub codex: Codex, - /// Backward-compatible version number for the issuer. - /// - /// This version number is used to decide which contract APIs to apply if multiple - /// contract APIs are available. - pub version: u16, - pub api: Api, - pub libs: SmallOrdSet, - pub types: TypeSystem, - /// Signature of a developer (`codex.developer`) over the [`IssuerId`]. - pub sig: Option, -} - -impl LibRepo for Issuer { - fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { self.libs.iter().find(|lib| lib.lib_id() == lib_id) } + /// Codex data. + codex: Codex, + /// A dedicated substructure [`Semantics`] keeping shared parts of both [`Issuer`] and + /// [`Articles`]. + semantics: Semantics, + /// Signature of a developer (`codex.developer`) over the [`IssuerId`] for a standalone issuer; + /// and from a contract issuer (`issue.meta.issuer`) for an issuer instance within a contract. + sig: Option, } impl Issuer { - pub fn new(version: u16, codex: Codex, api: Api, libs: impl IntoIterator, types: TypeSystem) -> Self { - Issuer { - version, - codex, - api, - libs: SmallOrdSet::from_iter_checked(libs), - types, - sig: none!(), + /// Construct issuer from a codex and its semantics. + pub fn new(codex: Codex, semantics: Semantics) -> Result { + semantics.check(codex.codex_id())?; + Ok(Self { semantics, codex, sig: None }) + } + + /// Construct issuer from a codex and signed semantics. + pub fn with( + codex: Codex, + semantics: Semantics, + sig: SigBlob, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result { + let mut me = Self::new(codex, semantics)?; + let id = me.issuer_id().commit_id(); + sig_validator(id, &me.codex.developer, &sig).map_err(|_| SemanticError::InvalidSignature)?; + me.sig = Some(sig); + Ok(me) + } + + pub fn dismember(self) -> (Codex, Semantics) { (self.codex, self.semantics) } + + /// Compute an issuer id, which includes information about the codex id, API version and + /// checksum. + pub fn issuer_id(&self) -> IssuerId { + IssuerId { + id: self.codex.codex_id(), + version: self.semantics.version, + checksum: self.semantics.apis_checksum(), } } + /// Compute a codex id. + pub fn codex_id(&self) -> CodexId { self.codex.codex_id() } + /// Get a reference to the underlying codex. + pub fn codex(&self) -> &Codex { &self.codex } + + /// Get a reference to the contract semantic. + pub fn semantics(&self) -> &Semantics { &self.semantics } + /// Get a reference to the default API. + pub fn default_api(&self) -> &Api { &self.semantics.default } + /// Get an iterator over the custom APIs. + pub fn custom_apis(&self) -> impl Iterator { self.semantics.custom.iter() } + /// Get a reference to the type system. + pub fn types(&self) -> &TypeSystem { &self.semantics.types } + /// Iterates over all APIs, including the default and the named ones. + pub fn apis(&self) -> impl Iterator { self.semantics.apis() } + /// Iterates over all codex libraries. + pub fn libs(&self) -> impl Iterator { self.semantics.libs.iter() } /// Get a [`CallId`] for a method from the default API. /// @@ -77,36 +119,19 @@ impl Issuer { /// /// If the method name is not known. pub fn call_id(&self, method: impl Into) -> CallId { - self.api + self.semantics + .default .verifier(method) .expect("calling to method absent in Codex API") } +} - pub fn decode(reader: &mut StrictReader) -> Result { - let magic_bytes = <[u8; 8]>::strict_decode(reader)?; - if magic_bytes != ISSUER_MAGIC_NUMBER { - return Err(DecodeError::DataIntegrityError(format!( - "wrong contract issuer magic bytes {}", - magic_bytes.to_hex() - ))); - } - let version = <[u8; 2]>::strict_decode(reader)?; - if version != ISSUER_VERSION { - return Err(DecodeError::DataIntegrityError(format!( - "unsupported contract issuer version {}", - u16::from_be_bytes(version) - ))); - } - Self::strict_decode(reader) - } - - pub fn encode(&self, mut writer: StrictWriter) -> io::Result<()> { - // This is compatible with BinFile - writer = ISSUER_MAGIC_NUMBER.strict_encode(writer)?; - // Version - writer = ISSUER_VERSION.strict_encode(writer)?; - self.strict_encode(writer)?; - Ok(()) +impl LibRepo for Issuer { + fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { + self.semantics + .libs + .iter() + .find(|lib| lib.lib_id() == lib_id) } } @@ -117,19 +142,40 @@ mod _fs { use amplify::confinement::U24 as U24MAX; use binfile::BinFile; - use strict_encoding::{DeserializeError, StreamReader, StreamWriter, StrictReader, StrictWriter}; + use commit_verify::{CommitId, StrictHash}; + use strict_encoding::{DecodeError, DeserializeError, StreamReader, StreamWriter, StrictDecode, StrictEncode}; + use ultrasonic::{Codex, Identity}; - use crate::Issuer; + use crate::{Issuer, Semantics, SigBlob}; pub const ISSUER_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"COISSUER"); pub const ISSUER_VERSION: u16 = 0; impl Issuer { - pub fn load(path: impl AsRef) -> Result { + pub fn load( + path: impl AsRef, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result { + // We use a manual implementation since we can't validate signature inside StrictDecode + // implementation for the Issuer let file = BinFile::::open(path)?; - let mut reader = StrictReader::with(StreamReader::new::(file)); - let me = Self::decode(&mut reader)?; - match reader.unbox().unconfine().read_exact(&mut [0u8; 1]) { + let mut reader = StreamReader::new::(file); + + let codex = Codex::strict_read(&mut reader)?; + let semantics = Semantics::strict_read(&mut reader)?; + semantics + .check(codex.codex_id()) + .map_err(|e| DecodeError::DataIntegrityError(e.to_string()))?; + + let sig = Option::::strict_read(&mut reader)?; + let me = Self { codex, semantics, sig }; + + if let Some(sig) = &me.sig { + sig_validator(me.issuer_id().commit_id(), &me.codex.developer, sig) + .map_err(|_| DecodeError::DataIntegrityError(s!("invalid signature")))?; + } + + match reader.unconfine().read_exact(&mut [0u8; 1]) { Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => Ok(me), Err(e) => Err(e.into()), Ok(()) => Err(DeserializeError::DataNotEntirelyConsumed), @@ -138,8 +184,8 @@ mod _fs { pub fn save(&self, path: impl AsRef) -> io::Result<()> { let file = BinFile::::create_new(path)?; - let writer = StrictWriter::with(StreamWriter::new::(file)); - self.encode(writer) + let writer = StreamWriter::new::(file); + self.strict_write(writer) } } } diff --git a/api/src/lib.rs b/api/src/lib.rs index e18656b..c8f8f75 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -46,8 +46,6 @@ extern crate alloc; extern crate amplify; #[macro_use] extern crate strict_types; -#[macro_use] -extern crate commit_verify; #[cfg(feature = "serde")] #[macro_use] @@ -59,13 +57,13 @@ mod articles; mod builders; mod state; -pub use api::{Api, ApiId, DestructibleApi, ImmutableApi, StateUnknown}; -pub use articles::{ - Articles, ArticlesCommitment, ArticlesError, ArticlesId, Semantics, SigBlob, SigValidator, ARTICLES_MAGIC_NUMBER, - ARTICLES_VERSION, +pub use api::{ + Api, ApisChecksum, DestructibleApi, ImmutableApi, ParseVersionedError, SemanticError, Semantics, StateUnknown, + Versioned, }; +pub use articles::{Articles, ArticlesId, SigBlob}; pub use builders::{Builder, BuilderRef, CoreParams, IssueParams, NamedState, OpBuilder, OpBuilderRef}; -pub use issuer::{Issuer, ISSUER_MAGIC_NUMBER, ISSUER_VERSION}; +pub use issuer::{Issuer, IssuerId, ISSUER_MAGIC_NUMBER, ISSUER_VERSION}; pub use sonic_callreq::*; pub use state::*; pub use ultrasonic::*; diff --git a/callreq/src/data.rs b/callreq/src/data.rs index 420d893..301cc67 100644 --- a/callreq/src/data.rs +++ b/callreq/src/data.rs @@ -38,7 +38,7 @@ pub type StateName = VariantName; pub type MethodName = VariantName; /// Combination of a method name and an optional state name used in API requests. -#[derive(Clone, Eq, PartialEq, Hash, Debug)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", bound = ""))] diff --git a/cli/src/cmd.rs b/cli/src/cmd.rs index 8ba1853..d59dd9b 100644 --- a/cli/src/cmd.rs +++ b/cli/src/cmd.rs @@ -22,12 +22,11 @@ // the License. use std::convert::Infallible; -use std::error::Error; use std::fs::File; use std::path::PathBuf; use clap::ValueHint; -use hypersonic::{AuthToken, CallParams, Identity, IssueParams, Issuer, SigBlob, SigValidator}; +use hypersonic::{AuthToken, CallParams, IssueParams, Issuer}; use sonic_persist_fs::LedgerDir; use crate::dump::dump_ledger; @@ -115,7 +114,7 @@ impl Cmd { } fn issue(issuer_file: PathBuf, form: PathBuf, output: Option) -> anyhow::Result<()> { - let issuer = Issuer::load(issuer_file)?; + let issuer = Issuer::load(issuer_file, |_, _, _| -> Result<_, Infallible> { todo!("signature validation") })?; let file = File::open(&form)?; let params = serde_yaml::from_reader::<_, IssueParams>(file)?; @@ -153,15 +152,8 @@ fn export(dir: PathBuf, terminals: impl IntoIterator, output: } fn accept(dir: PathBuf, input: PathBuf) -> anyhow::Result<()> { - // TODO: (v0.13) Use some real signature validator - pub struct DumbValidator; - impl SigValidator for DumbValidator { - fn validate_sig(&self, _: impl Into<[u8; 32]>, _: &Identity, _: &SigBlob) -> Result { - Result::<_, Infallible>::Ok(0) - } - } let mut ledger = LedgerDir::load(dir)?; - ledger.accept_from_file(input, DumbValidator)?; + ledger.accept_from_file(input, |_, _, _| -> Result<_, Infallible> { todo!("signature validation") })?; Ok(()) } diff --git a/cli/src/dump.rs b/cli/src/dump.rs index 5743afa..c053a39 100644 --- a/cli/src/dump.rs +++ b/cli/src/dump.rs @@ -55,7 +55,7 @@ pub fn dump_articles(articles: &Articles, dst: &Path) -> anyhow::Result { serde_yaml::to_writer(&out, &api)?; } - for lib in &articles.apis().libs { + for lib in articles.libs() { let lib_id = lib.lib_id(); let name = lib_id.to_baid64_mnemonic(); lib.strict_serialize_to_file::(dst.join(format!("{name}.alu")))?; diff --git a/examples/dao/main.rs b/examples/dao/main.rs index e21da92..293c2f7 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -38,7 +38,9 @@ use amplify::num::u256; use commit_verify::{Digest, Sha256}; use hypersonic::{Api, DestructibleApi, ImmutableApi}; use sonic_persist_fs::LedgerDir; -use sonicapi::{Issuer, RawBuilder, RawConvertor, StateAggregator, StateArithm, StateBuilder, StateConvertor}; +use sonicapi::{ + Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, +}; use strict_types::{SemId, StrictVal}; use ultrasonic::aluvm::FIELD_ORDER_SECP; use ultrasonic::{AuthToken, CellAddr, Codex, Consensus, Identity}; @@ -129,7 +131,14 @@ fn main() { let api = api(); // Creating DAO with three participants - let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); + let semantics = Semantics { + version: 0, + default: api, + custom: none!(), + libs: small_bset![libs::success()], + types: types.type_system(), + }; + let issuer = Issuer::new(codex, semantics).unwrap(); let filename = "examples/dao/data/SimpleDAO.issuer"; fs::remove_file(filename).ok(); issuer diff --git a/persistence/fs/Cargo.toml b/persistence/fs/Cargo.toml index cbfa8d9..86ecd57 100644 --- a/persistence/fs/Cargo.toml +++ b/persistence/fs/Cargo.toml @@ -16,6 +16,7 @@ exclude = [".github"] [dependencies] amplify = { workspace = true, features = ["serde"] } strict_encoding = { workspace = true, features = ["serde"] } +commit_verify = { workspace = true, features = ["serde"] } hypersonic = { workspace = true, features = ["serde", "binfile"] } aora.workspace = true binfile.workspace = true diff --git a/persistence/fs/src/fs.rs b/persistence/fs/src/fs.rs index 77ad77d..53c2cb2 100644 --- a/persistence/fs/src/fs.rs +++ b/persistence/fs/src/fs.rs @@ -31,9 +31,10 @@ use amplify::MultiError; use aora::file::{FileAoraIndex, FileAoraMap, FileAuraMap}; use aora::{AoraIndex, AoraMap, AuraMap, TransactionalMap}; use binfile::BinFile; +use commit_verify::StrictHash; use hypersonic::{ - AcceptError, Articles, ArticlesError, AuthToken, CellAddr, EffectiveState, Genesis, Issue, IssueError, Ledger, - Operation, Opid, RawState, Semantics, SigValidator, Stock, Transition, + AcceptError, Articles, AuthToken, CellAddr, EffectiveState, Genesis, Identity, Issue, IssueError, Ledger, + Operation, Opid, RawState, SemanticError, Semantics, SigBlob, Stock, Transition, }; use strict_encoding::{ DecodeError, StreamReader, StreamWriter, StrictDecode, StrictEncode, StrictReader, StrictWriter, @@ -50,7 +51,7 @@ const SPENT_MAGIC: u64 = u64::from_be_bytes(*b"OPSPENT "); const READ_MAGIC: u64 = u64::from_be_bytes(*b"OPREADBY"); const VALID_MAGIC: u64 = u64::from_be_bytes(*b"OPVALID "); -const APIS_MAGIC: u64 = u64::from_be_bytes(*b"CONAPIS "); +const SEMANTICS_MAGIC: u64 = u64::from_be_bytes(*b"SEMANTIC"); const STATE_MAGIC: u64 = u64::from_be_bytes(*b"CONSTATE"); const GENESIS_MAGIC: u64 = u64::from_be_bytes(*b"CGENESIS"); @@ -105,7 +106,7 @@ impl StockFs { const FILENAME_CODEX: &'static str = "codex.yaml"; const FILENAME_META: &'static str = "meta.toml"; const FILENAME_GENESIS: &'static str = "genesis.dat"; - const FILENAME_APIS: &'static str = "apis.dat"; + const FILENAME_SEMANTICS: &'static str = "semantics.dat"; const FILENAME_STATE_RAW: &'static str = "state.dat"; } @@ -131,9 +132,10 @@ impl Stock for StockFs { let writer = StreamWriter::new::<{ usize::MAX }>(file); articles.genesis().strict_write(writer)?; - let file = BinFile::::create_new(path.join(Self::FILENAME_APIS))?; - let writer = StreamWriter::new::<{ usize::MAX }>(file); - articles.apis().strict_write(writer)?; + let file = BinFile::::create_new(path.join(Self::FILENAME_SEMANTICS))?; + let mut writer = StreamWriter::new::<{ usize::MAX }>(file); + articles.semantics().strict_write(&mut writer)?; + articles.sig().strict_write(writer)?; let file = BinFile::::create_new(path.join(Self::FILENAME_STATE_RAW))?; let writer = StreamWriter::new::<{ usize::MAX }>(file); @@ -157,20 +159,25 @@ impl Stock for StockFs { let file = File::open(path.join(Self::FILENAME_CODEX))?; let codex = serde_yaml::from_reader(file)?; + // TODO: Check there is no content left at the end of reading let file = BinFile::::open(path.join(Self::FILENAME_GENESIS))?; let reader = StreamReader::new::<{ usize::MAX }>(file); let genesis = Genesis::strict_read(reader)?; - let file = BinFile::::open(path.join(Self::FILENAME_APIS))?; - let reader = StreamReader::new::<{ usize::MAX }>(file); - let apis = Semantics::strict_read(reader)?; + let file = BinFile::::open(path.join(Self::FILENAME_SEMANTICS))?; + let mut reader = StreamReader::new::<{ usize::MAX }>(file); + let semantics = Semantics::strict_read(&mut reader)?; + let sig = Option::::strict_read(reader)?; let file = BinFile::::open(path.join(Self::FILENAME_STATE_RAW))?; let reader = StreamReader::new::<{ usize::MAX }>(file); let raw = RawState::strict_read(reader)?; let issue = Issue { version: default!(), meta, codex, genesis }; - let articles = Articles::with(apis, issue)?; + let articles = match sig { + None => Articles::new(semantics, issue)?, + Some(_sig) => todo!("signature validation"), + }; let state = EffectiveState::with_raw_state(raw, &articles); @@ -208,19 +215,23 @@ impl Stock for StockFs { fn update_articles( &mut self, - f: impl FnOnce(&mut Articles) -> Result<(), ArticlesError>, - ) -> Result<(), MultiError> { - f(&mut self.articles).map_err(MultiError::A)?; + f: impl FnOnce(&mut Articles) -> Result, + ) -> Result> { + let res = f(&mut self.articles).map_err(MultiError::A)?; - let file = BinFile::::create(self.path.join(Self::FILENAME_APIS)) + let file = BinFile::::create(self.path.join(Self::FILENAME_SEMANTICS)) .map_err(MultiError::from_b)?; - let writer = StreamWriter::new::<{ usize::MAX }>(file); + let mut writer = StreamWriter::new::<{ usize::MAX }>(file); self.articles - .apis() + .semantics() + .strict_write(&mut writer) + .map_err(MultiError::from_b)?; + self.articles + .sig() .strict_write(writer) .map_err(MultiError::from_b)?; - Ok(()) + Ok(res) } fn update_state(&mut self, f: impl FnOnce(&mut EffectiveState, &Articles) -> R) -> Result { @@ -230,7 +241,7 @@ impl Stock for StockFs { let writer = StreamWriter::new::<{ usize::MAX }>(file); self.state.raw.strict_write(writer)?; - self.state.recompute(self.articles.apis()); + self.state.recompute(self.articles.semantics()); Ok(res) } @@ -273,10 +284,10 @@ impl LedgerDir { self.export(terminals, writer) } - pub fn accept_from_file( + pub fn accept_from_file( &mut self, input: impl AsRef, - sig_validator: impl SigValidator, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result<(), MultiError> { let file = File::open(input).map_err(MultiError::from_b)?; let mut reader = StrictReader::with(StreamReader::new::<{ usize::MAX }>(file)); @@ -296,7 +307,7 @@ pub enum FsError { Decode(DecodeError), #[from] - Articles(ArticlesError), + Articles(SemanticError), #[from] Yaml(serde_yaml::Error), diff --git a/src/bin/sonic-stl.rs b/src/bin/sonic-stl.rs index d9c5ee4..eb0b5a7 100644 --- a/src/bin/sonic-stl.rs +++ b/src/bin/sonic-stl.rs @@ -31,7 +31,7 @@ use commit_verify::stl::commit_verify_stl; use commit_verify::CommitmentLayout; use hypersonic::aluvm::zkstl::finite_field_stl; use hypersonic::stl::sonic_stl; -use sonicapi::ArticlesCommitment; +use sonicapi::Semantics; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::{parse_args, SystemBuilder}; use ultrasonic::stl::usonic_stl; @@ -100,9 +100,11 @@ fn main() { .unwrap(); writeln!(file, "\n-- Contract Articles\n").unwrap(); - let layout = ArticlesCommitment::commitment_layout(); + let layout = Semantics::commitment_layout(); writeln!(file, "{layout}").unwrap(); - let tt = sys.type_tree("SONIC.ArticlesCommitment").unwrap(); + let tt = sys.type_tree("SONIC.Semantics").unwrap(); + writeln!(file, "{tt}").unwrap(); + let tt = sys.type_tree("SONIC.Issuer").unwrap(); writeln!(file, "{tt}").unwrap(); let tt = sys.type_tree("SONIC.Articles").unwrap(); writeln!(file, "{tt}").unwrap(); diff --git a/src/ledger.rs b/src/ledger.rs index f275088..3bfb9b1 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -27,13 +27,14 @@ use std::io; use amplify::hex::ToHex; use amplify::MultiError; +use commit_verify::StrictHash; use indexmap::IndexSet; use sonic_callreq::MethodName; -use sonicapi::{Api, ArticlesError, NamedState, OpBuilder, Semantics, SigValidator}; +use sonicapi::{Api, NamedState, OpBuilder, SemanticError, Semantics, SigBlob}; use strict_encoding::{ DecodeError, ReadRaw, SerializeError, StrictDecode, StrictEncode, StrictReader, StrictWriter, WriteRaw, }; -use ultrasonic::{AuthToken, CallError, CellAddr, ContractId, Issue, Operation, Opid, VerifiedOperation}; +use ultrasonic::{AuthToken, CallError, CellAddr, ContractId, Identity, Issue, Operation, Opid, VerifiedOperation}; use crate::deed::{CallParams, DeedBuilder}; use crate::{Articles, EffectiveState, IssueError, ProcessedState, Stock, Transition}; @@ -340,8 +341,8 @@ impl Ledger { } } }; - collect(&articles.apis().default, &state.main); - for (api_name, api) in &articles.apis().custom { + collect(&articles.semantics().default, &state.main); + for (api_name, api) in &articles.semantics().custom { let Some(state) = state.aux.get(api_name) else { continue; }; @@ -374,21 +375,19 @@ impl Ledger { Ok(()) } - pub fn merge_articles( + pub fn upgrade_apis( &mut self, new_articles: Articles, - sig_validator: V, - ) -> Result<(), MultiError> { - self.0.update_articles(|articles| { - articles.merge(new_articles, sig_validator)?; - Ok(()) - }) + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result> { + self.0 + .update_articles(|articles| articles.upgrade_apis(new_articles, sig_validator)) } - pub fn accept( + pub fn accept( &mut self, reader: &mut StrictReader, - sig_validator: impl SigValidator, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result<(), MultiError> { // We need this closure to avoid multiple `map_err`. (|| -> Result<(), AcceptError> { @@ -410,14 +409,14 @@ impl Ledger { } let contract_id = ContractId::strict_decode(reader)?; - let apis = Semantics::strict_decode(reader)?; + let semantics = Semantics::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; - let articles = Articles::with(apis, issue)?; + let articles = Articles::new(semantics, issue)?; if articles.contract_id() != contract_id { - return Err(AcceptError::Articles(ArticlesError::ContractMismatch)); + return Err(AcceptError::Articles(SemanticError::ContractMismatch)); } - self.merge_articles(articles, sig_validator) + self.upgrade_apis(articles, sig_validator) .map_err(|e| AcceptError::Persistence(e.to_string()))?; Ok(()) })() @@ -451,7 +450,7 @@ impl Ledger { } } self.0.update_state(|state, articles| { - state.rollback(transition, articles.apis()); + state.rollback(transition, articles.semantics()); })?; self.0.mark_invalid(opid); } @@ -523,7 +522,7 @@ impl Ledger { force: bool, ) -> Result> { if operation.contract_id != self.contract_id() { - return Err(MultiError::A(AcceptError::Articles(ArticlesError::ContractMismatch))); + return Err(MultiError::A(AcceptError::Articles(SemanticError::ContractMismatch))); } let opid = operation.opid(); @@ -581,7 +580,7 @@ impl Ledger { let transition = self .0 - .update_state(|state, articles| state.apply(operation, articles.apis()))?; + .update_state(|state, articles| state.apply(operation, articles.semantics()))?; self.0.add_transition(opid, &transition); self.0.mark_valid(opid); @@ -598,7 +597,7 @@ pub enum AcceptError { Io(io::Error), #[from] - Articles(ArticlesError), + Articles(SemanticError), #[from] Verify(CallError), diff --git a/src/state.rs b/src/state.rs index 8651330..26d487b 100644 --- a/src/state.rs +++ b/src/state.rs @@ -66,7 +66,7 @@ impl EffectiveState { .verify(contract_id, genesis, &state.raw, articles)?; // We do not need state transition for genesis. - let _ = state.apply(verified, articles.apis()); + let _ = state.apply(verified, articles.semantics()); Ok(state) } @@ -79,7 +79,7 @@ impl EffectiveState { let state = ProcessedState::with(&me.raw, api, articles.types()); me.aux.insert(name.clone(), state); } - me.recompute(articles.apis()); + me.recompute(articles.semantics()); me } @@ -250,16 +250,13 @@ impl ProcessedState { self.aggregated = bmap! {}; for (name, aggregator) in api.aggregators() { let val = aggregator.read(|state_name| { - match self - .immutable(state_name) + self.immutable(state_name) .map(|map| map.values().cloned().collect::>()) .or_else(|| { let verified = self.aggregated.get(state_name)?.clone(); Some(vec![StateAtom { verified, unverified: None }]) - }) { - None => vec![], - Some(src) => src, - } + }) + .unwrap_or_else(|| vec![]) }); self.aggregated.insert(name.clone(), val); } diff --git a/src/stl.rs b/src/stl.rs index 18f26c9..865ae29 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -24,7 +24,7 @@ use aluvm::stl::aluvm_stl; use commit_verify::stl::commit_verify_stl; use sonic_callreq::LIB_NAME_SONIC; -use sonicapi::{Articles, ArticlesCommitment, ArticlesId}; +use sonicapi::{Articles, ArticlesId, Issuer, IssuerId}; use strict_types::stl::{std_stl, strict_types_stl}; use strict_types::typelib::LibBuilder; use strict_types::{CompileError, TypeLib}; @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:tyzJaGG6-0t0y7pw-RrvB~a9-adiS8We-x49ufrL-iZINc_s#hazard-profile-michael"; +pub const LIB_ID_SONIC: &str = "stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { @@ -47,8 +47,9 @@ fn _sonic_stl() -> Result { usonic_stl().to_dependency_types(), ]) .transpile::() + .transpile::() .transpile::() - .transpile::() + .transpile::() .transpile::() .compile() } diff --git a/src/stock.rs b/src/stock.rs index 4eb11a8..a6d0a3a 100644 --- a/src/stock.rs +++ b/src/stock.rs @@ -24,7 +24,7 @@ use core::error::Error; use amplify::MultiError; -use sonicapi::ArticlesError; +use sonicapi::SemanticError; use ultrasonic::{CallError, CellAddr, ContractName, Operation, Opid}; use crate::{Articles, EffectiveState, Transition}; @@ -286,8 +286,8 @@ pub trait Stock { /// updated state after calling the callback `f` method. fn update_articles( &mut self, - f: impl FnOnce(&mut Articles) -> Result<(), ArticlesError>, - ) -> Result<(), MultiError>; + f: impl FnOnce(&mut Articles) -> Result, + ) -> Result>; /// Updates contract effective state inside a callback method. /// diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 4d42676..c95939a 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -12,15 +12,395 @@ -- Contract Articles -commitment ArticlesId, hasher SHA256, tagged urn:ubideco:sonic:articles#2025-05-18 - serialized ArticlesCommitment +commitment ApisChecksum, hasher SHA256, tagged urn:ubideco:sonic:apis#2025-05-25 + serialized U16 + map StrictHash, len 0..MAX16 + mapKey TypeName + mapValue StrictHash + serialized TypeSysId -rec ArticlesCommitment - bytes contractId, len 32, aka ContractId - bytes defaultApiId, len 32, aka ApiId - map customApiIds, len 0..MAX16 +rec Semantics + is version, U16 + rec default, Api + bytes codexId, len 32, aka CodexId + set conforms, len 0..MAX8 + is element, U16 + rec some, CallState, option, wrapped, tag 1 + ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + map immutable, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, ImmutableApi + bytes semId, len 32, aka SemId + enum published, Bool, false 0, true 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union rawConvertor, RawConvertor + bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + union rawBuilder, RawBuilder + bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + map destructible, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, DestructibleApi + bytes semId, len 32, aka SemId + enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + bytes witnessSemId, len 32, aka SemId + union witnessBuilder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + map aggregators, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, StateAggregator + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + map verifiers, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is value, U16 + map errors, len 0..MAX8 + is key, U256 + str value, len 0..MAX8 + map custom, len 0..MAX16 ascii key, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100 - bytes value, len 32, aka ApiId + rec value, Api + bytes codexId, len 32, aka CodexId + set conforms, len 0..MAX8 + is element, U16 + rec some, CallState, option, wrapped, tag 1 + ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + map immutable, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, ImmutableApi + bytes semId, len 32, aka SemId + enum published, Bool, false 0, true 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union rawConvertor, RawConvertor + bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + union rawBuilder, RawBuilder + bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + map destructible, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, DestructibleApi + bytes semId, len 32, aka SemId + enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + bytes witnessSemId, len 32, aka SemId + union witnessBuilder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + map aggregators, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, StateAggregator + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + map verifiers, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is value, U16 + map errors, len 0..MAX8 + is key, U256 + str value, len 0..MAX8 + set libs, len 0..MAX16 + rec Lib + set isae, len 0..MAX8 + ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 + bytes code, len 0..MAX16 + bytes data, len 0..MAX16 + set libs, len 0..MAX8 + bytes element, len 32, aka LibId + map types, len 0..MAX24, aka TypeSystem + bytes key, len 32, aka SemId + union value, TySemId + is primitive, U8, wrapped, aka Primitive, tag 0 + is unicode, Unit, tag 1 + set enum, len 1..MAX8, wrapped, aka EnumVariants, tag 2 + rec Variant + ascii name, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is tag, U8 + map union, len 0..MAX8, wrapped, aka UnionVariantsSemId, tag 3 + is key, U8 + rec value, VariantInfoSemId + ascii name, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes ty, len 32, aka SemId + list tuple, len 1..MAX8, wrapped, aka UnnamedFieldsSemId, tag 4 + bytes element, len 32, aka SemId + list struct, len 1..MAX8, wrapped, aka NamedFieldsSemId, tag 5 + rec FieldSemId + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes ty, len 32, aka SemId + tuple array, tag 6 + bytes _, len 32, aka SemId + is _, U16 + tuple list, tag 7 + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + tuple set, tag 8 + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + tuple map, tag 9 + bytes _, len 32, aka SemId + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + +rec Issuer + rec codex, Codex + bytes version, len 1, aka ReservedBytes1 + str name, len 0..MAX8 + ascii developer, aka Identity, first AsciiPrintable, rest AsciiPrintable, len 1..4096 + is timestamp, I64 + is fieldOrder, U256 + rec inputConfig, CoreConfig + enum halt, Bool, false 0, true 1 + is some, U64, option, wrapped, tag 1 + rec verificationConfig, CoreConfig + enum halt, Bool, false 0, true 1 + is some, U64, option, wrapped, tag 1 + map verifiers, len 0..MAX8 + is key, U16 + rec value, LibSite + bytes libId, len 32, aka LibId + is offset, U16 + rec semantics, Semantics + is version, U16 + rec default, Api + bytes codexId, len 32, aka CodexId + set conforms, len 0..MAX8 + is element, U16 + rec some, CallState, option, wrapped, tag 1 + ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + map immutable, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, ImmutableApi + bytes semId, len 32, aka SemId + enum published, Bool, false 0, true 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union rawConvertor, RawConvertor + bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + union rawBuilder, RawBuilder + bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + map destructible, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, DestructibleApi + bytes semId, len 32, aka SemId + enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + bytes witnessSemId, len 32, aka SemId + union witnessBuilder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + map aggregators, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, StateAggregator + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + map verifiers, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is value, U16 + map errors, len 0..MAX8 + is key, U256 + str value, len 0..MAX8 + map custom, len 0..MAX16 + ascii key, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100 + rec value, Api + bytes codexId, len 32, aka CodexId + set conforms, len 0..MAX8 + is element, U16 + rec some, CallState, option, wrapped, tag 1 + ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + map immutable, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, ImmutableApi + bytes semId, len 32, aka SemId + enum published, Bool, false 0, true 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union rawConvertor, RawConvertor + bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + union rawBuilder, RawBuilder + bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + map destructible, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + rec value, DestructibleApi + bytes semId, len 32, aka SemId + enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union convertor, StateConvertor + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + union builder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + bytes witnessSemId, len 32, aka SemId + union witnessBuilder, StateBuilder + is unit, Unit, tag 0 + is typedEncoder, U256, wrapped, tag 1 + is typedFieldEncoder, U256, wrapped, tag 2 + map aggregators, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, StateAggregator + is unit, Unit, tag 0 + bytes const, len 0..MAX8, wrapped, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + tuple sum, tag 4 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + map verifiers, len 0..MAX8 + ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is value, U16 + map errors, len 0..MAX8 + is key, U256 + str value, len 0..MAX8 + set libs, len 0..MAX16 + rec Lib + set isae, len 0..MAX8 + ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 + bytes code, len 0..MAX16 + bytes data, len 0..MAX16 + set libs, len 0..MAX8 + bytes element, len 32, aka LibId + map types, len 0..MAX24, aka TypeSystem + bytes key, len 32, aka SemId + union value, TySemId + is primitive, U8, wrapped, aka Primitive, tag 0 + is unicode, Unit, tag 1 + set enum, len 1..MAX8, wrapped, aka EnumVariants, tag 2 + rec Variant + ascii name, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is tag, U8 + map union, len 0..MAX8, wrapped, aka UnionVariantsSemId, tag 3 + is key, U8 + rec value, VariantInfoSemId + ascii name, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes ty, len 32, aka SemId + list tuple, len 1..MAX8, wrapped, aka UnnamedFieldsSemId, tag 4 + bytes element, len 32, aka SemId + list struct, len 1..MAX8, wrapped, aka NamedFieldsSemId, tag 5 + rec FieldSemId + ascii name, aka FieldName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes ty, len 32, aka SemId + tuple array, tag 6 + bytes _, len 32, aka SemId + is _, U16 + tuple list, tag 7 + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + tuple set, tag 8 + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + tuple map, tag 9 + bytes _, len 32, aka SemId + bytes _, len 32, aka SemId + rec Sizing + is min, U64 + is max, U64 + bytes some, len 1..4096, option, wrapped, aka SigBlob, tag 1 rec Articles rec semantics, Semantics @@ -204,7 +584,6 @@ rec Articles rec Sizing is min, U64 is max, U64 - bytes some, len 1..4096, option, wrapped, aka SigBlob, tag 1 rec issue, Issue bytes version, len 1, aka ReservedBytes1 rec meta, ContractMeta @@ -280,4 +659,5 @@ rec Articles is third, U256, aka Fe256 is fourth, U256, aka Fe256 bytes some, len 0..MAX16, option, wrapped, aka RawData, tag 1 + bytes some, len 1..4096, option, wrapped, aka SigBlob, tag 1 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index bc3b21a..98621a2 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:tyzJaGG6-0t0y7pw-RrvB~a9-adiS8We-x49ufrL-iZINc_s#hazard-profile-michael +Id: stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 3a3418e63d8b0c6b6f603fba71bb77d9f8a0cc545546b27a0c93e12877e2f105 +Check-SHA256: 09ec671b8dc881fb22041fe9a25899060aad7e66db1aca2aafd075a8f648989a 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -45,7 +45,7 @@ cBe%OQ*>c;WmaKqb!D@OIM0+Zf@L2l@d@(MQJsr54hK$(!e6HQqr!PDy=MtQb#!P{Z);_4wXEwu(4(eX D|DxJ;;J@Cth|EksiOt-HPJ-=lHfc*2SaaUWq3(sw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u 2uWmRZggpMdGHmh1*yTf7t)jcn*aB%1xpArrVPVhCp50mBKADGoe5KPVRU6fWo&HwrN?q$uLxQs2Fvw;u@LuG7iL1bid{aM4p>0IFOo~Y652;7|;2>m$hiUk~2&U-senAm#W2U1~o -L}7Gc5dZ^0aA^hz2V-w!Wq3(s0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaezmOYKhUG5TPt*@ +L}7Gc5aA^hz2V-w!Wq3(s0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaezmOYKhUG5TPt*@ cH*iwNUXeq?5U##^fl2${*vH4KnP=RZf0+CZF2w#000620000000030000000000BWMyVyb!>D)VQg#w 1OfmAZf|a7000011aog~WdH>M0X%2<`V5Xnw4=-d1_`8fg(m2+l}g^fB0Ix1nd=gGR0(NqZFO{EVr*pq 3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+>bZ>HV ju4LlVPD>PWZ#Lo8IC-6`F;9ynVxG|msa?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFS j{pDy0000000000{{R300000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30 -000001wn9WNn`~900#g7Kp+4JL2`6yV{Bz}1_B9lWo=<@bZKLA0cAQ>XU<*00B0v!7o{TMe>VsSo#x_$ -V_(2Q!oCFCF$HOJb9H3`8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ|Njk^^qPoT1+zTRnAg`3vXv9d*8d@RXy~6c6G7My8W?^+~bU|=wNn`<4 -C86@1gt33$__S<#?wq1&$)LHlrefb({PdcEWW?nRV|8o|5M~K$m}!eub_$g}*CJ -IJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;EQA|)S-x88IWKN#S$#@T&w`gPmRVAVFoP@D|-}tm_dhVQ} -Y003uwWeazx0000000000|Nj60000003PEyoX=7|7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ -&^g7`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LzL}hbya&=>LX<}?;L2zjX1_g6v -ZAoMT>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0ZgypIbZ>G2OS*0T -e%EP8kyngk!QwTBrbc}#N>{B-;D=|lkC4U=2V!+;Y-D9}0kE-^$x##==E|&@N?>9q%L<%Ua(wJM|D$3N -@D~kfqYQUxbZ%vHb5mt)Nn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^ -w5ufb=C_Ju$l1`nW&GEpSWb-&cWHEPWpi^vb!lv5WpV+qv6abD6dUHsteHw+VkgTAoK|vt>^lFWViE8c -4QZncNo{R)bYWs_WkGOh1_lLlWo=1h0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG) -02XJT?*g=|B=zREie$*y(7k2+*P~cYjR|mdVr*%1Xk}yqf{E)*4-0TquXIZV=)u>WBLk*fW6RH_XPEi= -Ry;9kVTK~nd#>4R=asjF)4UI&T84K~YqFcD& -s+ri$U}E3inB`}Z8#25!inIz+VRu4xX>4R=as&YY40CjHX=8LnZewp`WdH>M0_mQT=Q}``f02HLt~iCi -D@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjSNy@cSCP(c4cyOZ*l|y -01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ -t0eX2w~A!Q+0eaZ{MVycPK^muWo=<@bZKLA1_lRqWpZ7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0 -6v={gsJ=SZlTl1iF5eQ8IAl(q%E@>So406W0Zfvf85&<4>eV};M1&000000RR600000000ne;aAk7>>7J73J3yCzk$#1)IEB9}O*pr- -e%zuW2Pj0_vj919NF-00aU61a5C`WdHyG0R(ez -ZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAtoX=g%gZ(;=j00;m8Kmh;%00000000mG -0000001s1iVRU6dXJ>L{XJK@2as&zh1a)p{bN~PV0R>}kZgX@11pxpE002M$00000000300000000002 -1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7? -iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{@nQlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW -2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj}QiQZ&Pn=WdH>M0_mQT=Q}``f02HL -t~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk01qXX>)W|00jX8 +000003_);db30||3wZDDS7X=8H%egDvFM#$ljTdg0(Ml +4XFilC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ2Ja#Ii?YxZw +(Ocq7g$YV6pHOVLJF$ytM@WLL^Df8(b7^M)1OfmAZf|a7000011aog~WdH>M0U^g1ZO|$}9Zg=R%ZE7e +t&pz}oUddU0B(<>YerIc3kgGEY;03>VRU5%0tRhmbZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|^mGb98cbV{~a^Y-Ioh0ssVVZ*FA(00035 +b8l^B00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ +&^g7@39Wprs{a{&|S*VI`tz9el{x{lbX!>yRN ++gXnJ*lWV;;wWejWN!&$Z*F#Fa&&KU0ZY1V{(jeKNRd~JW5MDzhNeb+DoR(aP2h)Tw2zR+4hLd&X>4R= +asjZhmB~>Q8|KQanMz<{C(8<)R&spoI{%|$5%3ocX`>8xX>@L7b8}N=ZAoMT>7J73J3yCzk$#1)IEB9} +O*pr-e%zuW2Pj0mw%Cd +g|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^n0bz*F3b7*B` +0)mO_O%DrjRIhYP1?a)oog)LLTw}}6rDvG=`c^zKYGH;V(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmO +O$lRfZgypIbZ>G2OS*0Te%EP8kyngk!QwTBrbc}#N>{B-;D=|lkC4U=2V!+;Y-D9}0kE-^$x##==E|&@ +N?>9q%L<%Ua(wJM|D$3N@D~kfqYQFkcSCP(c4cyOZ*l?Cvw2KFZyKJc&PYR|!^f-0Fkg70sI}$V%b}RP +j6)|1a$$Eub!lv5WpV+kCJl{5lNk%~wxV0O;HsI}&0u2R-k9ZQk{dF-G>WtaNpo{`WpV}s1!HeyWq1M_ +{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQe?#%E`{d+C1Sl4-0;gT-ZoMpKK(c7N=>KC_d#mnmn +b7gH|Zggp5a{+z-&}&A>;gMUdAH_y9^4<-p1&un?R0J1-rYT7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0< +ZYw-cYXqYdo~D%m7H6OD0<^0n_2##VWXRdjy=DB@qgYOj2~%ZlVQzG3V{--t2XD2Op=}%8ebgh*~0{3Ige#lIJ@>mw%Cdg|0Y-zbj2R +x3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-CQlAakFUmWV$%LXqyPm8u3Ik3QjW;F*B{0000000030{{R3000004Y-wV100{!OSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<| +u0=7lDd*2aVV&IHP})APDYB)cg%&~}+QsG>1Ch@9YYCa>3uf#90000000030{{R3000005ba`-Pa{}p} +lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+&PZdlOljoA7|k;k>s6qoa5|8f~f~n +X=g%gZ(;=j00;m8Kmh;%00000000mG0000001s1iVRU6dXJ>L{XJK@2as&zh1a)p{bN~PV0R>}kZgX@1 +1pxpE002M$000000003000000000021!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr- +e%zuW2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{@nQlIJ@>mw%Cd +g|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+c; -WkPjnY-D9}1OosBb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X -4pVetbY(+tZgypIbZ>G50{{edZfSG?000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?- -asUMZ001BgRB~Z%b7^#GZ*B$x1aEL@WC9xfZz;O*CD3`lC**6;}%ie4wrTWpLzfxZ1 -G^f?j#teS@rN?q$uLxQs2Fvw;u-8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ -?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFS +j}QiQZ&Pn=WdH>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6f +Mp@;h#Lzj#&aRFSk01qXX>)W|00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2R +x3qrTq9O+c;WkPjnY-D9}1OosBb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn +5p;QQWn@NaWo%?cZewp`WpV%o0RR9X4pVetbY(+tZgypIbZ>G50{{edZfSG?000mSba`-PWJPXcZ)9b1 +00jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001BgRB~Z%b7^#GZ*B$x1aEL@WC9xfZz;O*CD3`lC**6;}%ie4wrTWpLzfxZ1G^f?j#teS@rN?q$uLxQs2Fvw;u- +8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJlC**6;}%ie4wrTWpLzfxZ1 +G^f?j#teS7tm{9}qo!LcbfV=-00IbOXk}w-b9HS24rs`h +%>r>-9X0IN!p14WBr9LqgTBPo;{gj!U^Sf=6INw%b7^mGWn@EdZgg^CV{}Pm1_J_VWC9xfZz;O*CD3`< +HybC*-fSbK`q84lQeNdWr`6EL41S*oEJ-@Z0;0Ob-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+`#WpZMVv$(i4b+Q4E z;^Yt93X|6eS#37qjbr9#^8|?(u`#nI=clArfEBD{Q_v>CXpmu(CkdQpWZfJm=*PJE znb0K`QGu}3qT$c29e=BN-;t}28M*xuOy`OVBN>@jQk0ln0yovklq?eg-C~LK delta 298 zcmaEDutR^t5e`Pd%||)*Gr6)l7G!#+ure~RGcY(PFmN~)m1HL8q!zO=aTcfMCguTo z#f+&|q3P#h4>F{yM~N?0dRTAH!7=yQqvquJ1CEFGvD`MCe1Y3tUI?buIX^cyvm`e) zuY`@6D>*-}q$n}D#B*|in9^i12?cAOl+?7u(wq{o#f+h<3qQ?i*;s%7$CjL`cXJkH zo?NhV>$0T#QGdS7YD_uulqb2gxFkOpthjg*m-6I3K}8orni!zq|9=RB3+6N=pKcE1 liDRCeB5<0KZL@)(A0rEMac25tdrq;*E&>Xh>x3?`006~9arpoM diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 627dca5..94aa24b 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:tyzJaGG6-0t0y7pw-RrvB~a9-adiS8We-x49ufrL-iZINc_s#hazard-profile-michael + Id: stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -81,19 +81,13 @@ data Api : codexId UltraSONIC.CodexId , verifiers {StrictTypes.VariantName -> ^ ..0xff U16} , errors {U256 -> ^ ..0xff [Unicode ^ ..0xff]} -@mnemonic(sharp-section-left) -data ApiId : [Byte ^ 32] +@mnemonic(viva-index-tempo) +data ApisChecksum : [Byte ^ 4] -@mnemonic(stella-empire-rubber) -data Articles : semantics Semantics, issue UltraSONIC.Issue - -@mnemonic(distant-east-ritual) -data ArticlesCommitment : contractId UltraSONIC.ContractId - , defaultApiId ApiId - , customApiIds {StrictTypes.TypeName -> ApiId} - -@mnemonic(danube-pilot-karate) -data ArticlesId : [Byte ^ 32] +@mnemonic(cake-horse-equal) +data Articles : semantics Semantics + , issue UltraSONIC.Issue + , sig SigBlob? @mnemonic(alpha-balsa-verona) data CallState : method StrictTypes.VariantName, destructible StrictTypes.VariantName? @@ -114,19 +108,23 @@ data ImmutableApi : semId StrictTypes.SemId , rawConvertor RawConvertor , rawBuilder RawBuilder +@mnemonic(peace-film-video) +data Issuer : codex UltraSONIC.Codex + , semantics Semantics + , sig SigBlob? + @mnemonic(tomato-gordon-craft) data RawBuilder : strictEncode StrictTypes.SemId | (|) @mnemonic(tripod-guitar-bishop) data RawConvertor : strictDecode StrictTypes.SemId | (|) -@mnemonic(ballet-serpent-brown) +@mnemonic(gray-paint-pagoda) data Semantics : version U16 , default Api , custom {StrictTypes.TypeName -> Api} , libs {AluVM.Lib} , types StrictTypes.TypeSystem - , sig SigBlob? @mnemonic(insect-cello-avalon) data SigBlob : [Byte ^ 1..0x1000] @@ -160,4 +158,14 @@ data StateConvertor : unit () @mnemonic(explore-locate-zoom) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} +@mnemonic(sabrina-exit-marina) +data VersionedCodexId : id UltraSONIC.CodexId + , version U16 + , checksum ApisChecksum + +@mnemonic(miller-alien-comrade) +data VersionedContractId : id UltraSONIC.ContractId + , version U16 + , checksum ApisChecksum + diff --git a/tests/dao.rs b/tests/dao.rs index 68cd346..578600d 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -36,7 +36,9 @@ use amplify::num::u256; use commit_verify::{Digest, Sha256}; use hypersonic::{Api, DestructibleApi, ImmutableApi}; use sonic_persist_fs::LedgerDir; -use sonicapi::{Issuer, RawBuilder, RawConvertor, StateAggregator, StateArithm, StateBuilder, StateConvertor}; +use sonicapi::{ + Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, +}; use strict_types::{SemId, StrictVal}; use ultrasonic::aluvm::FIELD_ORDER_SECP; use ultrasonic::{AuthToken, CellAddr, Codex, Consensus, Identity}; @@ -126,7 +128,14 @@ fn main() { let api = api(); // Creating DAO with three participants - let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); + let semantics = Semantics { + version: 0, + default: api, + custom: none!(), + libs: small_bset![libs::success()], + types: types.type_system(), + }; + let issuer = Issuer::new(codex, semantics).unwrap(); let filename = "examples/dao/data/SimpleDAO.issuer"; fs::remove_file(filename).ok(); issuer diff --git a/tests/reorgs.rs b/tests/reorgs.rs index ebeac7d..1690bc5 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -44,7 +44,7 @@ use petgraph::Graph; use rand::rng; use rand::seq::SliceRandom; use sonic_persist_fs::LedgerDir; -use sonicapi::{IssueParams, Issuer, StateArithm, StateBuilder, StateConvertor}; +use sonicapi::{IssueParams, Issuer, Semantics, StateArithm, StateBuilder, StateConvertor}; use sonix::dump_ledger; use strict_types::SemId; use ultrasonic::aluvm::FIELD_ORDER_SECP; @@ -169,7 +169,14 @@ fn setup(name: &str) -> LedgerDir { let codex = codex(); let api = api(); - let issuer = Issuer::new(1, codex, api, [libs::success()], types.type_system()); + let semantics = Semantics { + version: 0, + default: api, + custom: none!(), + libs: small_bset![libs::success()], + types: types.type_system(), + }; + let issuer = Issuer::new(codex, semantics).unwrap(); let seed = &[0xCA; 30][..]; let mut auth = Sha256::digest(seed); From 21072033f118a1dec8163a37fa82a5fd29196b5a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 13:25:46 +0200 Subject: [PATCH 04/40] api: remove sig_validator where it is not needed --- api/src/articles.rs | 38 +++++++++++++++----------------------- api/src/builders.rs | 4 +++- cli/src/cmd.rs | 2 +- persistence/fs/src/fs.rs | 7 +++---- src/ledger.rs | 14 ++++++-------- src/stl.rs | 2 +- stl/SONIC.vesper | 2 +- stl/SONIC@0.12.0.sta | 10 +++++----- stl/SONIC@0.12.0.stl | Bin 6251 -> 6251 bytes stl/SONIC@0.12.0.sty | 6 +++--- 10 files changed, 38 insertions(+), 47 deletions(-) diff --git a/api/src/articles.rs b/api/src/articles.rs index 3900f56..88db131 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -46,7 +46,8 @@ pub type ArticlesId = Versioned; /// The structure provides the following invariance guarantees: /// - all the API codex matches the codex under which the contract was issued; /// - all the API ids are unique; -/// - all custom APIs have unique names. +/// - all custom APIs have unique names; +/// - the signature, if present, is a valid sig over the [`ArticlesId`]. #[derive(Clone, Eq, PartialEq, Debug)] #[derive(StrictType, StrictDumb, StrictEncode)] // We must not derive or implement StrictDecode for Issuer, since we cannot validate signature @@ -57,31 +58,31 @@ pub struct Articles { /// Thus, a dedicated substructure [`Semantics`] is introduced, which keeps a shared part of /// both [`Issuer`] and [`Articles`]. semantics: Semantics, - /// The contract issue. - issue: Issue, /// Signature from the contract issuer (`issue.meta.issuer`) over the articles' id. + /// + /// NB: it must precede the issue, which contains genesis! + /// Since genesis is read with a stream-supporting procedure later. sig: Option, + /// The contract issue. + issue: Issue, } impl Articles { - /// Construct articles from a contract semantic and the contract issue under that semantics. - pub fn new(semantics: Semantics, issue: Issue) -> Result { - semantics.check(issue.codex_id())?; - Ok(Self { semantics, issue, sig: None }) - } - /// Construct articles from a signed contract semantic and the contract issue under that /// semantics. pub fn with( semantics: Semantics, issue: Issue, - sig: SigBlob, + sig: Option, sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result { - let mut me = Self::new(semantics, issue)?; + semantics.check(issue.codex_id())?; + let mut me = Self { semantics, issue, sig: None }; let id = me.articles_id().commit_id(); - sig_validator(id, &me.issue.meta.issuer, &sig).map_err(|_| SemanticError::InvalidSignature)?; - me.sig = Some(sig); + if let Some(sig) = &sig { + sig_validator(id, &me.issue.meta.issuer, sig).map_err(|_| SemanticError::InvalidSignature)?; + } + me.sig = sig; Ok(me) } @@ -133,20 +134,11 @@ impl Articles { /// # Returns /// /// Whether the upgrade has happened, i.e. `other` represents a valid later version of the APIs. - pub fn upgrade_apis( - &mut self, - other: Self, - sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, - ) -> Result { + pub fn upgrade_apis(&mut self, other: Self) -> Result { if self.contract_id() != other.contract_id() { return Err(SemanticError::ContractMismatch); } - if let Some(sig) = &other.sig { - let id2 = other.articles_id().commit_id(); - sig_validator(id2, &self.issue.meta.issuer, sig).map_err(|_| SemanticError::InvalidSignature)?; - } - Ok(match (&self.sig, &other.sig) { (None, None) | (Some(_), Some(_)) if other.semantics.version > self.semantics.version => { self.semantics = other.semantics; diff --git a/api/src/builders.rs b/api/src/builders.rs index 9fc5454..a72b04e 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -21,6 +21,7 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. +use std::convert::Infallible; use std::ops::{Deref, DerefMut}; use aluvm::LibSite; @@ -183,7 +184,8 @@ impl IssueBuilder { let genesis = self.builder.issue_genesis(self.issuer.codex_id()); let (codex, semantics) = self.issuer.dismember(); let issue = Issue { version: default!(), meta, codex, genesis }; - Articles::new(semantics, issue).expect("broken issue builder") + Articles::with(semantics, issue, None, |_, _, _| -> Result<_, Infallible> { unreachable!() }) + .expect("broken issue builder") } } diff --git a/cli/src/cmd.rs b/cli/src/cmd.rs index d59dd9b..69a530d 100644 --- a/cli/src/cmd.rs +++ b/cli/src/cmd.rs @@ -153,7 +153,7 @@ fn export(dir: PathBuf, terminals: impl IntoIterator, output: fn accept(dir: PathBuf, input: PathBuf) -> anyhow::Result<()> { let mut ledger = LedgerDir::load(dir)?; - ledger.accept_from_file(input, |_, _, _| -> Result<_, Infallible> { todo!("signature validation") })?; + ledger.accept_from_file(input, |_, _, _| Err("signature validation is not implemented yet"))?; Ok(()) } diff --git a/persistence/fs/src/fs.rs b/persistence/fs/src/fs.rs index 53c2cb2..6a6881a 100644 --- a/persistence/fs/src/fs.rs +++ b/persistence/fs/src/fs.rs @@ -22,6 +22,7 @@ // the License. use std::borrow::Borrow; +use std::convert::Infallible; use std::fs::File; use std::io::Write; use std::path::{Path, PathBuf}; @@ -174,10 +175,8 @@ impl Stock for StockFs { let raw = RawState::strict_read(reader)?; let issue = Issue { version: default!(), meta, codex, genesis }; - let articles = match sig { - None => Articles::new(semantics, issue)?, - Some(_sig) => todo!("signature validation"), - }; + // We trust the storage + let articles = Articles::with(semantics, issue, sig, |_, _, _| -> Result<_, Infallible> { Ok(()) })?; let state = EffectiveState::with_raw_state(raw, &articles); diff --git a/src/ledger.rs b/src/ledger.rs index 3bfb9b1..c2196cd 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -294,6 +294,7 @@ impl Ledger { terminals: impl IntoIterator>, mut writer: StrictWriter, ) -> io::Result<()> { + // TODO Use binfile! // This is compatible with BinFile writer = LEDGER_MAGIC_NUMBER.strict_encode(writer)?; // Version @@ -375,13 +376,9 @@ impl Ledger { Ok(()) } - pub fn upgrade_apis( - &mut self, - new_articles: Articles, - sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, - ) -> Result> { + pub fn upgrade_apis(&mut self, new_articles: Articles) -> Result> { self.0 - .update_articles(|articles| articles.upgrade_apis(new_articles, sig_validator)) + .update_articles(|articles| articles.upgrade_apis(new_articles)) } pub fn accept( @@ -410,13 +407,14 @@ impl Ledger { let contract_id = ContractId::strict_decode(reader)?; let semantics = Semantics::strict_decode(reader)?; + let sig = Option::::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; - let articles = Articles::new(semantics, issue)?; + let articles = Articles::with(semantics, issue, sig, sig_validator)?; if articles.contract_id() != contract_id { return Err(AcceptError::Articles(SemanticError::ContractMismatch)); } - self.upgrade_apis(articles, sig_validator) + self.upgrade_apis(articles) .map_err(|e| AcceptError::Persistence(e.to_string()))?; Ok(()) })() diff --git a/src/stl.rs b/src/stl.rs index 865ae29..58a7a50 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket"; +pub const LIB_ID_SONIC: &str = "stl:ua~UUPtR-VR~rVc8-0tefjA~-sf0FNf~-a6kodv8-kYSgebM#crack-ballet-geneva"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index c95939a..9caee68 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -584,6 +584,7 @@ rec Articles rec Sizing is min, U64 is max, U64 + bytes some, len 1..4096, option, wrapped, aka SigBlob, tag 1 rec issue, Issue bytes version, len 1, aka ReservedBytes1 rec meta, ContractMeta @@ -659,5 +660,4 @@ rec Articles is third, U256, aka Fe256 is fourth, U256, aka Fe256 bytes some, len 0..MAX16, option, wrapped, aka RawData, tag 1 - bytes some, len 1..4096, option, wrapped, aka SigBlob, tag 1 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 98621a2..8f21f87 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket +Id: stl:ua~UUPtR-VR~rVc8-0tefjA~-sf0FNf~-a6kodv8-kYSgebM#crack-ballet-geneva Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 09ec671b8dc881fb22041fe9a25899060aad7e66db1aca2aafd075a8f648989a +Check-SHA256: db242e5c9c2c5d3792355111818604135ab86ee5815b2b9c4ba6ca7d70717db7 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -57,9 +57,9 @@ ju4LlVPD>PWZ#Lo8IC-6`F;9ynVxG|msa?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFS j{pDy0000000000{{R300000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30 000003_);db30||3wZDDS7X=8H%egDvFM#$ljTdg0(Ml -4XFilC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ2Ja#Ii?YxZw -(Ocq7g$YV6pHOVLJF$ytM@WLL^Df8(b7^M)1OfmAZf|a7000011aog~WdH>M0U^g1ZO|$}9Zg=R%ZE7e -t&pz}oUddU0B(<>YerIc3kgGEY;03>VRU5%0tRhmbZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +4XFiVRU5%0tRhmbZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ )ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|^mGb98cbV{~a^Y-Ioh0ssVVZ*FA(00035 b8l^B00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ &^g7Kv;Y7A delta 31 ncmaED@Y-O*1#ULh%;MtG)X9Znijxi56eeHbw%Q!XBgF#%$i52s diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 94aa24b..179c818 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:fhdn5LdZ-9IjcDFg-cAvoJl5-ZW_DqGM-4rM020O-MMt7Yew#patient-temple-cricket + Id: stl:ua~UUPtR-VR~rVc8-0tefjA~-sf0FNf~-a6kodv8-kYSgebM#crack-ballet-geneva Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -84,10 +84,10 @@ data Api : codexId UltraSONIC.CodexId @mnemonic(viva-index-tempo) data ApisChecksum : [Byte ^ 4] -@mnemonic(cake-horse-equal) +@mnemonic(mirage-bronze-regular) data Articles : semantics Semantics - , issue UltraSONIC.Issue , sig SigBlob? + , issue UltraSONIC.Issue @mnemonic(alpha-balsa-verona) data CallState : method StrictTypes.VariantName, destructible StrictTypes.VariantName? From e06284c273c79a3e799186c506e1643d25ed8dec Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 14:09:37 +0200 Subject: [PATCH 05/40] api: check that the set of libs in semantics matches the codex requirements --- api/src/api.rs | 37 +++++++++++++++++++++++++++++++++---- api/src/articles.rs | 2 +- api/src/issuer.rs | 4 ++-- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index e3777fd..842af6a 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -37,10 +37,11 @@ use core::cmp::Ordering; use core::fmt; use core::fmt::{Debug, Display, Formatter}; use core::hash::{Hash, Hasher}; +use core::num::ParseIntError; use core::str::FromStr; -use std::num::ParseIntError; +use std::collections::{BTreeMap, BTreeSet}; -use aluvm::Lib; +use aluvm::{Lib, LibId}; use amplify::confinement::{SmallOrdMap, SmallOrdSet, TinyOrdMap, TinyOrdSet, TinyString}; use amplify::num::u256; use amplify::Bytes4; @@ -49,7 +50,7 @@ use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, StrictHa use sonic_callreq::{CallState, MethodName, StateName}; use strict_encoding::TypeName; use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, TypeSystem}; -use ultrasonic::{CallId, CodexId, StateData, StateValue}; +use ultrasonic::{CallId, Codex, CodexId, StateData, StateValue}; use crate::{ RawBuilder, RawConvertor, StateAggregator, StateArithm, StateAtom, StateBuildError, StateBuilder, StateCalc, @@ -78,8 +79,11 @@ use crate::{ #[commit_encode(strategy = strict, id = StrictHash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub struct Versioned { + /// An identifier of the contract or codex. pub id: Id, + /// Version number of the API. pub version: u16, + /// A checksum for the APIs from the Semantics structure. pub checksum: ApisChecksum, } @@ -269,7 +273,10 @@ impl Semantics { /// Iterates over all APIs, including default and named ones. pub fn apis(&self) -> impl Iterator { [&self.default].into_iter().chain(self.custom.values()) } - pub fn check(&self, codex_id: CodexId) -> Result<(), SemanticError> { + /// Check whether this semantics object matches codex and the provided set of libraries for it. + pub fn check(&self, codex: &Codex) -> Result<(), SemanticError> { + let codex_id = codex.codex_id(); + let mut ids = bset![]; for api in self.apis() { if api.codex_id != codex_id { @@ -281,6 +288,24 @@ impl Semantics { } } + let lib_map = self + .libs + .iter() + .map(|lib| (lib.lib_id(), lib)) + .collect::>(); + + let libs_set = codex + .verifiers + .values() + .map(|site| site.lib_id) + .filter_map(|id| lib_map.get(&id)) + .flat_map(|lib| lib.libs.iter().copied().chain([lib.lib_id()])) + .collect::>(); + + if lib_map.into_keys().collect::>() != libs_set { + return Err(SemanticError::InvalidLibSet); + } + Ok(()) } } @@ -540,6 +565,10 @@ pub enum SemanticError { /// articles contain duplicated API {0} under a different name. DuplicatedApi(StrictHash), + /// the set of libraries provided in the contract articles doesn't match the set of libraries + /// required for the codex. + InvalidLibSet, + /// invalid signature over the contract articles. InvalidSignature, } diff --git a/api/src/articles.rs b/api/src/articles.rs index 88db131..715c706 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -76,7 +76,7 @@ impl Articles { sig: Option, sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result { - semantics.check(issue.codex_id())?; + semantics.check(&issue.codex)?; let mut me = Self { semantics, issue, sig: None }; let id = me.articles_id().commit_id(); if let Some(sig) = &sig { diff --git a/api/src/issuer.rs b/api/src/issuer.rs index 48ab2c1..404e319 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -66,7 +66,7 @@ pub struct Issuer { impl Issuer { /// Construct issuer from a codex and its semantics. pub fn new(codex: Codex, semantics: Semantics) -> Result { - semantics.check(codex.codex_id())?; + semantics.check(&codex)?; Ok(Self { semantics, codex, sig: None }) } @@ -164,7 +164,7 @@ mod _fs { let codex = Codex::strict_read(&mut reader)?; let semantics = Semantics::strict_read(&mut reader)?; semantics - .check(codex.codex_id()) + .check(&codex) .map_err(|e| DecodeError::DataIntegrityError(e.to_string()))?; let sig = Option::::strict_read(&mut reader)?; From ef5fef7f1a7b79acae1284f261d7c2ce583be1b9 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 14:10:56 +0200 Subject: [PATCH 06/40] chore: fix clippy lints --- api/src/state/adaptors.rs | 3 +++ api/src/state/aggregators.rs | 2 +- src/state.rs | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/api/src/state/adaptors.rs b/api/src/state/adaptors.rs index 05e72d6..d9e6812 100644 --- a/api/src/state/adaptors.rs +++ b/api/src/state/adaptors.rs @@ -219,6 +219,7 @@ fn typed_build(ty: StateTy, ser: ConfinedBlob<0, TOTAL_BYTES>) -> StateValue { StateValue::from_iter(elems) } +#[allow(clippy::result_large_err)] fn typed_field_build(ty: StateTy, val: StrictVal) -> Result { let mut elems = Vec::with_capacity(4); elems.push(ty); @@ -239,6 +240,7 @@ fn typed_field_build(ty: StateTy, val: StrictVal) -> Result, @@ -253,6 +255,7 @@ fn typed_field_build_items( Ok(StateValue::from_iter(items)) } +#[allow(clippy::result_large_err)] fn typed_field_build_item(val: StrictVal) -> Result, StateBuildError> { Ok(match val { StrictVal::Unit => None, diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index e249053..803e89c 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -79,7 +79,7 @@ pub enum StateAggregator { } impl StateAggregator { - pub fn read<'s, I: IntoIterator>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { + pub fn read>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { match self { StateAggregator::Unit => StrictVal::Unit, //EmbeddedReaders::Const(val) => val.clone(), diff --git a/src/state.rs b/src/state.rs index 26d487b..b542614 100644 --- a/src/state.rs +++ b/src/state.rs @@ -256,7 +256,7 @@ impl ProcessedState { let verified = self.aggregated.get(state_name)?.clone(); Some(vec![StateAtom { verified, unverified: None }]) }) - .unwrap_or_else(|| vec![]) + .unwrap_or_default() }); self.aggregated.insert(name.clone(), val); } From 6c05c461f540c9ab81cc4e2406a53831c3cf423a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 14:24:26 +0200 Subject: [PATCH 07/40] ledger: properly use Binfile with export/accept ops --- Cargo.lock | 1 + Cargo.toml | 3 +- persistence/fs/src/fs.rs | 48 +++++++-------------------- src/ledger.rs | 71 +++++++++++++++++++++++++--------------- 4 files changed, 60 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc15c5d..3e68ac1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -484,6 +484,7 @@ version = "0.12.0-rc.1" dependencies = [ "aluvm", "amplify", + "binfile", "commit_verify", "getrandom 0.2.16", "getrandom 0.3.3", diff --git a/Cargo.toml b/Cargo.toml index ab1f48c..8defd92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -74,6 +74,7 @@ aluvm.workspace = true ultrasonic.workspace = true sonic-api.workspace = true sonic-callreq.workspace = true +binfile = { workspace = true, optional = true } indexmap.workspace = true serde = { workspace = true, optional = true } @@ -87,7 +88,7 @@ petgraph = "0.8.1" default = ["std"] all = ["stl", "vesper", "binfile", "std", "serde"] -binfile = ["sonic-api/binfile"] +binfile = ["sonic-api/binfile", "dep:binfile"] std = ["sonic-api/std", "sonic-callreq/std"] vesper = ["ultrasonic/vesper"] stl = ["commit_verify/stl", "ultrasonic/stl", "strict_types/armor"] diff --git a/persistence/fs/src/fs.rs b/persistence/fs/src/fs.rs index 6a6881a..586a314 100644 --- a/persistence/fs/src/fs.rs +++ b/persistence/fs/src/fs.rs @@ -21,7 +21,6 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use std::borrow::Borrow; use std::convert::Infallible; use std::fs::File; use std::io::Write; @@ -32,14 +31,11 @@ use amplify::MultiError; use aora::file::{FileAoraIndex, FileAoraMap, FileAuraMap}; use aora::{AoraIndex, AoraMap, AuraMap, TransactionalMap}; use binfile::BinFile; -use commit_verify::StrictHash; use hypersonic::{ - AcceptError, Articles, AuthToken, CellAddr, EffectiveState, Genesis, Identity, Issue, IssueError, Ledger, - Operation, Opid, RawState, SemanticError, Semantics, SigBlob, Stock, Transition, -}; -use strict_encoding::{ - DecodeError, StreamReader, StreamWriter, StrictDecode, StrictEncode, StrictReader, StrictWriter, + Articles, CellAddr, EffectiveState, Genesis, Issue, IssueError, Ledger, Operation, Opid, RawState, SemanticError, + Semantics, SigBlob, Stock, Transition, }; +use strict_encoding::{DecodeError, StreamReader, StreamWriter, StrictDecode, StrictEncode, StrictWriter}; #[derive(Wrapper, WrapperMut, Debug, From)] #[wrapper(Deref)] @@ -56,7 +52,7 @@ const SEMANTICS_MAGIC: u64 = u64::from_be_bytes(*b"SEMANTIC"); const STATE_MAGIC: u64 = u64::from_be_bytes(*b"CONSTATE"); const GENESIS_MAGIC: u64 = u64::from_be_bytes(*b"CGENESIS"); -const VERSION_0: u16 = 0; +const PERSISTENCE_VERSION_0: u16 = 0; #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] enum OpValidity { @@ -129,16 +125,16 @@ impl Stock for StockFs { let file = File::create_new(path.join(Self::FILENAME_CODEX))?; serde_yaml::to_writer(file, articles.codex())?; - let file = BinFile::::create_new(path.join(Self::FILENAME_GENESIS))?; + let file = BinFile::::create_new(path.join(Self::FILENAME_GENESIS))?; let writer = StreamWriter::new::<{ usize::MAX }>(file); articles.genesis().strict_write(writer)?; - let file = BinFile::::create_new(path.join(Self::FILENAME_SEMANTICS))?; + let file = BinFile::::create_new(path.join(Self::FILENAME_SEMANTICS))?; let mut writer = StreamWriter::new::<{ usize::MAX }>(file); articles.semantics().strict_write(&mut writer)?; articles.sig().strict_write(writer)?; - let file = BinFile::::create_new(path.join(Self::FILENAME_STATE_RAW))?; + let file = BinFile::::create_new(path.join(Self::FILENAME_STATE_RAW))?; let writer = StreamWriter::new::<{ usize::MAX }>(file); state.raw.strict_write(writer)?; @@ -161,16 +157,16 @@ impl Stock for StockFs { let codex = serde_yaml::from_reader(file)?; // TODO: Check there is no content left at the end of reading - let file = BinFile::::open(path.join(Self::FILENAME_GENESIS))?; + let file = BinFile::::open(path.join(Self::FILENAME_GENESIS))?; let reader = StreamReader::new::<{ usize::MAX }>(file); let genesis = Genesis::strict_read(reader)?; - let file = BinFile::::open(path.join(Self::FILENAME_SEMANTICS))?; + let file = BinFile::::open(path.join(Self::FILENAME_SEMANTICS))?; let mut reader = StreamReader::new::<{ usize::MAX }>(file); let semantics = Semantics::strict_read(&mut reader)?; let sig = Option::::strict_read(reader)?; - let file = BinFile::::open(path.join(Self::FILENAME_STATE_RAW))?; + let file = BinFile::::open(path.join(Self::FILENAME_STATE_RAW))?; let reader = StreamReader::new::<{ usize::MAX }>(file); let raw = RawState::strict_read(reader)?; @@ -218,7 +214,7 @@ impl Stock for StockFs { ) -> Result> { let res = f(&mut self.articles).map_err(MultiError::A)?; - let file = BinFile::::create(self.path.join(Self::FILENAME_SEMANTICS)) + let file = BinFile::::create(self.path.join(Self::FILENAME_SEMANTICS)) .map_err(MultiError::from_b)?; let mut writer = StreamWriter::new::<{ usize::MAX }>(file); self.articles @@ -236,7 +232,7 @@ impl Stock for StockFs { fn update_state(&mut self, f: impl FnOnce(&mut EffectiveState, &Articles) -> R) -> Result { let res = f(&mut self.state, &self.articles); - let file = BinFile::::create(self.path.join(Self::FILENAME_STATE_RAW))?; + let file = BinFile::::create(self.path.join(Self::FILENAME_STATE_RAW))?; let writer = StreamWriter::new::<{ usize::MAX }>(file); self.state.raw.strict_write(writer)?; @@ -273,26 +269,6 @@ impl LedgerDir { self.export_all(writer) } - pub fn export_to_file( - &mut self, - terminals: impl IntoIterator>, - output: impl AsRef, - ) -> io::Result<()> { - let file = File::create_new(output)?; - let writer = StrictWriter::with(StreamWriter::new::<{ usize::MAX }>(file)); - self.export(terminals, writer) - } - - pub fn accept_from_file( - &mut self, - input: impl AsRef, - sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, - ) -> Result<(), MultiError> { - let file = File::open(input).map_err(MultiError::from_b)?; - let mut reader = StrictReader::with(StreamReader::new::<{ usize::MAX }>(file)); - self.accept(&mut reader, sig_validator) - } - pub fn path(&self) -> &Path { &self.0.stock().path } } diff --git a/src/ledger.rs b/src/ledger.rs index c2196cd..10a64ab 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -25,7 +25,6 @@ use alloc::collections::BTreeSet; use core::borrow::Borrow; use std::io; -use amplify::hex::ToHex; use amplify::MultiError; use commit_verify::StrictHash; use indexmap::IndexSet; @@ -39,9 +38,6 @@ use ultrasonic::{AuthToken, CallError, CellAddr, ContractId, Identity, Issue, Op use crate::deed::{CallParams, DeedBuilder}; use crate::{Articles, EffectiveState, IssueError, ProcessedState, Stock, Transition}; -pub const LEDGER_MAGIC_NUMBER: [u8; 8] = *b"DEEDLDGR"; -pub const LEDGER_VERSION: [u8; 2] = [0x00, 0x01]; - /// Contract with all its state and operations, supporting updates and rollbacks. // We need this structure to hide internal persistence methods and not to expose them. // We need the persistence trait (`Stock`) in order to allow different persistence storage @@ -294,11 +290,6 @@ impl Ledger { terminals: impl IntoIterator>, mut writer: StrictWriter, ) -> io::Result<()> { - // TODO Use binfile! - // This is compatible with BinFile - writer = LEDGER_MAGIC_NUMBER.strict_encode(writer)?; - // Version - writer = LEDGER_VERSION.strict_encode(writer)?; writer = self.contract_id().strict_encode(writer)?; self.export_aux(terminals, writer, |_, _, w| Ok(w)) } @@ -388,23 +379,6 @@ impl Ledger { ) -> Result<(), MultiError> { // We need this closure to avoid multiple `map_err`. (|| -> Result<(), AcceptError> { - let magic_bytes = <[u8; 8]>::strict_decode(reader)?; - if magic_bytes != LEDGER_MAGIC_NUMBER { - return Err(DecodeError::DataIntegrityError(format!( - "wrong contract ledger magic bytes {}", - magic_bytes.to_hex() - )) - .into()); - } - let version = <[u8; 2]>::strict_decode(reader)?; - if version != LEDGER_VERSION { - return Err(DecodeError::DataIntegrityError(format!( - "unsupported contract ledger version {}", - u16::from_be_bytes(version) - )) - .into()); - } - let contract_id = ContractId::strict_decode(reader)?; let semantics = Semantics::strict_decode(reader)?; let sig = Option::::strict_decode(reader)?; @@ -607,4 +581,49 @@ pub enum AcceptError { Serialize(SerializeError), Persistence(String), + + #[cfg(feature = "binfile")] + #[display("Invalid file format")] + InvalidFileFormat, +} + +#[cfg(feature = "binfile")] +mod _fs { + use std::path::Path; + + use binfile::BinFile; + use strict_encoding::{StreamReader, StreamWriter}; + + use super::*; + + pub const LEDGER_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"DEEDLDGR"); + pub const LEDGER_VERSION: u16 = 0; + + impl Ledger { + // TODO: Move this back to the main crate + pub fn export_to_file( + &mut self, + terminals: impl IntoIterator>, + output: impl AsRef, + ) -> io::Result<()> { + let file = BinFile::::create_new(output)?; + let writer = StrictWriter::with(StreamWriter::new::<{ usize::MAX }>(file)); + self.export(terminals, writer) + } + + // TODO: Move this back to the main crate + pub fn accept_from_file( + &mut self, + input: impl AsRef, + sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, + ) -> Result<(), MultiError> { + let file = BinFile::::open(input) + .map_err(|_| AcceptError::InvalidFileFormat) + .map_err(MultiError::from_a)?; + let mut reader = StrictReader::with(StreamReader::new::<{ usize::MAX }>(file)); + self.accept(&mut reader, sig_validator) + } + } } +#[cfg(feature = "binfile")] +pub use _fs::*; From 845e31a1bd7832f28c8023152b1f64af3a81e87f Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 14:26:34 +0200 Subject: [PATCH 08/40] api: remove unused issuer file constants --- api/src/issuer.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/api/src/issuer.rs b/api/src/issuer.rs index 404e319..4c15a5e 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -30,11 +30,6 @@ use ultrasonic::{CallId, Codex, CodexId, Identity, LibRepo}; use crate::{Api, SemanticError, Semantics, SigBlob, Versioned, LIB_NAME_SONIC}; -/// The magic number used in storing issuer as a binary file. -pub const ISSUER_MAGIC_NUMBER: [u8; 8] = *b"ISSUER "; -/// The issuer encoding version used in storing issuer as a binary file. -pub const ISSUER_VERSION: [u8; 2] = [0x00, 0x01]; - /// Articles id is a versioned variant for the contract id. pub type IssuerId = Versioned; @@ -148,7 +143,9 @@ mod _fs { use crate::{Issuer, Semantics, SigBlob}; - pub const ISSUER_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"COISSUER"); + /// The magic number used in storing issuer as a binary file. + pub const ISSUER_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"ISSUER "); + /// The issuer encoding version used in storing issuer as a binary file. pub const ISSUER_VERSION: u16 = 0; impl Issuer { @@ -189,3 +186,5 @@ mod _fs { } } } +#[cfg(feature = "binfile")] +pub use _fs::*; From 1f26c8dff73ecb8feefad07abda4ae7e4b87026c Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 16:10:31 +0200 Subject: [PATCH 09/40] api: add is_signed to Articles and Issuer --- api/src/articles.rs | 2 ++ api/src/issuer.rs | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/api/src/articles.rs b/api/src/articles.rs index 715c706..35ae5c2 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -128,6 +128,8 @@ impl Articles { /// Get a reference to a signature over the contract semantics. pub fn sig(&self) -> &Option { &self.sig } + /// Detect whether the articles are signed. + pub fn is_signed(&self) -> bool { self.sig.is_some() } /// Upgrades contract APIs if a newer version is available. /// diff --git a/api/src/issuer.rs b/api/src/issuer.rs index 4c15a5e..ec019c9 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -22,6 +22,7 @@ // the License. use aluvm::{Lib, LibId}; +use amplify::confinement::TinyString; use commit_verify::{CommitId, StrictHash}; use sonic_callreq::MethodName; use strict_encoding::TypeName; @@ -94,6 +95,8 @@ impl Issuer { pub fn codex_id(&self) -> CodexId { self.codex.codex_id() } /// Get a reference to the underlying codex. pub fn codex(&self) -> &Codex { &self.codex } + /// Get the name of the underlying codex. + pub fn codex_name(&self) -> &TinyString { &self.codex.name } /// Get a reference to the contract semantic. pub fn semantics(&self) -> &Semantics { &self.semantics } @@ -108,6 +111,9 @@ impl Issuer { /// Iterates over all codex libraries. pub fn libs(&self) -> impl Iterator { self.semantics.libs.iter() } + /// Detect whether the issuer is signed. + pub fn is_signed(&self) -> bool { self.sig.is_some() } + /// Get a [`CallId`] for a method from the default API. /// /// # Panics From 388e198f7ad2df7e01689485774e92cfed6669f3 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 16:32:23 +0200 Subject: [PATCH 10/40] fix: default build --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index ab3ee4d..4800d40 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,6 +63,8 @@ mod ledger; pub mod stl; pub use deed::{CallParams, DeedBuilder, Satisfaction}; -pub use ledger::{AcceptError, Ledger, LEDGER_MAGIC_NUMBER, LEDGER_VERSION}; +pub use ledger::{AcceptError, Ledger}; +#[cfg(feature = "binfile")] +pub use ledger::{LEDGER_MAGIC_NUMBER, LEDGER_VERSION}; pub use state::{EffectiveState, ProcessedState, RawState, Transition}; pub use stock::{IssueError, Stock}; From a488ac8233e5a44f30bfa29bf87ee5285e5462fe Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 16:32:46 +0200 Subject: [PATCH 11/40] api: reorg some aggregators --- api/src/state/aggregators.rs | 103 +++++++++++++++++--------- src/state.rs | 2 +- src/stl.rs | 2 +- stl/SONIC.vesper | 138 +++++++++++++++++++++-------------- stl/SONIC@0.12.0.sta | 70 +++++++++--------- stl/SONIC@0.12.0.stl | Bin 6251 -> 6499 bytes stl/SONIC@0.12.0.sty | 23 +++--- 7 files changed, 203 insertions(+), 135 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 803e89c..f0bb14b 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -29,57 +29,85 @@ use strict_types::StrictVal; use crate::{StateAtom, LIB_NAME_SONIC}; +/// A set of pre-defined state aggregators (see [`crate::Api::aggregators`]. #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Count(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum StateAggregator { + /// The aggregated state should have a unit value. + /// + /// This is useful when an interface requires some aggregated state to be present, + /// but you can't #[strict_type(tag = 0)] Unit, + /// Wrap an existing immutable state with an `Option::Some`. + /// + /// This is useful when an interface requires a value to be optional. #[strict_type(tag = 1)] - Const(TinyBlob), + ToSome(StateName), + /// Unwraps an optional value. + /// + /// If the value is `None`, sets the state to the provided constant. #[strict_type(tag = 2)] - Count(StateName), + UnwrapOr(StateName, TinyBlob), - /// Sum over verifiable field-element-based part of state. - /// - /// If any of the verifiable state is absent or not in the form of unsigned integer, - /// it is treated as zero. + /// Provide aggregated state as a constant value. #[strict_type(tag = 3)] - SumV(StateName), + Const(TinyBlob), + /// Converts an existing immutable or aggregated state into an optional, setting it to `Some` + /// some external check passes. + /// + /// Fails the check always if the `StateName` is another aggregated state. #[strict_type(tag = 4)] + If(StateName), + + /// Count the number of elements in the state of a certain type. + #[strict_type(tag = 0x10)] + Count(StateName), + + /// Sum over the elements of a state of a certain type. + /// + /// If any of the elements of the state are not integers, returns `None`. + #[strict_type(tag = 0x20)] Sum(StateName, StateName), - #[strict_type(tag = 5)] + #[strict_type(tag = 0x22)] Diff(StateName, StateName), - #[strict_type(tag = 0x10)] - ToSome(StateName), - - /* - /// Count values which verifiable field-element part binary representation is prefixed with a - /// given byte string. - #[strict_type(tag = 0x10)] - CountPrefixedV(StateName, TinyBlob), - */ /// Convert a verified state under the same state type into a vector. - #[strict_type(tag = 0x20)] + #[strict_type(tag = 0x30)] ListV(StateName), /// Convert a verified state under the same state type into a sorted set. - #[strict_type(tag = 0x22)] + #[strict_type(tag = 0x31)] SetV(StateName), /// Map from a field-based element state to a non-verifiable structured state - #[strict_type(tag = 0x30)] + #[strict_type(tag = 0x32)] MapV2U(StateName), + + /// Sum over verifiable field-element-based part of state. + /// + /// If any of the verifiable state is absent or not in the form of unsigned integer, + /// it is treated as zero. + #[strict_type(tag = 0x40)] + SumV(StateName), + + /// Sum over verifiable field-element-based part of state. + /// + /// If any of the verifiable state is absent or not in the form of unsigned integer, + /// sets the aggregated state to `None`. + #[strict_type(tag = 0x41)] + TrySumV(StateName), } impl StateAggregator { - pub fn read>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { + /// + pub fn aggregate>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { match self { StateAggregator::Unit => StrictVal::Unit, //EmbeddedReaders::Const(val) => val.clone(), @@ -127,6 +155,9 @@ impl StateAggregator { StateAggregator::Sum(_, _) => todo!(), StateAggregator::Diff(_, _) => todo!(), StateAggregator::ToSome(_) => todo!(), + StateAggregator::UnwrapOr(_, _) => todo!(), + StateAggregator::If(_) => todo!(), + StateAggregator::TrySumV(_) => todo!(), } } } @@ -149,7 +180,7 @@ mod test { let adaptor = StateAggregator::Count(vname!("test1")); assert_eq!( - adaptor.read(|name| { + adaptor.aggregate(|name| { assert_eq!(name.as_str(), "test1"); state.clone().into_iter() }), @@ -157,16 +188,16 @@ mod test { ); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), StrictVal::Map(none!())); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), StrictVal::Map(none!())); } #[test] @@ -181,20 +212,20 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(6u64)); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(6u64)); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(0u64)); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(0u64)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([(), (), (), (), (), ()])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([(), (), (), (), (), ()])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([()])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([()])); let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor.read(|_| { state.clone().into_iter() }), + adaptor.aggregate(|_| { state.clone().into_iter() }), StrictVal::Map(vec![(StrictVal::Unit, svnum!(5u64)),]) ); } @@ -211,20 +242,20 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(6u64)); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(6u64)); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.read(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor.read(|_| { state.clone().into_iter() }), + adaptor.aggregate(|_| { state.clone().into_iter() }), StrictVal::Map(vec![ (svnum!(5u64), svstr!("state 1")), (svnum!(1u64), svstr!("state 2")), diff --git a/src/state.rs b/src/state.rs index b542614..71ac678 100644 --- a/src/state.rs +++ b/src/state.rs @@ -249,7 +249,7 @@ impl ProcessedState { pub(super) fn aggregate(&mut self, api: &Api) { self.aggregated = bmap! {}; for (name, aggregator) in api.aggregators() { - let val = aggregator.read(|state_name| { + let val = aggregator.aggregate(|state_name| { self.immutable(state_name) .map(|map| map.values().cloned().collect::>()) .or_else(|| { diff --git a/src/stl.rs b/src/stl.rs index 58a7a50..39659d4 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:ua~UUPtR-VR~rVc8-0tefjA~-sf0FNf~-a6kodv8-kYSgebM#crack-ballet-geneva"; +pub const LIB_ID_SONIC: &str = "stl:DNcqIYE8-uA_vWkA-0dU28ca-EX0FY0n-Pw7B27z-iUGfwIw#snow-taboo-popular"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 9caee68..662ba85 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -67,19 +67,24 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -134,19 +139,24 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -267,19 +277,24 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -334,19 +349,24 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -451,19 +471,24 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -518,19 +543,24 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, StateAggregator is unit, Unit, tag 0 - bytes const, len 0..MAX8, wrapped, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - tuple sum, tag 4 + ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple unwrapOr, tag 2 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 0..MAX8 + bytes const, len 0..MAX8, wrapped, tag 3 + ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + tuple sum, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 5 + tuple diff, tag 7 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 8f21f87..43b8024 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ua~UUPtR-VR~rVc8-0tefjA~-sf0FNf~-a6kodv8-kYSgebM#crack-ballet-geneva +Id: stl:DNcqIYE8-uA_vWkA-0dU28ca-EX0FY0n-Pw7B27z-iUGfwIw#snow-taboo-popular Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: db242e5c9c2c5d3792355111818604135ab86ee5815b2b9c4ba6ca7d70717db7 +Check-SHA256: fe3e5ec84942aae9af05e9f21ed7f5aff9102d29c73da00c9dbbfeaecdd9414f 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -53,11 +53,11 @@ cH*iwNUXeq?5U##^fl2${*vH4KnP=RZf0+CZF2w#000620000000030000000000BWMyVyb!>D)VQg#w 015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPd ju4LlF^ImpZLyYlR?!^OTXL3zQ6L+J!aL;kpMB417UqnH0000000000{{R30000003t?wxa%E>>bZ>HV 015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPd -ju4LlVPD>PWZ#Lo8IC-6`F;9ynVxG|msa?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFS j{pDy0000000000{{R300000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30 -000003_);db30||3wZDDS7X=8H%egDvFM#$ljTdg0(Ml -4XFi0||3wZDDS7X=8H%TeRAKQ8V%r+0xTZ0!i;$ +-{!#M*`&cV7=*`i&V82q19NF-00aU61a5C`WdHyG0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M 7yxdMqH9J{cMAn+b8~fN0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaeg-^tDx~eajRMhI;!K4J N-dvIY`8nIi)lwlg01r|$O%JXY;03>VRU5%0tRhmbZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ )ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|^mGb98cbV{~a^Y-Ioh0ssVVZ*FA(00035 @@ -74,40 +74,44 @@ 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 delta 296 zcmaEC^x9y<5iW(q_Cob6$4j^sw*U0n*#F3N!9JpZtXDj6&`I z3)yZb9!`v2D}U6@_|rY!m8`v1S3+3Co0e(Dy=iRRe1Y4Fg`ld*Kvk1d1RkjSOqwSt z6)*GZ=4m#4>&I7Kwav{q6fkuan_|D+!-5Ah8`+Xei%arzCvhoH?h{m0Af$ZqdBOYK zTnsFwd6^{)3=E8uGlb Date: Sun, 25 May 2025 16:43:48 +0200 Subject: [PATCH 12/40] rename immutable to global and destructible to owned --- api/src/api.rs | 38 +++++----- api/src/builders.rs | 38 +++++----- api/src/lib.rs | 3 +- api/src/state/aggregators.rs | 4 +- callreq/src/builder.rs | 2 +- callreq/src/data.rs | 11 ++- callreq/src/uri.rs | 6 +- examples/dao/main.rs | 14 ++-- src/deed.rs | 6 +- src/ledger.rs | 6 +- src/state.rs | 57 +++++++-------- src/stl.rs | 2 +- src/stock.rs | 9 ++- stl/SONIC.vesper | 48 ++++++------- stl/SONIC@0.12.0.sta | 134 +++++++++++++++++------------------ stl/SONIC@0.12.0.stl | Bin 6499 -> 6472 bytes stl/SONIC@0.12.0.sty | 32 ++++----- tests/dao.rs | 14 ++-- tests/reorgs.rs | 14 ++-- 19 files changed, 212 insertions(+), 226 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index 842af6a..96d8d47 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -332,16 +332,16 @@ pub struct Api { /// Interface standards to which the API conforms. pub conforms: TinyOrdSet, - /// Name for the default API call and destructible state name. + /// Name for the default API call and owned state name. pub default_call: Option, - /// State API defines how a structured contract state is constructed out of (and converted into) - /// UltraSONIC immutable memory cells. - pub immutable: TinyOrdMap, + /// State API defines how a structured global contract state is constructed out of (and + /// converted into) UltraSONIC immutable memory cells. + pub global: TinyOrdMap, - /// State API defines how a structured contract state is constructed out of (and converted into) - /// UltraSONIC destructible memory cells. - pub destructible: TinyOrdMap, + /// State API defines how a structured owned contract state is constructed out of (and converted + /// into) UltraSONIC destructible memory cells. + pub owned: TinyOrdMap, /// Readers have access to the converted global `state` and can construct a derived state out of /// it. @@ -382,7 +382,7 @@ impl Api { self.verifiers.get(&method.into()).copied() } - pub fn convert_immutable( + pub fn convert_global( &self, data: &StateData, sys: &TypeSystem, @@ -391,7 +391,7 @@ impl Api { // of `StateValue`. Thus, we are trying all available convertors until they succeed, since the // convertors check the state type. Then, we use the state name associated with the succeeding // convertor. - for (name, api) in &self.immutable { + for (name, api) in &self.global { if let Some(verified) = api.convertor.convert(api.sem_id, data.value, sys)? { let unverified = if let Some(raw) = data.raw.as_ref() { Some(api.raw_convertor.convert(raw, sys)?) } else { None }; @@ -402,7 +402,7 @@ impl Api { Ok(None) } - pub fn convert_destructible( + pub fn convert_owned( &self, value: StateValue, sys: &TypeSystem, @@ -411,7 +411,7 @@ impl Api { // of `StateValue`. Thus, we are trying all available convertors until they succeed, since the // convertors check the state type. Then, we use the state name associated with the succeeding // convertor. - for (name, api) in &self.destructible { + for (name, api) in &self.owned { if let Some(atom) = api.convertor.convert(api.sem_id, value, sys)? { return Ok(Some((name.clone(), atom))); } @@ -430,7 +430,7 @@ impl Api { ) -> Result { let name = name.into(); let api = self - .immutable + .global .get(&name) .ok_or(StateBuildError::UnknownStateName(name))?; let value = api.builder.build(api.sem_id, data, sys)?; @@ -447,7 +447,7 @@ impl Api { ) -> Result { let name = name.into(); let api = self - .destructible + .owned .get(&name) .ok_or(StateBuildError::UnknownStateName(name))?; @@ -463,7 +463,7 @@ impl Api { ) -> Result { let name = name.into(); let api = self - .destructible + .owned .get(&name) .ok_or(StateBuildError::UnknownStateName(name))?; @@ -472,13 +472,13 @@ impl Api { pub fn calculate(&self, name: impl Into) -> Result { let name = name.into(); - let api = self.destructible.get(&name).ok_or(StateUnknown(name))?; + let api = self.owned.get(&name).ok_or(StateUnknown(name))?; Ok(api.arithmetics.calculator()) } } -/// API for immutable (append-only) state. +/// API for global (immutable, or append-only) state. /// /// API covers two main functions: taking structured data from the user input and _building_ a valid /// state included in a new contract operation - and taking contract state and _converting_ it @@ -488,7 +488,7 @@ impl Api { #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub struct ImmutableApi { +pub struct GlobalApi { /// Semantic type id for verifiable part of the state. pub sem_id: SemId, @@ -512,7 +512,7 @@ pub struct ImmutableApi { pub raw_builder: RawBuilder, } -/// API for destructible (read-once) state. +/// API for owned (destrictible, or read-once) state. /// /// API covers two main functions: taking structured data from the user input and _building_ a valid /// state included in a new contract operation - and taking contract state and _converting_ it @@ -522,7 +522,7 @@ pub struct ImmutableApi { #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub struct DestructibleApi { +pub struct OwnedApi { /// Semantic type id for the structured converted state data. pub sem_id: SemId, diff --git a/api/src/builders.rs b/api/src/builders.rs index a72b04e..7ce7a6a 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -156,7 +156,7 @@ impl IssueBuilder { pub fn append(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { self.builder = self .builder - .add_immutable(name, data, raw, self.issuer.default_api(), self.issuer.types()); + .add_global(name, data, raw, self.issuer.default_api(), self.issuer.types()); self } @@ -167,9 +167,9 @@ impl IssueBuilder { data: StrictVal, lock: Option, ) -> Self { - self.builder = - self.builder - .add_destructible(name, auth, data, lock, self.issuer.default_api(), self.issuer.types()); + self.builder = self + .builder + .add_owned(name, auth, data, lock, self.issuer.default_api(), self.issuer.types()); self } @@ -199,7 +199,7 @@ pub struct Builder { impl Builder { pub fn new(call_id: CallId) -> Self { Builder { call_id, destructible_out: none!(), immutable_out: none!() } } - pub fn add_immutable( + pub fn add_global( mut self, name: impl Into, data: StrictVal, @@ -217,7 +217,7 @@ impl Builder { self } - pub fn add_destructible( + pub fn add_owned( mut self, name: impl Into, auth: AuthToken, @@ -262,14 +262,14 @@ impl<'c> BuilderRef<'c> { BuilderRef { type_system: sys, api, inner: Builder::new(call_id) } } - pub fn add_immutable(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { + pub fn add_global(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { self.inner = self .inner - .add_immutable(name, data, raw, self.api, self.type_system); + .add_global(name, data, raw, self.api, self.type_system); self } - pub fn add_destructible( + pub fn add_owned( mut self, name: impl Into, auth: AuthToken, @@ -278,7 +278,7 @@ impl<'c> BuilderRef<'c> { ) -> Self { self.inner = self .inner - .add_destructible(name, auth, data, lock, self.api, self.type_system); + .add_owned(name, auth, data, lock, self.api, self.type_system); self } @@ -304,7 +304,7 @@ impl OpBuilder { } } - pub fn add_immutable( + pub fn add_global( mut self, name: impl Into, data: StrictVal, @@ -312,11 +312,11 @@ impl OpBuilder { api: &Api, sys: &TypeSystem, ) -> Self { - self.inner = self.inner.add_immutable(name, data, raw, api, sys); + self.inner = self.inner.add_global(name, data, raw, api, sys); self } - pub fn add_destructible( + pub fn add_owned( mut self, name: impl Into, auth: AuthToken, @@ -325,9 +325,7 @@ impl OpBuilder { api: &Api, sys: &TypeSystem, ) -> Self { - self.inner = self - .inner - .add_destructible(name, auth, data, lock, api, sys); + self.inner = self.inner.add_owned(name, auth, data, lock, api, sys); self } @@ -391,14 +389,14 @@ impl<'c> OpBuilderRef<'c> { Self { api, type_system: sys, inner } } - pub fn add_immutable(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { + pub fn add_global(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { self.inner = self .inner - .add_immutable(name, data, raw, self.api, self.type_system); + .add_global(name, data, raw, self.api, self.type_system); self } - pub fn add_destructible( + pub fn add_owned( mut self, name: impl Into, auth: AuthToken, @@ -407,7 +405,7 @@ impl<'c> OpBuilderRef<'c> { ) -> Self { self.inner = self .inner - .add_destructible(name, auth, data, lock, self.api, self.type_system); + .add_owned(name, auth, data, lock, self.api, self.type_system); self } diff --git a/api/src/lib.rs b/api/src/lib.rs index c8f8f75..c06828a 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -58,8 +58,7 @@ mod builders; mod state; pub use api::{ - Api, ApisChecksum, DestructibleApi, ImmutableApi, ParseVersionedError, SemanticError, Semantics, StateUnknown, - Versioned, + Api, ApisChecksum, GlobalApi, OwnedApi, ParseVersionedError, SemanticError, Semantics, StateUnknown, Versioned, }; pub use articles::{Articles, ArticlesId, SigBlob}; pub use builders::{Builder, BuilderRef, CoreParams, IssueParams, NamedState, OpBuilder, OpBuilderRef}; diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index f0bb14b..c2cc146 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -42,7 +42,7 @@ pub enum StateAggregator { #[strict_type(tag = 0)] Unit, - /// Wrap an existing immutable state with an `Option::Some`. + /// Wrap an existing state with an `Option::Some`. /// /// This is useful when an interface requires a value to be optional. #[strict_type(tag = 1)] @@ -58,7 +58,7 @@ pub enum StateAggregator { #[strict_type(tag = 3)] Const(TinyBlob), - /// Converts an existing immutable or aggregated state into an optional, setting it to `Some` + /// Converts an existing global or aggregated state into an optional, setting it to `Some` /// some external check passes. /// /// Fails the check always if the `StateName` is another aggregated state. diff --git a/callreq/src/builder.rs b/callreq/src/builder.rs index ff097fe..4733f5f 100644 --- a/callreq/src/builder.rs +++ b/callreq/src/builder.rs @@ -78,7 +78,7 @@ impl CallRequest { let mut call = self .call .expect("use_method must be called before use_state"); - call.destructible = Some(state); + call.owned = Some(state); self.call = Some(call); self } diff --git a/callreq/src/data.rs b/callreq/src/data.rs index 301cc67..d22bb73 100644 --- a/callreq/src/data.rs +++ b/callreq/src/data.rs @@ -44,17 +44,14 @@ pub type MethodName = VariantName; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", bound = ""))] pub struct CallState { pub method: MethodName, - pub destructible: Option, + pub owned: Option, } impl CallState { - pub fn new(method: impl Into) -> Self { Self { method: method.into(), destructible: None } } + pub fn new(method: impl Into) -> Self { Self { method: method.into(), owned: None } } - pub fn with(method: impl Into, destructible: impl Into) -> Self { - Self { - method: method.into(), - destructible: Some(destructible.into()), - } + pub fn with(method: impl Into, owned: impl Into) -> Self { + Self { method: method.into(), owned: Some(owned.into()) } } } diff --git a/callreq/src/uri.rs b/callreq/src/uri.rs index 44ec0ae..a0eb0f2 100644 --- a/callreq/src/uri.rs +++ b/callreq/src/uri.rs @@ -74,7 +74,7 @@ where } if let Some(call) = &self.call { write!(f, "{}/", call.method)?; - if let Some(state) = &call.destructible { + if let Some(state) = &call.owned { write!(f, "{state}/")?; } } @@ -175,12 +175,12 @@ where let mut call = None; if let Some(method) = method { let method = method.as_str().parse().map_err(ParseError::MethodInvalid)?; - let destructible = if let Some(state) = state { + let owned = if let Some(state) = state { Some(state.as_str().parse().map_err(ParseError::StateInvalid)?) } else { None }; - call = Some(CallState { method, destructible }); + call = Some(CallState { method, owned }); } let mut query_params: IndexMap = IndexMap::new(); diff --git a/examples/dao/main.rs b/examples/dao/main.rs index 293c2f7..b854014 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -36,7 +36,7 @@ use std::path::Path; use aluvm::{CoreConfig, LibSite}; use amplify::num::u256; use commit_verify::{Digest, Sha256}; -use hypersonic::{Api, DestructibleApi, ImmutableApi}; +use hypersonic::{Api, GlobalApi, OwnedApi}; use sonic_persist_fs::LedgerDir; use sonicapi::{ Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, @@ -73,8 +73,8 @@ fn api() -> Api { codex_id: codex.codex_id(), conforms: none!(), default_call: None, - immutable: tiny_bmap! { - vname!("_parties") => ImmutableApi { + global: tiny_bmap! { + vname!("_parties") => GlobalApi { published: true, sem_id: types.get("DAO.PartyId"), convertor: StateConvertor::TypedEncoder(u256::ZERO), @@ -82,7 +82,7 @@ fn api() -> Api { raw_convertor: RawConvertor::StrictDecode(types.get("DAO.Party")), raw_builder: RawBuilder::StrictEncode(types.get("DAO.Party")), }, - vname!("_votings") => ImmutableApi { + vname!("_votings") => GlobalApi { published: true, sem_id: types.get("DAO.VoteId"), convertor: StateConvertor::TypedEncoder(u256::ONE), @@ -90,7 +90,7 @@ fn api() -> Api { raw_convertor: RawConvertor::StrictDecode(types.get("DAO.Voting")), raw_builder: RawBuilder::StrictEncode(types.get("DAO.Voting")), }, - vname!("_votes") => ImmutableApi { + vname!("_votes") => GlobalApi { published: true, sem_id: types.get("DAO.CastVote"), convertor: StateConvertor::TypedEncoder(u256::from(2u8)), @@ -99,8 +99,8 @@ fn api() -> Api { raw_builder: RawBuilder::StrictEncode(SemId::unit()), }, }, - destructible: tiny_bmap! { - vname!("signers") => DestructibleApi { + owned: tiny_bmap! { + vname!("signers") => OwnedApi { sem_id: types.get("DAO.PartyId"), arithmetics: StateArithm::NonFungible, convertor: StateConvertor::TypedEncoder(u256::ZERO), diff --git a/src/deed.rs b/src/deed.rs index 8032948..27c617c 100644 --- a/src/deed.rs +++ b/src/deed.rs @@ -76,7 +76,7 @@ impl DeedBuilder<'_, S> { pub fn append(mut self, name: impl Into, data: StrictVal, raw: Option) -> Self { let api = &self.ledger.articles().default_api(); let types = &self.ledger.articles().types(); - self.builder = self.builder.add_immutable(name, data, raw, api, types); + self.builder = self.builder.add_global(name, data, raw, api, types); self } @@ -89,9 +89,7 @@ impl DeedBuilder<'_, S> { ) -> Self { let api = &self.ledger.articles().default_api(); let types = &self.ledger.articles().types(); - self.builder = self - .builder - .add_destructible(name, auth, data, lock, api, types); + self.builder = self.builder.add_owned(name, auth, data, lock, api, types); self } diff --git a/src/ledger.rs b/src/ledger.rs index 10a64ab..7901ce8 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -324,9 +324,9 @@ impl Ledger { // Include all operations defining published state let state = self.state(); let mut collect = |api: &Api, state: &ProcessedState| { - for (state_name, immutable) in &api.immutable { - if immutable.published { - let Some(cells) = state.immutable.get(state_name) else { + for (state_name, owned) in &api.global { + if owned.published { + let Some(cells) = state.global.get(state_name) else { continue; }; opids.extend(cells.keys().map(|addr| addr.opid)); diff --git a/src/state.rs b/src/state.rs index 71ac678..95604f6 100644 --- a/src/state.rs +++ b/src/state.rs @@ -199,11 +199,11 @@ impl RawState { pub(self) fn rollback(&mut self, transition: Transition) { let opid = transition.opid; - let mut immutable = mem::take(&mut self.global); + let mut global = mem::take(&mut self.global); let mut owned = mem::take(&mut self.owned); - immutable = LargeOrdMap::from_iter_checked(immutable.into_iter().filter(|(addr, _)| addr.opid != opid)); + global = LargeOrdMap::from_iter_checked(global.into_iter().filter(|(addr, _)| addr.opid != opid)); owned = LargeOrdMap::from_iter_checked(owned.into_iter().filter(|(addr, _)| addr.opid != opid)); - self.global = immutable; + self.global = global; self.owned = owned; // TODO: Use `retain` instead of the above workaround once supported by amplify @@ -221,36 +221,34 @@ impl RawState { #[derive(Clone, Eq, PartialEq, Debug, Default)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub struct ProcessedState { - pub immutable: BTreeMap>, - pub destructible: BTreeMap>, + pub global: BTreeMap>, + pub owned: BTreeMap>, pub aggregated: BTreeMap, - pub invalid_immutable: BTreeMap, - pub invalid_destructible: BTreeMap, + pub invalid_global: BTreeMap, + pub invalid_owned: BTreeMap, } impl ProcessedState { pub fn with(raw: &RawState, api: &Api, sys: &TypeSystem) -> Self { let mut me = ProcessedState::default(); for (addr, state) in &raw.global { - me.process_immutable(*addr, state, api, sys); + me.process_global(*addr, state, api, sys); } for (addr, state) in &raw.owned { - me.process_destructible(*addr, state, api, sys); + me.process_owned(*addr, state, api, sys); } me } - pub fn immutable(&self, name: &StateName) -> Option<&BTreeMap> { self.immutable.get(name) } + pub fn global(&self, name: &StateName) -> Option<&BTreeMap> { self.global.get(name) } - pub fn destructible(&self, name: &StateName) -> Option<&BTreeMap> { - self.destructible.get(name) - } + pub fn owned(&self, name: &StateName) -> Option<&BTreeMap> { self.owned.get(name) } pub(super) fn aggregate(&mut self, api: &Api) { self.aggregated = bmap! {}; for (name, aggregator) in api.aggregators() { let val = aggregator.aggregate(|state_name| { - self.immutable(state_name) + self.global(state_name) .map(|map| map.values().cloned().collect::>()) .or_else(|| { let verified = self.aggregated.get(state_name)?.clone(); @@ -267,59 +265,56 @@ impl ProcessedState { let op = op.as_operation(); for (no, state) in op.immutable_out.iter().enumerate() { let addr = CellAddr::new(opid, no as u16); - self.process_immutable(addr, state, api, sys); + self.process_global(addr, state, api, sys); } for input in &op.destructible_in { - for map in self.destructible.values_mut() { + for map in self.owned.values_mut() { map.remove(&input.addr); } } for (no, state) in op.destructible_out.iter().enumerate() { let addr = CellAddr::new(opid, no as u16); - self.process_destructible(addr, state, api, sys); + self.process_owned(addr, state, api, sys); } } pub(self) fn rollback(&mut self, transition: &Transition, api: &Api, sys: &TypeSystem) { let opid = transition.opid; - self.immutable + self.global .values_mut() .for_each(|state| state.retain(|addr, _| addr.opid != opid)); - self.destructible + self.owned .values_mut() .for_each(|state| state.retain(|addr, _| addr.opid != opid)); for (addr, cell) in &transition.destroyed { - self.process_destructible(*addr, cell, api, sys); + self.process_owned(*addr, cell, api, sys); } } - fn process_immutable(&mut self, addr: CellAddr, state: &StateData, api: &Api, sys: &TypeSystem) { - match api.convert_immutable(state, sys) { + fn process_global(&mut self, addr: CellAddr, state: &StateData, api: &Api, sys: &TypeSystem) { + match api.convert_global(state, sys) { // This means this state is unrelated to this API Ok(None) => {} Ok(Some((name, atom))) => { - self.immutable.entry(name).or_default().insert(addr, atom); + self.global.entry(name).or_default().insert(addr, atom); } Err(_) => { - self.invalid_immutable.insert(addr, state.clone()); + self.invalid_global.insert(addr, state.clone()); } } } - fn process_destructible(&mut self, addr: CellAddr, state: &StateCell, api: &Api, sys: &TypeSystem) { - match api.convert_destructible(state.data, sys) { + fn process_owned(&mut self, addr: CellAddr, state: &StateCell, api: &Api, sys: &TypeSystem) { + match api.convert_owned(state.data, sys) { // This means this state is unrelated to this API Ok(None) => {} Ok(Some((name, atom))) => { - self.destructible - .entry(name) - .or_default() - .insert(addr, atom); + self.owned.entry(name).or_default().insert(addr, atom); } Err(_) => { - self.invalid_destructible.insert(addr, state.data); + self.invalid_owned.insert(addr, state.data); } } } diff --git a/src/stl.rs b/src/stl.rs index 39659d4..a8f4dcd 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:DNcqIYE8-uA_vWkA-0dU28ca-EX0FY0n-Pw7B27z-iUGfwIw#snow-taboo-popular"; +pub const LIB_ID_SONIC: &str = "stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/src/stock.rs b/src/stock.rs index a6d0a3a..1bb6a14 100644 --- a/src/stock.rs +++ b/src/stock.rs @@ -236,7 +236,7 @@ pub trait Stock { /// transitions that were ever provided via [`Self::add_transition`]. fn trace(&self) -> impl Iterator; - /// Returns an id of an operation reading a provided address (operation immutable state + /// Returns an id of an operation reading a provided address (operation global state /// output). /// /// # Nota bene @@ -255,8 +255,7 @@ pub trait Stock { /// [`Self::add_reading`] as an `addr` argument. fn read_by(&self, addr: CellAddr) -> impl Iterator; - /// Returns an id of an operation spending a provided address (operation destructible state - /// output). + /// Returns an id of an operation spending a provided address (operation owned state output). /// /// # Nota bene /// @@ -339,7 +338,7 @@ pub trait Stock { /// the `transition` itself matches the known data for it. fn add_transition(&mut self, opid: Opid, transition: &Transition); - /// Registers a given operation immutable output (`addr`) to be read (used as an input) in + /// Registers a given operation global output (`addr`) to be read (used as an input) in /// operation `reader`. /// /// # Blocking I/O @@ -352,7 +351,7 @@ pub trait Stock { /// - add the `reader` to the list of readers who had accessed the address. fn add_reading(&mut self, addr: CellAddr, reader: Opid); - /// Registers a given operation destructible output (`spent`) to be spent (used as an input) in + /// Registers a given operation owned output (`spent`) to be spent (used as an input) in /// operation `spender`. /// /// # Blocking I/O diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 662ba85..cb84fc5 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -28,9 +28,9 @@ rec Semantics rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -45,9 +45,9 @@ rec Semantics bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor @@ -100,9 +100,9 @@ rec Semantics rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -117,9 +117,9 @@ rec Semantics bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor @@ -238,9 +238,9 @@ rec Issuer rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -255,9 +255,9 @@ rec Issuer bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor @@ -310,9 +310,9 @@ rec Issuer rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -327,9 +327,9 @@ rec Issuer bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor @@ -432,9 +432,9 @@ rec Articles rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -449,9 +449,9 @@ rec Articles bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor @@ -504,9 +504,9 @@ rec Articles rec some, CallState, option, wrapped, tag 1 ascii method, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii some, option, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - map immutable, len 0..MAX8 + map global, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, ImmutableApi + rec value, GlobalApi bytes semId, len 32, aka SemId enum published, Bool, false 0, true 1 union convertor, StateConvertor @@ -521,9 +521,9 @@ rec Articles bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 - map destructible, len 0..MAX8 + map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - rec value, DestructibleApi + rec value, OwnedApi bytes semId, len 32, aka SemId enum arithmetics, StateArithm, fungible 0, nonFungible 1 union convertor, StateConvertor diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 43b8024..3307e14 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:DNcqIYE8-uA_vWkA-0dU28ca-EX0FY0n-Pw7B27z-iUGfwIw#snow-taboo-popular +Id: stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: fe3e5ec84942aae9af05e9f21ed7f5aff9102d29c73da00c9dbbfeaecdd9414f +Check-SHA256: e551738e9effa77e9cbe884672383fa9b97e65955cee94e901a5b1eff5f15ad1 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -47,71 +47,71 @@ D|DxJ;;J@Cth|EksiOt-HPJ-=lHfc*2SaaUWq3(sw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u )#j{6K2It;&?57S>Qs2Fvw;u@LuG7iL1bid{aM4p>0IFOo~Y652;7|;2>m$hiUk~2&U-senAm#W2U1~o L}7Gc5aA^hz2V-w!Wq3(s0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaezmOYKhUG5TPt*@ cH*iwNUXeq?5U##^fl2${*vH4KnP=RZf0+CZF2w#000620000000030000000000BWMyVyb!>D)VQg#w -1OfmAZf|a7000011aog~WdH>M0X%2<`V5Xnw4=-d1_`8fg(m2+l}g^fB0Ix1nd=gGR0(NqZFO{EVr*pq -3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+LX<}?; -015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPd -ju4LlF^ImpZLyYlR?!^OTXL3zQ6L+J!aL;kpMB417UqnH0000000000{{R30000003t?wxa%E>>bZ>HV -015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPd -ju4Ll4}ZJ$L_0V{pxD+6orDL#%OHgtud!<$;xZwu^TX2^0000000000{{R300000033g?2X=Z6?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFS -j{pDy0000000000{{R300000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30 -000003_);db30||3wZDDS7X=8H%TeRAKQ8V%r+0xTZ0!i;$ --{!#M*`&cV7=*`i&V82q19NF-00aU61a5C`WdHyG0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M -7yxdMqH9J{cMAn+b8~fN0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaeg-^tDx~eajRMhI;!K4J -N-dvIY`8nIi)lwlg01r|$O%JXY;03>VRU5%0tRhmbZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ -)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|^mGb98cbV{~a^Y-Ioh0ssVVZ*FA(00035 -b8l^B00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ -&^g7@39Wprs{a{&|S*VI`tz9el{x{lbX!>yRN -+gXnJ*lWV;;wWejWN!&$Z*F#Fa&&KU0ZY1V{(jeKNRd~JW5MDzhNeb+DoR(aP2h)Tw2zR+4hLd&X>4R= -asjZhmB~>Q8|KQanMz<{C(8<)R&spoI{%|$5%3ocX`>8xX>@L7b8}N=ZAoMT>7J73J3yCzk$#1)IEB9} -O*pr-e%zuW2Pj0mw%Cd -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 +I7Fb>)(f442f)i9g&VK2YaZeo|5M~K$m}! +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 +&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4M91#D?^bXEWb0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW +2Pj0>g~&^g77J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0>g~&^g7DjZB_sU0Rris +lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>` +<)y^XImOPdju4LvQ*>c;WkGUjbZBh@0tjYxZf9v?Y-IooZf|Zzb#7;AVr*pr3{!MrbY((yX>4R=as&ea +1a)p{bN~PV5DavAaAjmgZewp`WpV%o0RR9X5fOBGaAjmhX=Q9=MQ&qnWMy&y1pxp6AP!S>VRU6fZ*F#F +a&&KU1OosBb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X3RH4o +ZgXjLX>V=@0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW=(>>~JNCWGL*g;d+ ++M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJFd8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJlC**6;}%ie4wrTWpLzfxZ1G^f?j#teR+2rNlD$O59e#ogQs +B77jPl+h5j^*S;Kc4cyNX>V=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN!p14WBr9LqgTBPo +;{gj!U^Sf= -----END STRICT TYPE LIB----- diff --git a/stl/SONIC@0.12.0.stl b/stl/SONIC@0.12.0.stl index 17b5b064d05e0c371003f7baea654d28c294bfcf..4348d71064c976cef1638cbffeb17aecaed3f86f 100644 GIT binary patch delta 352 zcmaECbi!yuD5v_J2it3on-()XKX3C!*?d+>V~Uri`RXN)Pxd$c&isE@l`TCdKPfS1 z5|@kFlLbn8?R;|=E)agVB;<@*=GzI+?y)~nx2nBsbfEX{#b^d7_z$I7^UL#6Q-C@Z z>U>=0)`~ylQOQcXw<2KW=Ca*8j2^LBN6pyWbn8a#KKIQjTt18nd%amRmZjHqs`jo7 z@a8%4pl@w}M&+@S37?93A6U0kqLYvFII?rPgPpfIi*Er@23WCi z_=8+EIg8I{aw6~l$teO4)E%@UvE^R?I*`|?F> a$)&|5`MHz0lqdHIDk>0CzWKc16m|ep0h_M? delta 375 zcmX?M^w?-aD5sW9`p;iHeQsM8pJ8I-TvFPq_G05yuY3EItPh*cd@WQF!kL+yTUwHs zl#@C+Ku~$|d`?B%LypW7IT%>y^`yGL)LOieN0z&5=baS`DlSXpY&gGy^%VmY{D;y! zDXGOJMWx9lnMkH67R!L2rVJHg6G}!VUnjOQ#P2 diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 58916d7..89e359f 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:DNcqIYE8-uA_vWkA-0dU28ca-EX0FY0n-Pw7B27z-iUGfwIw#snow-taboo-popular + Id: stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -71,12 +71,12 @@ import StrictTypes#henry-heart-survive use TypeSystem#adrian-boris-sponsor -@mnemonic(ricardo-mary-genius) +@mnemonic(super-cool-julius) data Api : codexId UltraSONIC.CodexId , conforms {U16 ^ ..0xff} , defaultCall CallState? - , immutable {StrictTypes.VariantName -> ^ ..0xff ImmutableApi} - , destructible {StrictTypes.VariantName -> ^ ..0xff DestructibleApi} + , global {StrictTypes.VariantName -> ^ ..0xff GlobalApi} + , owned {StrictTypes.VariantName -> ^ ..0xff OwnedApi} , aggregators {StrictTypes.VariantName -> ^ ..0xff StateAggregator} , verifiers {StrictTypes.VariantName -> ^ ..0xff U16} , errors {U256 -> ^ ..0xff [Unicode ^ ..0xff]} @@ -89,19 +89,11 @@ data Articles : semantics Semantics , sig SigBlob? , issue UltraSONIC.Issue -@mnemonic(alpha-balsa-verona) -data CallState : method StrictTypes.VariantName, destructible StrictTypes.VariantName? +@mnemonic(sparta-ginger-analyze) +data CallState : method StrictTypes.VariantName, owned StrictTypes.VariantName? -@mnemonic(career-ultra-harbor) -data DestructibleApi : semId StrictTypes.SemId - , arithmetics StateArithm - , convertor StateConvertor - , builder StateBuilder - , witnessSemId StrictTypes.SemId - , witnessBuilder StateBuilder - -@mnemonic(lexicon-mary-ceramic) -data ImmutableApi : semId StrictTypes.SemId +@mnemonic(polaris-yellow-public) +data GlobalApi : semId StrictTypes.SemId , published Std.Bool , convertor StateConvertor , builder StateBuilder @@ -113,6 +105,14 @@ data Issuer : codex UltraSONIC.Codex , semantics Semantics , sig SigBlob? +@mnemonic(history-support-manual) +data OwnedApi : semId StrictTypes.SemId + , arithmetics StateArithm + , convertor StateConvertor + , builder StateBuilder + , witnessSemId StrictTypes.SemId + , witnessBuilder StateBuilder + @mnemonic(tomato-gordon-craft) data RawBuilder : strictEncode StrictTypes.SemId | (|) diff --git a/tests/dao.rs b/tests/dao.rs index 578600d..abec963 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -34,7 +34,7 @@ use std::path::Path; use aluvm::{CoreConfig, LibSite}; use amplify::num::u256; use commit_verify::{Digest, Sha256}; -use hypersonic::{Api, DestructibleApi, ImmutableApi}; +use hypersonic::{Api, GlobalApi, OwnedApi}; use sonic_persist_fs::LedgerDir; use sonicapi::{ Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, @@ -71,8 +71,8 @@ fn api() -> Api { codex_id: codex.codex_id(), conforms: none!(), default_call: None, - immutable: tiny_bmap! { - vname!("_parties") => ImmutableApi { + global: tiny_bmap! { + vname!("_parties") => GlobalApi { published: true, sem_id: types.get("DAO.PartyId"), convertor: StateConvertor::TypedEncoder(u256::ZERO), @@ -80,7 +80,7 @@ fn api() -> Api { raw_convertor: RawConvertor::StrictDecode(types.get("DAO.Party")), raw_builder: RawBuilder::StrictEncode(types.get("DAO.Party")), }, - vname!("_votings") => ImmutableApi { + vname!("_votings") => GlobalApi { published: true, sem_id: types.get("DAO.VoteId"), convertor: StateConvertor::TypedEncoder(u256::ONE), @@ -88,7 +88,7 @@ fn api() -> Api { raw_convertor: RawConvertor::StrictDecode(types.get("DAO.Voting")), raw_builder: RawBuilder::StrictEncode(types.get("DAO.Voting")), }, - vname!("_votes") => ImmutableApi { + vname!("_votes") => GlobalApi { published: true, sem_id: types.get("DAO.CastVote"), convertor: StateConvertor::TypedEncoder(u256::from(2u8)), @@ -97,8 +97,8 @@ fn api() -> Api { raw_builder: RawBuilder::StrictEncode(SemId::unit()), }, }, - destructible: tiny_bmap! { - vname!("signers") => DestructibleApi { + owned: tiny_bmap! { + vname!("signers") => OwnedApi { sem_id: types.get("DAO.PartyId"), arithmetics: StateArithm::NonFungible, convertor: StateConvertor::TypedEncoder(u256::ZERO), diff --git a/tests/reorgs.rs b/tests/reorgs.rs index 1690bc5..4484861 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -35,7 +35,7 @@ use std::path::PathBuf; use aluvm::{CoreConfig, LibSite}; use amplify::num::u256; use commit_verify::{Digest, Sha256}; -use hypersonic::{Api, DestructibleApi}; +use hypersonic::{Api, OwnedApi}; use indexmap::{indexset, IndexSet}; use petgraph::dot::{Config, Dot}; use petgraph::graph::EdgeReference; @@ -144,9 +144,9 @@ fn api() -> Api { codex_id: codex.codex_id(), conforms: none!(), default_call: None, - immutable: none!(), - destructible: tiny_bmap! { - vname!("amount") => DestructibleApi { + global: none!(), + owned: tiny_bmap! { + vname!("amount") => OwnedApi { sem_id: types.get("Fungible.Amount"), arithmetics: StateArithm::Fungible, convertor: StateConvertor::TypedEncoder(u256::ZERO), @@ -202,7 +202,7 @@ fn setup(name: &str) -> LedgerDir { fs::create_dir_all(&contract_path).expect("Unable to create a contract folder"); let mut ledger = LedgerDir::new(articles, contract_path).expect("Can't issue a contract"); - let owned = &ledger.state().main.destructible; + let owned = &ledger.state().main.owned; assert_eq!(owned.len(), 1); let owned = owned.get("amount").unwrap(); assert_eq!(owned.len(), 20); @@ -234,7 +234,7 @@ fn setup(name: &str) -> LedgerDir { prev = new_prev; } - let owned = &ledger.state().main.destructible; + let owned = &ledger.state().main.owned; assert_eq!(owned.len(), 1); assert_eq!(prev.len(), 20); let owned = owned.get("amount").unwrap(); @@ -324,7 +324,7 @@ fn check_rollback(ledger: LedgerDir, mut removed: IndexSet) -> IndexS } // Now we check that no outputs of the rolled-back ops participate in the valid state - let state = ledger.state().main.destructible.get("amount").unwrap(); + let state = ledger.state().main.owned.get("amount").unwrap(); eprintln!("Not rolled back outputs:"); for addr in state.keys() { assert!(!removed_opids.contains(&addr.opid)); From 5c06d6e0d5583c315096abb429d74ec1badf40fc Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 17:16:19 +0200 Subject: [PATCH 13/40] api: allow AluVM aggregators in the future --- api/src/api.rs | 17 ++-- api/src/articles.rs | 4 +- api/src/issuer.rs | 4 +- api/src/state/aggregators.rs | 155 +++++++++++++++++++++++++------- cli/src/dump.rs | 2 +- examples/dao/main.rs | 3 +- src/state.rs | 34 ++++--- src/stl.rs | 2 +- stl/SONIC.vesper | 170 +++++++++++++++++++++++------------ stl/SONIC@0.12.0.sta | 84 ++++++++--------- stl/SONIC@0.12.0.stl | Bin 6472 -> 6654 bytes stl/SONIC@0.12.0.sty | 11 +-- tests/dao.rs | 3 +- tests/reorgs.rs | 3 +- 14 files changed, 330 insertions(+), 162 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index 96d8d47..6231f90 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -142,8 +142,9 @@ pub enum ParseVersionedError { /// /// # Nota bene /// -/// This is not a unique identifier! It is created just for UI, so users can easily vissually -/// distinguish different sets of APIs from each other. +/// This is not a unique identifier! +/// It is created just for UI, so users can easily visually distinguish different sets of APIs from +/// each other. /// /// This type is not - and must not be used in any verification. #[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)] @@ -224,7 +225,9 @@ pub struct Semantics { /// For instance, a contract may provide multiple tokens using different token names. pub custom: SmallOrdMap, /// A set of zk-AluVM libraries called from the contract codex. - pub libs: SmallOrdSet, + pub codex_libs: SmallOrdSet, + /// A set of AluVM libraries called from the APIs. + pub api_libs: SmallOrdSet, /// The type system used by the contract APIs. pub types: TypeSystem, } @@ -255,14 +258,16 @@ impl CommitEncode for Semantics { type CommitmentId = ApisChecksum; fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.version); + // We do not commit to the codex_libs since thea are not a part of APIs and are commit to inside the + // codex. The fact that there are no other libs is verified in the Articles and Issuer constructors. let apis = SmallOrdMap::from_iter_checked( self.custom .iter() .map(|(name, api)| (name.clone(), api.api_id())), ); e.commit_to_linear_map(&apis); - // We do not commit to the libs since thea are not a part of APIs and are commit to inside the - // codes. The fact that there are no other libs is verified in the Articles and Issuer constructors. + let libs = SmallOrdSet::from_iter_checked(self.api_libs.iter().map(Lib::lib_id)); + e.commit_to_linear_set(&libs); e.commit_to_serialized(&self.types.id()); } } @@ -289,7 +294,7 @@ impl Semantics { } let lib_map = self - .libs + .api_libs .iter() .map(|lib| (lib.lib_id(), lib)) .collect::>(); diff --git a/api/src/articles.rs b/api/src/articles.rs index 35ae5c2..f8481e2 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -113,7 +113,7 @@ impl Articles { /// Iterates over all APIs, including the default and the named ones. pub fn apis(&self) -> impl Iterator { self.semantics.apis() } /// Iterates over all codex libraries. - pub fn libs(&self) -> impl Iterator { self.semantics.libs.iter() } + pub fn codex_libs(&self) -> impl Iterator { self.semantics.codex_libs.iter() } /// Get a reference to the contract issue information. pub fn issue(&self) -> &Issue { &self.issue } @@ -172,7 +172,7 @@ impl Articles { impl LibRepo for Articles { fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { self.semantics - .libs + .codex_libs .iter() .find(|lib| lib.lib_id() == lib_id) } diff --git a/api/src/issuer.rs b/api/src/issuer.rs index ec019c9..583ba34 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -109,7 +109,7 @@ impl Issuer { /// Iterates over all APIs, including the default and the named ones. pub fn apis(&self) -> impl Iterator { self.semantics.apis() } /// Iterates over all codex libraries. - pub fn libs(&self) -> impl Iterator { self.semantics.libs.iter() } + pub fn codex_libs(&self) -> impl Iterator { self.semantics.codex_libs.iter() } /// Detect whether the issuer is signed. pub fn is_signed(&self) -> bool { self.sig.is_some() } @@ -130,7 +130,7 @@ impl Issuer { impl LibRepo for Issuer { fn get_lib(&self, lib_id: LibId) -> Option<&Lib> { self.semantics - .libs + .codex_libs .iter() .find(|lib| lib.lib_id() == lib_id) } diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index c2cc146..4a7c0ac 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -21,7 +21,10 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use amplify::confinement::TinyBlob; +use std::collections::BTreeMap; + +use aluvm::{Lib, LibId, LibSite}; +use amplify::confinement::{TinyBlob, TinyOrdSet}; use sonic_callreq::StateName; use strict_encoding::StrictDumb; use strict_types::value::StrictNum; @@ -58,13 +61,6 @@ pub enum StateAggregator { #[strict_type(tag = 3)] Const(TinyBlob), - /// Converts an existing global or aggregated state into an optional, setting it to `Some` - /// some external check passes. - /// - /// Fails the check always if the `StateName` is another aggregated state. - #[strict_type(tag = 4)] - If(StateName), - /// Count the number of elements in the state of a certain type. #[strict_type(tag = 0x10)] Count(StateName), @@ -103,12 +99,30 @@ pub enum StateAggregator { /// sets the aggregated state to `None`. #[strict_type(tag = 0x41)] TrySumV(StateName), + + /// Execute a custom function on the state. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + /// The aggregated state which must be computed when the script is called. + TinyOrdSet, + ), } impl StateAggregator { + /// Compute state via applying some aggregator function. + /// + /// # Returns /// - pub fn aggregate>(&self, state: impl Fn(&StateName) -> I) -> StrictVal { - match self { + /// Aggregated state value. If the computing fails due to any exception, `None`. + pub fn aggregate<'libs, I: IntoIterator>( + &self, + state: impl Fn(&StateName) -> I, + libs: impl IntoIterator, + ) -> Option { + Some(match self { StateAggregator::Unit => StrictVal::Unit, //EmbeddedReaders::Const(val) => val.clone(), StateAggregator::Count(name) => { @@ -156,9 +170,21 @@ impl StateAggregator { StateAggregator::Diff(_, _) => todo!(), StateAggregator::ToSome(_) => todo!(), StateAggregator::UnwrapOr(_, _) => todo!(), - StateAggregator::If(_) => todo!(), StateAggregator::TrySumV(_) => todo!(), - } + + StateAggregator::AluVM(entry, _) => { + let libs = libs + .into_iter() + .map(|lib| (lib.lib_id(), lib)) + .collect::>(); + let mut vm = aluvm::Vm::>::new(); + // For now, we ignore all computations and return `None` anyway. + // This leaves a way to add proper VM computing in the future + // in a backward-compatible way. + let _status = vm.exec(*entry, &(), |id| libs.get(&id)); + return None; + } + }) } } @@ -180,24 +206,49 @@ mod test { let adaptor = StateAggregator::Count(vname!("test1")); assert_eq!( - adaptor.aggregate(|name| { - assert_eq!(name.as_str(), "test1"); - state.clone().into_iter() - }), + adaptor + .aggregate( + |name| { + assert_eq!(name.as_str(), "test1"); + state.clone().into_iter() + }, + None + ) + .unwrap(), svnum!(6u64) ); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svnum!(5u64 + 1 + 2 + 3 + 4 + 5) + ); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) + ); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svset!([5u64, 1u64, 2u64, 3u64, 4u64]) + ); let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), StrictVal::Map(none!())); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + StrictVal::Map(none!()) + ); } #[test] @@ -212,20 +263,42 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(6u64)); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svnum!(6u64) + ); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(0u64)); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svnum!(0u64) + ); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([(), (), (), (), (), ()])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svlist!([(), (), (), (), (), ()]) + ); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([()])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svset!([()]) + ); let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor.aggregate(|_| { state.clone().into_iter() }), + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), StrictVal::Map(vec![(StrictVal::Unit, svnum!(5u64)),]) ); } @@ -242,20 +315,42 @@ mod test { ]; let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(6u64)); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svnum!(6u64) + ); let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svnum!(5u64 + 1 + 2 + 3 + 4 + 5) + ); let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) + ); let adaptor = StateAggregator::SetV(vname!("test")); - assert_eq!(adaptor.aggregate(|_| { state.clone().into_iter() }), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + assert_eq!( + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), + svset!([5u64, 1u64, 2u64, 3u64, 4u64]) + ); let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor.aggregate(|_| { state.clone().into_iter() }), + adaptor + .aggregate(|_| { state.clone().into_iter() }, None) + .unwrap(), StrictVal::Map(vec![ (svnum!(5u64), svstr!("state 1")), (svnum!(1u64), svstr!("state 2")), diff --git a/cli/src/dump.rs b/cli/src/dump.rs index c053a39..c432765 100644 --- a/cli/src/dump.rs +++ b/cli/src/dump.rs @@ -55,7 +55,7 @@ pub fn dump_articles(articles: &Articles, dst: &Path) -> anyhow::Result { serde_yaml::to_writer(&out, &api)?; } - for lib in articles.libs() { + for lib in articles.codex_libs() { let lib_id = lib.lib_id(); let name = lib_id.to_baid64_mnemonic(); lib.strict_serialize_to_file::(dst.join(format!("{name}.alu")))?; diff --git a/examples/dao/main.rs b/examples/dao/main.rs index b854014..a2dde53 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -135,7 +135,8 @@ fn main() { version: 0, default: api, custom: none!(), - libs: small_bset![libs::success()], + codex_libs: small_bset![libs::success()], + api_libs: none!(), types: types.type_system(), }; let issuer = Issuer::new(codex, semantics).unwrap(); diff --git a/src/state.rs b/src/state.rs index 95604f6..7d08a3e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -24,7 +24,8 @@ use alloc::collections::BTreeMap; use std::mem; -use amplify::confinement::{LargeOrdMap, SmallOrdMap}; +use aluvm::Lib; +use amplify::confinement::{LargeOrdMap, SmallOrdMap, SmallOrdSet}; use sonicapi::{Api, Articles, Semantics, StateAtom, StateName}; use strict_encoding::{StrictDeserialize, StrictSerialize, TypeName}; use strict_types::{StrictVal, TypeSystem}; @@ -96,11 +97,11 @@ impl EffectiveState { /// Re-evaluates computable part of the state pub fn recompute(&mut self, apis: &Semantics) { - self.main.aggregate(&apis.default); + self.main.aggregate(&apis.default, &apis.api_libs); self.aux = bmap! {}; for (name, api) in &apis.custom { let mut state = ProcessedState::default(); - state.aggregate(api); + state.aggregate(api, &apis.api_libs); self.aux.insert(name.clone(), state); } } @@ -244,19 +245,24 @@ impl ProcessedState { pub fn owned(&self, name: &StateName) -> Option<&BTreeMap> { self.owned.get(name) } - pub(super) fn aggregate(&mut self, api: &Api) { + pub(super) fn aggregate(&mut self, api: &Api, libs: &SmallOrdSet) { self.aggregated = bmap! {}; for (name, aggregator) in api.aggregators() { - let val = aggregator.aggregate(|state_name| { - self.global(state_name) - .map(|map| map.values().cloned().collect::>()) - .or_else(|| { - let verified = self.aggregated.get(state_name)?.clone(); - Some(vec![StateAtom { verified, unverified: None }]) - }) - .unwrap_or_default() - }); - self.aggregated.insert(name.clone(), val); + let val = aggregator.aggregate( + |state_name| { + self.global(state_name) + .map(|map| map.values().cloned().collect::>()) + .or_else(|| { + let verified = self.aggregated.get(state_name)?.clone(); + Some(vec![StateAtom { verified, unverified: None }]) + }) + .unwrap_or_default() + }, + libs, + ); + if let Some(val) = val { + self.aggregated.insert(name.clone(), val); + } } } diff --git a/src/stl.rs b/src/stl.rs index a8f4dcd..2c08e55 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo"; +pub const LIB_ID_SONIC: &str = "stl:7lzxWnCF-FxsTMR_-boRu64T-glhCQmN-D4hOleF-9gWIlh4#agatha-opinion-angel"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index cb84fc5..cf85b5c 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -17,6 +17,8 @@ commitment ApisChecksum, hasher SHA256, tagged urn:ubideco:sonic:apis#2025-05-25 map StrictHash, len 0..MAX16 mapKey TypeName mapValue StrictHash + set LibId, len 0..MAX16 + element LibId serialized TypeSysId rec Semantics @@ -72,19 +74,24 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -144,26 +151,39 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 map errors, len 0..MAX8 is key, U256 str value, len 0..MAX8 - set libs, len 0..MAX16 + set codexLibs, len 0..MAX16 + rec Lib + set isae, len 0..MAX8 + ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 + bytes code, len 0..MAX16 + bytes data, len 0..MAX16 + set libs, len 0..MAX8 + bytes element, len 32, aka LibId + set apiLibs, len 0..MAX16 rec Lib set isae, len 0..MAX8 ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 @@ -282,19 +302,24 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -354,26 +379,39 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 map errors, len 0..MAX8 is key, U256 str value, len 0..MAX8 - set libs, len 0..MAX16 + set codexLibs, len 0..MAX16 + rec Lib + set isae, len 0..MAX8 + ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 + bytes code, len 0..MAX16 + bytes data, len 0..MAX16 + set libs, len 0..MAX8 + bytes element, len 32, aka LibId + set apiLibs, len 0..MAX16 rec Lib set isae, len 0..MAX8 ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 @@ -476,19 +514,24 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -548,26 +591,39 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 0..MAX8 bytes const, len 0..MAX8, wrapped, tag 3 - ascii if, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - tuple sum, tag 6 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple sum, tag 5 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 7 + tuple diff, tag 6 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + tuple aluVm, tag 12 + rec LibSite + bytes libId, len 32, aka LibId + is offset, U16 + set _, len 0..MAX8 + ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 map errors, len 0..MAX8 is key, U256 str value, len 0..MAX8 - set libs, len 0..MAX16 + set codexLibs, len 0..MAX16 + rec Lib + set isae, len 0..MAX8 + ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 + bytes code, len 0..MAX16 + bytes data, len 0..MAX16 + set libs, len 0..MAX8 + bytes element, len 32, aka LibId + set apiLibs, len 0..MAX16 rec Lib set isae, len 0..MAX8 ascii element, aka IsaId, first AlphaCapsNum, rest AlphaCapsNum, len 1..16 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 3307e14..d5ecdcf 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo +Id: stl:7lzxWnCF-FxsTMR_-boRu64T-glhCQmN-D4hOleF-9gWIlh4#agatha-opinion-angel Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: e551738e9effa77e9cbe884672383fa9b97e65955cee94e901a5b1eff5f15ad1 +Check-SHA256: 23f321b8531604412546cd463bce8a8bd3283021cd755b26982b427976e66796 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -52,12 +52,12 @@ o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll gpcC$-RLmx6?U3f)2jnL@ecdv^jor~(0000000000{{R30000001#fq5Wn=&f0_mQT=Q}`` f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{$y6M4f#X <_siiX5Oe!sk3&wxH94fJ6f2tg4)=9zDEE6000000093000000000YNXJ>L{XJK@2a&rI*0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{y&VyY)mn -I7Fb>)(f442f)i9g&VK2YaZeo|5M~K$m}! +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{zBxx8B9O +C}%eQs$0o|5M~K$m}! eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk00IC200000 0093000000000JMa&m8Sa{vke03ZMe0096100000009300000000000000000093000000000a@aA|Wx -Xk}w-b9HS60RRU806+u)2tjgmX=7|?;T7d&|X=eZg0ssVVZ*FA(00035b8l^B00jX7A;%YO&?-P3OlC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ2Ja#Ii?YxZw(Ocq7g$YV6pHOVLJF$yt M@WLL^Df8c;Wd;HUZDn+5Z)5`Lo|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&> `ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LpZ+C8GWB>#L00eGtZe;)f009JZZ*64&1pxx-o|5M~K$m}! @@ -68,7 +68,7 @@ b;*F>vukd;=m`ygb@x#_>`RmOO$lRfZgypIbZ>G2OS*0Te%EP8kyngk!QwTBrbc}#N>{B-;D=|lkC4U= 2V!+;Y-D9}0kE-^$x##==E|&@N?>9q%L<%Ua(wJM|D$3N@D~kfqYQFkcSCP(c4cyOZ*l?Cvw2KFZyKJc &PYR|!^f-0Fkg70sI}$V%b}RPj6)|1a$$Eub!lv5WpV+kCJl{5lNk%~wxV0O;HsI}&0u2R-k9ZQk{dF- G>WtaNpo{`WpV}s1!HeyWq1M_{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQe?#%E`{d+C1Sl4-0 -;gT-ZoMpKK(c7N=>KC_d#mnmnb7gH|Zggp5a{;|e1!$&ceu*WGsZdJ{#NdvtP$+rE$zbwwjo>?;T7d&| +;gT-ZoMpKK(c7N=>KC_d#mnmnb7gH|Zggp5a{+D5*mAQm^zz0I3#t9#0Bi^KyHD<#tL8GO!{2N$Kam4- X=eZg0ssVVZ*FA(00035b8l^B00jX7A;%YO&?-P3Omw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q +0eaZ{MVycPK^s;a%psEZDn+6V{-u$>DSa*F}@^iR=SSZsl%<9x7%5c`Pgg1>*6SA4`go%V{dMDWpZ?H @@ -78,40 +78,42 @@ asf-aZT^1OX-JV*jAOy#HHM}}eJV;7J73J3yCzk$#1)IEB9}O*pr-e%zuW 2Pj0M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y -(7k2+*P~cYjR{j_ZDDS7X=8H+1qXIza&u{KZU6uR2V`YtVRdYD0YED>`bVzY)u+-^{Ne0W@^WJh>=m$Y -FpvY*U0gqRq6TAib98TQ015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;E -QA|)S-x88IWKN#S$#@T&w`gPmKr1x*N3Pq|r_xjW;p|lMa$^nb6|iqGkOS6TTt9cB0000000000|Nj60 -000001Z-(ya{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$Lt&lV-%#2HY;R%(0RRX906+l%000000000G00000 -000kDbYXO5L1$-jWoKb@Z*l|;00ebzX>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8 -A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{*pFZg+BFa8Ggo1p)%;o|5M~K$m}! -eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lk2mk;;00000 -00000{{R30000000|jGmZgX@11pxpE002M$000000003000000000040%>Ld1pxx-o|5M~K$m}!eub_$ -g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L!1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>`<)y^X -ImOPdju4Lm>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ -&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndT -z*X~v;Uq>`<)y^XImOPdju4M91#D?^bXEWb0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW -2Pj0>g~&^g77J73J3yCzk$#1) -IEB9}O*pr-e%zuW2Pj0>g~&^g7DjZB_sU0Rris -lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>` -<)y^XImOPdju4LvQ*>c;WkGUjbZBh@0tjYxZf9v?Y-IooZf|Zzb#7;AVr*pr3{!MrbY((yX>4R=as&ea -1a)p{bN~PV5DavAaAjmgZewp`WpV%o0RR9X5fOBGaAjmhX=Q9=MQ&qnWMy&y1pxp6AP!S>VRU6fZ*F#F -a&&KU1OosBb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X3RH4o -ZgXjLX>V=@0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW=(>>~JNCWGL*g;d+ -+M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJFd8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJlC**6;}%ie4wrTWpLzfxZ1G^f?j#teR+2rNlD$O59e#ogQs -B77jPl+h5j^*S;Kc4cyNX>V=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN!p14WBr9LqgTBPo -;{gj!U^Sf= +(7k2+*P~cYjR{j_ZDDS7X=8H+1_yR!a&u{KZU6uR2V`YtVRdYD0eiHSNY?AIFzvmvu*U9=`EJ9>Z&+Ue +8pq>pj`Bg5_6B2hb98TQ015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;E +QA|)S-x88IWKN#S$#@T&w`gPmd$g5E*6Xn_?Y*+F#_o>!Zo|oMSYH7e$K!2|@;M1&000000RR600000000&`kX-sKia{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7 +Knlpb7_LPzv?=G$Lt&lV-%#2HY;R%(0RRX906+l%000000000G00000000kDbYXO5L1$-jWoKb@Z*l|;00ebzX>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h +#Lzj#&aRFSj{*pFZg+BFa8Ggo1p)%;o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvN +B=ndTz*X~v;Uq>`<)y^XImOPdju4Lk2mk;;0000000000{{R30000000|jGmZgX@11pxpE002M$00000 +00030000000000G1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lm>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrT +q9O+`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4M91#D?^bXEWb0RrislIJ@>mw%Cd +g|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7DjZB_sU0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ok1z~J;R&4+U0s^;LDYTERN5LY|W}eb+cSx&f +8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-vnx0_mQT=Q}``f02HLt~iCi +D@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDw000000RI3000000 +01H!eVRU6da%psEZ36-bW_507X<}?;01Iw!Zbo%(XK7+=WdRIRbYXO5LUn0uWMy&$0{{edZfSG?000mS +ba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001BkQ*>c;WkYXnc4cyOZ*l|!00ebz +X>@6CZUzDb +Z*Xa30vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaewhUQ9xBs4>TE~@>xkGvQ`p*}&V@tQ&H5F< +8Nn=iYYAj!b98cVd1Yh(3IZDaZz;O*CD3`&x`)m +=B!6PPbxdmBJ+ysRCuhjfe->3{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teS&6{`iQ!MGRFll_|i +_pSv?2r{M&!(S&fuFxX(Ji46#0000000030{{R300000GR%LQ?X>V?2WJ7OcWq3(s1_J_VWC9xfZz;O* +CD3`p#$=rdum?r*`71Hb|_zg6yfI1@tx1ME;WCJU|C_WpZV?2WJ7OmbaG*1 +bV+0e0|IGe0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaexC>|Njk^^qPoT1+zTRnAg`3vXv9d* +8d@RXy~6c6G6!~La&u{KZU6uR2xDkvV{3DDZ2=Bw$d=6laa$cV?AOA^DZ(TxU)qDd#MR>g3r=7)ofi -----END STRICT TYPE LIB----- diff --git a/stl/SONIC@0.12.0.stl b/stl/SONIC@0.12.0.stl index 4348d71064c976cef1638cbffeb17aecaed3f86f..39879a158537fc3d209a50ce87542dde4631ef1f 100644 GIT binary patch delta 317 zcmX?M^v`(1E-nShiQDfT-K~*s_HR}6g)b9!F3s5}*LCplmG&dIo@{XvW}AGA>x@F~ z*&9Wh4ZnOk#>c(#??Z+h_OHAB-_2V6%xJ~o`#A>o6DRNEv)aTnkBOkd&HMPmm`vH& z%TkMqGxPHp7?{{oQqvMkb4nPiw@mf8_Ijhi+r67M9DCRIGw<-p{D^o)spF4x`#w2N z|2ElE(A%7lA_ge<{~yBOOwLb9t?-$AOfZaeQ?W@Z#1^;>YCgf95GVdGF4fzHWn6Jgg*q1Mw x>?!DNL`V?>6#V}WVX)*(J}nrwxkkvJk%fgRGi`Fbn9JtV!Z(;UJBsgR0svZsZ)X4i diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 89e359f..980c2a2 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:QcQOlgo9-KA7gO0h-4Zg_evI-wz7beHw-JWI4Hts-0aYtSWg#chant-bridge-rondo + Id: stl:7lzxWnCF-FxsTMR_-boRu64T-glhCQmN-D4hOleF-9gWIlh4#agatha-opinion-angel Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -119,22 +119,22 @@ data RawBuilder : strictEncode StrictTypes.SemId | (|) @mnemonic(tripod-guitar-bishop) data RawConvertor : strictDecode StrictTypes.SemId | (|) -@mnemonic(gray-paint-pagoda) +@mnemonic(senator-flower-guru) data Semantics : version U16 , default Api , custom {StrictTypes.TypeName -> Api} - , libs {AluVM.Lib} + , codexLibs {AluVM.Lib} + , apiLibs {AluVM.Lib} , types StrictTypes.TypeSystem @mnemonic(insect-cello-avalon) data SigBlob : [Byte ^ 1..0x1000] -@mnemonic(retro-cycle-learn) +@mnemonic(justice-phoenix-control) data StateAggregator : unit () | toSome StrictTypes.VariantName | unwrapOr (StrictTypes.VariantName, [Byte ^ ..0xff]) | const [Byte ^ ..0xff] - | if StrictTypes.VariantName | count#16 StrictTypes.VariantName | sum#32 (StrictTypes.VariantName, StrictTypes.VariantName) | diff#34 (StrictTypes.VariantName, StrictTypes.VariantName) @@ -143,6 +143,7 @@ data StateAggregator : unit () | mapV2u StrictTypes.VariantName | sumV#64 StrictTypes.VariantName | trySumV StrictTypes.VariantName + | aluVm#255 (AluVM.LibSite, {StrictTypes.VariantName ^ ..0xff}) @mnemonic(meteor-gondola-sweden) data StateArithm : fungible | nonFungible diff --git a/tests/dao.rs b/tests/dao.rs index abec963..2359d15 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -132,7 +132,8 @@ fn main() { version: 0, default: api, custom: none!(), - libs: small_bset![libs::success()], + codex_libs: small_bset![libs::success()], + api_libs: none!(), types: types.type_system(), }; let issuer = Issuer::new(codex, semantics).unwrap(); diff --git a/tests/reorgs.rs b/tests/reorgs.rs index 4484861..c9932e6 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -173,7 +173,8 @@ fn setup(name: &str) -> LedgerDir { version: 0, default: api, custom: none!(), - libs: small_bset![libs::success()], + codex_libs: small_bset![libs::success()], + api_libs: none!(), types: types.type_system(), }; let issuer = Issuer::new(codex, semantics).unwrap(); From 53e7c17a993781a410f29911f2a6e22dcd4c9b87 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 21:12:28 +0200 Subject: [PATCH 14/40] api: aggregators overhaul --- api/src/api.rs | 4 +- api/src/state/aggregators.rs | 539 +++++++++++++++++------------ api/src/state/mod.rs | 2 +- examples/dao/main.rs | 10 +- src/state.rs | 45 ++- src/stl.rs | 2 +- stl/SONIC.vesper | 636 +++++++++++++++++++++++++++-------- stl/SONIC@0.12.0.sta | 146 ++++---- stl/SONIC@0.12.0.stl | Bin 6654 -> 6868 bytes stl/SONIC@0.12.0.sty | 42 ++- tests/dao.rs | 10 +- 11 files changed, 947 insertions(+), 489 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index 6231f90..b8251ad 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -53,7 +53,7 @@ use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, Typ use ultrasonic::{CallId, Codex, CodexId, StateData, StateValue}; use crate::{ - RawBuilder, RawConvertor, StateAggregator, StateArithm, StateAtom, StateBuildError, StateBuilder, StateCalc, + Aggregator, RawBuilder, RawConvertor, StateArithm, StateAtom, StateBuildError, StateBuilder, StateCalc, StateConvertError, StateConvertor, LIB_NAME_SONIC, }; @@ -353,7 +353,7 @@ pub struct Api { /// /// The typical examples when readers are used are to sum individual asset issues and compute /// the number of totally issued assets. - pub aggregators: TinyOrdMap, + pub aggregators: TinyOrdMap, /// Links between named transaction methods defined in the interface - and corresponding /// verifier call ids defined by the contract. diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 4a7c0ac..18421cc 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -24,139 +24,308 @@ use std::collections::BTreeMap; use aluvm::{Lib, LibId, LibSite}; -use amplify::confinement::{TinyBlob, TinyOrdSet}; +use amplify::confinement::TinyBlob; use sonic_callreq::StateName; use strict_encoding::StrictDumb; -use strict_types::value::StrictNum; -use strict_types::StrictVal; +use strict_types::value::{EnumTag, StrictNum}; +use strict_types::{SemId, StrictVal, TypeSystem}; +use ultrasonic::CellAddr; use crate::{StateAtom, LIB_NAME_SONIC}; -/// A set of pre-defined state aggregators (see [`crate::Api::aggregators`]. +/// Structure which allows applying aggregators either to a global or a different aggregated +/// state. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Aggregated(strict_dumb!()))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub enum StateSelector { + #[strict_type(tag = 0)] + Global( + StateName, + /** Flag indicating that if multiple state elements are known, only the first one should + * be used. */ + bool, + ), + #[strict_type(tag = 1)] + Aggregated(StateName), +} + +/// A set of pre-defined top-level state aggregators (see [`crate::Api::aggregators`]. #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Count(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub enum StateAggregator { - /// The aggregated state should have a unit value. +pub enum Aggregator { + /// Takes the underlying aggregated state and applies nothing on top. /// - /// This is useful when an interface requires some aggregated state to be present, - /// but you can't + /// If the underlying aggregator fails, the aggregated state is not produced. #[strict_type(tag = 0)] - Unit, + Take(SubAggregator), - /// Wrap an existing state with an `Option::Some`. + /// The aggregated state is generated with a predefined constant value. /// - /// This is useful when an interface requires a value to be optional. + /// To produce a state with a unit value, use `Self::Const(SemId::unit(), none!())`. #[strict_type(tag = 1)] - ToSome(StateName), + Const(SemId, TinyBlob), + + /// If the underlying aggregated state fails, returns the provided constant value. + #[strict_type(tag = 2)] + Or(SubAggregator, SemId, TinyBlob), + /// Count the number of elements of the global state of a certain type. + #[strict_type(tag = 0x10)] + Count(StateName), + + /// Execute a custom function on the state. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), +} + +impl Aggregator { + /// Returns names of the other computed state which this aggregator depends on + /// and which needs to be computed before running this aggregator. + pub fn depends_on(&self) -> impl Iterator { + match self { + Self::Take(sub) | Self::Or(sub, _, _) => sub.depends_on(), + Self::Const(_, _) | Self::Count(_) | Self::AluVM(_) => vec![], + } + .into_iter() + } + + /// Compute state via applying some aggregator function. + /// + /// # Returns + /// + /// Aggregated state value. If the computing fails due to any exception, `None`. + pub fn aggregate<'libs>( + &self, + global: &BTreeMap>, + aggregated: &BTreeMap, + libs: impl IntoIterator, + types: &TypeSystem, + ) -> Option { + match self { + Self::Take(sub) => sub.aggregate(global, aggregated, types), + + Self::Const(sem_id, val) => deserialize(*sem_id, val, types), + + Self::Or(sub, sem_id, val) => sub + .aggregate(global, aggregated, types) + .or_else(|| deserialize(*sem_id, val, types)), + + Self::Count(name) => { + let count = global + .get(name) + .into_iter() + .flat_map(BTreeMap::values) + .count(); + Some(svnum!(count as u64)) + } + + Self::AluVM(entry) => { + let libs = libs + .into_iter() + .map(|lib| (lib.lib_id(), lib)) + .collect::>(); + let mut vm = aluvm::Vm::>::new(); + // For now, we ignore all computations and return `None` anyway. + // This leaves a way to add proper VM computing in the future + // in a backward-compatible way. + let _status = vm.exec(*entry, &(), |id| libs.get(&id)); + None + } + } + } +} + +/// A set of pre-defined state sub-aggregators (see [`crate::Api::aggregators`]. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Neg(strict_dumb!()))] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub enum SubAggregator { /// Unwraps an optional value. /// /// If the value is `None`, sets the state to the provided constant. - #[strict_type(tag = 2)] - UnwrapOr(StateName, TinyBlob), - - /// Provide aggregated state as a constant value. - #[strict_type(tag = 3)] - Const(TinyBlob), + /// + /// If the state is not defined, or not an optional, fails. + #[strict_type(tag = 1)] + UnwrapOr(StateName, SemId, TinyBlob), - /// Count the number of elements in the state of a certain type. + /// Integer-negate state. + /// + /// Fails if the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer or is greater than `i64::MAX`. #[strict_type(tag = 0x10)] - Count(StateName), + Neg(StateSelector), - /// Sum over the elements of a state of a certain type. + /// Sum two states of different types, expecting them to be integers. /// - /// If any of the elements of the state are not integers, returns `None`. - #[strict_type(tag = 0x20)] - Sum(StateName, StateName), + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer or there is an overflow. + #[strict_type(tag = 0x11)] + Sum(StateSelector, StateSelector), - #[strict_type(tag = 0x22)] - Diff(StateName, StateName), + /// Substracts the second state from the first state, expecting both to be integers. + /// + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer or there is an overflow. + #[strict_type(tag = 0x12)] + Diff(StateSelector, StateSelector), /// Convert a verified state under the same state type into a vector. - #[strict_type(tag = 0x30)] + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// If the global state with the name is absent returns an empty list. + #[strict_type(tag = 0x20)] ListV(StateName), /// Convert a verified state under the same state type into a sorted set. - #[strict_type(tag = 0x31)] + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// If the global state with the name is absent returns an empty set. + #[strict_type(tag = 0x21)] SetV(StateName), - /// Map from a field-based element state to a non-verifiable structured state - #[strict_type(tag = 0x32)] + /// Map from a field-based element state to a non-verifiable structured state. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// If the global state with the name is absent returns an empty map. + #[strict_type(tag = 0x22)] MapV2U(StateName), - /// Sum over verifiable field-element-based part of state. + /// Sums over verifiable part of a global state. /// - /// If any of the verifiable state is absent or not in the form of unsigned integer, - /// it is treated as zero. - #[strict_type(tag = 0x40)] - SumV(StateName), - - /// Sum over verifiable field-element-based part of state. + /// Acts only on a global state; doesn't recognize aggregated state. /// - /// If any of the verifiable state is absent or not in the form of unsigned integer, - /// sets the aggregated state to `None`. - #[strict_type(tag = 0x41)] - TrySumV(StateName), - - /// Execute a custom function on the state. - #[strict_type(tag = 0xFF)] - AluVM( - /// The entry point to the script (virtual machine uses libraries from - /// [`crate::Semantics`]). - LibSite, - /// The aggregated state which must be computed when the script is called. - TinyOrdSet, - ), + /// Fails if the global state doesn't have any elements, + /// or the state type is not an unsigned integer. + #[strict_type(tag = 0x30)] + SumV(StateName), } -impl StateAggregator { +impl SubAggregator { + /// Returns names of the other computed state which this aggregator depends on + /// and which needs to be computed before running this aggregator. + pub fn depends_on(&self) -> Vec<&StateName> { + match self { + Self::Neg(StateSelector::Aggregated(state)) + | Self::Sum(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Diff(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Sum(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Diff(StateSelector::Aggregated(state), StateSelector::Global(_, _)) => vec![state], + + Self::Sum(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Diff(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) => vec![a, b], + + Self::Neg(_) + | Self::Sum(_, _) + | Self::Diff(_, _) + | Self::UnwrapOr(_, _, _) + | Self::ListV(_) + | Self::SetV(_) + | Self::MapV2U(_) + | Self::SumV(_) => vec![], + } + } + /// Compute state via applying some aggregator function. /// /// # Returns /// - /// Aggregated state value. If the computing fails due to any exception, `None`. - pub fn aggregate<'libs, I: IntoIterator>( + /// Aggregated state value. + /// If the computing fails due to any exception, `None`. + pub fn aggregate( &self, - state: impl Fn(&StateName) -> I, - libs: impl IntoIterator, + global: &BTreeMap>, + aggregated: &BTreeMap, + types: &TypeSystem, ) -> Option { + let get_u64 = |sel: &StateSelector| -> Option { + let state = match sel { + StateSelector::Global(name, first) => { + let map = global.get(name)?; + if map.len() != 1 && !*first { + return None; + } + let (_, atom) = map.first_key_value()?; + &atom.verified + } + StateSelector::Aggregated(name) => aggregated.get(name)?, + }; + match state { + StrictVal::Number(StrictNum::Uint(val)) => Some(*val), + _ => None, + } + }; + Some(match self { - StateAggregator::Unit => StrictVal::Unit, - //EmbeddedReaders::Const(val) => val.clone(), - StateAggregator::Count(name) => { - let count = state(name).into_iter().count(); - svnum!(count as u64) + Self::UnwrapOr(name, sem_id, val) => { + let state = global.get(name)?; + if state.len() != 1 { + return None; + } + let (_, atom) = state.first_key_value()?; + let StrictVal::Union(tag, sv) = &atom.verified else { + return None; + }; + match tag { + EnumTag::Name(name) if name.as_str() == "none" && sv.as_ref() == &StrictVal::Unit => { + return deserialize(*sem_id, val, types) + } + EnumTag::Ord(0) if sv.as_ref() == &StrictVal::Unit => return deserialize(*sem_id, val, types), + EnumTag::Name(name) if name.as_str() == "some" => sv.as_ref().clone(), + EnumTag::Ord(1) => sv.as_ref().clone(), + _ => return None, + } } - StateAggregator::SumV(name) => { - let sum = state(name) - .into_iter() - .map(|atom| match &atom.verified { - StrictVal::Number(StrictNum::Uint(val)) => *val, - _ => 0u64, - }) - .sum::(); + + Self::Neg(name) => { + let val = get_u64(name)?; + let neg = (val as i64).checked_neg()?; + svnum!(neg) + } + Self::Sum(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sum = a.checked_add(b)?; svnum!(sum) } - StateAggregator::ListV(name) => StrictVal::List( - state(name) + Self::Diff(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sub = a.checked_sub(b)?; + svnum!(sub) + } + + Self::ListV(name) => StrictVal::List( + global + .get(name) .into_iter() + .flat_map(BTreeMap::values) .map(|atom| atom.verified.clone()) .collect(), ), - StateAggregator::SetV(name) => { + Self::SetV(name) => { let mut set = Vec::new(); - for atom in state(name) { - if !set.contains(&atom.verified) { - set.push(atom.verified.clone()); + for state in global.get(name).into_iter().flat_map(BTreeMap::values) { + if !set.contains(&state.verified) { + set.push(state.verified.clone()); } } StrictVal::Set(set) } - StateAggregator::MapV2U(name) => { + Self::MapV2U(name) => { let mut map = Vec::new(); - for atom in state(name) { + for atom in global.get(name)?.values() { let Some(val) = &atom.unverified else { continue }; if map.iter().any(|(key, _)| &atom.verified == key) { continue; @@ -165,192 +334,114 @@ impl StateAggregator { } StrictVal::Map(map) } - StateAggregator::Const(_) => todo!(), - StateAggregator::Sum(_, _) => todo!(), - StateAggregator::Diff(_, _) => todo!(), - StateAggregator::ToSome(_) => todo!(), - StateAggregator::UnwrapOr(_, _) => todo!(), - StateAggregator::TrySumV(_) => todo!(), - - StateAggregator::AluVM(entry, _) => { - let libs = libs + + Self::SumV(name) => { + let sum = global + .get(name) .into_iter() - .map(|lib| (lib.lib_id(), lib)) - .collect::>(); - let mut vm = aluvm::Vm::>::new(); - // For now, we ignore all computations and return `None` anyway. - // This leaves a way to add proper VM computing in the future - // in a backward-compatible way. - let _status = vm.exec(*entry, &(), |id| libs.get(&id)); - return None; + .flat_map(BTreeMap::values) + .try_fold(0u64, |sum, val| match &val.verified { + StrictVal::Number(StrictNum::Uint(val)) => Some(sum + *val), + _ => None, + })?; + svnum!(sum) } }) } } +fn deserialize(sem_id: SemId, val: &TinyBlob, types: &TypeSystem) -> Option { + let ty = types.strict_deserialize_type(sem_id, val.as_slice()).ok()?; + Some(ty.unbox()) +} + #[cfg(test)] mod test { #![cfg_attr(coverage_nightly, coverage(off))] use super::*; + fn addr(no: u16) -> CellAddr { CellAddr::new(strict_dumb!(), no) } + fn state() -> BTreeMap> { + bmap! { + vname!("pairs") => bmap! { + addr(0) => StateAtom::with(5u64, "state 1"), + addr(1) => StateAtom::with(1u64, "state 2"), + addr(2) => StateAtom::with(2u64, "state 3"), + addr(3) => StateAtom::with(3u64, "state 4"), + addr(4) => StateAtom::with(4u64, "state 5"), + addr(5) => StateAtom::with(5u64, "state 6"), + }, + vname!("verified") => bmap! { + addr(0) => StateAtom::new_verified(5u64), + addr(1) => StateAtom::new_verified(1u64), + addr(2) => StateAtom::new_verified(2u64), + addr(3) => StateAtom::new_verified(3u64), + addr(4) => StateAtom::new_verified(4u64), + addr(5) => StateAtom::new_verified(5u64), + }, + vname!("unverified") => bmap! { + addr(0) => StateAtom::new_unverified("state 1"), + addr(1) => StateAtom::new_unverified("state 2"), + addr(2) => StateAtom::new_unverified("state 3"), + addr(3) => StateAtom::new_unverified("state 4"), + addr(4) => StateAtom::new_unverified("state 5"), + addr(5) => StateAtom::new_unverified("state 6"), + }, + } + } + fn call(aggregator: Aggregator) -> StrictVal { + aggregator + .aggregate(&state(), &none!(), None, &none!()) + .unwrap() + } + #[test] fn verified_readers() { - let state = [ - StateAtom::new_verified(5u64), - StateAtom::new_verified(1u64), - StateAtom::new_verified(2u64), - StateAtom::new_verified(3u64), - StateAtom::new_verified(4u64), - StateAtom::new_verified(5u64), - ]; - - let adaptor = StateAggregator::Count(vname!("test1")); - assert_eq!( - adaptor - .aggregate( - |name| { - assert_eq!(name.as_str(), "test1"); - state.clone().into_iter() - }, - None - ) - .unwrap(), - svnum!(6u64) - ); - - let adaptor = StateAggregator::SumV(vname!("test")); + assert_eq!(call(Aggregator::Count(vname!("verified"))), svnum!(6u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::SumV(vname!("verified")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svnum!(5u64 + 1 + 2 + 3 + 4 + 5) - ); - - let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::ListV(vname!("verified")))), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) ); - - let adaptor = StateAggregator::SetV(vname!("test")); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::SetV(vname!("verified")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) ); - - let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - StrictVal::Map(none!()) - ); + assert_eq!(call(Aggregator::Take(SubAggregator::MapV2U(vname!("verified")))), StrictVal::Map(none!())); } #[test] fn unverified_readers() { - let state = [ - StateAtom::new_unverified(5u64), - StateAtom::new_unverified(1u64), - StateAtom::new_unverified(2u64), - StateAtom::new_unverified(3u64), - StateAtom::new_unverified(4u64), - StateAtom::new_unverified(5u64), - ]; - - let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svnum!(6u64) - ); - - let adaptor = StateAggregator::SumV(vname!("test")); + assert_eq!(call(Aggregator::Count(vname!("unverified"))), svnum!(6u64)); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svnum!(0u64) - ); - - let adaptor = StateAggregator::ListV(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::ListV(vname!("unverified")))), svlist!([(), (), (), (), (), ()]) ); - - let adaptor = StateAggregator::SetV(vname!("test")); + assert_eq!(call(Aggregator::Take(SubAggregator::SetV(vname!("unverified")))), svset!([()])); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svset!([()]) - ); - - let adaptor = StateAggregator::MapV2U(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - StrictVal::Map(vec![(StrictVal::Unit, svnum!(5u64)),]) + call(Aggregator::Take(SubAggregator::MapV2U(vname!("unverified")))), + StrictVal::Map(vec![(StrictVal::Unit, svstr!("state 1"))]) ); } #[test] - fn pair_readers() { - let state = [ - StateAtom::with(5u64, "state 1"), - StateAtom::with(1u64, "state 2"), - StateAtom::with(2u64, "state 3"), - StateAtom::with(3u64, "state 4"), - StateAtom::with(4u64, "state 5"), - StateAtom::with(5u64, "state 6"), - ]; - - let adaptor = StateAggregator::Count(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svnum!(6u64) - ); - - let adaptor = StateAggregator::SumV(vname!("test")); - assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), - svnum!(5u64 + 1 + 2 + 3 + 4 + 5) - ); + #[should_panic] + fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumV(vname!("unverified")))); } - let adaptor = StateAggregator::ListV(vname!("test")); + #[test] + fn pair_readers() { + assert_eq!(call(Aggregator::Count(vname!("pairs"))), svnum!(6u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::SumV(vname!("pairs")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::ListV(vname!("pairs")))), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) ); - - let adaptor = StateAggregator::SetV(vname!("test")); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::SetV(vname!("pairs")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) ); - - let adaptor = StateAggregator::MapV2U(vname!("test")); assert_eq!( - adaptor - .aggregate(|_| { state.clone().into_iter() }, None) - .unwrap(), + call(Aggregator::Take(SubAggregator::MapV2U(vname!("pairs")))), StrictVal::Map(vec![ (svnum!(5u64), svstr!("state 1")), (svnum!(1u64), svstr!("state 2")), diff --git a/api/src/state/mod.rs b/api/src/state/mod.rs index 4a0b363..09496b0 100644 --- a/api/src/state/mod.rs +++ b/api/src/state/mod.rs @@ -28,7 +28,7 @@ mod data; mod raw; pub use adaptors::{StateBuildError, StateBuilder, StateConvertError, StateConvertor}; -pub use aggregators::StateAggregator; +pub use aggregators::{Aggregator, StateSelector, SubAggregator}; pub use arithmetics::{StateArithm, StateCalc, StateCalcError}; pub use data::{DataCell, StateAtom, StateTy}; pub use raw::{RawBuilder, RawConvertor, TOTAL_RAW_BYTES}; diff --git a/examples/dao/main.rs b/examples/dao/main.rs index a2dde53..9379fab 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -39,7 +39,7 @@ use commit_verify::{Digest, Sha256}; use hypersonic::{Api, GlobalApi, OwnedApi}; use sonic_persist_fs::LedgerDir; use sonicapi::{ - Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, + Aggregator, Issuer, RawBuilder, RawConvertor, Semantics, StateArithm, StateBuilder, StateConvertor, SubAggregator, }; use strict_types::{SemId, StrictVal}; use ultrasonic::aluvm::FIELD_ORDER_SECP; @@ -110,10 +110,10 @@ fn api() -> Api { } }, aggregators: tiny_bmap! { - vname!("parties") => StateAggregator::MapV2U(vname!("_parties")), - vname!("votings") => StateAggregator::MapV2U(vname!("_votings")), - vname!("votes") => StateAggregator::SetV(vname!("_votes")), - vname!("votingCount") => StateAggregator::Count(vname!("_votings")), + vname!("parties") => Aggregator::Take(SubAggregator::MapV2U(vname!("_parties"))), + vname!("votings") => Aggregator::Take(SubAggregator::MapV2U(vname!("_votings"))), + vname!("votes") => Aggregator::Take(SubAggregator::SetV(vname!("_votes"))), + vname!("votingCount") => Aggregator::Count(vname!("_votings")), }, verifiers: tiny_bmap! { vname!("setup") => 0, diff --git a/src/state.rs b/src/state.rs index 7d08a3e..4ad550f 100644 --- a/src/state.rs +++ b/src/state.rs @@ -97,11 +97,12 @@ impl EffectiveState { /// Re-evaluates computable part of the state pub fn recompute(&mut self, apis: &Semantics) { - self.main.aggregate(&apis.default, &apis.api_libs); + self.main + .aggregate(&apis.default, &apis.api_libs, &apis.types); self.aux = bmap! {}; for (name, api) in &apis.custom { let mut state = ProcessedState::default(); - state.aggregate(api, &apis.api_libs); + state.aggregate(api, &apis.api_libs, &apis.types); self.aux.insert(name.clone(), state); } } @@ -245,24 +246,32 @@ impl ProcessedState { pub fn owned(&self, name: &StateName) -> Option<&BTreeMap> { self.owned.get(name) } - pub(super) fn aggregate(&mut self, api: &Api, libs: &SmallOrdSet) { + /// Computes aggregated state. + /// + /// Ignores cycle dependencies between aggregators; the computed state with them is not + /// produced. + pub(super) fn aggregate(&mut self, api: &Api, libs: &SmallOrdSet, types: &TypeSystem) { self.aggregated = bmap! {}; - for (name, aggregator) in api.aggregators() { - let val = aggregator.aggregate( - |state_name| { - self.global(state_name) - .map(|map| map.values().cloned().collect::>()) - .or_else(|| { - let verified = self.aggregated.get(state_name)?.clone(); - Some(vec![StateAtom { verified, unverified: None }]) - }) - .unwrap_or_default() - }, - libs, - ); - if let Some(val) = val { - self.aggregated.insert(name.clone(), val); + let mut computed = 0usize; + loop { + for (name, aggregator) in api.aggregators() { + if aggregator + .depends_on() + .any(|s| !self.global.contains_key(s) && !self.aggregated.contains_key(s)) + { + break; + } + let val = aggregator.aggregate(&self.global, &self.aggregated, libs, types); + if let Some(val) = val { + if self.aggregated.insert(name.clone(), val).is_none() { + computed += 1; + } + } + } + if computed == 0 { + break; } + computed = 0; } } diff --git a/src/stl.rs b/src/stl.rs index 2c08e55..8dfad96 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:7lzxWnCF-FxsTMR_-boRu64T-glhCQmN-D4hOleF-9gWIlh4#agatha-opinion-angel"; +pub const LIB_ID_SONIC: &str = "stl:ZxZS5Oz1-AMK_ZjX-EasLoq_-Dl~MMML-ksDdbSW-gQ_HUAY#classic-extreme-mimic"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index cf85b5c..730e58a 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -67,31 +67,89 @@ rec Semantics is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -144,31 +202,89 @@ rec Semantics is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -295,31 +411,89 @@ rec Issuer is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -372,31 +546,89 @@ rec Issuer is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -507,31 +739,89 @@ rec Articles is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 @@ -584,31 +874,89 @@ rec Articles is typedFieldEncoder, U256, wrapped, tag 2 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - union value, StateAggregator - is unit, Unit, tag 0 - ascii toSome, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple unwrapOr, tag 2 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + union value, Aggregator + union take, SubAggregator, wrapped, tag 0 + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + tuple const, tag 1 + bytes _, len 32, aka SemId bytes _, len 0..MAX8 - bytes const, len 0..MAX8, wrapped, tag 3 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - tuple sum, tag 5 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - tuple diff, tag 6 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii trySumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - tuple aluVm, tag 12 - rec LibSite - bytes libId, len 32, aka LibId - is offset, U16 - set _, len 0..MAX8 - ascii element, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + tuple or, tag 2 + union SubAggregator + tuple unwrapOr, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 1 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 2 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 3 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + rec aluVm, LibSite, wrapped, tag 4 + bytes libId, len 32, aka LibId + is offset, U16 map verifiers, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 is value, U16 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index d5ecdcf..c918af0 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:7lzxWnCF-FxsTMR_-boRu64T-glhCQmN-D4hOleF-9gWIlh4#agatha-opinion-angel +Id: stl:ZxZS5Oz1-AMK_ZjX-EasLoq_-Dl~MMML-ksDdbSW-gQ_HUAY#classic-extreme-mimic Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 23f321b8531604412546cd463bce8a8bd3283021cd755b26982b427976e66796 +Check-SHA256: 66122e28c0a0bbfab6b97a36898edeb8b2f61a9f066ca1e1d304a2a86ffb6eed 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -45,75 +45,79 @@ cBe%OQ*>c;WmaKqb!D@OIM0+Zf@L2l@d@(MQJsr54hK$(!e6HQqr!PDy=MtQb#!P{Z);_4wXEwu(4(eX D|DxJ;;J@Cth|EksiOt-HPJ-=lHfc*2SaaUWq3(sw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u 2uWmRZggpMdGHmh1*yTf7t)jcn*aB%1xpArrVPVhCp50mBKADGoe5KPVRU6fWo&HwrN?q$uLxQs2Fvw;u@LuG7iL1bid{aM4p>0IFOo~Y652;7|;2>m$hiUk~2&U-senAm#W2U1~o -L}7Gc5aA^hz2V-w!Wq3(s0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaezmOYKhUG5TPt*@ -cH*iwNUXeq?5U##^fl2${*vH4KnP=RZf0+CZF2w#000620000000030000000000BWMyVyb!>D)VQg#w -1OfmAZf|a7000011aog~WdH>M0o>rXe8)9&0O!v<>?1dtbb(|_DL1R6 -o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll -gpcC$-RLmx6?U3f)2jnL@ecdv^jor~(0000000000{{R30000001#fq5Wn=&f0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{$y6M4f#X -<_siiX5Oe!sk3&wxH94fJ6f2tg4)=9zDEE6000000093000000000YNXJ>L{XJK@2a&rI*0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{zBxx8B9O -C}%eQs$0o|5M~K$m}! -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 -X>@6CZUzDb -Z*Xa30vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaewhUQ9xBs4>TE~@>xkGvQ`p*}&V@tQ&H5F< -8Nn=iYYAj!b98cVd1Yh(3IZDaZz;O*CD3`&x`)m -=B!6PPbxdmBJ+ysRCuhjfe->3{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teS&6{`iQ!MGRFll_|i -_pSv?2r{M&!(S&fuFxX(Ji46#0000000030{{R300000GR%LQ?X>V?2WJ7OcWq3(s1_J_VWC9xfZz;O* -CD3`p#$=rdum?r*`71Hb|_zg6yfI1@tx1ME;WCJU|C_WpZV?2WJ7OmbaG*1 -bV+0e0|IGe0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaexC>|Njk^^qPoT1+zTRnAg`3vXv9d* -8d@RXy~6c6G6!~La&u{KZU6uR2xDkvV{3DDZ2=Bw$d=6laa$cV?AOA^DZ(TxU)qDd#MR>g3r=7)ofi +L}7Gc6aWfAXJ>L{XJK@2as&kc1ax6*WdH>M0WUqH=LY{3WVn;)`Tq=jV$1v`i7^rMUp%P-!2^ob4FLsX +Z*FsR00ja9>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ +{MVycPK^Kv002M$0000000030000000000G1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+< +MAdF9JWvUS!HXjLHPLD$^q3aFRr7@5Bt}`~rNq!V#m=sd5Rd-_VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2 +NULZXE0|-HmqXR*3X$A-fV{c?-cu8ae +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 +2Pj0>g~&^g7mw%Cdg|0Y- +zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ +&^g7V=@0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW= +(>>~JNCWGL*g;d++M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ +Fd8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJlC**6;}%ie4wrTWpLzfxZ1G^f?j#teR+ +2rNlD$O59e#ogQsB77jPl+h5j^*S;Kc4cyNX>V=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN +!p14WBr9LqgTBPo;{gj!U^Sf= -----END STRICT TYPE LIB----- diff --git a/stl/SONIC@0.12.0.stl b/stl/SONIC@0.12.0.stl index 39879a158537fc3d209a50ce87542dde4631ef1f..74a992681102a943936369990a19f1d08a50f719 100644 GIT binary patch delta 724 zcmexoe8qIb5e{b&1}?|+^rF=C#FG3X7FGt9lEmy(23AH!ecQ#)+5U^B?3n!G=YO7> zq|<*?I}HWD#M`W7I>_90m6wq?IKD6{SpWW0RC7x-sn?jN$x5N$ zqGH;Ct5HvHU;Qarv~bO%O|<}x{X@p|&UU7ze0vn=4vk#D>)Q>DGu>E2^O=HgOd&@&NKh)Y2z z+$bTIl+3g=O3Z>Ar7&4X)Qd%tr8sr6fv6j!(&U4p-mC^JK&MVN6m{MFNt}lX01K}r AyZ`_I delta 450 zcmca&`pvp0%18-Dq8jE{Te--ir2>|b~LzniuCnbC^F_j3&FCvGm}y}?9K)#O56 ztIdlA44Krcw@mf8_Ijhi+r67M9DCRIGw<-p{D^o)spF4x`#w2N|HhVFT3nK!J9#0u z@?<$-MFm3YH^&R>F)Hx~mn4>?I;N)=rKTsAe7 z=0emvPVN*_1ewIC#FCPkmWC>-IC-A97n>nVacW7} ^ ..0xff GlobalApi} , owned {StrictTypes.VariantName -> ^ ..0xff OwnedApi} - , aggregators {StrictTypes.VariantName -> ^ ..0xff StateAggregator} + , aggregators {StrictTypes.VariantName -> ^ ..0xff Aggregator} , verifiers {StrictTypes.VariantName -> ^ ..0xff U16} , errors {U256 -> ^ ..0xff [Unicode ^ ..0xff]} @@ -130,21 +137,6 @@ data Semantics : version U16 @mnemonic(insect-cello-avalon) data SigBlob : [Byte ^ 1..0x1000] -@mnemonic(justice-phoenix-control) -data StateAggregator : unit () - | toSome StrictTypes.VariantName - | unwrapOr (StrictTypes.VariantName, [Byte ^ ..0xff]) - | const [Byte ^ ..0xff] - | count#16 StrictTypes.VariantName - | sum#32 (StrictTypes.VariantName, StrictTypes.VariantName) - | diff#34 (StrictTypes.VariantName, StrictTypes.VariantName) - | listV#48 StrictTypes.VariantName - | setV StrictTypes.VariantName - | mapV2u StrictTypes.VariantName - | sumV#64 StrictTypes.VariantName - | trySumV StrictTypes.VariantName - | aluVm#255 (AluVM.LibSite, {StrictTypes.VariantName ^ ..0xff}) - @mnemonic(meteor-gondola-sweden) data StateArithm : fungible | nonFungible @@ -159,6 +151,20 @@ data StateConvertor : unit () | typedEncoder#16 U256 | typedFieldEncoder U256 +@mnemonic(benny-marina-fashion) +data StateSelector : global (StrictTypes.VariantName, Std.Bool) + | aggregated StrictTypes.VariantName + +@mnemonic(garlic-horizon-scroll) +data SubAggregator : unwrapOr#1 (StrictTypes.VariantName, StrictTypes.SemId, [Byte ^ ..0xff]) + | neg#16 StateSelector + | sum (StateSelector, StateSelector) + | diff (StateSelector, StateSelector) + | listV#32 StrictTypes.VariantName + | setV StrictTypes.VariantName + | mapV2u StrictTypes.VariantName + | sumV#48 StrictTypes.VariantName + @mnemonic(explore-locate-zoom) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} diff --git a/tests/dao.rs b/tests/dao.rs index 2359d15..220b4fa 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -37,7 +37,7 @@ use commit_verify::{Digest, Sha256}; use hypersonic::{Api, GlobalApi, OwnedApi}; use sonic_persist_fs::LedgerDir; use sonicapi::{ - Issuer, RawBuilder, RawConvertor, Semantics, StateAggregator, StateArithm, StateBuilder, StateConvertor, + Aggregator, Issuer, RawBuilder, RawConvertor, Semantics, StateArithm, StateBuilder, StateConvertor, SubAggregator, }; use strict_types::{SemId, StrictVal}; use ultrasonic::aluvm::FIELD_ORDER_SECP; @@ -108,10 +108,10 @@ fn api() -> Api { } }, aggregators: tiny_bmap! { - vname!("parties") => StateAggregator::MapV2U(vname!("_parties")), - vname!("votings") => StateAggregator::MapV2U(vname!("_votings")), - vname!("votes") => StateAggregator::SetV(vname!("_votes")), - vname!("votingCount") => StateAggregator::Count(vname!("_votings")), + vname!("parties") => Aggregator::Take(SubAggregator::MapV2U(vname!("_parties"))), + vname!("votings") => Aggregator::Take(SubAggregator::MapV2U(vname!("_votings"))), + vname!("votes") => Aggregator::Take(SubAggregator::SetV(vname!("_votes"))), + vname!("votingCount") => Aggregator::Count(vname!("_votings")), }, verifiers: tiny_bmap! { vname!("setup") => 0, From 2ec5e8ecf9207d26bf06ed3687e4e4949d8d8c7e Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 25 May 2025 21:56:49 +0200 Subject: [PATCH 15/40] ledger: add information about number of operations to the export --- Cargo.lock | 4 +-- Cargo.toml | 2 +- persistence/fs/src/fs.rs | 2 ++ src/ledger.rs | 78 +++++++++++++++++++++++++--------------- src/stock.rs | 11 ++++++ 5 files changed, 66 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3e68ac1..0aef3b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,9 +150,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "aora" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0da0aa3a98a56f9002e0d30d642b62ba55b39821075951a764121bfe098ee98" +checksum = "fa0b56f69d2c47f8ee387f40849742d552e8b94596d997c19095809ac5c6b377" dependencies = [ "amplify", "binfile", diff --git a/Cargo.toml b/Cargo.toml index 8defd92..5acc390 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ sonic-api = { version = "0.12.0-rc.1", path = "api" } sonic-callreq = { version = "0.12.0-rc.1", path = "callreq" } sonic-persist-fs = { version = "0.12.0-rc.1", path = "persistence/fs" } hypersonic = { version = "0.12.0-rc.1", path = "." } -aora = ">=0.6.3" +aora = ">=0.6.4" binfile = "0.2.0" baid64 = "0.4.1" indexmap = "2.9.0" diff --git a/persistence/fs/src/fs.rs b/persistence/fs/src/fs.rs index 586a314..1eccc39 100644 --- a/persistence/fs/src/fs.rs +++ b/persistence/fs/src/fs.rs @@ -196,6 +196,8 @@ impl Stock for StockFs { #[inline] fn has_operation(&self, opid: Opid) -> bool { self.stash.contains_key(opid) } #[inline] + fn operation_count(&self) -> u64 { self.stash.len() as u64 } + #[inline] fn operation(&self, opid: Opid) -> Operation { self.stash.get_expect(opid) } #[inline] fn operations(&self) -> impl Iterator { self.stash.iter() } diff --git a/src/ledger.rs b/src/ledger.rs index 7901ce8..27c87f5 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -275,34 +275,29 @@ impl Ledger { chain.into_iter() } - pub fn export_all(&self, mut writer: StrictWriter) -> io::Result<()> { - // Write articles - writer = self.0.articles().strict_encode(writer)?; - // Stream operations - for (_, op) in self.0.operations() { - writer = op.strict_encode(writer)?; - } - Ok(()) + /// Exports contract with all known operations + pub fn export_all(&self, writer: StrictWriter) -> io::Result<()> { + self.export_internal(self.0.operation_count(), writer, |_| true, |_, _, w| Ok(w)) } + /// Export a part of a contract history: a graph between set of terminals and genesis. pub fn export( &self, terminals: impl IntoIterator>, - mut writer: StrictWriter, + writer: StrictWriter, ) -> io::Result<()> { - writer = self.contract_id().strict_encode(writer)?; self.export_aux(terminals, writer, |_, _, w| Ok(w)) } + /// Exports contract and operations to a stream, extending operation data with some auxiliary + /// information returned by `aux`. // TODO: (v0.13) Return statistics pub fn export_aux( &self, terminals: impl IntoIterator>, - mut writer: StrictWriter, - mut aux: impl FnMut(Opid, &Operation, StrictWriter) -> io::Result>, + writer: StrictWriter, + aux: impl FnMut(Opid, &Operation, StrictWriter) -> io::Result>, ) -> io::Result<()> { - let contract_id = self.contract_id(); - let mut queue = terminals .into_iter() .map(|terminal| self.0.state().addr(*terminal.borrow()).opid) @@ -342,17 +337,7 @@ impl Ledger { } opids.remove(&genesis_opid); - // Write articles - writer = articles.strict_encode(writer)?; - writer = aux(genesis_opid, &articles.genesis().to_operation(contract_id), writer)?; - // Stream operations - for (opid, op) in self.0.operations() { - if !opids.remove(&opid) { - continue; - } - writer = op.strict_encode(writer)?; - writer = aux(opid, &op, writer)?; - } + self.export_internal(opids.len() as u64, writer, |opid| opids.remove(opid), aux)?; debug_assert!( opids.is_empty(), @@ -367,6 +352,40 @@ impl Ledger { Ok(()) } + /// Exports only operations for which `should_include` returns `true`. + /// + /// # Nota bene + /// + /// Does not write the contract id. + pub fn export_internal( + &self, + count: u64, + mut writer: StrictWriter, + mut should_include: impl FnMut(&Opid) -> bool, + mut aux: impl FnMut(Opid, &Operation, StrictWriter) -> io::Result>, + ) -> io::Result<()> { + let articles = self.articles(); + let genesis_opid = articles.genesis_opid(); + + // Write contract id + let contract_id = self.contract_id(); + writer = self.contract_id().strict_encode(writer)?; + // Write no of operations + writer = count.strict_encode(writer)?; + // Write articles + writer = articles.strict_encode(writer)?; + writer = aux(genesis_opid, &articles.genesis().to_operation(contract_id), writer)?; + // Stream operations + for (opid, op) in self.0.operations() { + if !should_include(&opid) { + continue; + } + writer = op.strict_encode(writer)?; + writer = aux(opid, &op, writer)?; + } + Ok(()) + } + pub fn upgrade_apis(&mut self, new_articles: Articles) -> Result> { self.0 .update_articles(|articles| articles.upgrade_apis(new_articles)) @@ -378,8 +397,10 @@ impl Ledger { sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result<(), MultiError> { // We need this closure to avoid multiple `map_err`. - (|| -> Result<(), AcceptError> { + let count = (|| -> Result { let contract_id = ContractId::strict_decode(reader)?; + let count = u64::strict_decode(reader)?; + let semantics = Semantics::strict_decode(reader)?; let sig = Option::::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; @@ -390,11 +411,12 @@ impl Ledger { self.upgrade_apis(articles) .map_err(|e| AcceptError::Persistence(e.to_string()))?; - Ok(()) + Ok(count) })() .map_err(MultiError::A)?; - loop { + // We need to account for genesis, which is not included in the `count` + for _ in 0..=count { let op = match Operation::strict_decode(reader) { Ok(operation) => operation, Err(DecodeError::Io(e)) if e.kind() == io::ErrorKind::UnexpectedEof => break, diff --git a/src/stock.rs b/src/stock.rs index 1bb6a14..6270ad2 100644 --- a/src/stock.rs +++ b/src/stock.rs @@ -117,6 +117,17 @@ pub trait Stock { /// This call MAY BE blocking. fn has_operation(&self, opid: Opid) -> bool; + /// Count the number of all known operations in the contract. + /// + /// # Nota bene + /// + /// Does not include genesis operation. + /// + /// # Blocking I/O + /// + /// This call MAY BE blocking. + fn operation_count(&self) -> u64; + /// Returns an operation ([`Operation`]) with a given `opid` from the set of known contract /// operations ("stash"). /// From 072ee4484bf77925c38257d037f5a9387734e3e8 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 15:17:40 +0200 Subject: [PATCH 16/40] chore --- src/ledger.rs | 10 ++++------ src/lib.rs | 2 +- src/stock.rs | 4 ++-- tests/reorgs.rs | 1 + 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ledger.rs b/src/ledger.rs index 27c87f5..c6c402a 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -618,28 +618,26 @@ mod _fs { use super::*; - pub const LEDGER_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"DEEDLDGR"); - pub const LEDGER_VERSION: u16 = 0; + pub const DEEDS_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"DEEDLDGR"); + pub const DEEDS_VERSION: u16 = 0; impl Ledger { - // TODO: Move this back to the main crate pub fn export_to_file( &mut self, terminals: impl IntoIterator>, output: impl AsRef, ) -> io::Result<()> { - let file = BinFile::::create_new(output)?; + let file = BinFile::::create_new(output)?; let writer = StrictWriter::with(StreamWriter::new::<{ usize::MAX }>(file)); self.export(terminals, writer) } - // TODO: Move this back to the main crate pub fn accept_from_file( &mut self, input: impl AsRef, sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result<(), MultiError> { - let file = BinFile::::open(input) + let file = BinFile::::open(input) .map_err(|_| AcceptError::InvalidFileFormat) .map_err(MultiError::from_a)?; let mut reader = StrictReader::with(StreamReader::new::<{ usize::MAX }>(file)); diff --git a/src/lib.rs b/src/lib.rs index 4800d40..e036fca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,6 +65,6 @@ pub mod stl; pub use deed::{CallParams, DeedBuilder, Satisfaction}; pub use ledger::{AcceptError, Ledger}; #[cfg(feature = "binfile")] -pub use ledger::{LEDGER_MAGIC_NUMBER, LEDGER_VERSION}; +pub use ledger::{DEEDS_MAGIC_NUMBER, DEEDS_VERSION}; pub use state::{EffectiveState, ProcessedState, RawState, Transition}; pub use stock::{IssueError, Stock}; diff --git a/src/stock.rs b/src/stock.rs index 6270ad2..aa9807d 100644 --- a/src/stock.rs +++ b/src/stock.rs @@ -266,7 +266,7 @@ pub trait Stock { /// [`Self::add_reading`] as an `addr` argument. fn read_by(&self, addr: CellAddr) -> impl Iterator; - /// Returns an id of an operation spending a provided address (operation owned state output). + /// Returns an id of an operation spending a provided address (operation-owned state output). /// /// # Nota bene /// @@ -362,7 +362,7 @@ pub trait Stock { /// - add the `reader` to the list of readers who had accessed the address. fn add_reading(&mut self, addr: CellAddr, reader: Opid); - /// Registers a given operation owned output (`spent`) to be spent (used as an input) in + /// Registers a given operation-owned output (`spent`) to be spent (used as an input) in /// operation `spender`. /// /// # Blocking I/O diff --git a/tests/reorgs.rs b/tests/reorgs.rs index c9932e6..6ab0c68 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -178,6 +178,7 @@ fn setup(name: &str) -> LedgerDir { types: types.type_system(), }; let issuer = Issuer::new(codex, semantics).unwrap(); + issuer.save("tests/data/Test.issuer").ok(); let seed = &[0xCA; 30][..]; let mut auth = Sha256::digest(seed); From 1b392562d4f266691dd2a0bf397aa7f4933c1285 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 18:06:13 +0200 Subject: [PATCH 17/40] ledger: move position of op count in consignment to make it strict-compatible --- src/ledger.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ledger.rs b/src/ledger.rs index c6c402a..7f02e15 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -277,7 +277,7 @@ impl Ledger { /// Exports contract with all known operations pub fn export_all(&self, writer: StrictWriter) -> io::Result<()> { - self.export_internal(self.0.operation_count(), writer, |_| true, |_, _, w| Ok(w)) + self.export_internal(self.0.operation_count() as u32, writer, |_| true, |_, _, w| Ok(w)) } /// Export a part of a contract history: a graph between set of terminals and genesis. @@ -337,7 +337,7 @@ impl Ledger { } opids.remove(&genesis_opid); - self.export_internal(opids.len() as u64, writer, |opid| opids.remove(opid), aux)?; + self.export_internal(opids.len() as u32, writer, |opid| opids.remove(opid), aux)?; debug_assert!( opids.is_empty(), @@ -359,7 +359,7 @@ impl Ledger { /// Does not write the contract id. pub fn export_internal( &self, - count: u64, + count: u32, mut writer: StrictWriter, mut should_include: impl FnMut(&Opid) -> bool, mut aux: impl FnMut(Opid, &Operation, StrictWriter) -> io::Result>, @@ -370,11 +370,11 @@ impl Ledger { // Write contract id let contract_id = self.contract_id(); writer = self.contract_id().strict_encode(writer)?; - // Write no of operations - writer = count.strict_encode(writer)?; // Write articles writer = articles.strict_encode(writer)?; writer = aux(genesis_opid, &articles.genesis().to_operation(contract_id), writer)?; + // Write no of operations + writer = count.strict_encode(writer)?; // Stream operations for (opid, op) in self.0.operations() { if !should_include(&opid) { @@ -397,9 +397,8 @@ impl Ledger { sig_validator: impl FnOnce(StrictHash, &Identity, &SigBlob) -> Result<(), E>, ) -> Result<(), MultiError> { // We need this closure to avoid multiple `map_err`. - let count = (|| -> Result { + let count = (|| -> Result { let contract_id = ContractId::strict_decode(reader)?; - let count = u64::strict_decode(reader)?; let semantics = Semantics::strict_decode(reader)?; let sig = Option::::strict_decode(reader)?; @@ -411,6 +410,8 @@ impl Ledger { self.upgrade_apis(articles) .map_err(|e| AcceptError::Persistence(e.to_string()))?; + + let count = u32::strict_decode(reader)?; Ok(count) })() .map_err(MultiError::A)?; From 4d516e7563fd7d1b8f5d3dabf32f500c72617e04 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 20:07:20 +0200 Subject: [PATCH 18/40] ledger: add version to the consignment stream --- src/ledger.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ledger.rs b/src/ledger.rs index 7f02e15..796bba1 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -26,7 +26,7 @@ use core::borrow::Borrow; use std::io; use amplify::MultiError; -use commit_verify::StrictHash; +use commit_verify::{ReservedBytes, StrictHash}; use indexmap::IndexSet; use sonic_callreq::MethodName; use sonicapi::{Api, NamedState, OpBuilder, SemanticError, Semantics, SigBlob}; @@ -367,6 +367,8 @@ impl Ledger { let articles = self.articles(); let genesis_opid = articles.genesis_opid(); + // Write version number + writer = (DEEDS_VERSION as u8).strict_encode(writer)?; // Write contract id let contract_id = self.contract_id(); writer = self.contract_id().strict_encode(writer)?; @@ -400,6 +402,8 @@ impl Ledger { let count = (|| -> Result { let contract_id = ContractId::strict_decode(reader)?; + // Check version number + let _ = ReservedBytes::<1, { DEEDS_VERSION as u8 }>::strict_decode(reader)?; let semantics = Semantics::strict_decode(reader)?; let sig = Option::::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; From 6af78353b42f1eb02b3dcac791221b1639e5760d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 20:17:21 +0200 Subject: [PATCH 19/40] ledger: add extension blocks to the consignment Signed-off-by: Dr Maxim Orlovsky --- src/ledger.rs | 16 +++++++++++++++- src/lib.rs | 3 ++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ledger.rs b/src/ledger.rs index 796bba1..af59d60 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -31,7 +31,7 @@ use indexmap::IndexSet; use sonic_callreq::MethodName; use sonicapi::{Api, NamedState, OpBuilder, SemanticError, Semantics, SigBlob}; use strict_encoding::{ - DecodeError, ReadRaw, SerializeError, StrictDecode, StrictEncode, StrictReader, StrictWriter, WriteRaw, + DecodeError, ReadRaw, SerializeError, StrictDecode, StrictEncode, StrictReader, StrictWriter, TypedRead, WriteRaw, }; use ultrasonic::{AuthToken, CallError, CellAddr, ContractId, Identity, Issue, Operation, Opid, VerifiedOperation}; @@ -372,6 +372,8 @@ impl Ledger { // Write contract id let contract_id = self.contract_id(); writer = self.contract_id().strict_encode(writer)?; + // Write an empty extension block + writer = 0u8.strict_encode(writer)?; // Write articles writer = articles.strict_encode(writer)?; writer = aux(genesis_opid, &articles.genesis().to_operation(contract_id), writer)?; @@ -404,6 +406,15 @@ impl Ledger { // Check version number let _ = ReservedBytes::<1, { DEEDS_VERSION as u8 }>::strict_decode(reader)?; + // Read and ignore the extension block + let ext_blocks = u8::strict_decode(reader)?; + for _ in 0..ext_blocks { + let len = u16::strict_decode(reader)?; + let r = unsafe { reader.raw_reader() }; + let _ = r.read_raw::<{ u16::MAX as usize }>(len as usize)?; + } + + // Read articles let semantics = Semantics::strict_decode(reader)?; let sig = Option::::strict_decode(reader)?; let issue = Issue::strict_decode(reader)?; @@ -429,6 +440,9 @@ impl Ledger { }; self.apply_verify(op, false)?; } + // Here we do not check for the end of the stream, + // so in the future we can have arbitrary extensions + // put here with no backward compatibility issues. self.commit_transaction(); Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index e036fca..b84ec72 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,7 +24,8 @@ // TODO: Activate once StrictEncoding will be no_std // #![cfg_attr(not(feature = "std"), no_std)] #![deny( - unsafe_code, + // TODO: Activate once StrictEncoding removes invalid unsafe fn modifiers from the raw reader + // unsafe_code, dead_code, // TODO: Complete documentation // missing_docs, From 833605649f81c17681e6003af9a92621994cc3ff Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 21:08:31 +0200 Subject: [PATCH 20/40] api: reserve AluVM state builders, covertors and arithmetics --- api/src/state/adaptors.rs | 31 ++++++-- api/src/state/arithmetics.rs | 32 +++++++-- src/ledger.rs | 3 +- src/stl.rs | 2 +- stl/SONIC.vesper | 132 +++++++++++++++++++++++++++++++++-- stl/SONIC@0.12.0.sta | 87 ++++++++++++----------- stl/SONIC@0.12.0.stl | Bin 6868 -> 7099 bytes stl/SONIC@0.12.0.sty | 15 ++-- 8 files changed, 235 insertions(+), 67 deletions(-) diff --git a/api/src/state/adaptors.rs b/api/src/state/adaptors.rs index d9e6812..fb8beb7 100644 --- a/api/src/state/adaptors.rs +++ b/api/src/state/adaptors.rs @@ -23,6 +23,7 @@ use std::io; +use aluvm::LibSite; use amplify::confinement::{Confined, ConfinedBlob}; use amplify::num::u256; use sonic_callreq::StateName; @@ -50,10 +51,17 @@ pub enum StateConvertor { #[strict_type(tag = 0x11)] TypedFieldEncoder(StateTy), // In the future we can add more adaptors: - // - doing more compact encoding (storing type in bits, not a full field element); + // - doing more compact encoding (storing state type in bits, not using a full field element); // - using just a specific range of field element bits, not a full value - such that multiple APIs may read // different parts of the same data; - // - using a Turing complete grammar with some VM (AluVM? RISC-V? WASM?). + /// Execute a custom function. + // AluVM is reserved for the future. We need it here to avoid breaking changes. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), } impl StateConvertor { @@ -68,6 +76,7 @@ impl StateConvertor { Self::Unit => Err(StateConvertError::UnitState), Self::TypedEncoder(ty) => typed_convert(*ty, sem_id, value, sys), Self::TypedFieldEncoder(ty) => typed_field_convert(*ty, sem_id, value, sys), + Self::AluVM(_) => Err(StateConvertError::Unsupported), } } } @@ -86,8 +95,15 @@ pub enum StateBuilder { #[strict_type(tag = 0x11)] TypedFieldEncoder(StateTy), // In the future we can add more adaptors: - // - doing more compact encoding (storing type in bits, not a full field element); - // - using a Turing complete grammar with some VM (AluVM? RISC-V? WASM?). + // - doing more compact encoding (storing state type in bits, not using a full field element); + /// Execute a custom function. + // AluVM is reserved for the future. We need it here to avoid breaking changes. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), } impl StateBuilder { @@ -102,6 +118,7 @@ impl StateBuilder { typed_build(*ty, ser) } Self::TypedFieldEncoder(ty) => typed_field_build(*ty, typed.unbox())?, + Self::AluVM(_) => return Err(StateBuildError::Unsupported), }) } } @@ -127,6 +144,9 @@ pub enum StateBuildError { #[display("the provided value doesn't match the required unit type")] InvalidUnit, + + #[display("AluVM is not yet supported for a state builder.")] + Unsupported, } #[derive(Clone, Eq, PartialEq, Debug, Display, Error, From)] @@ -143,6 +163,9 @@ pub enum StateConvertError { #[display("state has no data")] UnitState, + + #[display("AluVM is not yet supported for a state conversion.")] + Unsupported, } fn typed_convert( diff --git a/api/src/state/arithmetics.rs b/api/src/state/arithmetics.rs index 78192db..f62bd7f 100644 --- a/api/src/state/arithmetics.rs +++ b/api/src/state/arithmetics.rs @@ -23,6 +23,7 @@ use core::str::FromStr; +use aluvm::LibSite; use strict_types::value::StrictNum; use strict_types::StrictVal; @@ -30,14 +31,22 @@ use crate::LIB_NAME_SONIC; #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC, tags = repr, try_from_u8, into_u8)] +#[strict_type(lib = LIB_NAME_SONIC, tags = custom)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -#[repr(u8)] pub enum StateArithm { - #[strict_type(dumb)] - Fungible = 0, - NonFungible = 1, - // In the future more arithmetics can be added, for instance, based on Tunring-complete VMs. + #[strict_type(tag = 0x00, dumb)] + Fungible, + + #[strict_type(tag = 0x01)] + NonFungible, + // In the future more arithmetics can be added. + /// Execute a custom function. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), } impl StateArithm { @@ -45,6 +54,7 @@ impl StateArithm { match self { Self::Fungible => StateCalc::Fungible(StrictVal::Number(StrictNum::Uint(0))), Self::NonFungible => StateCalc::NonFungible(vec![]), + Self::AluVM(_) => StateCalc::AluVM, } } } @@ -57,13 +67,17 @@ pub enum StateCalcError { /// state cannot be computed. UncountableState, + + /// AluVM is not yet supported for the state arithmetics. + Unsupported, } #[derive(Clone, Eq, PartialEq, Debug)] pub enum StateCalc { NonFungible(Vec), Fungible(StrictVal), - // In the future more calculators can be added, for instance, keeping a state of a Turing-complete VM. + // AluVM is reserved for the future. We need it here to avoid breaking changes. + AluVM, } impl StateCalc { @@ -86,6 +100,7 @@ impl StateCalc { *val = val.checked_add(add).ok_or(StateCalcError::Overflow)?; Ok(()) } + Self::AluVM => Err(StateCalcError::Unsupported), } } @@ -115,6 +130,7 @@ impl StateCalc { *val -= dec; Ok(()) } + Self::AluVM => Err(StateCalcError::Unsupported), } } @@ -131,6 +147,7 @@ impl StateCalc { } _ => return Err(StateCalcError::UncountableState), }, + Self::AluVM => return Err(StateCalcError::Unsupported), }) } @@ -150,6 +167,7 @@ impl StateCalc { false } } + Self::AluVM => false, } } } diff --git a/src/ledger.rs b/src/ledger.rs index af59d60..e9a776b 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -38,6 +38,8 @@ use ultrasonic::{AuthToken, CallError, CellAddr, ContractId, Identity, Issue, Op use crate::deed::{CallParams, DeedBuilder}; use crate::{Articles, EffectiveState, IssueError, ProcessedState, Stock, Transition}; +pub const DEEDS_VERSION: u16 = 0; + /// Contract with all its state and operations, supporting updates and rollbacks. // We need this structure to hide internal persistence methods and not to expose them. // We need the persistence trait (`Stock`) in order to allow different persistence storage @@ -638,7 +640,6 @@ mod _fs { use super::*; pub const DEEDS_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"DEEDLDGR"); - pub const DEEDS_VERSION: u16 = 0; impl Ledger { pub fn export_to_file( diff --git a/src/stl.rs b/src/stl.rs index 8dfad96..97ad222 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:ZxZS5Oz1-AMK_ZjX-EasLoq_-Dl~MMML-ksDdbSW-gQ_HUAY#classic-extreme-mimic"; +pub const LIB_ID_SONIC: &str = "stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 730e58a..727d9c2 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -39,10 +39,16 @@ rec Semantics is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -51,20 +57,34 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator @@ -174,10 +194,16 @@ rec Semantics is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -186,20 +212,34 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator @@ -383,10 +423,16 @@ rec Issuer is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -395,20 +441,34 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator @@ -518,10 +578,16 @@ rec Issuer is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -530,20 +596,34 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator @@ -711,10 +791,16 @@ rec Articles is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -723,20 +809,34 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator @@ -846,10 +946,16 @@ rec Articles is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 union rawBuilder, RawBuilder @@ -858,20 +964,34 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi bytes semId, len 32, aka SemId - enum arithmetics, StateArithm, fungible 0, nonFungible 1 + union arithmetics, StateArithm + is fungible, Unit, tag 0 + is nonFungible, Unit, tag 1 + rec aluVm, LibSite, wrapped, tag 2 + bytes libId, len 32, aka LibId + is offset, U16 union convertor, StateConvertor is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 union builder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 bytes witnessSemId, len 32, aka SemId union witnessBuilder, StateBuilder is unit, Unit, tag 0 is typedEncoder, U256, wrapped, tag 1 is typedFieldEncoder, U256, wrapped, tag 2 + rec aluVm, LibSite, wrapped, tag 3 + bytes libId, len 32, aka LibId + is offset, U16 map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index c918af0..31aa027 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZxZS5Oz1-AMK_ZjX-EasLoq_-Dl~MMML-ksDdbSW-gQ_HUAY#classic-extreme-mimic +Id: stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 66122e28c0a0bbfab6b97a36898edeb8b2f61a9f066ca1e1d304a2a86ffb6eed +Check-SHA256: 20e80f316cc1b061235d2da06a83eb70b52c4009757cb1a7f9891ab68bf607e8 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -55,15 +55,15 @@ NULZXE0|-HmqXR*3X$A-fV{c?-cu8ae 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 -2Pj0>g~&^g7mw%Cdg|0Y- -zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ -&^g7V=@0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW= -(>>~JNCWGL*g;d++M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ -Fd8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJlC**6;}%ie4wrTWpLzfxZ1G^f?j#teR+ -2rNlD$O59e#ogQsB77jPl+h5j^*S;Kc4cyNX>V=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN -!p14WBr9LqgTBPo;{gj!U^Sf= +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 diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 697c849..1f859a7 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:ZxZS5Oz1-AMK_ZjX-EasLoq_-Dl~MMML-ksDdbSW-gQ_HUAY#classic-extreme-mimic + Id: stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -137,19 +137,22 @@ data Semantics : version U16 @mnemonic(insect-cello-avalon) data SigBlob : [Byte ^ 1..0x1000] -@mnemonic(meteor-gondola-sweden) -data StateArithm : fungible | nonFungible - +@mnemonic(pablo-cotton-mirror) +data StateArithm : fungible () + | nonFungible () + | aluVm#255 AluVM.LibSite -@mnemonic(truck-domain-viking) +@mnemonic(reverse-delphi-camel) data StateBuilder : unit () | typedEncoder#16 U256 | typedFieldEncoder U256 + | aluVm#255 AluVM.LibSite -@mnemonic(random-morris-havana) +@mnemonic(beach-congo-instant) data StateConvertor : unit () | typedEncoder#16 U256 | typedFieldEncoder U256 + | aluVm#255 AluVM.LibSite @mnemonic(benny-marina-fashion) data StateSelector : global (StrictTypes.VariantName, Std.Bool) From 9ba4233f5fda9c15521090bfdbba8da58dcbc2e0 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 21:41:49 +0200 Subject: [PATCH 21/40] api: reserve AluVM variant in raw state convertors --- api/src/state/raw.rs | 23 ++++++++-- src/stl.rs | 2 +- stl/SONIC.vesper | 36 ++++++++++++++++ stl/SONIC@0.12.0.sta | 97 ++++++++++++++++++++++--------------------- stl/SONIC@0.12.0.stl | Bin 7099 -> 7249 bytes stl/SONIC@0.12.0.sty | 12 +++--- 6 files changed, 114 insertions(+), 56 deletions(-) diff --git a/api/src/state/raw.rs b/api/src/state/raw.rs index 15199c8..00a5f24 100644 --- a/api/src/state/raw.rs +++ b/api/src/state/raw.rs @@ -21,6 +21,7 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. +use aluvm::LibSite; use amplify::confinement::{SmallBlob, U24 as U24MAX}; use strict_encoding::StreamReader; use strict_types::{SemId, StrictVal, TypeSystem}; @@ -41,13 +42,21 @@ pub enum RawConvertor { // In the future we can add more adaptors: // - using just a specific range of raw bytes, not a full value - such that multiple APIs may read different parts // of the same data; - // - using a Turing complete grammar with some VM (AluVM? RISC-V? WASM?). + /// Execute a custom function. + // AluVM is reserved for the future. We need it here to avoid breaking changes. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), } impl RawConvertor { pub fn convert(&self, raw: &RawData, sys: &TypeSystem) -> Result { match self { Self::StrictDecode(sem_id) => strict_convert(*sem_id, raw, sys), + Self::AluVM(_) => Err(StateConvertError::Unsupported), } } } @@ -60,8 +69,15 @@ pub enum RawBuilder { /// Convert strict value into raw bytes using strict encoding. #[strict_type(tag = 0x00)] StrictEncode(SemId), - // In the future we can add more adaptors: - // - using a Turing complete grammar with some VM (AluVM? RISC-V? WASM?). + + /// Execute a custom function. + // AluVM is reserved for the future. We need it here to avoid breaking changes. + #[strict_type(tag = 0xFF)] + AluVM( + /// The entry point to the script (virtual machine uses libraries from + /// [`crate::Semantics`]). + LibSite, + ), } impl RawBuilder { @@ -69,6 +85,7 @@ impl RawBuilder { pub fn build(&self, val: StrictVal, sys: &TypeSystem) -> Result { match self { Self::StrictEncode(sem_id) => strict_build(*sem_id, val, sys), + Self::AluVM(_) => Err(StateBuildError::Unsupported), } } } diff --git a/src/stl.rs b/src/stl.rs index 97ad222..43722c9 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable"; +pub const LIB_ID_SONIC: &str = "stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 727d9c2..21c39ff 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -51,8 +51,14 @@ rec Semantics is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi @@ -206,8 +212,14 @@ rec Semantics is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi @@ -435,8 +447,14 @@ rec Issuer is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi @@ -590,8 +608,14 @@ rec Issuer is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi @@ -803,8 +827,14 @@ rec Articles is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi @@ -958,8 +988,14 @@ rec Articles is offset, U16 union rawConvertor, RawConvertor bytes strictDecode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 union rawBuilder, RawBuilder bytes strictEncode, len 32, wrapped, aka SemId, tag 0 + rec aluVm, LibSite, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 map owned, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 rec value, OwnedApi diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 31aa027..9c50ef3 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable +Id: stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 20e80f316cc1b061235d2da06a83eb70b52c4009757cb1a7f9891ab68bf607e8 +Check-SHA256: 106c2d9a11d9c2ea5cc2f342f4e362e3fce19b509ea6d0912a5aa55a60a68a10 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -55,15 +55,15 @@ NULZXE0|-HmqXR*3X$A-fV{c?-cu8ae 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 +7D6D}#pW3Uk;M1&000000RR600000000ne; +aAk7>>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0_vj92UBThLTqnh1pxpE002M%00000000005C8xG0000BQ*>c;WkGUjbZBh^0{{qSb#7;AVr*pq0003C +Zf|Zzb#7;AVr*pq00935VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqYP7YVRU6eb!lv5WpV@r00ebzX>0|-HmqYhJaVRU6fZ*F#Fa&&KU1OxyCb#7^N +0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X{{>-ebyjTv1pxxLSt+!S +tw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`yhQ*>c; +Wm9ErWn*-2as&bZ24`$`ZdvN +B=ndTz*X~v;Uq>`<)y^XImOPdju4Lmf{E)*4-0TquXIZV=)u>WBLk*fW6RH_XPEi=Ry;9kVTK~nd#>7J73J3yCzk$#1)IEB9}O*pr-e%zuW +2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWO +hkZic;}HXMb!`9z0s)clSh2=pqY5<1(br?Xy7E4w1fUIUAA#7JB!_)M-s1t0?^v0 +qXeK0Y#)KxnIwmOLf+#N1Y~JuW&i~O0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;{lQHSh2=p +qY5<1(br?Xy7E4w1fUIUAA#7JB!_)M-s2zzY-w|JRsaP70_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0AteWpq{m1pxx-o|5M~K$m}!eub_$g}*CJ +IJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L`25n(*Rx)(}1pxx-o|5M~ +K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4M91aoz5 +RsaP70_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# +&aRFSj|x*xI4ag+tfP`W3(#!7O@f31nq+baHQbWn=&f0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W +)zHQae*2}za$v6rX_fBJi~iN-tVcdiDm&03^NQ+Jc&xL55CR(gZz;O*CD3`g3r=7) +ofi{UWpZFd8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b2XHn)OVqb^hFH2LWhS@RR0@3DXON%_u}tX~pWetnp#Ic=`l%FW%}#~2lC zPW7zMwAw22Tq`+Rkv_CUVg6%vug!(LhD<)oAD3Pa=KhuU;BT_> zp+MiN^!GL|PunG|*cuV`wV-!BJ6BO+xl?IoPD*MK9RYU5G-we?BPsz4hLZvD22lQ{eRL^l`m8Z!A@-dyS9kS{fF#W@e> zMTd{CK4B1Fv1rBCr?*ZooUymZS)HpWvD~RNGbbgrh;fw~Z?DT_N$!u^7DexPuxjRw zvk6J}@6C9cK1teWk4e{-$?y2130gb3kk@MSVu4sjM#jmELP7jIL5bzg`FUljMJ4$~ zER2)a3I$E}5>`-naQRRTb7mNYHWm0h{P`{K<_dnR`YdlOW& J`KxdY2LL=OkqrO< diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 1f859a7..fbe4824 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:HzKD6nNX-PP5Zch2-_e5SO_n-LfRxQr7-sSfKDig-r_DTqBw#donald-june-cable + Id: stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -120,11 +120,13 @@ data OwnedApi : semId StrictTypes.SemId , witnessSemId StrictTypes.SemId , witnessBuilder StateBuilder -@mnemonic(tomato-gordon-craft) -data RawBuilder : strictEncode StrictTypes.SemId | (|) +@mnemonic(tropic-brenda-reply) +data RawBuilder : strictEncode StrictTypes.SemId + | aluVm#255 AluVM.LibSite -@mnemonic(tripod-guitar-bishop) -data RawConvertor : strictDecode StrictTypes.SemId | (|) +@mnemonic(result-right-amazon) +data RawConvertor : strictDecode StrictTypes.SemId + | aluVm#255 AluVM.LibSite @mnemonic(senator-flower-guru) data Semantics : version U16 From 9fd19936524f907aee110445b70f2f1dac12c103 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 21:41:59 +0200 Subject: [PATCH 22/40] api: check for API libraries --- Cargo.lock | 1 + api/Cargo.toml | 1 + api/src/api.rs | 101 ++++++++++++++++++++++++++++++----- api/src/state/aggregators.rs | 5 +- callreq/src/data.rs | 2 +- src/state.rs | 2 +- 6 files changed, 95 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0aef3b7..f635078 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -838,6 +838,7 @@ dependencies = [ "commit_verify", "getrandom 0.2.16", "getrandom 0.3.3", + "indexmap", "rand", "serde", "sonic-callreq", diff --git a/api/Cargo.toml b/api/Cargo.toml index 2f8ef59..b53e126 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -26,6 +26,7 @@ aluvm.workspace = true ultrasonic.workspace = true sonic-callreq.workspace = true binfile = { workspace = true, optional = true } +indexmap.workspace = true serde = { workspace = true, optional = true } chrono.workspace = true diff --git a/api/src/api.rs b/api/src/api.rs index b8251ad..aa670be 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -39,7 +39,6 @@ use core::fmt::{Debug, Display, Formatter}; use core::hash::{Hash, Hasher}; use core::num::ParseIntError; use core::str::FromStr; -use std::collections::{BTreeMap, BTreeSet}; use aluvm::{Lib, LibId}; use amplify::confinement::{SmallOrdMap, SmallOrdSet, TinyOrdMap, TinyOrdSet, TinyString}; @@ -47,6 +46,7 @@ use amplify::num::u256; use amplify::Bytes4; use baid64::{Baid64ParseError, DisplayBaid64}; use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, StrictHash}; +use indexmap::{indexset, IndexMap, IndexSet}; use sonic_callreq::{CallState, MethodName, StateName}; use strict_encoding::TypeName; use strict_types::{SemId, StrictDecode, StrictDumb, StrictEncode, StrictVal, TypeSystem}; @@ -293,22 +293,89 @@ impl Semantics { } } + // Check codex libs for redundancies and completeness let lib_map = self - .api_libs + .codex_libs .iter() .map(|lib| (lib.lib_id(), lib)) - .collect::>(); + .collect::>(); - let libs_set = codex + let mut lib_ids = codex .verifiers .values() - .map(|site| site.lib_id) - .filter_map(|id| lib_map.get(&id)) - .flat_map(|lib| lib.libs.iter().copied().chain([lib.lib_id()])) - .collect::>(); + .map(|entry| entry.lib_id) + .collect::>(); + let mut i = 0usize; + let mut count = lib_ids.len(); + while i < count { + let id = lib_ids.get_index(i).expect("index is valid"); + let lib = lib_map.get(id).ok_or(SemanticError::MissedCodexLib(*id))?; + lib_ids.extend(lib.libs.iter().copied()); + count = lib_ids.len(); + i += 1; + } + for id in lib_map.keys() { + if !lib_ids.contains(id) { + return Err(SemanticError::ExcessiveCodexLib(*id)); + } + } + + // Check API libs for redundancies and completeness + let lib_map = self + .api_libs + .iter() + .map(|lib| (lib.lib_id(), lib)) + .collect::>(); - if lib_map.into_keys().collect::>() != libs_set { - return Err(SemanticError::InvalidLibSet); + let mut lib_ids = indexset![]; + for api in self.apis() { + for agg in api.aggregators.values() { + if let Aggregator::AluVM(entry) = agg { + lib_ids.insert(entry.lib_id); + } + } + for glob in api.global.values() { + if let StateConvertor::AluVM(entry) = glob.convertor { + lib_ids.insert(entry.lib_id); + } + if let StateBuilder::AluVM(entry) = glob.builder { + lib_ids.insert(entry.lib_id); + } + if let RawConvertor::AluVM(entry) = glob.raw_convertor { + lib_ids.insert(entry.lib_id); + } + if let RawBuilder::AluVM(entry) = glob.raw_builder { + lib_ids.insert(entry.lib_id); + } + } + for owned in api.owned.values() { + if let StateConvertor::AluVM(entry) = owned.convertor { + lib_ids.insert(entry.lib_id); + } + if let StateBuilder::AluVM(entry) = owned.builder { + lib_ids.insert(entry.lib_id); + } + if let StateBuilder::AluVM(entry) = owned.witness_builder { + lib_ids.insert(entry.lib_id); + } + if let StateArithm::AluVM(entry) = owned.arithmetics { + lib_ids.insert(entry.lib_id); + } + } + } + let mut i = 0usize; + let mut count = lib_ids.len(); + while i < count { + let id = lib_ids.get_index(i).expect("index is valid"); + let lib = lib_map.get(id).ok_or(SemanticError::MissedApiLib(*id))?; + lib_ids.extend(lib.libs.iter().copied()); + count = lib_ids.len(); + i += 1; + } + for id in lib_map.keys() { + if !lib_ids.contains(id) { + return Err(SemanticError::ExcessiveApiLib(*id)); + } } Ok(()) @@ -570,9 +637,17 @@ pub enum SemanticError { /// articles contain duplicated API {0} under a different name. DuplicatedApi(StrictHash), - /// the set of libraries provided in the contract articles doesn't match the set of libraries - /// required for the codex. - InvalidLibSet, + /// library {0} is used by the contract codex verifiers but absent from the articles. + MissedCodexLib(LibId), + + /// library {0} is present in the contract articles but not used in the codex verifiers. + ExcessiveCodexLib(LibId), + + /// library {0} is used by the contract APIs but absent from the articles. + MissedApiLib(LibId), + + /// library {0} is present in the contract articles but not used in the APIs. + ExcessiveApiLib(LibId), /// invalid signature over the contract articles. InvalidSignature, diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 18421cc..5f3c685 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -21,10 +21,11 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use std::collections::BTreeMap; +use alloc::collections::BTreeMap; use aluvm::{Lib, LibId, LibSite}; use amplify::confinement::TinyBlob; +use indexmap::IndexMap; use sonic_callreq::StateName; use strict_encoding::StrictDumb; use strict_types::value::{EnumTag, StrictNum}; @@ -131,7 +132,7 @@ impl Aggregator { let libs = libs .into_iter() .map(|lib| (lib.lib_id(), lib)) - .collect::>(); + .collect::>(); let mut vm = aluvm::Vm::>::new(); // For now, we ignore all computations and return `None` anyway. // This leaves a way to add proper VM computing in the future diff --git a/callreq/src/data.rs b/callreq/src/data.rs index d22bb73..1eec15b 100644 --- a/callreq/src/data.rs +++ b/callreq/src/data.rs @@ -21,9 +21,9 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. +use core::convert::Infallible; use core::fmt::{self, Display, Formatter}; use core::str::FromStr; -use std::convert::Infallible; use amplify::confinement::{ConfinedVec, TinyBlob}; use baid64::Baid64ParseError; diff --git a/src/state.rs b/src/state.rs index 4ad550f..0e78cef 100644 --- a/src/state.rs +++ b/src/state.rs @@ -22,7 +22,7 @@ // the License. use alloc::collections::BTreeMap; -use std::mem; +use core::mem; use aluvm::Lib; use amplify::confinement::{LargeOrdMap, SmallOrdMap, SmallOrdSet}; From e1dbe60512ab25f8c0118ac96ecd4d084570bc3e Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 22:38:28 +0200 Subject: [PATCH 23/40] api: final touches to aggregators --- api/src/state/aggregators.rs | 154 +++++++--- examples/dao/main.rs | 2 +- src/stl.rs | 2 +- stl/SONIC.vesper | 570 +++++++++++++++++++++++++++-------- stl/SONIC@0.12.0.sta | 166 +++++----- stl/SONIC@0.12.0.stl | Bin 7249 -> 7529 bytes stl/SONIC@0.12.0.sty | 20 +- tests/dao.rs | 2 +- 8 files changed, 651 insertions(+), 265 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 5f3c685..23dffd0 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -55,7 +55,7 @@ pub enum StateSelector { /// A set of pre-defined top-level state aggregators (see [`crate::Api::aggregators`]. #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Count(strict_dumb!()))] +#[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Some(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum Aggregator { /// Takes the underlying aggregated state and applies nothing on top. @@ -64,20 +64,16 @@ pub enum Aggregator { #[strict_type(tag = 0)] Take(SubAggregator), - /// The aggregated state is generated with a predefined constant value. + /// Wrap into an optional value. /// - /// To produce a state with a unit value, use `Self::Const(SemId::unit(), none!())`. + /// If the underlying aggregated state fails, sets the aggregated state to `None`. #[strict_type(tag = 1)] - Const(SemId, TinyBlob), + Some(SubAggregator), /// If the underlying aggregated state fails, returns the provided constant value. #[strict_type(tag = 2)] Or(SubAggregator, SemId, TinyBlob), - /// Count the number of elements of the global state of a certain type. - #[strict_type(tag = 0x10)] - Count(StateName), - /// Execute a custom function on the state. #[strict_type(tag = 0xFF)] AluVM( @@ -92,8 +88,8 @@ impl Aggregator { /// and which needs to be computed before running this aggregator. pub fn depends_on(&self) -> impl Iterator { match self { - Self::Take(sub) | Self::Or(sub, _, _) => sub.depends_on(), - Self::Const(_, _) | Self::Count(_) | Self::AluVM(_) => vec![], + Self::Take(sub) | Self::Some(sub) | Self::Or(sub, _, _) => sub.depends_on(), + Self::AluVM(_) => vec![], } .into_iter() } @@ -113,21 +109,15 @@ impl Aggregator { match self { Self::Take(sub) => sub.aggregate(global, aggregated, types), - Self::Const(sem_id, val) => deserialize(*sem_id, val, types), + Self::Some(sub) => Some(match sub.aggregate(global, aggregated, types) { + Some(val) => StrictVal::some(val), + None => StrictVal::none(), + }), Self::Or(sub, sem_id, val) => sub .aggregate(global, aggregated, types) .or_else(|| deserialize(*sem_id, val, types)), - Self::Count(name) => { - let count = global - .get(name) - .into_iter() - .flat_map(BTreeMap::values) - .count(); - Some(svnum!(count as u64)) - } - Self::AluVM(entry) => { let libs = libs .into_iter() @@ -150,12 +140,30 @@ impl Aggregator { #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Neg(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum SubAggregator { + /// The aggregated state is generated with a predefined constant value. + /// + /// To produce a state with a unit value, use `Self::Const(SemId::unit(), none!())`. + #[strict_type(tag = 0)] + Const(SemId, TinyBlob), + + /// Takes the only element of the global state. + /// + /// Fails if the state is not defined or has more than one defined element. + #[strict_type(tag = 1)] + TheOnly(StateName), + + /// Takes some other aggregated and copies it. + /// + /// Fails if the other aggregated state is not defined. + #[strict_type(tag = 2)] + Copy(StateName), + /// Unwraps an optional value. /// /// If the value is `None`, sets the state to the provided constant. /// - /// If the state is not defined, or not an optional, fails. - #[strict_type(tag = 1)] + /// Fails if the state is not defined, is multiple, or not an optional. + #[strict_type(tag = 3)] UnwrapOr(StateName, SemId, TinyBlob), /// Integer-negate state. @@ -179,12 +187,16 @@ pub enum SubAggregator { #[strict_type(tag = 0x12)] Diff(StateSelector, StateSelector), + /// Count the number of elements of the global state of a certain type. + #[strict_type(tag = 0x20)] + Count(StateName), + /// Convert a verified state under the same state type into a vector. /// /// Acts only on a global state; doesn't recognize aggregated state. /// /// If the global state with the name is absent returns an empty list. - #[strict_type(tag = 0x20)] + #[strict_type(tag = 0x21)] ListV(StateName), /// Convert a verified state under the same state type into a sorted set. @@ -192,7 +204,7 @@ pub enum SubAggregator { /// Acts only on a global state; doesn't recognize aggregated state. /// /// If the global state with the name is absent returns an empty set. - #[strict_type(tag = 0x21)] + #[strict_type(tag = 0x22)] SetV(StateName), /// Map from a field-based element state to a non-verifiable structured state. @@ -200,7 +212,7 @@ pub enum SubAggregator { /// Acts only on a global state; doesn't recognize aggregated state. /// /// If the global state with the name is absent returns an empty map. - #[strict_type(tag = 0x22)] + #[strict_type(tag = 0x23)] MapV2U(StateName), /// Sums over verifiable part of a global state. @@ -210,7 +222,10 @@ pub enum SubAggregator { /// Fails if the global state doesn't have any elements, /// or the state type is not an unsigned integer. #[strict_type(tag = 0x30)] - SumV(StateName), + SumVUnwrap(StateName), + + #[strict_type(tag = 0x31)] + SumVDefault(StateName), } impl SubAggregator { @@ -227,14 +242,19 @@ impl SubAggregator { Self::Sum(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) | Self::Diff(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) => vec![a, b], - Self::Neg(_) + Self::Const(_, _) + | Self::TheOnly(_) + | Self::Count(_) + | Self::Copy(_) + | Self::Neg(_) | Self::Sum(_, _) | Self::Diff(_, _) | Self::UnwrapOr(_, _, _) | Self::ListV(_) | Self::SetV(_) | Self::MapV2U(_) - | Self::SumV(_) => vec![], + | Self::SumVUnwrap(_) + | Self::SumVDefault(_) => vec![], } } @@ -268,7 +288,19 @@ impl SubAggregator { } }; - Some(match self { + match self { + Self::Const(sem_id, val) => deserialize(*sem_id, val, types), + + Self::TheOnly(name) => { + let state = global.get(name)?; + if state.len() != 1 { + return None; + } + Some(state.first_key_value()?.1.verified.clone()) + } + + Self::Copy(name) => aggregated.get(name).cloned(), + Self::UnwrapOr(name, sem_id, val) => { let state = global.get(name)?; if state.len() != 1 { @@ -278,7 +310,7 @@ impl SubAggregator { let StrictVal::Union(tag, sv) = &atom.verified else { return None; }; - match tag { + Some(match tag { EnumTag::Name(name) if name.as_str() == "none" && sv.as_ref() == &StrictVal::Unit => { return deserialize(*sem_id, val, types) } @@ -286,35 +318,44 @@ impl SubAggregator { EnumTag::Name(name) if name.as_str() == "some" => sv.as_ref().clone(), EnumTag::Ord(1) => sv.as_ref().clone(), _ => return None, - } + }) } Self::Neg(name) => { let val = get_u64(name)?; let neg = (val as i64).checked_neg()?; - svnum!(neg) + Some(svnum!(neg)) } Self::Sum(a, b) => { let a = get_u64(a)?; let b = get_u64(b)?; let sum = a.checked_add(b)?; - svnum!(sum) + Some(svnum!(sum)) } Self::Diff(a, b) => { let a = get_u64(a)?; let b = get_u64(b)?; let sub = a.checked_sub(b)?; - svnum!(sub) + Some(svnum!(sub)) + } + + Self::Count(name) => { + let count = global + .get(name) + .into_iter() + .flat_map(BTreeMap::values) + .count(); + Some(svnum!(count as u64)) } - Self::ListV(name) => StrictVal::List( + Self::ListV(name) => Some(StrictVal::List( global .get(name) .into_iter() .flat_map(BTreeMap::values) .map(|atom| atom.verified.clone()) .collect(), - ), + )), Self::SetV(name) => { let mut set = Vec::new(); for state in global.get(name).into_iter().flat_map(BTreeMap::values) { @@ -322,7 +363,7 @@ impl SubAggregator { set.push(state.verified.clone()); } } - StrictVal::Set(set) + Some(StrictVal::Set(set)) } Self::MapV2U(name) => { let mut map = Vec::new(); @@ -333,10 +374,10 @@ impl SubAggregator { } map.push((atom.verified.clone(), val.clone())); } - StrictVal::Map(map) + Some(StrictVal::Map(map)) } - Self::SumV(name) => { + Self::SumVUnwrap(name) => { let sum = global .get(name) .into_iter() @@ -345,9 +386,22 @@ impl SubAggregator { StrictVal::Number(StrictNum::Uint(val)) => Some(sum + *val), _ => None, })?; - svnum!(sum) + Some(svnum!(sum)) + } + + Self::SumVDefault(name) => { + let sum = global + .get(name) + .into_iter() + .flat_map(BTreeMap::values) + .filter_map(|val| match &val.verified { + StrictVal::Number(StrictNum::Uint(val)) => Some(*val), + _ => None, + }) + .sum::(); + Some(svnum!(sum)) } - }) + } } } @@ -398,8 +452,11 @@ mod test { #[test] fn verified_readers() { - assert_eq!(call(Aggregator::Count(vname!("verified"))), svnum!(6u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::SumV(vname!("verified")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); + assert_eq!( + call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("verified")))), + svnum!(5u64 + 1 + 2 + 3 + 4 + 5) + ); assert_eq!( call(Aggregator::Take(SubAggregator::ListV(vname!("verified")))), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) @@ -413,7 +470,7 @@ mod test { #[test] fn unverified_readers() { - assert_eq!(call(Aggregator::Count(vname!("unverified"))), svnum!(6u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); assert_eq!( call(Aggregator::Take(SubAggregator::ListV(vname!("unverified")))), svlist!([(), (), (), (), (), ()]) @@ -427,12 +484,15 @@ mod test { #[test] #[should_panic] - fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumV(vname!("unverified")))); } + fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("unverified")))); } #[test] fn pair_readers() { - assert_eq!(call(Aggregator::Count(vname!("pairs"))), svnum!(6u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::SumV(vname!("pairs")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); + assert_eq!( + call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("pairs")))), + svnum!(5u64 + 1 + 2 + 3 + 4 + 5) + ); assert_eq!( call(Aggregator::Take(SubAggregator::ListV(vname!("pairs")))), svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) diff --git a/examples/dao/main.rs b/examples/dao/main.rs index 9379fab..f091bce 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -113,7 +113,7 @@ fn api() -> Api { vname!("parties") => Aggregator::Take(SubAggregator::MapV2U(vname!("_parties"))), vname!("votings") => Aggregator::Take(SubAggregator::MapV2U(vname!("_votings"))), vname!("votes") => Aggregator::Take(SubAggregator::SetV(vname!("_votes"))), - vname!("votingCount") => Aggregator::Count(vname!("_votings")), + vname!("votingCount") => Aggregator::Take(SubAggregator::Count(vname!("_votings"))), }, verifiers: tiny_bmap! { vname!("setup") => 0, diff --git a/src/stl.rs b/src/stl.rs index 43722c9..b8b1a20 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent"; +pub const LIB_ID_SONIC: &str = "stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 21c39ff..bc01fef 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -95,16 +95,21 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -115,7 +120,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -126,25 +131,72 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -155,7 +207,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -166,14 +218,15 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -256,16 +309,21 @@ rec Semantics ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -276,7 +334,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -287,25 +345,72 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -316,7 +421,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -327,14 +432,15 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -491,16 +597,21 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -511,7 +622,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -522,25 +633,72 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -551,7 +709,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -562,14 +720,15 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -652,16 +811,21 @@ rec Issuer ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -672,7 +836,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -683,25 +847,72 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -712,7 +923,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -723,14 +934,15 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -871,16 +1083,21 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -891,7 +1108,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -902,25 +1119,72 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -931,7 +1195,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -942,14 +1206,15 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -1032,16 +1297,21 @@ rec Articles ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator union take, SubAggregator, wrapped, tag 0 - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1052,7 +1322,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1063,25 +1333,72 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - tuple const, tag 1 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + union some, SubAggregator, wrapped, tag 1 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + union neg, StateSelector, wrapped, tag 4 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sum, tag 5 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple diff, tag 6 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 tuple or, tag 2 union SubAggregator - tuple unwrapOr, tag 0 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple unwrapOr, tag 3 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 1 + union neg, StateSelector, wrapped, tag 4 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 2 + tuple sum, tag 5 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1092,7 +1409,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 3 + tuple diff, tag 6 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1103,14 +1420,15 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 - ascii sumV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 - rec aluVm, LibSite, wrapped, tag 4 + rec aluVm, LibSite, wrapped, tag 3 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 9c50ef3..3617581 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent +Id: stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 106c2d9a11d9c2ea5cc2f342f4e362e3fce19b509ea6d0912a5aa55a60a68a10 +Check-SHA256: 606f109efbea39ab2a4c224e87a7a04c39de1f1cc462d5dcb7cc652799ed6bbe 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -45,85 +45,89 @@ cBe%OQ*>c;WmaKqb!D@OIM0+Zf@L2l@d@(MQJsr54hK$(!e6HQqr!PDy=MtQb#!P{Z);_4wXEwu(4(eX D|DxJ;;J@Cth|EksiOt-HPJ-=lHfc*2SaaUWq3(sw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u 2uWmRZggpMdGHmh1*yTf7t)jcn*aB%1xpArrVPVhCp50mBKADGoe5KPVRU6fWo&HwrN?q$uLxQs2Fvw;u@LuG7iL1bid{aM4p>0IFOo~Y652;7|;2>m$hiUk~2&U-senAm#W2U1~o -L}7Gc6aWfAXJ>L{XJK@2as&kc1ax6*WdH>M0WUqH=LY{3WVn;)`Tq=jV$1v`i7^rMUp%P-!2^ob4FLsX -Z*FsR00ja9>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ -{MVycPK^Kv002M$0000000030000000000G1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+< -MAdF9JWvUS!HXjLHPLD$^q3aFRr7@5Bt}`~rNq!V#m=sd5Rd-_VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2 -NULZXE0|-HmqXR*3X$A-fV{c?-cu8ae -8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ;%M$&Z5jY5(0N24`$mw%Cdg|0Y-zbj2Rx3qrT -q9O+{R>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0< -ZYw-c35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7Lkd(R(OIzR -#{i@7r~m)}000000RI300000001IJfXL4m{VRUbDa{vkg>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0< -ZYw-c35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g73Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+&tpWn*h|b!`O!00#g7Km-5?L2`6y -V{Bz}1_KFmWo=<@bZKLA0X)i#uW3596z3{iYZXmu54GFpXe^h(q#MGdAfMwWN&|CgX8;5O00eGtZe;)f -009JZZ*64&1pxse#}{qTDnK1gUZ=~4IPtBJuMnKCWEcQ$kD_ZvQg;glX>)URWda)gZz;O*CD3`mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+WBLk*fW6RH_XPEi=Ry;9kVTK~nd#>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOwVs&Y3WMy&zL1&V2o**cr;@RA^ -i_^yDJVpBQO{s7F8GT|w6)bIX402(2LvL<&WpZ?Hasj8~b=Ol1`flL;V4R=asm5cRyk`k?kWEQdWrTza1nu+B|GJQ%{OSD#2Xf2lLZDzb8~fNas~qhV{c?-cmf*z -Zz;O*CD3`@39Wprs{ -a{;r1T$Agw*bMrRl}V)K>bDD4(!40@Nrp_Cq-P`IBRUCVZ*F#Fa&&KU0oQM=cYl!udKzn6R -YBAzQ=MVTbvT3l6Ne5zeX>4R=asfeSl5w6OD5K)p+_a0+#^yXl`tnVwZ~Ym4VnG!wZE_5EX>@L7b8}N= -ZAoMT>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0G50sstibaH89bVOxiZ)9Zv1pxx- -o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb=q -1z~J;R&4+U0Rp#KDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL -7S@v%AOi?Nj-v@vWo=<@bZKLA1_lRqWpZ7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj06v={gsJ=SZ -lTl1iF5eQ8IAl(q%E@>So406W0UNSf)mddHtw<)M)YyG7sp>k)R2a}an#p(gC{(C_zyJUM000000RR60 -00000010DnWMz0vX<~B#2?DoSDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g&i7o!sA0+CHx-vZbVj -7D6D}#pW3Uk;M1&000000RR600000000ne; -aAk7>>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0_vj92UBThLTqnh1pxpE002M%00000000005C8xG0000BQ*>c;WkGUjbZBh^0{{qSb#7;AVr*pq0003C -Zf|Zzb#7;AVr*pq00935VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqYP7YVRU6eb!lv5WpV@r00ebzX>0|-HmqYhJaVRU6fZ*F#Fa&&KU1OxyCb#7^N -0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X{{>-ebyjTv1pxxLSt+!S -tw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`yhQ*>c; -Wm9ErWn*-2as&bZ24`$`ZdvN -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 +01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ +t0eX2w~A!Q+0eaZ{MVycPL2NsVQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqYP4EcSCP(c4cyOZ*l|z01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPL2Ns +VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqX|=GZDDS7X=8H+1_yR!a&u{KZU6uR2V`YtVRdYD0jDcYZ2mPnYfdSs)GDjwV%NMksnz(b +Kt=W`b-H*%*al;Db98TQ015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;E +QA|)S-x88IWKN#S$#@T&w`gPmrz=iu{xv&mPARC=Dy!sT*St5W)%dJHMfNFmx_Cp_0000000000|Nj60 +0000031e?$Wq3?!Vsiiq0=HQyw2!Sv!6MOSp3-i2NULZXE;M1&000000RR600000000&`kX-sKia{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7 +Knlpb7_LPzv?=G$Lt&lV-%#2HY;R%(0RRX906+l%000000000G00000000Y9bYXO5L2_wyXl(=o00?GvZf9v?Y-Iod009eb +Z*E3)Zf9v?Y-Iod0RIJHY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$*7My#T6183 +ELud{7pMT5X4R=as&hb1a)p{bN~PV5DavAaAjmgZewp`WpV%o +0RR9X5fOBGaAjmhX=Q9=MQ&qnWMy&y1pxp6ApZqnY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb +7_LPzv?=G$*7My#T6183ELud{7pMT5XG51ONneZfSG? +000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001EW1z~J;R&4+U0Rp#KDYTER +N5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-w4zbYXO5 +Q)O&rV{~tF1OfmCXKZg`VQc^e0s`rtlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+uJC38 +-{*D7fZ(%hZo23R4S;p`Q9JBQllDyk3Snnwa%E>>bY)}!1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}} +C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LxQ*~lNXJ>L{XJK@2as&+k1!He+b94X& +0s`rtlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVyc +PK^Kv002M$000000003000000000012Xts7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0< +ZYw-c35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7mw%Cdg|0Y-zbj2R +x3qrTq9O+7J73 +J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g70qXeK0Y#)KxnIwmOLf+#M19Nq4 +00ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWO +hkZic;}Qg9X=Y{s1p)z)?^v0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lb +KBEMn4QwBQ*qJ1UeL~*jAO&M@b#8P31pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&> +`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L_1#D?^bXEWb0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+< +MAdF9JWvUS!HXjLHPLD$^q3aFRr7@5Bt}`~rNq!V#m=sd5RW1Rb7gc^00jX8>7J73J3yCzk$#1)IEB9} +O*pr-e%zuW2Pj0>g~&^g77J73 +J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7Z +ZB|uocXDBH00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7? +iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|x*xI4ag+tfP`W3(#!7O@f31nq+baHQbWn=&f0vi2q +DZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQae*2}za$v6rX_fBJi~iN-tVcdiDm&03^NQ+Jc&xL55CR(g +Zz;O*CD3`g3r=7)ofi{UWpZFd8vSo6y748@dD%A` +C(GV!Bc=M$qQ6pJ-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b2X{JF;M#jv>59P7U#l|dkWhY!Nd@^`^|Mza2b4NZl>g}|x zeO~Xz$Wol2OO#3`ru-rXR%U`GGQFIteda)?66sJy>mvm!Pp1eWQhnuUoG&d|Xue>O+0Hl@2 XkQ*f6lA4xSnlt$!r|V`{DIO*OgXF^? delta 347 zcmaE9b{JF;Mn-+x#n0LPi>Bf7e^fgS1;51GtYkXK z+;x?gak7PYyap3feh~vJGeOmp9mT^K1tw3F^qTx$)O+&>&M%A#*1!K0)!Y(I>NVzR zvQp@`sF-%(YSh!)SAR+tEnM?xdBJ2Bo-+zIr+U_BT5T11t`(gv>YK&C_4e}&o#_Xc zNFQ3FF#oZ-*X9pAH<$>jn*4#sYO|8SaV7=nO;J}PQ`Ogcs4cm2qt5*KV{ zoh<*M5wfEGz+_HgZ-R<8mk1wXX5wJntS^zwIQg!mCyOFWaq8p;lJ1iWrF>Xeic51R NKa_Oc94pPk1OS#Ml{EkW diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index fbe4824..fd42004 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:o1mAwC2V-BqvNYzm-2nSfelM-yKM5hNO-xf1gQsd-hfoQL0c#passive-phrase-accent + Id: stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -71,11 +71,10 @@ import StrictTypes#henry-heart-survive use TypeSystem#adrian-boris-sponsor -@mnemonic(fiction-shine-ceramic) +@mnemonic(roof-monkey-stand) data Aggregator : take SubAggregator - | const (StrictTypes.SemId, [Byte ^ ..0xff]) + | some SubAggregator | or (SubAggregator, StrictTypes.SemId, [Byte ^ ..0xff]) - | count#16 StrictTypes.VariantName | aluVm#255 AluVM.LibSite @mnemonic(cobra-abraham-bonus) @@ -160,15 +159,20 @@ data StateConvertor : unit () data StateSelector : global (StrictTypes.VariantName, Std.Bool) | aggregated StrictTypes.VariantName -@mnemonic(garlic-horizon-scroll) -data SubAggregator : unwrapOr#1 (StrictTypes.VariantName, StrictTypes.SemId, [Byte ^ ..0xff]) +@mnemonic(judge-gloria-weekend) +data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) + | theOnly StrictTypes.VariantName + | copy StrictTypes.VariantName + | unwrapOr (StrictTypes.VariantName, StrictTypes.SemId, [Byte ^ ..0xff]) | neg#16 StateSelector | sum (StateSelector, StateSelector) | diff (StateSelector, StateSelector) - | listV#32 StrictTypes.VariantName + | count#32 StrictTypes.VariantName + | listV StrictTypes.VariantName | setV StrictTypes.VariantName | mapV2u StrictTypes.VariantName - | sumV#48 StrictTypes.VariantName + | sumVUnwrap#48 StrictTypes.VariantName + | sumVDefault StrictTypes.VariantName @mnemonic(explore-locate-zoom) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} diff --git a/tests/dao.rs b/tests/dao.rs index 220b4fa..5d144a8 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -111,7 +111,7 @@ fn api() -> Api { vname!("parties") => Aggregator::Take(SubAggregator::MapV2U(vname!("_parties"))), vname!("votings") => Aggregator::Take(SubAggregator::MapV2U(vname!("_votings"))), vname!("votes") => Aggregator::Take(SubAggregator::SetV(vname!("_votes"))), - vname!("votingCount") => Aggregator::Count(vname!("_votings")), + vname!("votingCount") => Aggregator::Take(SubAggregator::Count(vname!("_votings"))), }, verifiers: tiny_bmap! { vname!("setup") => 0, From f948606e70a81cffa3d832eea8f31660ce532b95 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 26 May 2025 23:00:31 +0200 Subject: [PATCH 24/40] api: fix ccomitting to default API in API checksums --- api/src/api.rs | 7 +++++-- stl/SONIC.vesper | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index aa670be..321de63 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -258,8 +258,11 @@ impl CommitEncode for Semantics { type CommitmentId = ApisChecksum; fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(&self.version); - // We do not commit to the codex_libs since thea are not a part of APIs and are commit to inside the - // codex. The fact that there are no other libs is verified in the Articles and Issuer constructors. + e.commit_to_hash(&self.default); + // We do not commit to the codex_libs since they are not a part of APIs + // and are commit to inside the codex. + // The fact that there are no other libs + // is verified in the Articles and Issuer constructors. let apis = SmallOrdMap::from_iter_checked( self.custom .iter() diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index bc01fef..7acc2ac 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -14,6 +14,7 @@ commitment ApisChecksum, hasher SHA256, tagged urn:ubideco:sonic:apis#2025-05-25 serialized U16 + hashed Api map StrictHash, len 0..MAX16 mapKey TypeName mapValue StrictHash From e6e71c938544d8787fda739e543b0febd1044a63 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 10:58:47 +0200 Subject: [PATCH 25/40] ledger: add export_all_exu method --- api/src/builders.rs | 1 + src/ledger.rs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/api/src/builders.rs b/api/src/builders.rs index 7ce7a6a..3e536ad 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -82,6 +82,7 @@ impl CoreParams { #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct IssueParams { + // TODO: Add issuer id checking pub name: TypeName, pub consensus: Consensus, pub testnet: bool, diff --git a/src/ledger.rs b/src/ledger.rs index e9a776b..9e93921 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -277,12 +277,22 @@ impl Ledger { chain.into_iter() } - /// Exports contract with all known operations + /// Exports contract with all known operations. pub fn export_all(&self, writer: StrictWriter) -> io::Result<()> { self.export_internal(self.0.operation_count() as u32, writer, |_| true, |_, _, w| Ok(w)) } - /// Export a part of a contract history: a graph between set of terminals and genesis. + /// Exports contract with all known operations with some auxiliary information returned by + /// `aux`. + pub fn export_all_aux( + &self, + writer: StrictWriter, + aux: impl FnMut(Opid, &Operation, StrictWriter) -> io::Result>, + ) -> io::Result<()> { + self.export_internal(self.0.operation_count() as u32, writer, |_| true, aux) + } + + /// Export a part of a contract history: a graph between a set of terminals and genesis. pub fn export( &self, terminals: impl IntoIterator>, @@ -293,7 +303,6 @@ impl Ledger { /// Exports contract and operations to a stream, extending operation data with some auxiliary /// information returned by `aux`. - // TODO: (v0.13) Return statistics pub fn export_aux( &self, terminals: impl IntoIterator>, From 7e375bf287760465722bf28c1a6d4ae69ababd20 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 12:14:04 +0200 Subject: [PATCH 26/40] state: use new confined retain APIs --- Cargo.lock | 24 +++++++++++++++--------- src/state.rs | 13 ++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f635078..ce285c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,12 +133,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys", ] @@ -192,9 +192,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "baid64" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb4a8b2f1afee4ef00a190b260ad871842b93206177b59631fecd325d48d538" +checksum = "61eced31ae690ea39ffe808ed970bd11ebbb3ccc6861d2ab787d848b03a0d049" dependencies = [ "amplify", "base64", @@ -255,9 +255,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "cc" -version = "1.2.23" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "shlex", ] @@ -609,6 +609,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "paste" version = "1.0.15" @@ -726,9 +732,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" diff --git a/src/state.rs b/src/state.rs index 0e78cef..bbb54fe 100644 --- a/src/state.rs +++ b/src/state.rs @@ -22,7 +22,6 @@ // the License. use alloc::collections::BTreeMap; -use core::mem; use aluvm::Lib; use amplify::confinement::{LargeOrdMap, SmallOrdMap, SmallOrdSet}; @@ -201,16 +200,8 @@ impl RawState { pub(self) fn rollback(&mut self, transition: Transition) { let opid = transition.opid; - let mut global = mem::take(&mut self.global); - let mut owned = mem::take(&mut self.owned); - global = LargeOrdMap::from_iter_checked(global.into_iter().filter(|(addr, _)| addr.opid != opid)); - owned = LargeOrdMap::from_iter_checked(owned.into_iter().filter(|(addr, _)| addr.opid != opid)); - self.global = global; - self.owned = owned; - - // TODO: Use `retain` instead of the above workaround once supported by amplify - // self.immutable.retain(|addr, _| addr.opid != opid); - // self.owned.retain(|addr, _| addr.opid != opid); + self.global.retain(|addr, _| addr.opid != opid); + self.owned.retain(|addr, _| addr.opid != opid); for (addr, cell) in transition.destroyed { self.owned From a7227ba16dfcbb0cb7fcfc8762919f04c1aa19fa Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 12:29:17 +0200 Subject: [PATCH 27/40] api: add issuer requirements to issue params --- api/src/builders.rs | 72 +++++++++++++++++++++++++++++++++++++++++++-- api/src/lib.rs | 4 ++- tests/reorgs.rs | 2 +- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/api/src/builders.rs b/api/src/builders.rs index 3e536ad..49f5aee 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -35,7 +35,7 @@ use ultrasonic::{ Input, Issue, Operation, StateCell, StateData, StateValue, }; -use crate::{Api, Articles, DataCell, Issuer, MethodName, StateAtom, StateName}; +use crate::{Api, ApisChecksum, Articles, DataCell, Issuer, IssuerId, MethodName, StateAtom, StateName}; #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -79,10 +79,71 @@ impl CoreParams { } } +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", untagged))] +pub enum VersionRange { + After { min: u16 }, + Before { max: u16 }, + Range { min: u16, max: u16 }, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, From)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", untagged))] +pub enum IssuerSpec { + #[from] + Exact(IssuerId), + + #[from] + Latest(CodexId), + + ExactVer { + codex_id: CodexId, + version: u16, + api: Option, + }, + VersionRange { + codex_id: CodexId, + version: VersionRange, + }, +} + +impl IssuerSpec { + pub fn check(&self, issuer_id: IssuerId) -> bool { + match self { + IssuerSpec::Exact(id) => *id == issuer_id, + IssuerSpec::Latest(codex_id) => *codex_id == issuer_id.id, + IssuerSpec::ExactVer { codex_id, version, api: Some(checksum) } => { + *codex_id == issuer_id.id && *version == issuer_id.version && *checksum == issuer_id.checksum + } + IssuerSpec::ExactVer { codex_id, version, api: _ } => { + *codex_id == issuer_id.id && *version == issuer_id.version + } + IssuerSpec::VersionRange { codex_id, version: VersionRange::After { min } } => { + *codex_id == issuer_id.id && issuer_id.version >= *min + } + IssuerSpec::VersionRange { codex_id, version: VersionRange::Before { max } } => { + *codex_id == issuer_id.id && issuer_id.version < *max + } + IssuerSpec::VersionRange { codex_id, version: VersionRange::Range { min, max } } => { + *codex_id == issuer_id.id && (*min..*max).contains(&issuer_id.version) + } + } + } + + pub fn codex_id(&self) -> CodexId { + match self { + IssuerSpec::Exact(id) => id.id, + IssuerSpec::Latest(codex_id) => *codex_id, + IssuerSpec::ExactVer { codex_id, .. } => *codex_id, + IssuerSpec::VersionRange { codex_id, .. } => *codex_id, + } + } +} + #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] pub struct IssueParams { - // TODO: Add issuer id checking + pub issuer: IssuerSpec, pub name: TypeName, pub consensus: Consensus, pub testnet: bool, @@ -102,8 +163,9 @@ impl DerefMut for IssueParams { } impl IssueParams { - pub fn new_testnet(name: impl Into, consensus: Consensus) -> Self { + pub fn new_testnet(codex_id: CodexId, name: impl Into, consensus: Consensus) -> Self { Self { + issuer: IssuerSpec::Latest(codex_id), name: name.into(), consensus, testnet: true, @@ -131,6 +193,10 @@ impl Issuer { } pub fn issue(self, params: IssueParams) -> Articles { + if !params.issuer.check(self.issuer_id()) { + panic!("issuer version does not match requested version"); + } + let mut builder = self.start_issue(params.core.method, params.consensus, params.testnet); for NamedState { name, state } in params.core.global { diff --git a/api/src/lib.rs b/api/src/lib.rs index c06828a..d6fbac4 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -61,7 +61,9 @@ pub use api::{ Api, ApisChecksum, GlobalApi, OwnedApi, ParseVersionedError, SemanticError, Semantics, StateUnknown, Versioned, }; pub use articles::{Articles, ArticlesId, SigBlob}; -pub use builders::{Builder, BuilderRef, CoreParams, IssueParams, NamedState, OpBuilder, OpBuilderRef}; +pub use builders::{ + Builder, BuilderRef, CoreParams, IssueParams, IssuerSpec, NamedState, OpBuilder, OpBuilderRef, VersionRange, +}; pub use issuer::{Issuer, IssuerId, ISSUER_MAGIC_NUMBER, ISSUER_VERSION}; pub use sonic_callreq::*; pub use state::*; diff --git a/tests/reorgs.rs b/tests/reorgs.rs index 6ab0c68..ffa4e6d 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -189,7 +189,7 @@ fn setup(name: &str) -> LedgerDir { AuthToken::from(buf) }; - let mut issue = IssueParams::new_testnet("FungibleTest", Consensus::None); + let mut issue = IssueParams::new_testnet(issuer.codex_id(), "FungibleTest", Consensus::None); for _ in 0u16..10 { issue.push_owned_unlocked("amount", next_auth(), svnum!(100u64)); issue.push_owned_unlocked("amount", next_auth(), svnum!(100u64)); From d90a5f42316c1198c4cff8a4542b9ee8427dd9aa Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 13:10:19 +0200 Subject: [PATCH 28/40] api: fix serde yaml nested enums problem --- Cargo.lock | 1 + Cargo.toml | 2 +- api/Cargo.toml | 2 ++ api/src/state/aggregators.rs | 6 +++++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce285c9..a1c00e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -847,6 +847,7 @@ dependencies = [ "indexmap", "rand", "serde", + "serde_yaml", "sonic-callreq", "strict_encoding", "strict_types", diff --git a/Cargo.toml b/Cargo.toml index 5acc390..8be85cf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,8 +31,8 @@ baid64 = "0.4.1" indexmap = "2.9.0" chrono = "0.4.38" serde = { version = "1", features = ["derive"] } -toml = "0.8.22" serde_yaml = "0.9.34" +toml = "0.8.22" [package] name = "hypersonic" diff --git a/api/Cargo.toml b/api/Cargo.toml index b53e126..d03afcb 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -28,6 +28,7 @@ sonic-callreq.workspace = true binfile = { workspace = true, optional = true } indexmap.workspace = true serde = { workspace = true, optional = true } +serde_yaml = { workspace = true, optional = true } chrono.workspace = true [features] @@ -39,6 +40,7 @@ binfile = ["dep:binfile", "std"] stl = ["commit_verify/stl", "ultrasonic/stl", "strict_types/armor"] serde = [ "dep:serde", + "dep:serde_yaml", "chrono/serde", "amplify/serde", "strict_encoding/serde", diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 23dffd0..5a84ad5 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -62,17 +62,21 @@ pub enum Aggregator { /// /// If the underlying aggregator fails, the aggregated state is not produced. #[strict_type(tag = 0)] + // https://github.com/dtolnay/serde-yaml/issues/363 + // We should repeat this if we encounter any other nested enums. + #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] Take(SubAggregator), /// Wrap into an optional value. /// /// If the underlying aggregated state fails, sets the aggregated state to `None`. #[strict_type(tag = 1)] + #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] Some(SubAggregator), /// If the underlying aggregated state fails, returns the provided constant value. #[strict_type(tag = 2)] - Or(SubAggregator, SemId, TinyBlob), + Or(#[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] SubAggregator, SemId, TinyBlob), /// Execute a custom function on the state. #[strict_type(tag = 0xFF)] From e6df2aad9b06214d872d91fe6467df768ce83328 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 13:44:17 +0200 Subject: [PATCH 29/40] api: improve and test asset spec --- api/src/api.rs | 70 +--------------------- api/src/articles.rs | 64 +++++++++++++++++++-- api/src/builders.rs | 120 +++++++++++++++++++++++++++++++------- api/src/issuer.rs | 66 +++++++++++++++++++-- api/src/lib.rs | 4 +- src/stl.rs | 2 +- stl/SONIC@0.12.0.sta | 134 +++++++++++++++++++++---------------------- stl/SONIC@0.12.0.stl | Bin 7529 -> 7525 bytes stl/SONIC@0.12.0.sty | 22 +++---- 9 files changed, 301 insertions(+), 181 deletions(-) diff --git a/api/src/api.rs b/api/src/api.rs index 321de63..dac16c4 100644 --- a/api/src/api.rs +++ b/api/src/api.rs @@ -34,18 +34,16 @@ //! performed directly, so these two are not covered by an API. use core::cmp::Ordering; -use core::fmt; -use core::fmt::{Debug, Display, Formatter}; +use core::fmt::Debug; use core::hash::{Hash, Hasher}; use core::num::ParseIntError; -use core::str::FromStr; use aluvm::{Lib, LibId}; use amplify::confinement::{SmallOrdMap, SmallOrdSet, TinyOrdMap, TinyOrdSet, TinyString}; use amplify::num::u256; use amplify::Bytes4; -use baid64::{Baid64ParseError, DisplayBaid64}; -use commit_verify::{CommitEncode, CommitEngine, CommitId, CommitmentId, StrictHash}; +use baid64::Baid64ParseError; +use commit_verify::{CommitEncode, CommitEngine, CommitId, StrictHash}; use indexmap::{indexset, IndexMap, IndexSet}; use sonic_callreq::{CallState, MethodName, StateName}; use strict_encoding::TypeName; @@ -57,68 +55,6 @@ use crate::{ StateConvertError, StateConvertor, LIB_NAME_SONIC, }; -/// Create a versioned variant of a commitment ID (contract or codex), so information about a -/// specific API version is added. -/// -/// Both contracts and codexes may have multiple API implementations, which may be versioned. -/// Issuers and articles include a specific version of the codex and contract APIs. -/// This structure provides the necessary information for the user about a specific API version -/// known and used by a system, so a user may avoid confusion when an API change due to upgrade -/// happens. -/// -/// # See also -/// -/// - [`ContractId`] -/// - [`CodexId`] -/// - [`crate::ArticlesId`] -/// - [`crate::IssuerId`] -#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] -#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] -#[strict_type(lib = LIB_NAME_SONIC)] -#[derive(CommitEncode)] -#[commit_encode(strategy = strict, id = StrictHash)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] -pub struct Versioned { - /// An identifier of the contract or codex. - pub id: Id, - /// Version number of the API. - pub version: u16, - /// A checksum for the APIs from the Semantics structure. - pub checksum: ApisChecksum, -} - -impl Display for Versioned -where Id: CommitmentId + StrictDumb + StrictEncode + StrictDecode + Display + DisplayBaid64 -{ - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - if Id::MNEMONIC { - write!(f, "{:#}/{}#", self.id, self.version)?; - } else { - write!(f, "{}/{}#", self.id, self.version)?; - } - self.checksum.fmt_baid64(f) - } -} - -impl FromStr for Versioned -where Id: CommitmentId + StrictDumb + StrictEncode + StrictDecode + FromStr -{ - type Err = ParseVersionedError; - fn from_str(s: &str) -> Result { - let (id, remnant) = s - .split_once('/') - .ok_or_else(|| ParseVersionedError::NoVersion(s.to_string()))?; - let (version, api_id) = remnant - .split_once('#') - .ok_or_else(|| ParseVersionedError::NoChecksum(s.to_string()))?; - Ok(Self { - id: id.parse().map_err(ParseVersionedError::Id)?, - version: version.parse().map_err(ParseVersionedError::Version)?, - checksum: api_id.parse().map_err(ParseVersionedError::Checksum)?, - }) - } -} - /// Errors happening during parsing of a versioned contract or codex ID. #[derive(Debug, Display, Error, From)] #[display(doc_comments)] diff --git a/api/src/articles.rs b/api/src/articles.rs index f8481e2..1a1dd6f 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -23,10 +23,15 @@ #![allow(unused_braces)] +use core::fmt; +use core::fmt::{Display, Formatter}; +use core::str::FromStr; + use aluvm::{Lib, LibId}; use amplify::confinement::NonEmptyBlob; use amplify::Wrapper; -use commit_verify::{CommitId, StrictHash}; +use baid64::DisplayBaid64; +use commit_verify::{CommitEncode, CommitId, StrictHash}; use sonic_callreq::MethodName; use strict_encoding::TypeName; use strict_types::TypeSystem; @@ -34,10 +39,59 @@ use ultrasonic::{ CallId, Codex, CodexId, ContractId, ContractMeta, ContractName, Genesis, Identity, Issue, LibRepo, Opid, }; -use crate::{Api, SemanticError, Semantics, Versioned, LIB_NAME_SONIC}; +use crate::{Api, ApisChecksum, ParseVersionedError, SemanticError, Semantics, LIB_NAME_SONIC}; + +/// Articles id is a versioned variant for the contract id, which includes information about a +/// specific API version. +/// +/// Contracts may have multiple API implementations, which may be versioned. +/// Articles include a specific version of the contract APIs. +/// This structure provides the necessary information for the user about a specific API version +/// known and used by a system, so a user may avoid confusion when an API change due to upgrade +/// happens. +/// +/// # See also +/// +/// - [`ContractId`] +/// - [`crate::IssuerId`] +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC)] +#[derive(CommitEncode)] +#[commit_encode(strategy = strict, id = StrictHash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub struct ArticlesId { + /// An identifier of the contract. + pub contract_id: ContractId, + /// Version number of the API. + pub version: u16, + /// A checksum for the APIs from the Semantics structure. + pub checksum: ApisChecksum, +} + +impl Display for ArticlesId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}/{}#", self.contract_id, self.version)?; + self.checksum.fmt_baid64(f) + } +} -/// Articles id is a versioned variant for the contract id. -pub type ArticlesId = Versioned; +impl FromStr for ArticlesId { + type Err = ParseVersionedError; + fn from_str(s: &str) -> Result { + let (id, remnant) = s + .split_once('/') + .ok_or_else(|| ParseVersionedError::NoVersion(s.to_string()))?; + let (version, api_id) = remnant + .split_once('#') + .ok_or_else(|| ParseVersionedError::NoChecksum(s.to_string()))?; + Ok(Self { + contract_id: id.parse().map_err(ParseVersionedError::Id)?, + version: version.parse().map_err(ParseVersionedError::Version)?, + checksum: api_id.parse().map_err(ParseVersionedError::Checksum)?, + }) + } +} /// Articles contain the contract and all related codex and API information for interacting with it. /// @@ -90,7 +144,7 @@ impl Articles { /// checksum. pub fn articles_id(&self) -> ArticlesId { ArticlesId { - id: self.issue.contract_id(), + contract_id: self.issue.contract_id(), version: self.semantics.version, checksum: self.semantics.apis_checksum(), } diff --git a/api/src/builders.rs b/api/src/builders.rs index 49f5aee..e930fce 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -35,7 +35,7 @@ use ultrasonic::{ Input, Issue, Operation, StateCell, StateData, StateValue, }; -use crate::{Api, ApisChecksum, Articles, DataCell, Issuer, IssuerId, MethodName, StateAtom, StateName}; +use crate::{Api, Articles, DataCell, Issuer, IssuerId, MethodName, StateAtom, StateName}; #[derive(Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -82,9 +82,9 @@ impl CoreParams { #[derive(Copy, Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase", untagged))] pub enum VersionRange { + Range { min: u16, max: u16 }, After { min: u16 }, Before { max: u16 }, - Range { min: u16, max: u16 }, } #[derive(Copy, Clone, PartialEq, Eq, Debug, From)] @@ -96,43 +96,36 @@ pub enum IssuerSpec { #[from] Latest(CodexId), - ExactVer { - codex_id: CodexId, - version: u16, - api: Option, - }, - VersionRange { - codex_id: CodexId, - version: VersionRange, - }, + #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] + ExactVer { codex_id: CodexId, version: u16 }, + + #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] + VersionRange { codex_id: CodexId, version: VersionRange }, } impl IssuerSpec { pub fn check(&self, issuer_id: IssuerId) -> bool { match self { IssuerSpec::Exact(id) => *id == issuer_id, - IssuerSpec::Latest(codex_id) => *codex_id == issuer_id.id, - IssuerSpec::ExactVer { codex_id, version, api: Some(checksum) } => { - *codex_id == issuer_id.id && *version == issuer_id.version && *checksum == issuer_id.checksum - } - IssuerSpec::ExactVer { codex_id, version, api: _ } => { - *codex_id == issuer_id.id && *version == issuer_id.version + IssuerSpec::Latest(codex_id) => *codex_id == issuer_id.codex_id, + IssuerSpec::ExactVer { codex_id, version } => { + *codex_id == issuer_id.codex_id && *version == issuer_id.version } IssuerSpec::VersionRange { codex_id, version: VersionRange::After { min } } => { - *codex_id == issuer_id.id && issuer_id.version >= *min + *codex_id == issuer_id.codex_id && issuer_id.version >= *min } IssuerSpec::VersionRange { codex_id, version: VersionRange::Before { max } } => { - *codex_id == issuer_id.id && issuer_id.version < *max + *codex_id == issuer_id.codex_id && issuer_id.version < *max } IssuerSpec::VersionRange { codex_id, version: VersionRange::Range { min, max } } => { - *codex_id == issuer_id.id && (*min..*max).contains(&issuer_id.version) + *codex_id == issuer_id.codex_id && (*min..*max).contains(&issuer_id.version) } } } pub fn codex_id(&self) -> CodexId { match self { - IssuerSpec::Exact(id) => id.id, + IssuerSpec::Exact(id) => id.codex_id, IssuerSpec::Latest(codex_id) => *codex_id, IssuerSpec::ExactVer { codex_id, .. } => *codex_id, IssuerSpec::VersionRange { codex_id, .. } => *codex_id, @@ -500,3 +493,88 @@ impl<'c> OpBuilderRef<'c> { pub fn finalize(self) -> Operation { self.inner.finalize() } } + +#[cfg(test)] +mod test { + #![cfg_attr(coverage_nightly, coverage(off))] + + use super::*; + + #[test] + fn issuer_spec_yaml_latest() { + let val = IssuerSpec::Latest(strict_dumb!()); + let s = "AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } + + #[test] + fn issuer_spec_yaml_exact() { + let val = IssuerSpec::Exact(strict_dumb!()); + let s = "\ +codexId: AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +version: 0 +checksum: AAAAAA +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } + + #[test] + fn issuer_spec_yaml_ver_nosum() { + let val = IssuerSpec::ExactVer { codex_id: strict_dumb!(), version: 0 }; + let s = "\ +codexId: AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +version: 0 +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } + + #[test] + fn issuer_spec_yaml_min() { + let val = IssuerSpec::VersionRange { + codex_id: strict_dumb!(), + version: VersionRange::After { min: 0 }, + }; + let s = "\ +codexId: AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +version: + min: 0 +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } + + #[test] + fn issuer_spec_yaml_max() { + let val = IssuerSpec::VersionRange { + codex_id: strict_dumb!(), + version: VersionRange::Before { max: 1 }, + }; + let s = "\ +codexId: AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +version: + max: 1 +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } + + #[test] + fn issuer_spec_yaml_range() { + let val = IssuerSpec::VersionRange { + codex_id: strict_dumb!(), + version: VersionRange::Range { min: 0, max: 1 }, + }; + let s = "\ +codexId: AAAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA-AAAAAAA#origami-bruno-life +version: + min: 0 + max: 1 +"; + assert_eq!(serde_yaml::to_string(&val).unwrap(), s); + assert_eq!(serde_yaml::from_str::(s).unwrap(), val); + } +} diff --git a/api/src/issuer.rs b/api/src/issuer.rs index 583ba34..7ea2bcb 100644 --- a/api/src/issuer.rs +++ b/api/src/issuer.rs @@ -21,18 +21,72 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. +use core::fmt; +use core::fmt::{Display, Formatter}; +use core::str::FromStr; + use aluvm::{Lib, LibId}; use amplify::confinement::TinyString; -use commit_verify::{CommitId, StrictHash}; +use baid64::DisplayBaid64; +use commit_verify::{CommitEncode, CommitId, StrictHash}; use sonic_callreq::MethodName; -use strict_encoding::TypeName; +use strict_encoding::{StrictDecode, StrictDumb, StrictEncode, TypeName}; use strict_types::TypeSystem; use ultrasonic::{CallId, Codex, CodexId, Identity, LibRepo}; -use crate::{Api, SemanticError, Semantics, SigBlob, Versioned, LIB_NAME_SONIC}; +use crate::{Api, ApisChecksum, ParseVersionedError, SemanticError, Semantics, SigBlob, LIB_NAME_SONIC}; + +/// Issuer id is a versioned variant for the codex id, which includes information about a +/// specific API version. +/// +/// Codexes may have multiple API implementations, which may be versioned. +/// Issuers include a specific version of the codex APIs. +/// This structure provides the necessary information for the user about a specific API version +/// known and used by a system, so a user may avoid confusion when an API change due to upgrade +/// happens. +/// +/// # See also +/// +/// - [`CodexId`] +/// - [`crate::ArticlesId`] +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_SONIC)] +#[derive(CommitEncode)] +#[commit_encode(strategy = strict, id = StrictHash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] +pub struct IssuerId { + /// An identifier of the codex. + pub codex_id: CodexId, + /// Version number of the API. + pub version: u16, + /// A checksum for the APIs from the Semantics structure. + pub checksum: ApisChecksum, +} + +impl Display for IssuerId { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{:#}/{}#", self.codex_id, self.version)?; + self.checksum.fmt_baid64(f) + } +} -/// Articles id is a versioned variant for the contract id. -pub type IssuerId = Versioned; +impl FromStr for IssuerId { + type Err = ParseVersionedError; + fn from_str(s: &str) -> Result { + let (id, remnant) = s + .split_once('/') + .ok_or_else(|| ParseVersionedError::NoVersion(s.to_string()))?; + let (version, api_id) = remnant + .split_once('#') + .ok_or_else(|| ParseVersionedError::NoChecksum(s.to_string()))?; + Ok(Self { + codex_id: id.parse().map_err(ParseVersionedError::Id)?, + version: version.parse().map_err(ParseVersionedError::Version)?, + checksum: api_id.parse().map_err(ParseVersionedError::Checksum)?, + }) + } +} /// An issuer contains information required for the creation of a contract and interaction with an /// existing contract. @@ -86,7 +140,7 @@ impl Issuer { /// checksum. pub fn issuer_id(&self) -> IssuerId { IssuerId { - id: self.codex.codex_id(), + codex_id: self.codex.codex_id(), version: self.semantics.version, checksum: self.semantics.apis_checksum(), } diff --git a/api/src/lib.rs b/api/src/lib.rs index d6fbac4..7ecad1d 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -57,9 +57,7 @@ mod articles; mod builders; mod state; -pub use api::{ - Api, ApisChecksum, GlobalApi, OwnedApi, ParseVersionedError, SemanticError, Semantics, StateUnknown, Versioned, -}; +pub use api::{Api, ApisChecksum, GlobalApi, OwnedApi, ParseVersionedError, SemanticError, Semantics, StateUnknown}; pub use articles::{Articles, ArticlesId, SigBlob}; pub use builders::{ Builder, BuilderRef, CoreParams, IssueParams, IssuerSpec, NamedState, OpBuilder, OpBuilderRef, VersionRange, diff --git a/src/stl.rs b/src/stl.rs index b8b1a20..3a6d58d 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma"; +pub const LIB_ID_SONIC: &str = "stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 3617581..ace18a0 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma +Id: stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 606f109efbea39ab2a4c224e87a7a04c39de1f1cc462d5dcb7cc652799ed6bbe +Check-SHA256: e884305c8fb381d9de75be1e697087935342bb0ced1102cd083e0e60b86afc9b 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -63,71 +63,71 @@ Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy0000000000{{R300000024!+`Z*p@03IG5g 00;m90000000000{{R30000000000000000{{R30000003_);db30||3wZDDS7X=8H%V}}sd<*AdeEF&Z1w|25}q0eyZTa*Hp?=Oj>t)ezW19NF-00aU61a5C`WdHyG 0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAn+b8~fN0vi2qDZ23`(0SQ68z;-& -Y$K)m(W1XnUgb2W)zHQaeg-^tDx~eajRMhI;!K4JN-dvIY`8nIi)lwlg01r|$O%JXY;03>VRU5%0tRhm -bZBp60_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# -&aRFSj|FdcZe?Tu1OfmAZf|a7000011aog~WdH>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 -Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|oR?Z(?C=L2zjX1_g6vZAoMT>7J73J3yCzk$#1) -IEB9}O*pr-e%zuW2Pj0uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQllDys -V{dMDWpZ?Hask(GtapEr1$r8Dd!}w*Soo1E5Na{vM&}RsHL_{2j!6e%b!lv5WpV*QXOeNAASk2a+1#{? -)5hjJMf&nhsc-!mePTfsENyZOa$$EvZ*F#Fa&&KU0jJ}2*Ha7nZs7f6Bf?QldS~xE>B~M~sI^#D^>B@^ -2MTgwcS3b(Y-D9}0sCQAIcqcSDgOd`iS|Np5rLQ`JLP`OH)x;48x~=c1qMlTb9H5M1_K3SZ)9b70vi2q -DZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQaek|_H@J{`EEw5PDc~;?)F4df6xdYMLp8e_j`sZ -ZDDS7X=8H%V}}sd<*AdeEF&Z1w|25}q0eyZTa*Hp?=Oj>t)ezW19NF-00aU61a5C`WdHyG0R(ezZDjxj -0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAwlcWz~5L2zjX1_g6vZAoMT>7J73J3yCzk$#1) -IEB9}O*pr-e%zuW2Pj0G2*Ke$Me~|@x8gqN5ZeLjVkt+~t -G2%w&5BN2*X|Rq-2V!+;Y-D9}0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atwEAbZ%vHb5mt) -Nn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEp -SWb-&cWHEPWpi^vb!lv5WpV*QXOeNAASk2a+1#{?)5hjJMf&nhsc-!mePTfsENyZMQek&Ob!lv5WpV@p -01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ -t0eX2w~A!Q+0eaZ{MVycPL2NsVQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqYP4EcSCP(c4cyOZ*l|z01R_mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPL2Ns -VQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE0|-HmqX|=GZDDS7X=8H+1_yR!a&u{KZU6uR2V`YtVRdYD0jDcYZ2mPnYfdSs)GDjwV%NMksnz(b -Kt=W`b-H*%*al;Db98TQ015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtB76^nC$%1sKzB<;E -QA|)S-x88IWKN#S$#@T&w`gPmrz=iu{xv&mPARC=Dy!sT*St5W)%dJHMfNFmx_Cp_0000000000|Nj60 -0000031e?$Wq3?!Vsiiq0=HQyw2!Sv!6MOSp3-i2NULZXE;M1&000000RR600000000&`kX-sKia{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7 -Knlpb7_LPzv?=G$Lt&lV-%#2HY;R%(0RRX906+l%000000000G00000000Y9bYXO5L2_wyXl(=o00?GvZf9v?Y-Iod009eb -Z*E3)Zf9v?Y-Iod0RIJHY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$*7My#T6183 -ELud{7pMT5X4R=as&hb1a)p{bN~PV5DavAaAjmgZewp`WpV%o -0RR9X5fOBGaAjmhX=Q9=MQ&qnWMy&y1pxp6ApZqnY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb -7_LPzv?=G$*7My#T6183ELud{7pMT5XG51ONneZfSG? -000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001EW1z~J;R&4+U0Rp#KDYTER -N5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-w4zbYXO5 -Q)O&rV{~tF1OfmCXKZg`VQc^e0s`rtlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+uJC38 --{*D7fZ(%hZo23R4S;p`Q9JBQllDyk3Snnwa%E>>bY)}!1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}} -C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LxQ*~lNXJ>L{XJK@2as&+k1!He+b94X& -0s`rtlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVyc -PK^Kv002M$000000003000000000012Xts7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0< -ZYw-c35LOoBKkGaY9#cS7Qj{WgyAGcS>>g~&^g7mw%Cdg|0Y-zbj2R -x3qrTq9O+7J73 -J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g70qXeK0Y#)KxnIwmOLf+#M19Nq4 -00ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWO -hkZic;}Qg9X=Y{s1p)z)?^v0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lb -KBEMn4QwBQ*qJ1UeL~*jAO&M@b#8P31pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&> -`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L_1#D?^bXEWb0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+< -MAdF9JWvUS!HXjLHPLD$^q3aFRr7@5Bt}`~rNq!V#m=sd5RW1Rb7gc^00jX8>7J73J3yCzk$#1)IEB9} -O*pr-e%zuW2Pj0>g~&^g77J73 -J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7Z -ZB|uocXDBH00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7? -iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|x*xI4ag+tfP`W3(#!7O@f31nq+baHQbWn=&f0vi2q -DZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQae*2}za$v6rX_fBJi~iN-tVcdiDm&03^NQ+Jc&xL55CR(g -Zz;O*CD3`g3r=7)ofi{UWpZFd8vSo6y748@dD%A` -C(GV!Bc=M$qQ6pJ-W|y2ahx3nF|Vuawki#7NH?S|Q-Q!u2{b2Xc;Wd;HUZDn+5Z)5`Lo|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4LpZ+C8GWB>#L00eGtZe;)f009JZZ*64&1pxx-o|5M~K$m}!eub_$g}*CJ +IJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LtM{I9mVQfKgX$A%bb7gHw +WCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVyc +PK^n0bz*F3b7*B`0)mO_O%DrjRIhYP1?a)oog)LLTw}}6rDvG=`c^zKYGH;V(R;4&W&+>mb;*F>vukd; +=m`ygb@x#_>`RmOO$lRfZgypIbZ>G2*Ke$Me~|@x8gqN5ZeLjVkt+~tG2%w&5BN2*X|Rq-2V!+;Y-D9} +0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atv}|cSCP(c4cyOZ*l>r<8{|l3;J&0{bM7-QB8Vh +?>y0(yz|LU0j*m?b;qe$6*%pTrv$VUq<0Npo{` +WpV}s1!HeyWq1M_{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQe?#%E`{d+C1Sl4-0;gT-ZoMpKK +(c7N=>KC_d#mnmnb7gH|Zggp5a{*(A5Z2|XldmizBjdMrvT~u%aO+!?0+#PDiK4BdHbet+X=eZg0ssVV +Z*FA(00035b8l^B00jX7A;%YO&?-P3ONn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju +$l1`nW&GEpSWb-#VRC77Xl-S5X=8H%vx8id>$BJl`jC}Lq~+?j3s%y+DC$XuOq!%;BjO`E31e?=c4cyO +Z*l?GZ>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOwVs&Y3WMy&zL1&V2o**cr;@RA^i_^yDJVpBQ +O{s7F8GT|w6)bIX40maCZe??GQ)O*QWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^$CX>@L7b8|v4R=asfeSl5w6OD5K)p+_a0+#^yXl`tnVw +Z~Ym4VnG!wZE^}yVRu4xX>4R=as&bZ40CjHX=8LnZewp`WdH>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8 +A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFEM0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT +?*g=|B=zREie$*y(7k2+*P~cYjsFED2 +rz=iu{xv&mPARC=Dy!sT*St5W)%dJHMfNFmx_Cp_24i(|bZ>0{3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrT +q9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-DWD^6_wH9KogDX7#ctK?$Wyf>-U +_^d!h_9=C`cth9#0000000030{{R3000009V{c?-cuZ+xa{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb +7_LPzv?=G$Lt&lV-%#21Ch@9YYCa> +3uf#90000000030{{R3000005ba`-Pa{}p}lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+&PZdlOljoA7|k;k>s6qoa5|8f~f~nX=g%gZ(;=j00;m8Kmh;%00000000mG0000001H!eVRU6d +a%psEZ3F`V2xfI|XK7+=WdHyG0Sj(#Zbo%(XK7+=WdHyG{{>-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tl +Xc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ygQ*>c;WkPjnY-D9}1OxyC +b#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o0RR9X{{>-ebyjTv1pxxL +St+!Stw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`yi +Q*>c;WkYXnc4cyOZ*l|#00ebzX>0|-HmqYYDZVRU6vWo%_*bZ>G50ssbQY;R&=YybrU0_mQT=Q}``f02HLt~iCiD@{1J +w0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{<^;>rD>}a8$2!O9kk`*PSB+ +rd(so&!uOW`TABoF=}CkBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Dul_VP|J@WoKb@Wn=&a0Rris +lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lm1Y>V- +c>o0g0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# +&aRFSj{^vGZg+BFa8Ggo1p@-`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4Lm>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj00qXeK0Y#)KxnIwmOLf+#6k?&Zs +#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j5(H#vW@Z2d0s)clSh2=pqY5<1(br?Xy7E4w1fUIUAA#7J +B!_)M-s1t0?^v0qXeK0Y#)KxnIwmOLf+#b1!He@Zgcmw%Cdg|0Y- +zbj2Rx3qrTq9O+?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0Jzf +Wpq{m1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^X +ImOPdju4L{25n(*Rx)(}1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4M93UhUBR#k3ya$#@)1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 +D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4MA3v+dCRzziHVRdYD00jX8>7J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0>g~&^g7V=@ +0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW=(>>~JNCWGL*g;d++M&*cL)Xpv +6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJk2)CNGsS-K->_!vg?y-5LP^ delta 86 zcmaEA_0noXA@An@yqlOdTM26OhzW$H78Pga=cT4N=clArc&4y1Gi9bsHsDp9EYGDd XnMKf4QW!}|UP)16atX4kRlK197;+pw diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index fd42004..7a22457 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:KYGUnSNH-gN8bCy6-OjMcF10-ddgvq94-HWVIi9I-Qh5kN9Y#orbit-driver-puma + Id: stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -95,6 +95,11 @@ data Articles : semantics Semantics , sig SigBlob? , issue UltraSONIC.Issue +@mnemonic(pigment-melon-smart) +data ArticlesId : contractId UltraSONIC.ContractId + , version U16 + , checksum ApisChecksum + @mnemonic(sparta-ginger-analyze) data CallState : method StrictTypes.VariantName, owned StrictTypes.VariantName? @@ -111,6 +116,11 @@ data Issuer : codex UltraSONIC.Codex , semantics Semantics , sig SigBlob? +@mnemonic(laser-george-europe) +data IssuerId : codexId UltraSONIC.CodexId + , version U16 + , checksum ApisChecksum + @mnemonic(history-support-manual) data OwnedApi : semId StrictTypes.SemId , arithmetics StateArithm @@ -177,14 +187,4 @@ data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) @mnemonic(explore-locate-zoom) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} -@mnemonic(sabrina-exit-marina) -data VersionedCodexId : id UltraSONIC.CodexId - , version U16 - , checksum ApisChecksum - -@mnemonic(miller-alien-comrade) -data VersionedContractId : id UltraSONIC.ContractId - , version U16 - , checksum ApisChecksum - From 34070cdf26fa8adcfb93033e1270f680323f27c8 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 27 May 2025 19:05:27 +0200 Subject: [PATCH 30/40] api: add first and last aggregator --- api/src/state/aggregators.rs | 66 ++++- src/stl.rs | 2 +- stl/SONIC.vesper | 450 +++++++++++++++++------------------ stl/SONIC@0.12.0.sta | 61 ++--- stl/SONIC@0.12.0.stl | Bin 7525 -> 7586 bytes stl/SONIC@0.12.0.sty | 8 +- 6 files changed, 309 insertions(+), 278 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 5a84ad5..8dc8ad6 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -164,11 +164,43 @@ pub enum SubAggregator { /// Unwraps an optional value. /// - /// If the value is `None`, sets the state to the provided constant. - /// - /// Fails if the state is not defined, is multiple, or not an optional. + /// Fails if the value is `None`, is not defined, multiple, or not an optional. #[strict_type(tag = 3)] - UnwrapOr(StateName, SemId, TinyBlob), + Unwrap(StateName), + + /// Takes the first element of the global state. + /// + /// Fails if the global state is not defined, i.e., has zero elements. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 4)] + First(StateName), + + /// Takes the last element of the global state. + /// + /// Fails if the global state is not defined, i.e., has zero elements. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 5)] + Last(StateName), /// Integer-negate state. /// @@ -250,10 +282,12 @@ impl SubAggregator { | Self::TheOnly(_) | Self::Count(_) | Self::Copy(_) + | Self::Unwrap(_) + | Self::First(_) + | Self::Last(_) | Self::Neg(_) | Self::Sum(_, _) | Self::Diff(_, _) - | Self::UnwrapOr(_, _, _) | Self::ListV(_) | Self::SetV(_) | Self::MapV2U(_) @@ -305,7 +339,7 @@ impl SubAggregator { Self::Copy(name) => aggregated.get(name).cloned(), - Self::UnwrapOr(name, sem_id, val) => { + Self::Unwrap(name) => { let state = global.get(name)?; if state.len() != 1 { return None; @@ -315,16 +349,28 @@ impl SubAggregator { return None; }; Some(match tag { - EnumTag::Name(name) if name.as_str() == "none" && sv.as_ref() == &StrictVal::Unit => { - return deserialize(*sem_id, val, types) - } - EnumTag::Ord(0) if sv.as_ref() == &StrictVal::Unit => return deserialize(*sem_id, val, types), EnumTag::Name(name) if name.as_str() == "some" => sv.as_ref().clone(), EnumTag::Ord(1) => sv.as_ref().clone(), _ => return None, }) } + Self::First(name) => { + let state = global.get(name)?; + if state.is_empty() { + return None; + } + Some(state.first_key_value()?.1.verified.clone()) + } + + Self::Last(name) => { + let state = global.get(name)?; + if state.is_empty() { + return None; + } + Some(state.last_key_value()?.1.verified.clone()) + } + Self::Neg(name) => { let val = get_u64(name)?; let neg = (val as i64).checked_neg()?; diff --git a/src/stl.rs b/src/stl.rs index 3a6d58d..930b9cc 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid"; +pub const LIB_ID_SONIC: &str = "stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 7acc2ac..f2ce0b7 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -101,16 +101,15 @@ rec Semantics bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -121,7 +120,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -132,28 +131,27 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -164,7 +162,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -175,12 +173,12 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -188,16 +186,15 @@ rec Semantics bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -208,7 +205,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -219,12 +216,12 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -315,16 +312,15 @@ rec Semantics bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -335,7 +331,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -346,28 +342,27 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -378,7 +373,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -389,12 +384,12 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -402,16 +397,15 @@ rec Semantics bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -422,7 +416,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -433,12 +427,12 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -603,16 +597,15 @@ rec Issuer bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -623,7 +616,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -634,28 +627,27 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -666,7 +658,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -677,12 +669,12 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -690,16 +682,15 @@ rec Issuer bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -710,7 +701,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -721,12 +712,12 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -817,16 +808,15 @@ rec Issuer bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -837,7 +827,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -848,28 +838,27 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -880,7 +869,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -891,12 +880,12 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -904,16 +893,15 @@ rec Issuer bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -924,7 +912,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -935,12 +923,12 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -1089,16 +1077,15 @@ rec Articles bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1109,7 +1096,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1120,28 +1107,27 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1152,7 +1138,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1163,12 +1149,12 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -1176,16 +1162,15 @@ rec Articles bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1196,7 +1181,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1207,12 +1192,12 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -1303,16 +1288,15 @@ rec Articles bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1323,7 +1307,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1334,28 +1318,27 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1366,7 +1349,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1377,12 +1360,12 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -1390,16 +1373,15 @@ rec Articles bytes _, len 0..MAX8 ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 - tuple unwrapOr, tag 3 - ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - union neg, StateSelector, wrapped, tag 4 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 + union neg, StateSelector, wrapped, tag 6 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 5 + tuple sum, tag 7 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1410,7 +1392,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 6 + tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1421,12 +1403,12 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 7 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 8 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 + ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index ace18a0..02f3e5d 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid +Id: stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace Name: SONIC Dependencies: UltraSONIC#stuart-memphis-english, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: e884305c8fb381d9de75be1e697087935342bb0ced1102cd083e0e60b86afc9b +Check-SHA256: 05cd2ae9c830c6f7af18f2292035b989d7fc36619e02c9eda50f25702b10af68 1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -45,9 +45,9 @@ cBe%OQ*>c;WmaKqb!D@OIM0+Zf@L2l@d@(MQJsr54hK$(!e6HQqr!PDy=MtQb#!P{Z);_4wXEwu(4(eX D|DxJ;;J@Cth|EksiOt-HPJ-=lHfc*2SaaUWq3(sw&;L{94K`ndk%K5+?9Jv$dw7jc}U5p5@2#$kUJ%u 2uWmRZggpMdGHmh1*yTf7t)jcn*aB%1xpArrVPVhCp50mBKADGoe5KPVRU6fWo&HwrN?q$uLxQs2Fvw;u@LuG7iL1bid{aM4p>0IFOo~Y652;7|;2>m$hiUk~2&U-senAm#W2U1~o -L}7Gc6aWfAXJ>L{XJK@2as&hb1ax6*WdH>M0cnBocU=Q>GX#Ei$VAZcFyr6*yFAXs@qsS6J$>hYMgatK -Z*64&1pxtRf$(=-19LM3es;)2(DE?j-}}2f&cyM7F1bB@=YK{50&j8v1p@(Tf$(=-19LM3es;)2(DE?j --}}2f&cyM7F1bB@=YK{5>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0L{XJK@2as&hb1ax6*WdH>M0iS&zy!WyiX++52gg{$FYI{je5$5okyD@~1{{2{W*#QJ| +Z*64&1pxt{eILB{vKnbb$l!!PTSRJmNlp>w@S3|ZgpdCHSasO~0&j8v1p@(}eILB{vKnbb$l!!PTSRJm +Nlp>w@S3|ZgpdCHSasO~>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0V {ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teS7tm{9}qo!Lcbf?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{!D;Edq6xAD58@Z(--WKj!iy+_Y-? 7}Wakl_{2;HmLvr000000093000000000GVcWz~5015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll2&wGZS!@Jni^|L1T^LqX{Nukv3REP~S+MEH 0Hg4z0000000000{{R30000003t?wxa%E>>bZ>HV015)>o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 -D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll@WgkRtLc&iIjjfGi%K=ciQOB-k|c}5p>u=% -FzFnZ0000000000{{R300000033g?2X=Z6`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LlzRX4jMuc8RtCP$NH)?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy0000000000{{R300000024!+`Z*p@03IG5g 00;m90000000000{{R30000000000000000{{R30000003_);db30||3wZDDS7X=8H%V}}sd<*AdeEF&Z1w|25}q0eyZTa*Hp?=Oj>t)ezW19NF-00aU61a5C`WdHyG +Y-Mu>0||3wZDDS7X=8H%-9Y*U(QGhnF{QvHebRoFUC?i?6dU0ENv{KpHlgf<19NF-00aU61a5C`WdHyG 0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAn+b8~fN0vi2qDZ23`(0SQ68z;-& Y$K)m(W1XnUgb2W)zHQaeg-^tDx~eajRMhI;!K4JN-dvIY`8nIi)lwlg01r|$O=JnbZKL3Wphbn1_KIX Z*FvQVPkYjWC9xfZz;O*CD3`mb;*F>vukd; 0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atv}|cSCP(c4cyOZ*l>r<8{|l3;J&0{bM7-QB8Vh ?>y0(yz|LU0j*m?b;qe$6*%pTrv$VUq<0Npo{` WpV}s1!HeyWq1M_{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQe?#%E`{d+C1Sl4-0;gT-ZoMpKK -(c7N=>KC_d#mnmnb7gH|Zggp5a{*(A5Z2|XldmizBjdMrvT~u%aO+!?0+#PDiK4BdHbet+X=eZg0ssVV +(c7N=>KC_d#mnmnb7gH|Zggp5a{=8z`UTN!Fl{lVz$AUrewAI&Z>|&@;QdLj1B^DI?1TezX=eZg0ssVV Z*FA(00035b8l^B00jX7A;%YO&?-P3OM0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT ?*g=|B=zREie$*y(7k2+*P~cYjsFED2 -rz=iu{xv&mPARC=Dy!sT*St5W)%dJHMfNFmx_Cp_24i(|bZ>0{3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrT -q9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-DWD^6_wH9KogDX7#ctK?$Wyf>-U -_^d!h_9=C`cth9#0000000030{{R3000009V{c?-cuZ+xa{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb +Am1Co0{3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrT +q9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-B(-y6Z@V*UIRhFKh?YV3F8;=o0X +Aj+ma&W$Y?mBDQQ0000000030{{R3000009V{c?-cuZ+xa{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb 7_LPzv?=G$Lt&lV-%#21Ch@9YYCa> 3uf#90000000030{{R3000005ba`-Pa{}p}lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+0|-HmqYYDZVRU6vWo%_*bZ>G50ssbQY;R&=YybrU0_mQT=Q}``f02HLt~iCiD@{1J w0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{<^;>rD>}a8$2!O9kk`*PSB+ rd(so&!uOW`TABoF=}CkBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Dul_VP|J@WoKb@Wn=&a0Rris lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lm1Y>V- c>o0g0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# -&aRFSj{^vGZg+BFa8Ggo1p@-`ZdvNB=ndT -z*X~v;Uq>`<)y^XImOPdju4Lm>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj00qXeK0Y#)KxnIwmOLf+#6k?&Zs -#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j5(H#vW@Z2d0s)clSh2=pqY5<1(br?Xy7E4w1fUIUAA#7J -B!_)M-s1t0?^v0qXeK0Y#)KxnIwmOLf+#b1!He@Zgcmw%Cdg|0Y- -zbj2Rx3qrTq9O+?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0Jzf -Wpq{m1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^X -ImOPdju4L{25n(*Rx)(}1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndT -z*X~v;Uq>`<)y^XImOPdju4M93UhUBR#k3ya$#@)1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 -D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4MA3v+dCRzziHVRdYD00jX8>7J73J3yCzk$#1) -IEB9}O*pr-e%zuW2Pj0>g~&^g7V=@ -0t9bxX=DN#{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teR$1pOW=(>>~JNCWGL*g;d++M&*cL)Xpv -6~Gz6EP87RWMy-7a&LKMWB>{R8vSo6y748@dD%A`C(GV!Bc=M$qQ6pJ?iz50p(P||0m=?fQ +^Mv6fMp@;h#Lzj#&aRFSj|2r~X>xOP00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7mw%Cdg|0Y-zbj2Rx3qrTq9O+< +MAdF9JWvUS!HXjLHPLD$^q3aFRr7@5Bt}`~rNq!V#m=sd5RVW8Ze?cx1pxt(?^v0 +qXeK0Y#)KxnIwmOLf+#M19Nq400ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j0g>-mvBqMf +3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;}Qg9X=Y{s1p)z)?^v0qXeK0Y#)KxnIwmO +Lf+#6k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*jAO&M@b#8P31pxx-o|5M~K$m}!eub_$g}*CJ +IJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L_1#D?^bXEWb0RrislIJ@> +mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7< +u8t6oBL;0@a8@#P00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7ZZB|uocXDBH00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|x*xI4ag+tfP`W3(# +!7O@f31nq+baHQbWn=&f0vi2qDZ23`(0SQ68z;-&Y$K)m(W1XnUgb2W)zHQae*2}za$v6rX_fBJi~iN- +tVcdiDm&03^NQ+Jc&xL55CR(gZz;O*CD3`qMj<{PkSV z++()zP0QvFJZa1XRZafDW3_pMKmfCX!hPw3Pm})s5pIi=S(^2x{PCj$uDuGUmf4=` z)s>ifFn6+oh&Mq+o4Z90F*EW{_LKO*&Q_XNUX)lcnNiY(orN_mv#7WP#Aah<$w`DT KH@}puVFmyg=&WP_ delta 376 zcmZ2v{nTp1U5@(9#t-GO%*Dnmb!8`9E_^b0eE;`un{!7#HtOxPt$kka#>i5fpPS0S z%E(AaB@fyZj|27v%(h2`3QIsZ(pv;8zzT+v$nBO+z#kM6lMnJKPW~XR0Hhr!Pv8{Y JtR_{%3;?`Gu(<#L diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 7a22457..860b4d2 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:IZESgPaS-pEn7ARQ-NtwBcdr-BDIZhkR-8NbxOPk-RjmzsMI#conduct-initial-fluid + Id: stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -169,11 +169,13 @@ data StateConvertor : unit () data StateSelector : global (StrictTypes.VariantName, Std.Bool) | aggregated StrictTypes.VariantName -@mnemonic(judge-gloria-weekend) +@mnemonic(table-origami-shrink) data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) | theOnly StrictTypes.VariantName | copy StrictTypes.VariantName - | unwrapOr (StrictTypes.VariantName, StrictTypes.SemId, [Byte ^ ..0xff]) + | unwrap StrictTypes.VariantName + | first StrictTypes.VariantName + | last StrictTypes.VariantName | neg#16 StateSelector | sum (StateSelector, StateSelector) | diff (StateSelector, StateSelector) From fc16587311c6bdee97eb8b842ea764b8b6898285 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 28 May 2025 20:26:45 +0200 Subject: [PATCH 31/40] test: api checksum --- api/src/builders.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/api/src/builders.rs b/api/src/builders.rs index e930fce..3ef2b32 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -498,7 +498,10 @@ impl<'c> OpBuilderRef<'c> { mod test { #![cfg_attr(coverage_nightly, coverage(off))] + use core::str::FromStr; + use super::*; + use crate::ApisChecksum; #[test] fn issuer_spec_yaml_latest() { @@ -577,4 +580,33 @@ version: assert_eq!(serde_yaml::to_string(&val).unwrap(), s); assert_eq!(serde_yaml::from_str::(s).unwrap(), val); } + + #[test] + fn issuer_display_fromstr() { + let s = "nmThRWDr-0hOJgJt-OFVCZTA-XX8aOWj-bkqWzK7-_jAtdhQ/0#NRIsWA"; + let issuer_id = IssuerId::from_str(s).unwrap(); + assert_eq!(issuer_id.to_string(), s); + assert_eq!(issuer_id.codex_id, CodexId::from_str(s.split_once("/").unwrap().0).unwrap()); + assert_eq!(issuer_id.checksum, ApisChecksum::from_str(s.split_once("#").unwrap().1).unwrap()); + assert_eq!(issuer_id.version, 0); + } + + #[test] + fn issuer_check() { + let s = "nmThRWDr-0hOJgJt-OFVCZTA-XX8aOWj-bkqWzK7-_jAtdhQ/0#NRIsWA"; + let issuer_id = IssuerId::from_str(s).unwrap(); + assert!(IssuerSpec::Exact(issuer_id).check(issuer_id)); + + let mut changed_ver = issuer_id; + changed_ver.version += 1; + assert!(!IssuerSpec::Exact(issuer_id).check(changed_ver)); + assert!(IssuerSpec::Latest(issuer_id.codex_id).check(changed_ver)); + assert!(!IssuerSpec::ExactVer { codex_id: issuer_id.codex_id, version: issuer_id.version }.check(changed_ver)); + + let mut changed_sum = issuer_id; + changed_sum.checksum = ApisChecksum::from_str("rLAuRQ").unwrap(); + assert!(!IssuerSpec::Exact(issuer_id).check(changed_sum)); + assert!(IssuerSpec::Latest(issuer_id.codex_id).check(changed_sum)); + assert!(IssuerSpec::ExactVer { codex_id: issuer_id.codex_id, version: issuer_id.version }.check(changed_sum)); + } } From 3d3c0724cb95e7347bbad5fd4d669f521a3cd007 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 31 May 2025 09:37:02 +0200 Subject: [PATCH 32/40] api: add plans for aggregators --- api/src/state/aggregators.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 8dc8ad6..4244278 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -67,6 +67,7 @@ pub enum Aggregator { #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] Take(SubAggregator), + // TODO: Add `None` /// Wrap into an optional value. /// /// If the underlying aggregated state fails, sets the aggregated state to `None`. @@ -185,6 +186,7 @@ pub enum SubAggregator { #[strict_type(tag = 4)] First(StateName), + // TODO: Add `Nth` /// Takes the last element of the global state. /// /// Fails if the global state is not defined, i.e., has zero elements. @@ -202,6 +204,7 @@ pub enum SubAggregator { #[strict_type(tag = 5)] Last(StateName), + // TODO: Add `ReversedNth` /// Integer-negate state. /// /// Fails if the state is not defined or contains multiple elements. @@ -223,19 +226,15 @@ pub enum SubAggregator { #[strict_type(tag = 0x12)] Diff(StateSelector, StateSelector), + // TODO: Add `Product`(aggregated, aggregated) + // TODO: Add `Pow`(selector, int) + // TODO: Add `Root`(selector, int) /// Count the number of elements of the global state of a certain type. #[strict_type(tag = 0x20)] Count(StateName), - /// Convert a verified state under the same state type into a vector. - /// - /// Acts only on a global state; doesn't recognize aggregated state. - /// - /// If the global state with the name is absent returns an empty list. - #[strict_type(tag = 0x21)] - ListV(StateName), - - /// Convert a verified state under the same state type into a sorted set. + // TODO: Add `CountUnique` + /// Convert a verified state under the same state type into an ordered set. /// /// Acts only on a global state; doesn't recognize aggregated state. /// @@ -251,6 +250,7 @@ pub enum SubAggregator { #[strict_type(tag = 0x23)] MapV2U(StateName), + // TODO: Add MapV2AU /// Sums over verifiable part of a global state. /// /// Acts only on a global state; doesn't recognize aggregated state. From 26c996a52b8f3569a3d03a4596d287d1b9b570b3 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 31 May 2025 09:44:14 +0200 Subject: [PATCH 33/40] chore: update to use RCP-250528A --- Cargo.lock | 3 +- Cargo.toml | 3 + api/src/builders.rs | 18 +-- api/src/state/aggregators.rs | 21 ---- api/src/state/data.rs | 5 +- examples/dao/main.rs | 1 + src/deed.rs | 5 +- src/stl.rs | 2 +- stl/SONIC.vesper | 201 +++++++++++++++--------------- stl/SONIC@0.12.0.sta | 233 ++++++++++++++++++----------------- stl/SONIC@0.12.0.stl | Bin 7586 -> 7646 bytes stl/SONIC@0.12.0.sty | 32 ++--- tests/dao.rs | 1 + tests/reorgs.rs | 1 + 14 files changed, 258 insertions(+), 268 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1c00e4..ba885df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1063,8 +1063,7 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ultrasonic" version = "0.12.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5245198eb653a287955cd0ddaf7b7918373375592a28c189bd54a5345ce05377" +source = "git+https://github.com/AluVM/ultrasonic?branch=feat/opwitness#342c6746635af97bdd4843283faa729264a88811" dependencies = [ "amplify", "baid64", diff --git a/Cargo.toml b/Cargo.toml index 8be85cf..038bd6d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,3 +117,6 @@ features = ["all"] [lints.rust] unexpected_cfgs = { level = "allow", check-cfg = ['cfg(coverage_nightly)'] } + +[patch.crates-io] +ultrasonic = { git = "https://github.com/AluVM/ultrasonic", branch = "feat/opwitness" } diff --git a/api/src/builders.rs b/api/src/builders.rs index 3ef2b32..3fa9a5e 100644 --- a/api/src/builders.rs +++ b/api/src/builders.rs @@ -24,15 +24,14 @@ use std::convert::Infallible; use std::ops::{Deref, DerefMut}; -use aluvm::LibSite; use amplify::confinement::SmallVec; use amplify::num::u256; use chrono::{DateTime, Utc}; use strict_encoding::TypeName; use strict_types::{StrictVal, TypeSystem}; use ultrasonic::{ - fe256, AuthToken, CallId, CellAddr, CodexId, Consensus, ContractId, ContractMeta, ContractName, Genesis, Identity, - Input, Issue, Operation, StateCell, StateData, StateValue, + fe256, AuthToken, CallId, CellAddr, CellLock, CodexId, Consensus, ContractId, ContractMeta, ContractName, Genesis, + Identity, Input, Issue, Operation, StateCell, StateData, StateValue, }; use crate::{Api, Articles, DataCell, Issuer, IssuerId, MethodName, StateAtom, StateName}; @@ -225,7 +224,7 @@ impl IssueBuilder { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, ) -> Self { self.builder = self .builder @@ -238,6 +237,7 @@ impl IssueBuilder { consensus: self.consensus, testnet: self.testnet, timestamp, + features: default!(), name: ContractName::Named(name.into()), issuer: Identity::default(), }; @@ -282,7 +282,7 @@ impl Builder { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, api: &Api, sys: &TypeSystem, ) -> Self { @@ -302,6 +302,7 @@ impl Builder { codex_id, call_id: self.call_id, nonce: fe256::from(u256::ZERO), + blank0: zero!(), blank1: zero!(), blank2: zero!(), destructible_out: self.destructible_out, @@ -334,7 +335,7 @@ impl<'c> BuilderRef<'c> { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, ) -> Self { self.inner = self .inner @@ -381,7 +382,7 @@ impl OpBuilder { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, api: &Api, sys: &TypeSystem, ) -> Self { @@ -428,6 +429,7 @@ impl OpBuilder { contract_id: self.contract_id, call_id: self.inner.call_id, nonce: fe256::from(u256::ZERO), + witness: none!(), destructible_in: self.destructible_in, immutable_in: self.immutable_in, destructible_out: self.inner.destructible_out, @@ -461,7 +463,7 @@ impl<'c> OpBuilderRef<'c> { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, ) -> Self { self.inner = self .inner diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 4244278..3b23796 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -288,7 +288,6 @@ impl SubAggregator { | Self::Neg(_) | Self::Sum(_, _) | Self::Diff(_, _) - | Self::ListV(_) | Self::SetV(_) | Self::MapV2U(_) | Self::SumVUnwrap(_) @@ -398,14 +397,6 @@ impl SubAggregator { Some(svnum!(count as u64)) } - Self::ListV(name) => Some(StrictVal::List( - global - .get(name) - .into_iter() - .flat_map(BTreeMap::values) - .map(|atom| atom.verified.clone()) - .collect(), - )), Self::SetV(name) => { let mut set = Vec::new(); for state in global.get(name).into_iter().flat_map(BTreeMap::values) { @@ -507,10 +498,6 @@ mod test { call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("verified")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5) ); - assert_eq!( - call(Aggregator::Take(SubAggregator::ListV(vname!("verified")))), - svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) - ); assert_eq!( call(Aggregator::Take(SubAggregator::SetV(vname!("verified")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) @@ -521,10 +508,6 @@ mod test { #[test] fn unverified_readers() { assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); - assert_eq!( - call(Aggregator::Take(SubAggregator::ListV(vname!("unverified")))), - svlist!([(), (), (), (), (), ()]) - ); assert_eq!(call(Aggregator::Take(SubAggregator::SetV(vname!("unverified")))), svset!([()])); assert_eq!( call(Aggregator::Take(SubAggregator::MapV2U(vname!("unverified")))), @@ -543,10 +526,6 @@ mod test { call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("pairs")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5) ); - assert_eq!( - call(Aggregator::Take(SubAggregator::ListV(vname!("pairs")))), - svlist!([5u64, 1u64, 2u64, 3u64, 4u64, 5u64]) - ); assert_eq!( call(Aggregator::Take(SubAggregator::SetV(vname!("pairs")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) diff --git a/api/src/state/data.rs b/api/src/state/data.rs index 2deba0e..d5df0f3 100644 --- a/api/src/state/data.rs +++ b/api/src/state/data.rs @@ -21,10 +21,9 @@ // or implied. See the License for the specific language governing permissions and limitations under // the License. -use aluvm::LibSite; use amplify::num::u256; use strict_types::StrictVal; -use ultrasonic::AuthToken; +use ultrasonic::{AuthToken, CellLock}; pub type StateTy = u256; @@ -58,7 +57,7 @@ impl StateAtom { pub struct DataCell { pub data: StrictVal, pub auth: AuthToken, - pub lock: Option, + pub lock: Option, } impl DataCell { diff --git a/examples/dao/main.rs b/examples/dao/main.rs index f091bce..4768102 100644 --- a/examples/dao/main.rs +++ b/examples/dao/main.rs @@ -53,6 +53,7 @@ fn codex() -> Codex { developer: Identity::default(), version: default!(), timestamp: 1732529307, + features: none!(), field_order: FIELD_ORDER_SECP, input_config: CoreConfig::default(), verification_config: CoreConfig::default(), diff --git a/src/deed.rs b/src/deed.rs index 27c617c..15d09d7 100644 --- a/src/deed.rs +++ b/src/deed.rs @@ -23,12 +23,11 @@ use std::collections::BTreeMap; -use aluvm::LibSite; use amplify::MultiError; use sonic_callreq::StateName; use sonicapi::{CoreParams, OpBuilder}; use strict_types::StrictVal; -use ultrasonic::{AuthToken, CellAddr, Opid}; +use ultrasonic::{AuthToken, CellAddr, CellLock, Opid}; use crate::{AcceptError, Ledger, Stock}; @@ -85,7 +84,7 @@ impl DeedBuilder<'_, S> { name: impl Into, auth: AuthToken, data: StrictVal, - lock: Option, + lock: Option, ) -> Self { let api = &self.ledger.articles().default_api(); let types = &self.ledger.articles().types(); diff --git a/src/stl.rs b/src/stl.rs index 930b9cc..2bbdbb3 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace"; +pub const LIB_ID_SONIC: &str = "stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index f2ce0b7..0d47386 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -132,11 +132,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -174,11 +173,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -217,11 +215,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -343,11 +340,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -385,11 +381,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -428,11 +423,10 @@ rec Semantics enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -506,11 +500,12 @@ rec Issuer str name, len 0..MAX8 ascii developer, aka Identity, first AsciiPrintable, rest AsciiPrintable, len 1..4096 is timestamp, I64 + bytes features, len 4, aka ReservedBytes4 is fieldOrder, U256 - rec inputConfig, CoreConfig + rec verificationConfig, CoreConfig enum halt, Bool, false 0, true 1 is some, U64, option, wrapped, tag 1 - rec verificationConfig, CoreConfig + rec inputConfig, CoreConfig enum halt, Bool, false 0, true 1 is some, U64, option, wrapped, tag 1 map verifiers, len 0..MAX8 @@ -628,11 +623,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -670,11 +664,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -713,11 +706,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -839,11 +831,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -881,11 +872,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -924,11 +914,10 @@ rec Issuer enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -1108,11 +1097,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -1150,11 +1138,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -1193,11 +1180,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -1319,11 +1305,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId @@ -1361,11 +1346,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 tuple or, tag 2 union SubAggregator tuple const, tag 0 @@ -1404,11 +1388,10 @@ rec Articles enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii listV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 14 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 + ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 + ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 3 @@ -1482,6 +1465,7 @@ rec Articles enum testnet, Bool, false 0, true 1 enum consensus, Consensus, none 0, bitcoin 16, liquid 17, prime 32 is timestamp, I64 + bytes features, len 6, aka ReservedBytes6 union name, ContractName is unnamed, Unit, tag 0 ascii named, wrapped, aka TypeName, first AlphaCapsLodash, rest AlphaNumLodash, len 1..100, tag 1 @@ -1491,11 +1475,12 @@ rec Articles str name, len 0..MAX8 ascii developer, aka Identity, first AsciiPrintable, rest AsciiPrintable, len 1..4096 is timestamp, I64 + bytes features, len 4, aka ReservedBytes4 is fieldOrder, U256 - rec inputConfig, CoreConfig + rec verificationConfig, CoreConfig enum halt, Bool, false 0, true 1 is some, U64, option, wrapped, tag 1 - rec verificationConfig, CoreConfig + rec inputConfig, CoreConfig enum halt, Bool, false 0, true 1 is some, U64, option, wrapped, tag 1 map verifiers, len 0..MAX8 @@ -1508,6 +1493,7 @@ rec Articles bytes codexId, len 32, aka CodexId is callId, U16 is nonce, U256, aka Fe256 + bytes blank0, len 1, aka ReservedBytes1 bytes blank1, len 2, aka ReservedBytes2 bytes blank2, len 2, aka ReservedBytes2 list destructibleOut, len 0..MAX16 @@ -1523,15 +1509,32 @@ rec Articles is first, U256, aka Fe256 is second, U256, aka Fe256 is third, U256, aka Fe256 - rec quadripple, tag 4 + rec quadruple, tag 4 is first, U256, aka Fe256 is second, U256, aka Fe256 is third, U256, aka Fe256 is fourth, U256, aka Fe256 is auth, U256, aka AuthToken, aka Fe256 - rec some, LibSite, option, wrapped, tag 1 - bytes libId, len 32, aka LibId - is offset, U16 + rec some, CellLock, option, wrapped, tag 1 + union aux, StateValue + is none, Unit, tag 0 + rec single, tag 1 + is first, U256, aka Fe256 + rec double, tag 2 + is first, U256, aka Fe256 + is second, U256, aka Fe256 + rec triple, tag 3 + is first, U256, aka Fe256 + is second, U256, aka Fe256 + is third, U256, aka Fe256 + rec quadruple, tag 4 + is first, U256, aka Fe256 + is second, U256, aka Fe256 + is third, U256, aka Fe256 + is fourth, U256, aka Fe256 + rec some, LibSite, option, wrapped, tag 1 + bytes libId, len 32, aka LibId + is offset, U16 list immutableOut, len 0..MAX16 rec StateData union value, StateValue @@ -1545,7 +1548,7 @@ rec Articles is first, U256, aka Fe256 is second, U256, aka Fe256 is third, U256, aka Fe256 - rec quadripple, tag 4 + rec quadruple, tag 4 is first, U256, aka Fe256 is second, U256, aka Fe256 is third, U256, aka Fe256 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 02f3e5d..c9f1da8 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,134 +1,135 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace +Id: stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany Name: SONIC Dependencies: - UltraSONIC#stuart-memphis-english, + UltraSONIC#korea-helena-moral, FiniteField#report-canal-convert, Std#delete-roman-hair, AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 05cd2ae9c830c6f7af18f2292035b989d7fc36619e02c9eda50f25702b10af68 +Check-SHA256: 98268dfbeda174fe5f5ec33c51c2ef91b7fc3600811ae4b0c5dd49617e33c6ad -1yfH>Nkax2{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQ6Rcv%}VN*{|NkcYmGKAh0u07FCu`OJL +1yfH>Nkaw%;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjvJRcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- bY!<#DYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g$Q}Y;{&mz -0|-HmqX$fBVpC~!Weh`aZEb0ER%LQ&W_bbtllNeFa6}P}rq7L!(40)FbL%msz%JU8hqvFyoea2o4pL=v -WpZ|9WI}m#WpgphxGg*8X!CPrawgw_sqk4BX8}k^^xj-FXm+)yumJ%MQe|^xa&~28LV0v$b21A?X>MtB -WkzXbY-9ldG4ZKDyg*2kjAiqI%+Ut?-5Twb%j}W1x95uH8ulNbYunqNWLQ%D(Hkon&*Qw -pawq)`VKLB>Wd>h=Ype%b?2724ncEcX=zY$X>N33Vr*q$h9c2>uJC38-{*D7fZ(%hZo23R4S;p`Q9JBQ -llDynLT_(udPjz(4^OqB|1Bk8zGh-IHIi*o-3_)ygXkkNPaC1&|ZI#2l$xQ-a`EhCy -JoZT~T}~sIjxz)>1`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LvR$+2!VQzFzVQpm_ -v{(W1V6JV*{3!yZ{M3XW@z+pX9JtzktHWiJ@1L)babH -ELfN$u@7k>`Uy~SX>DnAX?A5X{h;vIo29B#Zbv)THgnzJqzni;K&ISmvLd)pN>Rl&wr9&I-v?L-&~MrmbiWK(5rNn}$N2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ri -cn_PmXk-Xfd2nS;VQpn(jMNXXYlf+hXQ9AJ%?72#_KJ5v@E-96x!ZDnLeX=Q9=b5mt) -Nn~pTqZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^aqWo=1heaS*6)M5bHCYFUH@63IY`6K;Dlo$g{ -Z6f4)7N~Yk2UcNnX<=@3fzvD`*Td*C*~4P}$n=kpoj->tyfRKrOAiJKV)22*KzX>Mnd(*pTEa(nZJ -gZT^?2ML$C)mClKyTm8WaJ}8CMy}crPGN0jWJYOaY-Dp&Wo=1hmm!0y(Hu`f(Fijc5*b_M4dVs -Y!8b|ZDhq!3`K5rZB}7&X<=@3bC}8#qjhfwd&>tyAtR<)2LcK~xyL-@iqBUFK20Q^G*lRL(MHiY2Qv~?ZfS3BR$+2!VQzGDQ)O*QWc`7zgMJGK -o2X9f$RGGR>zM`dnhb7^xb -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 -?>y0(yz|LU0j*m?b;qe$6*%pTrv$VUq<0Npo{` -WpV}s1!HeyWq1M_{ckC{@g>lC**6;}%ie4wrTWpLzfxZ1G^f?j#teQe?#%E`{d+C1Sl4-0;gT-ZoMpKK -(c7N=>KC_d#mnmnb7gH|Zggp5a{=8z`UTN!Fl{lVz$AUrewAI&Z>|&@;QdLj1B^DI?1TezX=eZg0ssVV -Z*FA(00035b8l^B00jX7A;%YO&?-P3ONn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5rj-B|XP@r^w5ufb=C_Ju -$l1`nW&GEpSWb-#VRC77Xl-S5X=8H%vx8id>$BJl`jC}Lq~+?j3s%y+DC$XuOq!%;BjO`E31e?=c4cyO -Z*l?GZ>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOwVs&Y3WMy&zL1&V2o**cr;@RA^i_^yDJVpBQ -O{s7F8GT|w6)bIX40maCZe??GQ)O*QWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^$CX>@L7b8|v4R=asfeSl5w6OD5K)p+_a0+#^yXl`tnVw -Z~Ym4VnG!wZE^}yVRu4xX>4R=as&bZ40CjHX=8LnZewp`WdH>M0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8 -A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFEM0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT -?*g=|B=zREie$*y(7k2+*P~cYjsFED2 -Am1Co0{3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrT -q9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-B(-y6Z@V*UIRhFKh?YV3F8;=o0X -Aj+ma&W$Y?mBDQQ0000000030{{R3000009V{c?-cuZ+xa{vhfw^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb -7_LPzv?=G$Lt&lV-%#21Ch@9YYCa> -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 +q9O+mw%Cdg|0Y-zbj2Rx3qrT +q9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW +2Pj0>g~&^g79000000003000000000000000000030000000000CL2zkvLuh4VYjbsN1pxpD002M) +00=>HbZKL3Wpf4t33Fv_VQzG3V{-u^TD*BHADcbhj3lIR2*l2gqDIF<%Ygs|BvZAvnufOnb7^M)1OfmA +Zf|a7000011aog~WdH>M0U^g1ZO|$}9Zg=R%ZE7et&pz}oUddU0B(<>YerIc3k7L&b9H3`1mw(?1L1}E +9EHd_BlVD&E80+f~tBjF2L5xp4$G8|HaaRE?_3PEyoX=7|< +b4g?d0}5krZgg^CV{}Pm0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1D^;iNjk^^qPoT1+zTRn +Ag`3vXv9d*8d@RXy~6c6G6!~La&u{KZU6uR2xDkvV{3DDZ2=Bw$d=6laa$cV?AOA^DZ(TxU)qDd#MR>g +3r=7)ofip1VQg$ubYXO51_B0cWprq7WCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cd +g|0Y-zbj2Rx3qrTq9O+WBLk*fW6RH_XPEi=Ry;9kVTK~nd#>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOw +Vs&Y3WMy&zL1&V2o**cr;@RA^i_^yDJVpBQO{s7F8GT|w6)bIX402(2LvL<&WpZ?Hasj8~b=Ol1`flL; +V4R=asm5cRyk`k?kWEQdWrTza1nu+B|GJQ%{OSD#2Xf2 +lLZDzb8~fNas~qhV{c?-cmf3E%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^zeb+H2qZPeA#eSuS;M +85Xq;Lqt&W@r+$3x4300ksdwYHjuw*zx& +X8;5O00eGtZe;)f009JZZ*64&1pxse#}{qTDnK1gUZ=~4IPtBJuMnKCWEcQ$kD_ZvQg;goNpo{`WpYVm +1_K9UZ)9b7Nn`>9;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxKtm{9}qo!LcbfV=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN!p14WBr9LqgTBPo;{gj!U^Sf= +2v2uzWn@8cX$A%bb7gHwWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ +t0eX2w~A!Q+0eaZ{MVycPK^s;a%psEZDn+6V{-wsgItsAv)By!kd;ZKPd!7nxtnV;v+f< +V{dMDWpZ?Hask(GtapEr1$r8Dd!}w*Soo1E5Na{vM&}RsHL_{2j!6e%b!lv5WpV*QXOeNAASk2a+1#{? +)5hjJMf&nhsc-!mePTfsENyZOcWHEPWpi^=Wo=1h0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 +P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjShEdbZ%vHb3%1#Y-D9}0YPVyah@P3qvF}zw2RZm +<~&9E@=d94{TY2?K@}`*atcymcS3b(Y-D9}1OfmIb98cPV{}DsV{c?-00jX8>7J73J3yCzk$#1)IEB9} +O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!S +tw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ygQek&P +Z*F#Fa&&KU1OfmIb98cPV{}AiV{c?-00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<| +u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ydQ)O*oZggp5a|Q+nc4cyNX>V=-00IYO +WoBV@Y;*w$5!lYbfgOV$;Q#{?{UirsWu)RMRNsACi?hE+BOV|8>jlDGG$V-zfgRW<+s000000096000000000SNZ)9b7Ole|s00{!OSt+!Stw+Hk(Po~~Zg)tl +Xc{g+3dp<|u0=7lDd*2aVV&IHP})APDYB)cg%&~}+QsG>1Ch@9YYCa>3uf#90000000030{{R3000007 +VQ^_oX<~B#2?DoSDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g&i7o!sA0+CHx-vZbVj7D6D}#pW3U +k@391OosFW_507X<}?;000013vO?2Ms;pyX<}?;000301z~J;R&4+U0Rp#KDYTERN5LY| +W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-w1ybYXO5LUn0u +WMy&$1ONneZfSG?000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001EW1z~J; +R&4+U0Rp#KDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v% +AOi?Nj-w7!bYXO5LvL<&WpZ?Has&hb1a)p{bN~PV5DavAaAjmgZewp`WpV%o0RR9X5fOBGaAjmhX=Q9= +MQ&qnWMy&y1pxp6ApZqnY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$*7My#T6183 +ELud{7pMT5X7J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0>g~&^g7mb;*F>vukd;=m`ygb@x#_>`RmOO#upFXJ>L{XJK?@ +WB>&L0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# +&aRFSj}23GVnJtTa%E>>bZ>G54gdvXZ*FsR00ja9>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lp1Z-h*bN~eb0_mQT=Q}``f02HLt~iCiD@{1J +w0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj}QZHWoG~d0RfTkSh2=pqY5<1 +(br?Xy7E4w1fUIUAA#7JB!_)M-s2Gib9HS11p)z)?^v0qXeK0Y#)KxnIwmOLf+#6 +k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j5(H#vW@Z2d0s)clSh2=pqY5<1(br?Xy7E4w1fUIU +AA#7JB!_)M-s1t0?^v0qXeK0Y#)KxnIwmOLf+#b1!He@Zgcmw%Cd +g|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7ZZB|uocXDBH00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|x*xI4ag+tfP`W3(#!7O@f +31nq+baHQbWn=&f0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1N)`Na$v6rX_fBJi~iN-tVcdi +Dm&03^NQ+Jc&xL55CR0`%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^$sVRCU7I&Si0f-Nslz6#Cn4 +t^5q*{ZW-{pIWc4bq4?d000000096000000000 -----END STRICT TYPE LIB----- diff --git a/stl/SONIC@0.12.0.stl b/stl/SONIC@0.12.0.stl index c65829eedcb8340aa66bd7ac4517d48bfcfedc10..03236dc578d107717f14009f2584a0c30bc0c5f2 100644 GIT binary patch delta 1267 zcmZ2vea~8*HQ3+J)0vIs$(d=)4_kl8w4Sh1dGWI3;G)7Qm$tgP+wWl5xv%6I^G5Z} zjEpRkZ!^ZnU9|Q%v!LLL@P66ERR`D4otcy`aHaEv^-BZh$5J+RJS==csl};9WvMAn zl_jagX767K^RwP)G)xTsUl=u2u2e8Q&XnVilg$*N>x_DnmGq@zNB-JIcByn;*o7Uv>Y`XO! z3a82*iw2&|31sf>Y;csamf=z?O<*(%-Se<^)wb|G?Cz;~sl}PaArX96eoxFje5zNe zBRJFA^!U+&{C~e!r%&a$R~eF6mdN9rpI1_pm|WtUT9TON^S-;}<@F8ua;>p5^%>VW zOK!e&Y5$ai-)?2!Xj@UJ&EcGyljD=0oLyC4@3wuH^rsuEJCy8}FIMi%j@#2F!}r^k zfBW^z4xeBD;R3rjEHS4vwR7XG?E8QG9e&P>)GN(<^7=;F@p^_Z=>)Uoe(v^`4A)ql z^HWkQCK%oL%lN?TV8U0u8%$HCaVbCKjuPA}$!sJO)Lh6I(8KCkTwIzuljX0R)@9pQ zIg{VYh)*tNH<)~my;|YXpODf+x6Y*&Hs3uK;UMzscHY`QJdghdPR*GgwSIjm`{YcH zlKQJod91s%X1orT;VbQ(xbEMJaLMx7^Q0h2Mwa6I+*AfuMn*y^nV9m6 z7+9GJt9vGc!qTGvfJ$7eEm0%yJgp~SaYp6e*1f?z+pS^f=oE!&${KA*VL zQQy$FVdKdy3DL(kYwO)D`OQ3;h3AZdV$_~WZTZ=@cY9Qp6mT3l*SE;+xbx{o23D2e zt=nd`ZJ+#s$I*e1eS`vjav`rIVMnjxO=QX@WEG*5z*(G{o0wOUnOw|Bgx9PlZx9e6 z=(5T3Tnd|61phE8a0=eIS?iS%X>*md7b9T@Jdx2QtjJJSF@R9;5lZF^Q1JghgaH5ykx6U- delta 1190 zcmca-y~tXfHQ3+J)0s``Z@%WPkE$0cZ<Oc$dc`LuF+>CO+x*d&9iMdy${^w|`%Wusqn2i#B+1*p~Qj0T-C+}p_Qqy^N z=7ZngYTfk_*DJ#wPSU$NCv_+D#oP1#z7pS_d-U{cR_FYb)QZWE*>uB;F9zA|v8d}% z_;6;1KX3L4v-yb}<SfDaxxnU!CFYc-P7dX$R`?*gnsw#D9paZJ|DE;!`#M%{ z4x?o}hvU^v)?HBgX0vPVe76OLbFYFXXQik$&*kb3Jp9*}^w1lm7}>)w5=Tk^~bWs|lqnF2|yh z%;cQZV$T#dX0Bvt^m(QbGMKS$vmsw1Q#K*{2_-|$;?&&4JfIVb8Hw<=A2C6#xVcC0 zHDVkJdWe~WpMez^OvNRWKZvVrlHA6`uE?5`SzHn}xlzJp^EPQOM#64Xkkuuu VC|6c7fKccX$|(#`@c%!A0RVlkC`$kU diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index 860b4d2..f372584 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:XYSvyYlE-exuTRwa-LExvrDM-Emv6Mek-AoHY1bX-K2iwJ9M#escort-betty-grace + Id: stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -13,21 +13,22 @@ @context typelib SONIC -import UltraSONIC#stuart-memphis-english - use Issue#exotic-profit-diet - use Genesis#network-erosion-trade +import UltraSONIC#korea-helena-moral + use StateData#mission-first-owner use Consensus#nissan-congo-clark - use Codex#panther-royal-pandora use ContractName#value-reform-lesson - use StateData#amigo-igor-panel - use ContractMeta#tornado-fractal-cement + use Genesis#minute-prism-small + use ContractMeta#element-novel-salute + use CellLock#jasmine-demo-resume + use StateValue#kiwi-million-ford + use Codex#adam-mega-analyze + use Issue#finance-peru-havana use Opid#storm-dragon-brain use ContractId#uniform-welcome-papa - use StateValue#bamboo-morgan-edition use AuthToken#western-america-patrol use CodexId#cargo-season-impact use Identity#smart-pioneer-nominal - use StateCell#storm-martin-jump + use StateCell#tarzan-jordan-camera use CellAddr#lecture-vincent-carbon use RawData#lima-anvil-karate @@ -52,6 +53,8 @@ import AluVM#reward-accent-swim import CommitVerify#biology-news-adam use ReservedBytes1#origin-roger-relax use ReservedBytes2#florida-libra-circus + use ReservedBytes6#joker-peru-brave + use ReservedBytes4#young-goblin-academy import StrictTypes#henry-heart-survive use VariantName#theory-austin-before @@ -90,7 +93,7 @@ data Api : codexId UltraSONIC.CodexId @mnemonic(viva-index-tempo) data ApisChecksum : [Byte ^ 4] -@mnemonic(mirage-bronze-regular) +@mnemonic(project-freddie-oasis) data Articles : semantics Semantics , sig SigBlob? , issue UltraSONIC.Issue @@ -111,7 +114,7 @@ data GlobalApi : semId StrictTypes.SemId , rawConvertor RawConvertor , rawBuilder RawBuilder -@mnemonic(peace-film-video) +@mnemonic(salon-record-hope) data Issuer : codex UltraSONIC.Codex , semantics Semantics , sig SigBlob? @@ -169,7 +172,7 @@ data StateConvertor : unit () data StateSelector : global (StrictTypes.VariantName, Std.Bool) | aggregated StrictTypes.VariantName -@mnemonic(table-origami-shrink) +@mnemonic(panel-permit-distant) data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) | theOnly StrictTypes.VariantName | copy StrictTypes.VariantName @@ -180,13 +183,12 @@ data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) | sum (StateSelector, StateSelector) | diff (StateSelector, StateSelector) | count#32 StrictTypes.VariantName - | listV StrictTypes.VariantName - | setV StrictTypes.VariantName + | setV#34 StrictTypes.VariantName | mapV2u StrictTypes.VariantName | sumVUnwrap#48 StrictTypes.VariantName | sumVDefault StrictTypes.VariantName -@mnemonic(explore-locate-zoom) +@mnemonic(weekend-street-channel) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} diff --git a/tests/dao.rs b/tests/dao.rs index 5d144a8..45a5ccd 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -51,6 +51,7 @@ fn codex() -> Codex { developer: Identity::default(), version: default!(), timestamp: 1732529307, + features: none!(), field_order: FIELD_ORDER_SECP, input_config: CoreConfig::default(), verification_config: CoreConfig::default(), diff --git a/tests/reorgs.rs b/tests/reorgs.rs index ffa4e6d..cc5bb74 100644 --- a/tests/reorgs.rs +++ b/tests/reorgs.rs @@ -125,6 +125,7 @@ fn codex() -> Codex { developer: Identity::default(), version: default!(), timestamp: 1732529307, + features: none!(), field_order: FIELD_ORDER_SECP, input_config: CoreConfig::default(), verification_config: CoreConfig::default(), From 59e56b70bb27d5e5e58d68e1a46fb4e808d64a57 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 31 May 2025 09:46:59 +0200 Subject: [PATCH 34/40] api: add None aggregator --- api/src/state/aggregators.rs | 25 +++--- src/stl.rs | 2 +- stl/SONIC.vesper | 54 ++++++----- stl/SONIC@0.12.0.sta | 170 +++++++++++++++++------------------ stl/SONIC@0.12.0.stl | Bin 7646 -> 7655 bytes stl/SONIC@0.12.0.sty | 7 +- 6 files changed, 135 insertions(+), 123 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 3b23796..5e288fb 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -58,16 +58,10 @@ pub enum StateSelector { #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Some(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum Aggregator { - /// Takes the underlying aggregated state and applies nothing on top. - /// - /// If the underlying aggregator fails, the aggregated state is not produced. + /// Produces constant value of `Option::None` type. #[strict_type(tag = 0)] - // https://github.com/dtolnay/serde-yaml/issues/363 - // We should repeat this if we encounter any other nested enums. - #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] - Take(SubAggregator), + None, - // TODO: Add `None` /// Wrap into an optional value. /// /// If the underlying aggregated state fails, sets the aggregated state to `None`. @@ -75,8 +69,17 @@ pub enum Aggregator { #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] Some(SubAggregator), - /// If the underlying aggregated state fails, returns the provided constant value. + /// Takes the underlying aggregated state and applies nothing on top. + /// + /// If the underlying aggregator fails, the aggregated state is not produced. #[strict_type(tag = 2)] + // https://github.com/dtolnay/serde-yaml/issues/363 + // We should repeat this if we encounter any other nested enums. + #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] + Take(SubAggregator), + + /// If the underlying aggregated state fails, returns the provided constant value. + #[strict_type(tag = 3)] Or(#[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] SubAggregator, SemId, TinyBlob), /// Execute a custom function on the state. @@ -94,7 +97,7 @@ impl Aggregator { pub fn depends_on(&self) -> impl Iterator { match self { Self::Take(sub) | Self::Some(sub) | Self::Or(sub, _, _) => sub.depends_on(), - Self::AluVM(_) => vec![], + Self::None | Self::AluVM(_) => vec![], } .into_iter() } @@ -112,6 +115,8 @@ impl Aggregator { types: &TypeSystem, ) -> Option { match self { + Self::None => Some(StrictVal::none()), + Self::Take(sub) => sub.aggregate(global, aggregated, types), Self::Some(sub) => Some(match sub.aggregate(global, aggregated, types) { diff --git a/src/stl.rs b/src/stl.rs index 2bbdbb3..36070bb 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany"; +pub const LIB_ID_SONIC: &str = "stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index 0d47386..a3b5dd8 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -95,7 +95,8 @@ rec Semantics map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -136,7 +137,7 @@ rec Semantics ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -177,7 +178,7 @@ rec Semantics ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -221,7 +222,7 @@ rec Semantics ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -303,7 +304,8 @@ rec Semantics map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -344,7 +346,7 @@ rec Semantics ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -385,7 +387,7 @@ rec Semantics ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -429,7 +431,7 @@ rec Semantics ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -586,7 +588,8 @@ rec Issuer map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -627,7 +630,7 @@ rec Issuer ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -668,7 +671,7 @@ rec Issuer ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -712,7 +715,7 @@ rec Issuer ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -794,7 +797,8 @@ rec Issuer map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -835,7 +839,7 @@ rec Issuer ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -876,7 +880,7 @@ rec Issuer ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -920,7 +924,7 @@ rec Issuer ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -1060,7 +1064,8 @@ rec Articles map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -1101,7 +1106,7 @@ rec Articles ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -1142,7 +1147,7 @@ rec Articles ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -1186,7 +1191,7 @@ rec Articles ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 @@ -1268,7 +1273,8 @@ rec Articles map aggregators, len 0..MAX8 ascii key, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 union value, Aggregator - union take, SubAggregator, wrapped, tag 0 + is none, Unit, tag 0 + union some, SubAggregator, wrapped, tag 1 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -1309,7 +1315,7 @@ rec Articles ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union some, SubAggregator, wrapped, tag 1 + union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId bytes _, len 0..MAX8 @@ -1350,7 +1356,7 @@ rec Articles ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - tuple or, tag 2 + tuple or, tag 3 union SubAggregator tuple const, tag 0 bytes _, len 32, aka SemId @@ -1394,7 +1400,7 @@ rec Articles ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 bytes _, len 32, aka SemId bytes _, len 0..MAX8 - rec aluVm, LibSite, wrapped, tag 3 + rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 map verifiers, len 0..MAX8 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index c9f1da8..5ec0a16 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany +Id: stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz Name: SONIC Dependencies: UltraSONIC#korea-helena-moral, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: 98268dfbeda174fe5f5ec33c51c2ef91b7fc3600811ae4b0c5dd49617e33c6ad +Check-SHA256: e32eda5545557b08617cef3ecb9285245af10b5a49ba8aec6642d224a4e22026 1yfH>Nkaw%;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjvJRcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -47,89 +47,89 @@ Npo{`Wtjy19xBs4>TE~@>xkGvQ`p*}&V@tQ&H5F<8Nn=iYXnblX=I-WEJ-@Z0;0Ob-P{Wzd?2rs)M&&= tm{9}qo!Lcbf&x`)m=B!6PPbxdmBJ+ysRCuhjfe;8oWo&FgWMp#vS;NBVT;TAYsL|^P+?^W;{W$E31sqn+dpk{- -*m~XvQek&QVRT^>01828XL4m{VRUbD1OxyCbYW{{00jX7)k1Csx+<9KQydO;jghYY=%=;of4FWJ;L-ebyjTv1pxxLSt+!Stw+Hk -(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`yXL2zjX2nStW$T}qG>2$%Oag@@vMMpol0J*+&<^#2?>p#$=rdum?r*`71Hb|_zg6yfI1@tx1 -ME;WCJU|FzZ*FF9a&2<}2><{B0000000000{{R30000003uI+xVRdYDLt$)e00aU61a5C`WdHyG0R(ez -ZDjxj0Ri0Lw|vJna{%YhJnSPknsk9=N+~z1q~pntg8OOz-6aNRY;R&=Yyb)Z>7J73J3yCzk$#1)IEB9} -O*pr-e%zuW2Pj0>g~&^g7@~000000RI300000000nP%Ze?Tu3Ige#lIJ@>mw%Cdg|0Y-zbj2Rx3qrT -q9O+mw%Cdg|0Y-zbj2Rx3qrT -q9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW -2Pj0>g~&^g79000000003000000000000000000030000000000CL2zkvLuh4VYjbsN1pxpD002M) -00=>HbZKL3Wpf4t33Fv_VQzG3V{-u^TD*BHADcbhj3lIR2*l2gqDIF<%Ygs|BvZAvnufOnb7^M)1OfmA -Zf|a7000011aog~WdH>M0U^g1ZO|$}9Zg=R%ZE7et&pz}oUddU0B(<>YerIc3k7L&b9H3`1mw(?1L1}E -9EHd_BlVD&E80+f~tBjF2L5xp4$G8|HaaRE?_3PEyoX=7|< -b4g?d0}5krZgg^CV{}Pm0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1D^;iNjk^^qPoT1+zTRn -Ag`3vXv9d*8d@RXy~6c6G6!~La&u{KZU6uR2xDkvV{3DDZ2=Bw$d=6laa$cV?AOA^DZ(TxU)qDd#MR>g -3r=7)ofip1VQg$ubYXO51_B0cWprq7WCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cd -g|0Y-zbj2Rx3qrTq9O+WBLk*fW6RH_XPEi=Ry;9kVTK~nd#>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOw -Vs&Y3WMy&zL1&V2o**cr;@RA^i_^yDJVpBQO{s7F8GT|w6)bIX402(2LvL<&WpZ?Hasj8~b=Ol1`flL; -V4R=asm5cRyk`k?kWEQdWrTza1nu+B|GJQ%{OSD#2Xf2 -lLZDzb8~fNas~qhV{c?-cmf3E%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^zeb+H2qZPeA#eSuS;M -85Xq;Lqt&W@r+$3x4300ksdwYHjuw*zx& -X8;5O00eGtZe;)f009JZZ*64&1pxse#}{qTDnK1gUZ=~4IPtBJuMnKCWEcQ$kD_ZvQg;goNpo{`WpYVm -1_K9UZ)9b7Nn`>9;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxKtm{9}qo!LcbfV=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN!p14WBr9LqgTBPo;{gj!U^Sf= -2v2uzWn@8cX$A%bb7gHwWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ -t0eX2w~A!Q+0eaZ{MVycPK^s;a%psEZDn+6V{-wsgItsAv)By!kd;ZKPd!7nxtnV;v+f< -V{dMDWpZ?Hask(GtapEr1$r8Dd!}w*Soo1E5Na{vM&}RsHL_{2j!6e%b!lv5WpV*QXOeNAASk2a+1#{? -)5hjJMf&nhsc-!mePTfsENyZOcWHEPWpi^=Wo=1h0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 -P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjShEdbZ%vHb3%1#Y-D9}0YPVyah@P3qvF}zw2RZm -<~&9E@=d94{TY2?K@}`*atcymcS3b(Y-D9}1OfmIb98cPV{}DsV{c?-00jX8>7J73J3yCzk$#1)IEB9} -O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!S -tw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ygQek&P -Z*F#Fa&&KU1OfmIb98cPV{}AiV{c?-00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<| -u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ydQ)O*oZggp5a|Q+nc4cyNX>V=-00IYO -WoBV@Y;*w$5!lYbfgOV$;Q#{?{UirsWu)RMRNsACi?hE+BOV|8>jlDGG$V-zfgRW<+s000000096000000000SNZ)9b7Ole|s00{!OSt+!Stw+Hk(Po~~Zg)tl -Xc{g+3dp<|u0=7lDd*2aVV&IHP})APDYB)cg%&~}+QsG>1Ch@9YYCa>3uf#90000000030{{R3000007 -VQ^_oX<~B#2?DoSDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g&i7o!sA0+CHx-vZbVj7D6D}#pW3U -k@391OosFW_507X<}?;000013vO?2Ms;pyX<}?;000301z~J;R&4+U0Rp#KDYTERN5LY| -W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-w1ybYXO5LUn0u -WMy&$1ONneZfSG?000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOaY-B}lV{c?-asUMZ001EW1z~J; -R&4+U0Rp#KDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL7S@v% -AOi?Nj-w7!bYXO5LvL<&WpZ?Has&hb1a)p{bN~PV5DavAaAjmgZewp`WpV%o0RR9X5fOBGaAjmhX=Q9= -MQ&qnWMy&y1pxp6ApZqnY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$*7My#T6183 -ELud{7pMT5X7J73J3yCzk$#1) -IEB9}O*pr-e%zuW2Pj0>g~&^g7mb;*F>vukd;=m`ygb@x#_>`RmOO#upFXJ>L{XJK?@ -WB>&L0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj# -&aRFSj}23GVnJtTa%E>>bZ>G54gdvXZ*FsR00ja9>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lp1Z-h*bN~eb0_mQT=Q}``f02HLt~iCiD@{1J -w0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj}QZHWoG~d0RfTkSh2=pqY5<1 -(br?Xy7E4w1fUIUAA#7JB!_)M-s2Gib9HS11p)z)?^v0qXeK0Y#)KxnIwmOLf+#6 -k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j5(H#vW@Z2d0s)clSh2=pqY5<1(br?Xy7E4w1fUIU -AA#7JB!_)M-s1t0?^v0qXeK0Y#)KxnIwmOLf+#b1!He@Zgcmw%Cd -g|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7ZZB|uocXDBH00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|x*xI4ag+tfP`W3(#!7O@f -31nq+baHQbWn=&f0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1N)`Na$v6rX_fBJi~iN-tVcdi -Dm&03^NQ+Jc&xL55CR0`%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^$sVRCU7I&Si0f-Nslz6#Cn4 -t^5q*{ZW-{pIWc4bq4?d000000096000000000 +*m~XvQek&QVRT^>01828XL4m{VRUbD1O)&DZf|a7000011aog~WdH>M0o6io1-dGj>r)&Kb&Zj({^+N* +>wmaz7vR!4=I3Hk83F`!VQXao1pxuoLT&}RDwyk291eAjk*@yer?u;UxNaBV(mCemVp16c0&j8v1p@)q +LT&}RDwyk291eAjk*@yer?u;UxNaBV(mCemVp16b>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj09;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxKtm{9}qo!Lcbf?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{!D;Edq6x +AD58@Z(--WKj!iy+_Y-?7}Wakl_{2;HmLvr000000093000000000GVcWz~5015)>o|5M~K$m}!eub_$ +g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll2&wGZS!@Jni^|L1 +T^LqX{Nukv3REP~S+MEH0Hg4z0000000000{{R30000003t?wxa%E>>bZ>HV015)>o|5M~K$m}!eub_$ +g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll+X;1Xivg*fc=Ld9 +J3;!#Bj_%JoYj8u6mfNrDC=S&0000000000{{R300000033g?2X=Z6?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy0000000000{{R30 +0000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30000003_);db30||3wZDDS7X=8H%b@pLdDZ^pXz~{?jMza$BXS%?(BJzh!$TODED_{Yb +19NF-00aU61a5C`WdHyG0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAn+b8~fN +0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1CTP<{Q=-M!C>_+*aDQ63M1hQS`ob&12P;^gK+^+ +j0!<=bZKL3Wphbn1_KIXZ*FvQVPkYjWC8@_%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^!JyEJ-@Z +0;0Ob-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+`#WpZc;Wd;HUZDn+5Z)5`Lo|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 +D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LpZ+C8GWB>#L00eGtZe;)f009JZZ*64&1pxx- +o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lt +M{I9mVQfKgX$A%bb7gHwWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ +t0eX2w~A!Q+0eaZ{MVycPK^n0bz*F3b7*B`0)mO_O%DrjRIhYP1?a)oog)LLTw}}6rDvG=`c^zKYGH;V +(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$lRfZgypIbZ>G2*Ke$Me~|@x8gqN5ZeLjVkt+~tG2%w& +5BN2*X|Rq-2V!+;Y-D9}0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atv}|cSCP(c4cyOZ*l>r +<8{|l3;J&0{bM7-QB8Vh?>y0(yz|LU0j*m?b;q +e$6*%pTrv$VUq<0Npo{`WpV}s1!HeyWq1Mv;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjwzvD$0j +{7*pno>?w+ZshCOX2*X3RvTb8r%p#dIRMrPb7gH|Zggp5a{+bsVOc4|VbZ|o%VS2f68>kpz_lXshfK&b +me4C;0hj}GX=eZg0ssVVZ*FA(00035b8l^B00jX7A;%YO&?-P3ONn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5 +rj-B|XP@r^w5ufb=C_Ju$l1`nW&GEpSWb-#VRC77Xl-S5X=8H%vx8id>$BJl`jC}Lq~+?j3s%y+DC$Xu +Oq!%;BjO`E31e?=c4cyOZ*l?GZ>)EJkp+4hb9<(4Us(8&D-dci;zs8W_%*U=u#QOwVs&Y3WMy&zL1&V2 +o**cr;@RA^i_^yDJVpBQO{s7F8GT|w6)bIX40maCZe??GQ)O*QWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrT +q9O+ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^$CX>@L7b8|v4R=asfeSl5w6O +D5K)p+_a0+#^yXl`tnVwZ~Ym4VnG!wZE^}yVRu4xX>4R=as&bZ40CjHX=8LnZewp`WdH>M0_mQT=Q}`` +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFEM0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFED25bvY=hwClP42NtW0Vv0s0{3Ige#lIJ@> +mw%Cdg|0Y-zbj2Rx3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Bp@1y&N +>n+U;hio7LD94)PfI8^#41Ch@9YYCa>3uf#90000000030{{R3000005ba`-Pa{}p}lIJ@>mw%Cdg|0Y-zbj2Rx3qrT +q9O+&PZdlOljoA7|k;k>s6qoa5|8f~f~nX=g%gZ(;=j00;m8Kmh;%00000 +000mG0000001H!eVRU6da%psEZ3F`V2xfI|XK7+=WdHyG0Sj(#Zbo%(XK7+=WdHyG{{>-ebyjTv1pxxL +St+!Stw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`yg +Q*>c;WkPjnY-D9}1OxyCb#7^N0000G40L&LWn@KeV{c?-asUMZ001Bn5p;QQWn@NaWo%?cZewp`WpV%o +0RR9X{{>-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2 +Tv2Na_ZHTZ79ax%L5`yiQ*>c;WkYXnc4cyOZ*l|#00ebzX>0|-HmqYYDZVRU6vWo%_*bZ>G50ssbQY;R&=YybrU0_mQT +=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{<^; +>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=}CkBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Dul_ +VP|J@WoKb@Wn=&a0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>` +<)y^XImOPdju4Lm1Y>V-c>o0g0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0 +m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{^pEZg+BFZ~z4X0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 +Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|2r~X>xOP00jX8>7J73J3yCzk$#1)IEB9}O*pr- +e%zuW2Pj0>g~&^g7mw%Cd +g|0Y-zbj2Rx3qrTq9O+0qXeK0Y#)KxnIwmOLf+#M19Nq400ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ +*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;}Qg9X=Y{s1p)z)?^v0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*jAO&M@b#8P31pxx- +o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L` +1aoC{RsaP70_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h +#Lzj#&aRFSk0S?iz50p(P||0 +m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1z^zb!}EvZg+BFZ~z4X0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ +)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1-2#b!}EeWoBV@Y;*tx0RrislIJ@>mw%Cd +g|0Y-zbj2Rx3qrTq9O+@6C +ZUzDbZ*Xa30tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1DOQ<9xBs4>TE~@>xkGvQ`p*}&V@tQ +&H5F<8Nn=iYYAj!b98cVd1Yh(3IYV=%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^%hs$8un=2x*n> +&x`)m=B!6PPbxdmBJ+ysRCuhjfe-=&;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjx%{8V+q+RkNh +gWbkhKot7hZms+bAMbW zRr=KKbHaGq1?>dJ8I%7CSZ&_OtHVrC<>tQvUCf#S?-&1Wf316#r#(l3QRDcm#|>65 rKJY8%cIn4BMlNXPW=k$DF3Hbj;F^3DtJ$lMJ@CFJ+IyTur@HHIN%WOT+rO_! V7SU-7HJiLa#G9a^&C;T0H~^3YVH5xW diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index f372584..e71be9c 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:MaPAknhf-bKLyB9L-eGdRIYN-N3SUvEu-zxSFPbC-kc_99E0#congo-whiskey-germany + Id: stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -74,9 +74,10 @@ import StrictTypes#henry-heart-survive use TypeSystem#adrian-boris-sponsor -@mnemonic(roof-monkey-stand) -data Aggregator : take SubAggregator +@mnemonic(royal-maestro-benefit) +data Aggregator : none () | some SubAggregator + | take SubAggregator | or (SubAggregator, StrictTypes.SemId, [Byte ^ ..0xff]) | aluVm#255 AluVM.LibSite From 28586856f22030bdd6076442258fa860e3b1930a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sat, 31 May 2025 13:16:26 +0200 Subject: [PATCH 35/40] api: add more aggregators --- api/src/state/aggregators.rs | 359 +++++++-- src/stl.rs | 2 +- stl/SONIC.vesper | 1326 +++++++++++++++++++++++++++++----- stl/SONIC@0.12.0.sta | 71 +- stl/SONIC@0.12.0.stl | Bin 7655 -> 8509 bytes stl/SONIC@0.12.0.sty | 25 +- 6 files changed, 1532 insertions(+), 251 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index 5e288fb..ffb2788 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -191,7 +191,24 @@ pub enum SubAggregator { #[strict_type(tag = 4)] First(StateName), - // TODO: Add `Nth` + /// Takes the nth element of the global state. + /// + /// Fails if the global state is not defined, i.e., has zero elements, + /// or if the nth-element is empty. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 5)] + Nth(StateName, u16), + /// Takes the last element of the global state. /// /// Fails if the global state is not defined, i.e., has zero elements. @@ -206,10 +223,27 @@ pub enum SubAggregator { /// /// It is the responsibility of the codex developer /// to ensure non-ambiguity when this aggregator is used. - #[strict_type(tag = 5)] + #[strict_type(tag = 6)] Last(StateName), - // TODO: Add `ReversedNth` + /// Takes the nth element of the global state, counting from the end of the list. + /// + /// Fails if the global state is not defined, i.e., has zero elements, + /// or if the nth-element is empty. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 7)] + NthBack(StateName, u16), + /// Integer-negate state. /// /// Fails if the state is not defined or contains multiple elements. @@ -222,23 +256,54 @@ pub enum SubAggregator { /// Fails if any of the state is not defined or contains multiple elements. /// Also fails if the state is not an unsigned 64-bit integer or there is an overflow. #[strict_type(tag = 0x11)] - Sum(StateSelector, StateSelector), + Add(StateSelector, StateSelector), /// Substracts the second state from the first state, expecting both to be integers. /// /// Fails if any of the state is not defined or contains multiple elements. /// Also fails if the state is not an unsigned 64-bit integer or there is an overflow. #[strict_type(tag = 0x12)] - Diff(StateSelector, StateSelector), + Sub(StateSelector, StateSelector), + + /// Product two states of different types, expecting them to be integers. + /// + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer or there is an overflow. + #[strict_type(tag = 0x13)] + Mul(StateSelector, StateSelector), + + /// Divide the first state on the second state, expecting them to be integers. + /// The resulting value is rounded towards zero. + /// + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer, or the second state is zero. + #[strict_type(tag = 0x14)] + Div(StateSelector, StateSelector), + + /// Modulo-divide the first state on the second state, expecting them to be integers. + /// + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the state is not an unsigned 64-bit integer, or the second state is zero. + #[strict_type(tag = 0x15)] + Rem(StateSelector, StateSelector), + + /// Exponentiates the first state with the second state, expecting them to be integers. + /// The resulting value is rounded towards zero. + /// + /// Fails if any of the state is not defined or contains multiple elements. + /// Also fails if the first state is not an unsigned 64-bit integer, + /// the second state is not an unsigned 32-bit integer, or there is an overflow. + #[strict_type(tag = 0x16)] + Exp(StateSelector, StateSelector), - // TODO: Add `Product`(aggregated, aggregated) - // TODO: Add `Pow`(selector, int) - // TODO: Add `Root`(selector, int) /// Count the number of elements of the global state of a certain type. #[strict_type(tag = 0x20)] Count(StateName), - // TODO: Add `CountUnique` + /// Count the number of unique elements of the global state of a certain type. + #[strict_type(tag = 0x21)] + CountUnique(StateName), + /// Convert a verified state under the same state type into an ordered set. /// /// Acts only on a global state; doesn't recognize aggregated state. @@ -247,26 +312,112 @@ pub enum SubAggregator { #[strict_type(tag = 0x22)] SetV(StateName), - /// Map from a field-based element state to a non-verifiable structured state. + /// Map from a field-based element state to a non-verifiable structured state; + /// when the field-based element state repeats, it is ignored and only the initial state is + /// kept. + /// + /// The map is sorted by its values, lexicographically. /// /// Acts only on a global state; doesn't recognize aggregated state. /// /// If the global state with the name is absent returns an empty map. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. #[strict_type(tag = 0x23)] MapV2U(StateName), - // TODO: Add MapV2AU + /// Map from a field-based element state to a list of non-verifiable structured state; + /// when the field-based element state repeats, the list is extended with the non-verifiable + /// state. + /// + /// The map is ordered according to the global state element order. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// If the global state with the name is absent returns an empty map. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 0x24)] + MapV2ListU(StateName), + + /// Map from a field-based element state to a set of non-verifiable structured state; + /// when the field-based element state repeats, the set is extended with the non-verifiable + /// state. + /// + /// The map is ordered according to the global state element order. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// If the global state with the name is absent returns an empty map. + /// + /// # Nota bene + /// + /// The global state does not have only a partial ordering (it is a lattice). + /// + /// It is only in the case when one operation depends on outputs of another + /// (via global or owned state) there is a guarantee that the global state + /// defined by the second operation will always follow the first one. + /// + /// It is the responsibility of the codex developer + /// to ensure non-ambiguity when this aggregator is used. + #[strict_type(tag = 0x25)] + MapV2SetU(StateName), + /// Sums over verifiable part of a global state. /// /// Acts only on a global state; doesn't recognize aggregated state. /// - /// Fails if the global state doesn't have any elements, + /// Fails if the global state doesn't have any elements, or if there is an overflow, /// or the state type is not an unsigned integer. #[strict_type(tag = 0x30)] - SumVUnwrap(StateName), + SumUnwrap(StateName), + /// Sums over verifiable part of a global state. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// Produces zero f the global state doesn't have any elements, or if there is an overflow. + /// + /// If any of the elements of the global state are not an unsigner integer, treats them as zero. #[strict_type(tag = 0x31)] - SumVDefault(StateName), + SumOrDefault(StateName), + + /// Takes a product of the elements of a global state, taking their verifiable part. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// Fails if the global state doesn't have any elements, or if there is an overflow, + /// or the state type is not an unsigned integer. + #[strict_type(tag = 0x32)] + ProdUnwrap(StateName), + + /// Takes a product of the elements of a global state, taking their verifiable part. + /// + /// Acts only on a global state; doesn't recognize aggregated state. + /// + /// Produces zero f the global state doesn't have any elements, or if there is an overflow. + /// + /// If any of the elements of the global state are not an unsigner integer, treats them as one. + #[strict_type(tag = 0x33)] + ProdOrDefault(StateName), } impl SubAggregator { @@ -275,28 +426,51 @@ impl SubAggregator { pub fn depends_on(&self) -> Vec<&StateName> { match self { Self::Neg(StateSelector::Aggregated(state)) - | Self::Sum(StateSelector::Global(_, _), StateSelector::Aggregated(state)) - | Self::Diff(StateSelector::Global(_, _), StateSelector::Aggregated(state)) - | Self::Sum(StateSelector::Aggregated(state), StateSelector::Global(_, _)) - | Self::Diff(StateSelector::Aggregated(state), StateSelector::Global(_, _)) => vec![state], - - Self::Sum(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) - | Self::Diff(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) => vec![a, b], + | Self::Add(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Sub(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Mul(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Div(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Rem(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Exp(StateSelector::Global(_, _), StateSelector::Aggregated(state)) + | Self::Add(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Sub(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Mul(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Div(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Rem(StateSelector::Aggregated(state), StateSelector::Global(_, _)) + | Self::Exp(StateSelector::Aggregated(state), StateSelector::Global(_, _)) => vec![state], + + Self::Add(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Sub(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Mul(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Div(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Rem(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) + | Self::Exp(StateSelector::Aggregated(a), StateSelector::Aggregated(b)) => vec![a, b], Self::Const(_, _) | Self::TheOnly(_) | Self::Count(_) + | Self::CountUnique(_) | Self::Copy(_) | Self::Unwrap(_) | Self::First(_) + | Self::Nth(_, _) | Self::Last(_) + | Self::NthBack(_, _) | Self::Neg(_) - | Self::Sum(_, _) - | Self::Diff(_, _) + | Self::Add(_, _) + | Self::Sub(_, _) + | Self::Mul(_, _) + | Self::Div(_, _) + | Self::Rem(_, _) + | Self::Exp(_, _) | Self::SetV(_) | Self::MapV2U(_) - | Self::SumVUnwrap(_) - | Self::SumVDefault(_) => vec![], + | Self::MapV2ListU(_) + | Self::MapV2SetU(_) + | Self::SumUnwrap(_) + | Self::SumOrDefault(_) + | Self::ProdUnwrap(_) + | Self::ProdOrDefault(_) => vec![], } } @@ -361,37 +535,65 @@ impl SubAggregator { Self::First(name) => { let state = global.get(name)?; - if state.is_empty() { - return None; - } Some(state.first_key_value()?.1.verified.clone()) } + Self::Nth(name, pos) => { + let state = global.get(name)?; + Some(state.iter().nth(*pos as usize)?.1.verified.clone()) + } + Self::Last(name) => { let state = global.get(name)?; - if state.is_empty() { - return None; - } Some(state.last_key_value()?.1.verified.clone()) } + Self::NthBack(name, pos) => { + let state = global.get(name)?; + Some(state.iter().nth_back(*pos as usize)?.1.verified.clone()) + } + Self::Neg(name) => { let val = get_u64(name)?; let neg = (val as i64).checked_neg()?; Some(svnum!(neg)) } - Self::Sum(a, b) => { + Self::Add(a, b) => { let a = get_u64(a)?; let b = get_u64(b)?; let sum = a.checked_add(b)?; Some(svnum!(sum)) } - Self::Diff(a, b) => { + Self::Sub(a, b) => { let a = get_u64(a)?; let b = get_u64(b)?; let sub = a.checked_sub(b)?; Some(svnum!(sub)) } + Self::Mul(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sub = a.checked_mul(b)?; + Some(svnum!(sub)) + } + Self::Div(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sub = a.checked_div(b)?; + Some(svnum!(sub)) + } + Self::Rem(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sub = a.checked_rem(b)?; + Some(svnum!(sub)) + } + Self::Exp(a, b) => { + let a = get_u64(a)?; + let b = get_u64(b)?; + let sub = a.checked_pow(b.try_into().ok()?)?; + Some(svnum!(sub)) + } Self::Count(name) => { let count = global @@ -402,6 +604,16 @@ impl SubAggregator { Some(svnum!(count as u64)) } + Self::CountUnique(name) => { + let mut unique = Vec::new(); + for item in global.get(name)?.values() { + if !unique.contains(&item) { + unique.push(item); + } + } + Some(svnum!(unique.len() as u64)) + } + Self::SetV(name) => { let mut set = Vec::new(); for state in global.get(name).into_iter().flat_map(BTreeMap::values) { @@ -411,6 +623,7 @@ impl SubAggregator { } Some(StrictVal::Set(set)) } + Self::MapV2U(name) => { let mut map = Vec::new(); for atom in global.get(name)?.values() { @@ -423,28 +636,85 @@ impl SubAggregator { Some(StrictVal::Map(map)) } - Self::SumVUnwrap(name) => { + Self::MapV2ListU(name) => { + let mut map = Vec::<(StrictVal, StrictVal)>::new(); + for atom in global.get(name)?.values() { + let Some(val) = &atom.unverified else { continue }; + if let Some((_key, list)) = map.iter_mut().find(|(key, _)| &atom.verified == key) { + let StrictVal::List(list) = list else { + unreachable!(); + }; + list.push(val.clone()); + } else { + map.push((atom.verified.clone(), StrictVal::List(vec![val.clone()]))); + } + } + Some(StrictVal::Map(map)) + } + + Self::MapV2SetU(name) => { + let mut map = Vec::<(StrictVal, StrictVal)>::new(); + for atom in global.get(name)?.values() { + let Some(val) = &atom.unverified else { continue }; + if let Some((_key, list)) = map.iter_mut().find(|(key, _)| &atom.verified == key) { + let StrictVal::List(list) = list else { + unreachable!(); + }; + if !list.contains(val) { + list.push(val.clone()); + } + } else { + map.push((atom.verified.clone(), StrictVal::Set(vec![val.clone()]))); + } + } + Some(StrictVal::Map(map)) + } + + Self::SumUnwrap(name) => { let sum = global .get(name) .into_iter() .flat_map(BTreeMap::values) .try_fold(0u64, |sum, val| match &val.verified { - StrictVal::Number(StrictNum::Uint(val)) => Some(sum + *val), + StrictVal::Number(StrictNum::Uint(val)) => sum.checked_add(*val), _ => None, })?; Some(svnum!(sum)) } - Self::SumVDefault(name) => { + Self::SumOrDefault(name) => { let sum = global .get(name) .into_iter() .flat_map(BTreeMap::values) - .filter_map(|val| match &val.verified { - StrictVal::Number(StrictNum::Uint(val)) => Some(*val), + .try_fold(0u64, |sum, val| match &val.verified { + StrictVal::Number(StrictNum::Uint(val)) => sum.checked_add(*val), + _ => Some(sum), + })?; + Some(svnum!(sum)) + } + + Self::ProdUnwrap(name) => { + let sum = global + .get(name) + .into_iter() + .flat_map(BTreeMap::values) + .try_fold(0u64, |prod, val| match &val.verified { + StrictVal::Number(StrictNum::Uint(val)) => prod.checked_mul(*val), _ => None, - }) - .sum::(); + })?; + Some(svnum!(sum)) + } + + Self::ProdOrDefault(name) => { + let sum = global + .get(name) + .into_iter() + .flat_map(BTreeMap::values) + .try_fold(0u64, |prod, val| match &val.verified { + StrictVal::Number(StrictNum::Uint(val)) => prod.checked_mul(*val), + _ => Some(prod), + })?; Some(svnum!(sum)) } } @@ -500,7 +770,7 @@ mod test { fn verified_readers() { assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); assert_eq!( - call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("verified")))), + call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("verified")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5) ); assert_eq!( @@ -522,15 +792,12 @@ mod test { #[test] #[should_panic] - fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("unverified")))); } + fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } #[test] fn pair_readers() { assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); - assert_eq!( - call(Aggregator::Take(SubAggregator::SumVUnwrap(vname!("pairs")))), - svnum!(5u64 + 1 + 2 + 3 + 4 + 5) - ); + assert_eq!(call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("pairs")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); assert_eq!( call(Aggregator::Take(SubAggregator::SetV(vname!("pairs")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) diff --git a/src/stl.rs b/src/stl.rs index 36070bb..db9fb48 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz"; +pub const LIB_ID_SONIC: &str = "stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index a3b5dd8..fe5a8b2 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -104,13 +104,19 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -121,7 +127,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple sub, tag 10 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -132,11 +138,60 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId @@ -145,13 +200,63 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -162,7 +267,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -173,11 +278,16 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -187,13 +297,52 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -204,7 +353,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -215,11 +364,27 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 @@ -313,13 +478,63 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -330,7 +545,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -341,11 +556,16 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId @@ -354,13 +574,63 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -371,7 +641,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -382,11 +652,16 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -396,13 +671,63 @@ rec Semantics ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -413,7 +738,7 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -424,11 +749,16 @@ rec Semantics ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 @@ -597,13 +927,19 @@ rec Issuer ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -614,7 +950,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple sub, tag 10 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -625,26 +961,81 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 - union take, SubAggregator, wrapped, tag 2 - tuple const, tag 0 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 - ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 + union take, SubAggregator, wrapped, tag 2 + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -655,7 +1046,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple sub, tag 10 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -666,11 +1057,60 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -680,13 +1120,63 @@ rec Issuer ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -697,7 +1187,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -708,11 +1198,16 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 @@ -806,39 +1301,94 @@ rec Issuer ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId @@ -847,39 +1397,94 @@ rec Issuer ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -889,13 +1494,63 @@ rec Issuer ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -906,7 +1561,7 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -917,11 +1572,16 @@ rec Issuer ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 @@ -1073,13 +1733,63 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1090,7 +1800,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1101,11 +1811,16 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId @@ -1114,13 +1829,30 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1131,7 +1863,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple mul, tag 11 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1142,11 +1874,49 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -1156,13 +1926,63 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1173,7 +1993,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1184,11 +2004,16 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 @@ -1282,13 +2107,63 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1299,7 +2174,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1310,11 +2185,16 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 union take, SubAggregator, wrapped, tag 2 tuple const, tag 0 bytes _, len 32, aka SemId @@ -1323,39 +2203,94 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 tuple or, tag 3 union SubAggregator tuple const, tag 0 @@ -1365,13 +2300,63 @@ rec Articles ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 - ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 5 - union neg, StateSelector, wrapped, tag 6 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple sum, tag 7 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1382,7 +2367,7 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - tuple diff, tag 8 + tuple exp, tag 14 union StateSelector tuple global, tag 0 ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 @@ -1393,11 +2378,16 @@ rec Articles ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 enum Bool, false 0, true 1 ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 - ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 9 - ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 10 - ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 11 - ascii sumVUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 12 - ascii sumVDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 13 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 bytes _, len 32, aka SemId bytes _, len 0..MAX8 rec aluVm, LibSite, wrapped, tag 4 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index 5ec0a16..b0b3566 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz +Id: stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber Name: SONIC Dependencies: UltraSONIC#korea-helena-moral, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: e32eda5545557b08617cef3ecb9285245af10b5a49ba8aec6642d224a4e22026 +Check-SHA256: cd0480b310a2f90fede4549bf96b4960df38c4b81f1210838c5a0acc67cadf0c 1yfH>Nkaw%;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjvJRcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -47,9 +47,9 @@ Npo{`Wtjy19xBs4>TE~@>xkGvQ`p*}&V@tQ&H5F<8Nn=iYXnblX=I-WEJ-@Z0;0Ob-P{Wzd?2rs)M&&= tm{9}qo!Lcbf&x`)m=B!6PPbxdmBJ+ysRCuhjfe;8oWo&FgWMp#vS;NBVT;TAYsL|^P+?^W;{W$E31sqn+dpk{- -*m~XvQek&QVRT^>01828XL4m{VRUbD1O)&DZf|a7000011aog~WdH>M0o6io1-dGj>r)&Kb&Zj({^+N* ->wmaz7vR!4=I3Hk83F`!VQXao1pxuoLT&}RDwyk291eAjk*@yer?u;UxNaBV(mCemVp16c0&j8v1p@)q -LT&}RDwyk291eAjk*@yer?u;UxNaBV(mCemVp16b>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj001828XL4m{VRUbD1O)&DZf|a7000011aog~WdH>M0sGFKbHJ&K=73;xT9e8zPrRwV +e+qg8W^KOf5Mb-Ek^%&DVQXao1pxv3&Yg3>sf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>pp0&j8v1p@*5 +&Yg3>sf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>po>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj09;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxKtm{9}qo!Lcbf?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{!D;Edq6x AD58@Z(--WKj!iy+_Y-?7}Wakl_{2;HmLvr000000093000000000GVcWz~5015)>o|5M~K$m}!eub_$ g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll2&wGZS!@Jni^|L1 T^LqX{Nukv3REP~S+MEH0Hg4z0000000000{{R30000003t?wxa%E>>bZ>HV015)>o|5M~K$m}!eub_$ -g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll+X;1Xivg*fc=Ld9 -J3;!#Bj_%JoYj8u6mfNrDC=S&0000000000{{R300000033g?2X=Z6`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LloIHA_DYd+AIPR<5 +p}kdMV)qQPoM*d@tAE!RZeSB&0000000000{{R300000033g?2X=Z6?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy0000000000{{R30 0000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30000003_);db30||3wZDDS7X=8H%b@pLdDZ^pXz~{?jMza$BXS%?(BJzh!$TODED_{Yb +Z3O`U2LJ#-1ONy@a&&29Y-Mu>0||3wZDDS7X=8H%fqB*v!NOS0PMdH1-JbXr!Ew7|1#S)*b%;*Z+d7+_ 19NF-00aU61a5C`WdHyG0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAn+b8~fN 0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1CTP<{Q=-M!C>_+*aDQ63M1hQS`ob&12P;^gK+^+ j0!<=bZKL3Wphbn1_KIXZ*FvQVPkYjWC8@_%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^!JyEJ-@Z @@ -77,8 +77,8 @@ t0eX2w~A!Q+0eaZ{MVycPK^n0bz*F3b7*B`0)mO_O%DrjRIhYP1?a)oog)LLTw}}6rDvG=`c^zKYGH;V 5BN2*X|Rq-2V!+;Y-D9}0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atv}|cSCP(c4cyOZ*l>r <8{|l3;J&0{bM7-QB8Vh?>y0(yz|LU0j*m?b;q e$6*%pTrv$VUq<0Npo{`WpV}s1!HeyWq1Mv;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjwzvD$0j -{7*pno>?w+ZshCOX2*X3RvTb8r%p#dIRMrPb7gH|Zggp5a{+bsVOc4|VbZ|o%VS2f68>kpz_lXshfK&b -me4C;0hj}GX=eZg0ssVVZ*FA(00035b8l^B00jX7A;%YO&?-P3O?w+ZshCOX2*X3RvTb8r%p#dIRMrPb7gH|Zggp5a{+;Q))K+OSj|qGZ~Wb!_!Yr%yJH1z4jFZb +PS)Exo1Fu5X=eZg0ssVVZ*FA(00035b8l^B00jX7A;%YO&?-P3ONn`@)o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CtZ1fvw5 @@ -92,9 +92,9 @@ f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFEM0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ )ov?1P-_IE6rQG)02XJT?*g=|B=zREie$*y(7k2+*P~cYjsFED25bvY=hwClP42NtW0Vv0s0{3Ige#lIJ@> -mw%Cdg|0Y-zbj2Rx3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-Bp@1y&N ->n+U;hio7LD94)PfI8^#4D20b-iwdEmo@1{Vxr2^xkmA_I?bhY|_Ed27U32SVU;24i(|bZ>0{3Ige#lIJ@> +mw%Cdg|0Y-zbj2Rx3qrTq9O+2!s^Lf^?|9I@Xg>Oi(W05|TJ%PM*ricn_PmXk-BaVw&c8 +;KPIl7Ytzu8ip|<1CMZr5(&V0Ys6UxLf~@%0000000030{{R3000009V{c?-cuZ+xa{vhfw^=E)kF7_+ BGG1^(r$N1t7sZ7Knlpb7_LPzv?=G$Lt&lV-%#21Ch@9YYCa>3uf#90000000030{{R3000005ba`-Pa{}p}lIJ@>mw%Cdg|0Y-zbj2Rx3qrT @@ -109,27 +109,40 @@ d2nT9MrmbiWJPXcZ)9b100jX603iPbVQh6)Z2$!U0=HQyw2!Sv!6MOSp3-i2NULZXE?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{<^; >rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=}CkBGG%U@MZ$v=XJ?|;InIPy66cFfOYp#JM2r7_Dul_ VP|J@WoKb@Wn=&a0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v;Uq>` <)y^XImOPdju4Lm1Y>V-c>o0g0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0 m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{^pEZg+BFZ~z4X0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1 Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj|2r~X>xOP00jX8>7J73J3yCzk$#1)IEB9}O*pr- -e%zuW2Pj0>g~&^g7mw%Cd -g|0Y-zbj2Rx3qrTq9O+0qXeK0Y#)KxnIwmOLf+#M19Nq400ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ -*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;}Qg9X=Y{s1p)z)?^v0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*jAO&M@b#8P31pxx- -o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4L` -1aoC{RsaP70_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h -#Lzj#&aRFSk0S?iz50p(P||0 -m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1z^zb!}EvZg+BFZ~z4X0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$ -)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1-2#b!}EeWoBV@Y;*tx0RrislIJ@>mw%Cd -g|0Y-zbj2Rx3qrTq9O+@6C -ZUzDbZ*Xa30tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1DOQ<9xBs4>TE~@>xkGvQ`p*}&V@tQ -&H5F<8Nn=iYYAj!b98cVd1Yh(3IYV=%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^%hs$8un=2x*n> -&x`)m=B!6PPbxdmBJ+ysRCuhjfe-=&;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjx%{8V+q+RkNh -gWbkhKot7hZms+b>g~&^g7?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy1_W$jb94X& +0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndTz*X~v +;Uq>`<)y^XImOPdju4Lk00IyLZe?cx1pxt(?^v0qXeK0Y#)KxnIwmOLf+#M17T!j +00ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWO +hkZic;}QdNbz%So0s)clSh2=pqY5<1(br?Xy7E4w1fUIUAA#7JB!_)M-s1t0?^v0 +qXeK0Y#)KxnIwmOLf+#O18sF|00ja8k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j0g>-mvBqMf +3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;}ipAX?6ew0s)clSh2=pqY5<1(br?Xy7E4w1fUIUAA#7JB!_)M +-s1t0?^v0qXeK0Y#)KxnIwmOLf+#Q19D|;00ja8k?&Zs#$uxiG|AD|W4^lbKBEMn +4QwBQ*qJ1UeL~*j0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;}!#DcyIs(0s)clSh2=pqY5<1 +(br?Xy7E4w1fUIUAA#7JB!_)M-s1t0?^v0qXeK0Y#)KxnIwmOLf+#b1!He@Zgcmw%Cdg|0Y-zbj2Rx3qrTq9O+`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4L`1aoC{RsaP70_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>? +iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0S?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0c6hVQ^M5Olfm;RR9G60_mQT=Q}`` +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk0l9hVQ^M5 +Q)P5j00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ +&^g7`ZdvN +B=ndTz*X~v;Uq>`<)y^XImOPdju4MA40CmDPjW?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1`5ya&Kf+Zg+BFZ~z4X0_mQT=Q}`` +f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk24K$a&Kf$ +aztfjVRdYD00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7V=@0t9bxX=DNf;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjw@ +1pOW=(>>~JNCWGL*g;d++M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R1mw(?1L1}E9EHd_Bz+J|cdPF# z+#8yh^qptZob=tjtLv{zR5oi5o=l{7o?}zBY!rjTNd3=(k z9e&qtTg{%kxq&y0nV_o44ZK#H9RvfI6&RCdJ*#|hxP?ueCy`UC%}|NCzo1=+^FU?x zkw|u@2gQ>&h2=nXE7E$|}TMT$%)C2{Y%G=73ou%qf{=V3sIzQED!j zCB~duQ2=C3;8o;K&M(a?3C+taEKQv}QPO4de(7mEDqOjV1z|=$nZ+fcAVF?bPOw05 zDv&QIv!adKe%N1?0HggA=Y~RS z$6v>lU+6W@xmx#8q_DJK<8_ka14OfLjTft9oVY$som#< z@w5xt35+u~H}Ix06I3<1f!AuYgJ1x&g24O5zuRByp5 diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index e71be9c..dcf958d 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:jz79GIWx-fsM_d91-~0Gu9QU-hNYoCB1-OJzgvyt-PVenb5o#station-america-quiz + Id: stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -173,21 +173,32 @@ data StateConvertor : unit () data StateSelector : global (StrictTypes.VariantName, Std.Bool) | aggregated StrictTypes.VariantName -@mnemonic(panel-permit-distant) +@mnemonic(archer-metal-bison) data SubAggregator : const (StrictTypes.SemId, [Byte ^ ..0xff]) | theOnly StrictTypes.VariantName | copy StrictTypes.VariantName | unwrap StrictTypes.VariantName | first StrictTypes.VariantName + | nth (StrictTypes.VariantName, U16) | last StrictTypes.VariantName + | nthBack (StrictTypes.VariantName, U16) | neg#16 StateSelector - | sum (StateSelector, StateSelector) - | diff (StateSelector, StateSelector) + | add (StateSelector, StateSelector) + | sub (StateSelector, StateSelector) + | mul (StateSelector, StateSelector) + | div (StateSelector, StateSelector) + | rem (StateSelector, StateSelector) + | exp (StateSelector, StateSelector) | count#32 StrictTypes.VariantName - | setV#34 StrictTypes.VariantName + | countUnique StrictTypes.VariantName + | setV StrictTypes.VariantName | mapV2u StrictTypes.VariantName - | sumVUnwrap#48 StrictTypes.VariantName - | sumVDefault StrictTypes.VariantName + | mapV2ListU StrictTypes.VariantName + | mapV2SetU StrictTypes.VariantName + | sumUnwrap#48 StrictTypes.VariantName + | sumOrDefault StrictTypes.VariantName + | prodUnwrap StrictTypes.VariantName + | prodOrDefault StrictTypes.VariantName @mnemonic(weekend-street-channel) data Transition : opid UltraSONIC.Opid, destroyed {UltraSONIC.CellAddr -> UltraSONIC.StateCell} From 3e9636eb9472bd3a79ca7207352afdc79eb2b0a5 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 12:37:42 +0200 Subject: [PATCH 36/40] test: new api aggregators --- api/src/state/aggregators.rs | 267 +++++++++++++++- src/stl.rs | 2 +- stl/SONIC.vesper | 588 ++++++++++++++++++++++++++++++++++- stl/SONIC@0.12.0.sta | 194 ++++++------ stl/SONIC@0.12.0.stl | Bin 8509 -> 8456 bytes stl/SONIC@0.12.0.sty | 6 +- 6 files changed, 931 insertions(+), 126 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index ffb2788..c961ea7 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -78,9 +78,14 @@ pub enum Aggregator { #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] Take(SubAggregator), - /// If the underlying aggregated state fails, returns the provided constant value. + /// If the underlying aggregated state fails, returns the other state. + /// + /// If the other state fails, the aggregated state is not produced. #[strict_type(tag = 3)] - Or(#[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] SubAggregator, SemId, TinyBlob), + Or( + #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] SubAggregator, + #[cfg_attr(feature = "serde", serde(with = "serde_yaml::with::singleton_map"))] SubAggregator, + ), /// Execute a custom function on the state. #[strict_type(tag = 0xFF)] @@ -96,7 +101,12 @@ impl Aggregator { /// and which needs to be computed before running this aggregator. pub fn depends_on(&self) -> impl Iterator { match self { - Self::Take(sub) | Self::Some(sub) | Self::Or(sub, _, _) => sub.depends_on(), + Self::Some(sub) | Self::Take(sub) => sub.depends_on(), + Self::Or(some, other) => { + let mut deps = some.depends_on(); + deps.append(&mut other.depends_on()); + deps + } Self::None | Self::AluVM(_) => vec![], } .into_iter() @@ -124,9 +134,9 @@ impl Aggregator { None => StrictVal::none(), }), - Self::Or(sub, sem_id, val) => sub + Self::Or(some, other) => some .aggregate(global, aggregated, types) - .or_else(|| deserialize(*sem_id, val, types)), + .or_else(|| other.aggregate(global, aggregated, types)), Self::AluVM(entry) => { let libs = libs @@ -150,7 +160,7 @@ impl Aggregator { #[strict_type(lib = LIB_NAME_SONIC, tags = custom, dumb = Self::Neg(strict_dumb!()))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(rename_all = "camelCase"))] pub enum SubAggregator { - /// The aggregated state is generated with a predefined constant value. + /// The aggregated state is generated with a predefined constant strict-encoded value. /// /// To produce a state with a unit value, use `Self::Const(SemId::unit(), none!())`. #[strict_type(tag = 0)] @@ -657,7 +667,7 @@ impl SubAggregator { for atom in global.get(name)?.values() { let Some(val) = &atom.unverified else { continue }; if let Some((_key, list)) = map.iter_mut().find(|(key, _)| &atom.verified == key) { - let StrictVal::List(list) = list else { + let StrictVal::Set(list) = list else { unreachable!(); }; if !list.contains(val) { @@ -699,7 +709,7 @@ impl SubAggregator { .get(name) .into_iter() .flat_map(BTreeMap::values) - .try_fold(0u64, |prod, val| match &val.verified { + .try_fold(1u64, |prod, val| match &val.verified { StrictVal::Number(StrictNum::Uint(val)) => prod.checked_mul(*val), _ => None, })?; @@ -711,7 +721,7 @@ impl SubAggregator { .get(name) .into_iter() .flat_map(BTreeMap::values) - .try_fold(0u64, |prod, val| match &val.verified { + .try_fold(1u64, |prod, val| match &val.verified { StrictVal::Number(StrictNum::Uint(val)) => prod.checked_mul(*val), _ => Some(prod), })?; @@ -722,13 +732,20 @@ impl SubAggregator { } fn deserialize(sem_id: SemId, val: &TinyBlob, types: &TypeSystem) -> Option { - let ty = types.strict_deserialize_type(sem_id, val.as_slice()).ok()?; + let ty = types + .strict_deserialize_type(sem_id, val.as_slice()) + .unwrap(); Some(ty.unbox()) } #[cfg(test)] mod test { #![cfg_attr(coverage_nightly, coverage(off))] + + use aluvm::aluasm; + use strict_types::stl::std_stl; + use strict_types::SystemBuilder; + use super::*; fn addr(no: u16) -> CellAddr { CellAddr::new(strict_dumb!(), no) } @@ -760,24 +777,206 @@ mod test { }, } } + fn types() -> TypeSystem { + let sys = SystemBuilder::new() + .import(std_stl()) + .unwrap() + .finalize() + .unwrap(); + let types = std_stl() + .types + .into_iter() + .map(|(tn, ty)| ty.sem_id_named(&tn)); + sys.as_types().extract(types).unwrap() + } + fn success_lib() -> Lib { + let code = aluasm! { ret; }; + Lib::assemble(&code).unwrap() + } fn call(aggregator: Aggregator) -> StrictVal { aggregator - .aggregate(&state(), &none!(), None, &none!()) + .aggregate(&state(), &none!(), &[success_lib()], &types()) + .unwrap() + } + fn call2(aggregator: Aggregator) -> StrictVal { + let aggregated = bmap! { + vname!("zero") => svnum!(0u64), + vname!("two") => svnum!(2u64), + vname!("three") => svnum!(3u64), + vname!("str") => svstr!("Hi"), + }; + aggregator + .aggregate(&state(), &aggregated, &[success_lib()], &types()) .unwrap() } #[test] - fn verified_readers() { - assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); + fn none() { + assert_eq!(call(Aggregator::None), svnone!()); + } + + #[test] + fn some() { + assert_eq!(call(Aggregator::Some(SubAggregator::Count(vname!("verified")))), svsome!(6u64)); + } + + #[test] + fn or() { + assert_eq!( + call(Aggregator::Or( + SubAggregator::Unwrap(vname!("nonExisting")), + SubAggregator::Count(vname!("verified")) + )), + svnum!(6u64) + ); + } + + #[test] + #[should_panic] + fn non_existing() { call(Aggregator::Take(SubAggregator::Unwrap(vname!("nonExisting")))); } + + #[test] + fn sum() { + #![allow(clippy::identity_op)] assert_eq!( call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("verified")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5) ); + assert_eq!( + call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("verified")))), + svnum!(5u64 + 1 + 2 + 3 + 4 + 5) + ); + + assert_eq!(call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified")))), svnum!(0u64)); + } + + #[test] + fn prod() { + #![allow(clippy::identity_op)] + assert_eq!( + call(Aggregator::Take(SubAggregator::ProdUnwrap(vname!("verified")))), + svnum!(5u64 * 1 * 2 * 3 * 4 * 5) + ); + assert_eq!( + call(Aggregator::Take(SubAggregator::ProdOrDefault(vname!("verified")))), + svnum!(5u64 * 1 * 2 * 3 * 4 * 5) + ); + + assert_eq!(call(Aggregator::Take(SubAggregator::ProdOrDefault(vname!("unverified")))), svnum!(1u64)); + } + + #[test] + fn add() { + let agg = Aggregator::Take(SubAggregator::Add( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); + assert_eq!(call2(agg), svnum!(5u64)); + } + + #[test] + fn meg() { + let agg = Aggregator::Take(SubAggregator::Neg(StateSelector::Aggregated(vname!("two")))); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two")]); + assert_eq!(call2(agg), svnum!(-2i64)); + } + + #[test] + fn sub() { + let agg = Aggregator::Take(SubAggregator::Sub( + StateSelector::Aggregated(vname!("three")), + StateSelector::Aggregated(vname!("two")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("three"), &vname!("two")]); + assert_eq!(call2(agg), svnum!(1u64)); + } + + #[test] + #[should_panic] + fn sub_overflow() { + let agg = Aggregator::Take(SubAggregator::Sub( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + call2(agg); + } + + #[test] + fn mul() { + let agg = Aggregator::Take(SubAggregator::Mul( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); + assert_eq!(call2(agg), svnum!(6u64)); + } + + #[test] + fn div() { + let agg = Aggregator::Take(SubAggregator::Div( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); + assert_eq!(call2(agg), svnum!(0u64)); + } + + #[test] + #[should_panic] + fn div_zero() { + let agg = Aggregator::Take(SubAggregator::Div( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("zero")), + )); + call2(agg); + } + + #[test] + fn rem() { + let agg = Aggregator::Take(SubAggregator::Rem( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); + assert_eq!(call2(agg), svnum!(2u64)); + } + + #[test] + fn exp() { + let agg = Aggregator::Take(SubAggregator::Exp( + StateSelector::Aggregated(vname!("two")), + StateSelector::Aggregated(vname!("three")), + )); + assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); + assert_eq!(call2(agg), svnum!(8u64)); + } + + #[test] + #[should_panic] + fn math_sum_fail() { call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } + + #[test] + #[should_panic] + fn math_prod_fail() { call(Aggregator::Take(SubAggregator::ProdUnwrap(vname!("unverified")))); } + + #[test] + fn verified_readers() { + assert_eq!(call(Aggregator::Take(SubAggregator::First(vname!("verified")))), svnum!(5u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 0))), svnum!(5u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 1))), svnum!(1u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::Last(vname!("verified")))), svnum!(5u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 0))), svnum!(5u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 1))), svnum!(4u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); + assert_eq!(call(Aggregator::Take(SubAggregator::CountUnique(vname!("verified")))), svnum!(5u64)); assert_eq!( call(Aggregator::Take(SubAggregator::SetV(vname!("verified")))), svset!([5u64, 1u64, 2u64, 3u64, 4u64]) ); assert_eq!(call(Aggregator::Take(SubAggregator::MapV2U(vname!("verified")))), StrictVal::Map(none!())); + assert_eq!(call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("verified")))), StrictVal::Map(none!())); + assert_eq!(call(Aggregator::Take(SubAggregator::MapV2SetU(vname!("verified")))), StrictVal::Map(none!())); } #[test] @@ -788,12 +987,39 @@ mod test { call(Aggregator::Take(SubAggregator::MapV2U(vname!("unverified")))), StrictVal::Map(vec![(StrictVal::Unit, svstr!("state 1"))]) ); + assert_eq!( + call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("unverified")))), + StrictVal::Map(vec![(StrictVal::Unit, svlist![[ + svstr!("state 1"), + svstr!("state 2"), + svstr!("state 3"), + svstr!("state 4"), + svstr!("state 5"), + svstr!("state 6"), + ]])]) + ); + assert_eq!( + call(Aggregator::Take(SubAggregator::MapV2SetU(vname!("unverified")))), + StrictVal::Map(vec![(StrictVal::Unit, svset![[ + svstr!("state 1"), + svstr!("state 2"), + svstr!("state 3"), + svstr!("state 4"), + svstr!("state 5"), + svstr!("state 6"), + ]])]) + ); } #[test] #[should_panic] fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } + #[test] + fn unverified_sum_default() { + assert_eq!(call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified")))), svnum!(0u64)); + } + #[test] fn pair_readers() { assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); @@ -812,5 +1038,20 @@ mod test { (svnum!(4u64), svstr!("state 5")) ]) ); + assert_eq!( + call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("pairs")))), + StrictVal::Map(vec![ + (svnum!(5u64), svlist![[svstr!("state 1"), svstr!("state 6")]]), + (svnum!(1u64), svlist![[svstr!("state 2")]]), + (svnum!(2u64), svlist![[svstr!("state 3")]]), + (svnum!(3u64), svlist![[svstr!("state 4")]]), + (svnum!(4u64), svlist![[svstr!("state 5")]]) + ]) + ); } + + #[test] + #[should_panic] + // For now, the fail here indicates forward compatibility with when we allow AluVM + fn aluvm() { call(Aggregator::AluVM(LibSite::new(success_lib().lib_id(), 0))); } } diff --git a/src/stl.rs b/src/stl.rs index db9fb48..ffd3055 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -34,7 +34,7 @@ pub use ultrasonic::stl::usonic_stl; use crate::Transition; /// Strict types id for the library providing data types for RGB consensus. -pub const LIB_ID_SONIC: &str = "stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber"; +pub const LIB_ID_SONIC: &str = "stl:FOnI~0yx-bcvd_Wq-~xjW37p-uqzQ3Nq-GGH8AtN-dO64ac8#river-atomic-dallas"; #[allow(clippy::result_large_err)] fn _sonic_stl() -> Result { diff --git a/stl/SONIC.vesper b/stl/SONIC.vesper index fe5a8b2..11659af 100644 --- a/stl/SONIC.vesper +++ b/stl/SONIC.vesper @@ -385,8 +385,102 @@ rec Semantics ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 @@ -759,8 +853,102 @@ rec Semantics ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 @@ -1208,8 +1396,102 @@ rec Issuer ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 @@ -1582,8 +1864,102 @@ rec Issuer ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 @@ -2014,8 +2390,102 @@ rec Articles ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 @@ -2388,8 +2858,102 @@ rec Articles ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 - bytes _, len 32, aka SemId - bytes _, len 0..MAX8 + union SubAggregator + tuple const, tag 0 + bytes _, len 32, aka SemId + bytes _, len 0..MAX8 + ascii theOnly, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii copy, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 2 + ascii unwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 3 + ascii first, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 4 + tuple nth, tag 5 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + ascii last, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 6 + tuple nthBack, tag 7 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + is _, U16 + union neg, StateSelector, wrapped, tag 8 + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple add, tag 9 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple sub, tag 10 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple mul, tag 11 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple div, tag 12 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple rem, tag 13 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + tuple exp, tag 14 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + union StateSelector + tuple global, tag 0 + ascii _, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100 + enum Bool, false 0, true 1 + ascii aggregated, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 1 + ascii count, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 15 + ascii countUnique, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 16 + ascii setV, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 17 + ascii mapV2u, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 18 + ascii mapV2ListU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 19 + ascii mapV2SetU, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 20 + ascii sumUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 21 + ascii sumOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 22 + ascii prodUnwrap, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 23 + ascii prodOrDefault, wrapped, aka VariantName, first AlphaSmallLodash, rest AlphaNumLodash, len 1..100, tag 24 rec aluVm, LibSite, wrapped, tag 4 bytes libId, len 32, aka LibId is offset, U16 diff --git a/stl/SONIC@0.12.0.sta b/stl/SONIC@0.12.0.sta index b0b3566..aacc04c 100644 --- a/stl/SONIC@0.12.0.sta +++ b/stl/SONIC@0.12.0.sta @@ -1,5 +1,5 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber +Id: stl:FOnI~0yx-bcvd_Wq-~xjW37p-uqzQ3Nq-GGH8AtN-dO64ac8#river-atomic-dallas Name: SONIC Dependencies: UltraSONIC#korea-helena-moral, @@ -8,7 +8,7 @@ Dependencies: AluVM#reward-accent-swim, CommitVerify#biology-news-adam, StrictTypes#henry-heart-survive -Check-SHA256: cd0480b310a2f90fede4549bf96b4960df38c4b81f1210838c5a0acc67cadf0c +Check-SHA256: b34662b632c92fa486f67da170dfe364d4566dba66eb5e6517acda1ff2328203 1yfH>Nkaw%;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjvJRcv%}VN*{|NkcYmGKAh0u07FCu`OJL wc+Ab)ZtUdGtGq-ROf^i(%1_|X>MtBWkzXbY-ECo>rD>}a8$2!O9kk`*PSB+rd(so&!uOW`TABoF=_)- @@ -48,101 +48,101 @@ tm{9}qo!Lcbf&x`)m=B!6PPbxdmBJ+ysRCuhjfe;8oWo&FgWMp#vS;NBVT;TAYsL|^P+?^W;{W$E31sqn+dpk{- *m~XvQek&QVRT^>01828XL4m{VRUbD1O)&DZf|a7000011aog~WdH>M0sGFKbHJ&K=73;xT9e8zPrRwV -e+qg8W^KOf5Mb-Ek^%&DVQXao1pxv3&Yg3>sf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>pp0&j8v1p@*5 -&Yg3>sf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>po>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj09;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxKtm{9}qo!Lcbf?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{!D;Edq6x -AD58@Z(--WKj!iy+_Y-?7}Wakl_{2;HmLvr000000093000000000GVcWz~5015)>o|5M~K$m}!eub_$ -g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Ll2&wGZS!@Jni^|L1 -T^LqX{Nukv3REP~S+MEH0Hg4z0000000000{{R30000003t?wxa%E>>bZ>HV015)>o|5M~K$m}!eub_$ -g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LloIHA_DYd+AIPR<5 -p}kdMV)qQPoM*d@tAE!RZeSB&0000000000{{R300000033g?2X=Z6?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj{pDy0000000000{{R30 -0000024!+`Z*p@03IG5g00;m90000000000{{R30000000000000000{{R30000003_);db30||3wZDDS7X=8H%fqB*v!NOS0PMdH1-JbXr!Ew7|1#S)*b%;*Z+d7+_ -19NF-00aU61a5C`WdHyG0R(ezZDjxj0RbV$7j4igKpjn9r^|;p@vV@r5S*`M7yxdMqH9J{cMAn+b8~fN -0tDpDmIL91_#B1EIwa`nbitx=l+v|DM?bg#xxRGf1CTP<{Q=-M!C>_+*aDQ63M1hQS`ob&12P;^gK+^+ -j0!<=bZKL3Wphbn1_KIXZ*FvQVPkYjWC8@_%$5V;h4>tW$T}qG>2$%Oag@@vMMpol0J*+&<^!JyEJ-@Z -0;0Ob-P{Wzd?2rs)M&&=&l*}G;Jw22Ix+`#WpZc;Wd;HUZDn+5Z)5`Lo|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6 -D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4LpZ+C8GWB>#L00eGtZe;)f009JZZ*64&1pxx- -o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lt -M{I9mVQfKgX$A%bb7gHwWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+ioJpYH;+ -t0eX2w~A!Q+0eaZ{MVycPK^n0bz*F3b7*B`0)mO_O%DrjRIhYP1?a)oog)LLTw}}6rDvG=`c^zKYGH;V -(R;4&W&+>mb;*F>vukd;=m`ygb@x#_>`RmOO$lRfZgypIbZ>G2*Ke$Me~|@x8gqN5ZeLjVkt+~tG2%w& -5BN2*X|Rq-2V!+;Y-D9}0YPVyah@P3qvF}zw2RZm<~&9E@=d94{TY2?K@}`*atv}|cSCP(c4cyOZ*l>r -<8{|l3;J&0{bM7-QB8Vh?>y0(yz|LU0j*m?b;q -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 -&^g7`ZdvN -B=ndTz*X~v;Uq>`<)y^XImOPdju4MA40CmDPjW?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk1`5ya&Kf+Zg+BFZ~z4X0_mQT=Q}`` -f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSk24K$a&Kf$ -aztfjVRdYD00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7V=@0t9bxX=DNf;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjw@ -1pOW=(>>~JNCWGL*g;d++M&*cL)Xpv6~Gz6EP87RWMy-7a&LKMWB>{R1mw(?1L1}E9EHd_Bsf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>pp0&j8v1p)#4 +&Yg3>sf*@-U~^iN$}dm6slI;-dIV-|zUvTR>#>pn`_7$nz^RMofM9c4lgckoys5r_3VH-)ZNBReVC%7x +{{>-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na +_ZHTZ79ax%L5`yXL2zjX2nStW$T}qG>2$%Oag@@vMMpol0J*+&<^#2?>p#$= +rdum?r*`71Hb|_zg6yfI1@tx1ME;WCJU|FzZ*FF9a&2<}2><{B0000000000{{R30000003uI+xVRdYD +Lt$)e00aU61a5C`WdHyG0R(ezZDjxj0Ri0Lw|vJna{%YhJnSPknsk9=N+~z1q~pntg8OOz-6aNRY;R&= +Yyb)Z>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7< +u8t6o0XBgx0(F)jmyrc;VduO*=JF%lv}*bo)cWw1DVCi!sQ>@~000000RI300000000nP%Ze?Tu3Ige# +lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73 +J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g79000000003000000000000000000030000000000C +L2zkvLuh4VYjbsN1pxpD002M)00=>HbZKL3Wpf4t33Fv_VQzG3V{-v6x#Pn^I>)lX=EHRe6Paghwt^*k +k9ki&&;$Y0w$||jb7^M)1OfmAZf|a7000011aog~WdH>M0U^g1ZO|$}9Zg=R%ZE7et&pz}oUddU0B(<> +YerIc3k7L&b9H3`1mw(?1L1}E9EHd_BlVD&E80+f~tBjF2L +5xp4$G8|HaaRE?_3PEyoX=7|g3r=7)ofip1VQg$ubYXO51_B0cWprq7WCH1)lIJ@>mw%Cdg|0Y-zbj2R +x3qrTq9O+mw%Cdg|0Y-zbj2Rx3qrTq9O+WBLk*fW6RH_ +XPEi=Ry;9kVTK~nd#>)EJkp+4hb9<(4 +Us(8&D-dci;zs8W_%*U=u#QOwVs&Y3WMy&zL1&V2o**cr;@RA^i_^yDJVpBQO{s7F8GT|w6)bIX402(2 +LvL<&WpZ?Hasj8~b=Ol1`flL;V4R=asm5cRyk`k?kWEQ +dWrTza1nu+B|GJQ%{OSD#2Xf2lLZDzb8~fNas~qhV{c?-cmf3E%$5V;h4>tW$T}qG>2$%Oag@@vMMpol +0J*+&<^zeb+H2qZPeA#eSuS;M9;f44dg~&Q2=;?I9qH&bcwM9oixB$7nbmjxK +tm{9}qo!LcbfV=-00IbOXk}w-b9HS24rs`h%>r>-9X0IN +!p14WBr9LqgTBPo;{gj!U^Sf=2v2uzWn@8cX$A%bb7gHwWCH1)lIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+< +MAdF9JWy){qZFQ|l>ioJpYH;+t0eX2w~A!Q+0eaZ{MVycPK^s;a%psEZDn+6V{-wsgItsAv)By!kd;ZK +Pd!7nxtnV;v+f7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!Stw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2 +Tv2Na_ZHTZ79ax%L5`ygQek&PZ*F#Fa&&KU1OfmIb98cPV{}AiV{c?-00jX8>7J73J3yCzk$#1)IEB9} +O*pr-e%zuW2Pj0-ebyjTv1pxxLSt+!S +tw+Hk(Po~~Zg)tlXc{g+3dp<|u0=7lDd*4D^W8yOb6|fgT149yr~sO2Tv2Na_ZHTZ79ax%L5`ydQ)O*o +Zggp5a|Q+nc4cyNX>V=-00IYOWoBV@Y;*zm&z?vG7(!mC=1~h}ANI>At43DT^Vis5AIXv$ng?zMV|81Ch@9YYCa> +3uf#90000000030{{R3000007VQ^_oX<~B#2?DoSDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g&i7 +o!sA0+CHx-vZbVj7D6D}#pW3Uk@391OosFW_507X<}?;000013vO?2Ms;pyX<}?;00030 +1z~J;R&4+U0Rp#KDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ&V1F!HMB5jr0GerBQELnL +7S@v%AOi?Nj-w1ybYXO5LUn0uWMy&$1ONneZfSG?000mSba`-PWJPXcZ)9b100jX603Z<&ba`-PWJYOa +Y-B}lV{c?-asUMZ001EW1z~J;R&4+U0Rp#KDYTERN5LY|W}eb+cSx&f8ZJNz$h;V?MKQD~=g-#j-9cJ& +V1F!HMB5jr0GerBQELnL7S@v%AOi?Nj-w7!bYXO5LvL<&WpZ?Has&hb1a)p{bN~PV5DavAaAjmgZewp` +WpV%o0RR9X5fOBGaAjmhX=Q9=MQ&qnWMy&y1pxp6ApZqnY;{&`00jX8w^=E)kF7_+BGG1^(r$N1t7sZ7 +Knlpb7_LPzv?=G$*7My#T6183ELud{7pMT5X7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~ +&^g7mb;*F>vukd;=m`yg +b@x#_>`RmOO#upFXJ>L{XJK?@WB>&L0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p +(P||0m=?fQ^Mv6fMp@;h#Lzj#&aRFSj}23GVnJtTa%E>>bZ>G582|-iZ*FsR00ja9>7J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr- +e%zuW2Pj0>g~&^g7`ZdvNB=ndTz*X~v;Uq>`<)y^XImOPdju4Lp18#I^00ja9 +>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7?iz50p(P||0m=?fQ^Mv6f +Mp@;h#Lzj#&aRFSj|T^CbZA0hV`~5f0s`rtlIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lb +KBEMn4QwBQ*qJ1UeL~*j5(9H}VgLmK0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;{lQHSh2=p +qY5<1(br?Xy7E4w1fUIUAA#7JB!_)M-s2MkZFOt_1p)z)?^v0qXeK0Y#)KxnIwmO +Lf+#6k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j6a!>wb^rwe0g>-mvBqMf3N*>l*JHlA@;;*k +pbcyvf!LWOhkZic;{lQHSh2=pqY5<1(br?Xy7E4w1fUIUAA#7JB!_)M-s2Sma%F7*1p)z)?^v0qXeK0Y#)KxnIwmOLf+#6k?&Zs#$uxiG|AD|W4^lbKBEMn4QwBQ*qJ1UeL~*j76WB?Z~z4Y +0g>-mvBqMf3N*>l*JHlA@;;*kpbcyvf!LWOhkZic;{lQHSh2=pqY5<1(br?Xy7E4w1fUIUAA#7JB!_)M +-s2zzV{dhCbN~eb0_mQT=Q}``f02HLt~iCiD@{1Jw0_*8A_pi$)ov?1Pzi>?iz50p(P||0m=?fQ^Mv6f +Mp@;h#Lzj#&aRFSk0A?VZ*^{TRc>imw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1)IEB9}O*pr-e%zuW +2Pj0>g~&^g77J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0>g~&^g7)W{ +00jX8>7J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7< +u8t6oB?)a|a8@!?Wpq^l1pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvNB=ndT +z*X~v;Uq>`<)y^XImOPdju4M933GLARc?23VQ>Hi0RrislIJ@>mw%Cdg|0Y-zbj2Rx3qrTq9O+7J73J3yCzk$#1) +IEB9}O*pr-e%zuW2Pj0>g~&^g77J73J3yCzk$#1)IEB9}O*pr-e%zuW2Pj0>g~&^g7< +u8t6oGYxQZZ)8t$L}g}Sb!>D11pxx-o|5M~K$m}!eub_$g}*CJIJdNZ+@c}}C`8q6D?CsMhQW&>`ZdvN +B=ndTz*X~v;Uq>`<)y^XImOPdju4LuRB~Z%b7^#GZ*B$x1aEL@WC8@_%$5V;h4>tW$T}qG>2$%Oag@@v +MMpol0J*+&<^!1o{T?dQJ?d;o1M7&`K~vb;q0WUv*UkDBz!||TdTR+}Wpi|LZ+T^8015&G;f44d +g~&Q2=;?I9qH&bcwM9oixB$7nbmjy5rN?q$uLxQs2Fvw;u-1mw(?1L1}E +9EHd_Bpn} z)fNBOtjbY0n>>Z*jDp_I$A_J)j&C~n>~JZE@XYj_ZB43G{gwXq7g!jtY`gYxa|3T0 zGeK388+ffYI|v3aEBrV=&x1w6DQ?BHK<-reZ>Kd@yMv;@#>y z3-^X5CVl7GG$(y`@9O&N5_t*236tY_&L}iiUK2WaDB`T&?EF7>=lu{pShzcxHIGlS zw8QV(ZL8UHCtnn>+T6;k!%R@+=8FPd%nFQ2vz}ExINZV}&XdR~)n=%~++WZx#Cf1H X`$#0a(}Uv4)gs;m6>WYdqQnCLCdy(m diff --git a/stl/SONIC@0.12.0.sty b/stl/SONIC@0.12.0.sty index dcf958d..21786ae 100644 --- a/stl/SONIC@0.12.0.sty +++ b/stl/SONIC@0.12.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:ZjN~OAtq-GmQ7Pzx-eA7muEd-P_~nowb-HM0GJ8W-WQ7vY8o#isabel-husband-rubber + Id: stl:FOnI~0yx-bcvd_Wq-~xjW37p-uqzQ3Nq-GGH8AtN-dO64ac8#river-atomic-dallas Name: SONIC Version: 0.12.0 Description: Standard library for formally-verifiable distributed contracts @@ -74,11 +74,11 @@ import StrictTypes#henry-heart-survive use TypeSystem#adrian-boris-sponsor -@mnemonic(royal-maestro-benefit) +@mnemonic(arcade-graph-bruno) data Aggregator : none () | some SubAggregator | take SubAggregator - | or (SubAggregator, StrictTypes.SemId, [Byte ^ ..0xff]) + | or (SubAggregator, SubAggregator) | aluVm#255 AluVM.LibSite @mnemonic(cobra-abraham-bonus) From 22748d3f841f2492b47dfb1642da1087f82e5a2a Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 17:53:15 +0200 Subject: [PATCH 37/40] ledger: test export/accept operations --- cli/src/cmd.rs | 2 +- src/ledger.rs | 13 ++++++++++--- tests/dao.rs | 24 ++++++++++++++++++++---- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/cli/src/cmd.rs b/cli/src/cmd.rs index 69a530d..070d6ac 100644 --- a/cli/src/cmd.rs +++ b/cli/src/cmd.rs @@ -146,7 +146,7 @@ fn call(dir: PathBuf, form: PathBuf) -> anyhow::Result<()> { } fn export(dir: PathBuf, terminals: impl IntoIterator, output: PathBuf) -> anyhow::Result<()> { - let mut ledger = LedgerDir::load(dir)?; + let ledger = LedgerDir::load(dir)?; ledger.export_to_file(terminals, output)?; Ok(()) } diff --git a/src/ledger.rs b/src/ledger.rs index 9e93921..21e1f62 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -413,10 +413,11 @@ impl Ledger { ) -> Result<(), MultiError> { // We need this closure to avoid multiple `map_err`. let count = (|| -> Result { - let contract_id = ContractId::strict_decode(reader)?; - // Check version number let _ = ReservedBytes::<1, { DEEDS_VERSION as u8 }>::strict_decode(reader)?; + + let contract_id = ContractId::strict_decode(reader)?; + // Read and ignore the extension block let ext_blocks = u8::strict_decode(reader)?; for _ in 0..ext_blocks { @@ -651,8 +652,14 @@ mod _fs { pub const DEEDS_MAGIC_NUMBER: u64 = u64::from_be_bytes(*b"DEEDLDGR"); impl Ledger { + pub fn export_all_to_file(&self, output: impl AsRef) -> io::Result<()> { + let file = BinFile::::create_new(output)?; + let writer = StrictWriter::with(StreamWriter::new::<{ usize::MAX }>(file)); + self.export_all(writer) + } + pub fn export_to_file( - &mut self, + &self, terminals: impl IntoIterator>, output: impl AsRef, ) -> io::Result<()> { diff --git a/tests/dao.rs b/tests/dao.rs index 45a5ccd..2c1c32b 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -28,6 +28,7 @@ extern crate amplify; #[macro_use] extern crate strict_types; +use std::convert::Infallible; use std::fs; use std::path::Path; @@ -123,6 +124,7 @@ fn api() -> Api { } } +#[test] fn main() { let types = stl::DaoTypes::new(); let codex = codex(); @@ -172,12 +174,12 @@ fn main() { .finish("WonderlandDAO", 1732529307); let opid = articles.genesis_opid(); - let contract_path = Path::new("examples/dao/data/WonderlandDAO.contract"); + let contract_path = Path::new("tests/data/WonderlandDAO.contract"); if contract_path.exists() { fs::remove_dir_all(contract_path).expect("Unable to remove a contract file"); } fs::create_dir_all(contract_path).expect("Unable to create a contract folder"); - let mut ledger = LedgerDir::new(articles, contract_path.to_path_buf()).expect("Can't issue contract"); + let mut ledger = LedgerDir::new(articles.clone(), contract_path.to_path_buf()).expect("Can't issue contract"); // Proposing vote let votings = ledger @@ -236,14 +238,28 @@ fn main() { } // Now anybody accessing this file can figure out who is on duty today, by the decision of DAO. - let deeds_path = Path::new("examples/dao/data/voting.deeds"); + let deeds_path = Path::new("tests/data/voting.deeds"); if deeds_path.exists() { fs::remove_file(deeds_path).expect("unable to remove contract file"); } ledger - .export_to_file([alice_auth2, bob_auth2, carol_auth2], "examples/dao/data/voting.deeds") + .export_to_file([alice_auth2, bob_auth2, carol_auth2], deeds_path) .expect("unable to save deeds to a file"); + + let contract_path = Path::new("tests/data/WonderlandDAO-2.contract"); + if contract_path.exists() { + fs::remove_dir_all(contract_path).expect("Unable to remove a contract file"); + } + fs::create_dir_all(contract_path).expect("Unable to create a contract folder"); + let mut ledger2 = LedgerDir::new(articles, contract_path.to_path_buf()).expect("Can't issue contract"); + ledger2 + .accept_from_file(deeds_path, |_, _, _| Result::<_, Infallible>::Ok(())) + .unwrap(); + + ledger2 + .export_all_to_file("tests/data/votings-all.deeds") + .unwrap(); } mod libs { From 68e9320a3842db2fe049bb949445f4d01fe213ba Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 18:21:30 +0200 Subject: [PATCH 38/40] test: issuer persistence --- api/src/articles.rs | 18 ++++++++++++++++++ tests/dao.rs | 33 +++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/api/src/articles.rs b/api/src/articles.rs index 1a1dd6f..2ac4854 100644 --- a/api/src/articles.rs +++ b/api/src/articles.rs @@ -242,3 +242,21 @@ impl LibRepo for Articles { #[strict_type(lib = LIB_NAME_SONIC, dumb = { Self(NonEmptyBlob::with(0)) })] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(transparent))] pub struct SigBlob(NonEmptyBlob<4096>); + +impl SigBlob { + /// Constrict sig blob from byte slice. + /// + /// # Panics + /// + /// If the slice length is zero or larger than 4096. + pub fn from_slice_checked(data: impl AsRef<[u8]>) -> SigBlob { + Self(NonEmptyBlob::from_checked(data.as_ref().to_vec())) + } + + /// Constrict sig blob from byte vector. + /// + /// # Panics + /// + /// If the slice length is zero or larger than 4096. + pub fn from_vec_checked(data: Vec) -> SigBlob { Self(NonEmptyBlob::from_checked(data)) } +} diff --git a/tests/dao.rs b/tests/dao.rs index 2c1c32b..019fb29 100644 --- a/tests/dao.rs +++ b/tests/dao.rs @@ -34,11 +34,12 @@ use std::path::Path; use aluvm::{CoreConfig, LibSite}; use amplify::num::u256; -use commit_verify::{Digest, Sha256}; +use commit_verify::{Digest, Sha256, StrictHash}; use hypersonic::{Api, GlobalApi, OwnedApi}; use sonic_persist_fs::LedgerDir; use sonicapi::{ - Aggregator, Issuer, RawBuilder, RawConvertor, Semantics, StateArithm, StateBuilder, StateConvertor, SubAggregator, + Aggregator, Issuer, RawBuilder, RawConvertor, Semantics, SigBlob, StateArithm, StateBuilder, StateConvertor, + SubAggregator, }; use strict_types::{SemId, StrictVal}; use ultrasonic::aluvm::FIELD_ORDER_SECP; @@ -139,13 +140,33 @@ fn main() { api_libs: none!(), types: types.type_system(), }; - let issuer = Issuer::new(codex, semantics).unwrap(); + + let sig = SigBlob::from_slice_checked(*b"me"); + fn sig_validator(_: StrictHash, _: &Identity, s: &SigBlob) -> Result<(), ()> { + if s.as_slice() == b"me" { + Ok(()) + } else { + Err(()) + } + } + let issuer = Issuer::with(codex, semantics, sig, sig_validator).unwrap(); let filename = "examples/dao/data/SimpleDAO.issuer"; fs::remove_file(filename).ok(); issuer .save(filename) .expect("unable to save an issuer to a file"); + let issuer2 = Issuer::load(filename, sig_validator).unwrap(); + assert_eq!(issuer.issuer_id(), issuer2.issuer_id()); + assert_eq!(issuer.codex_id(), issuer2.codex_id()); + assert_eq!(issuer.codex_name(), issuer2.codex_name()); + assert_eq!(issuer.codex(), issuer2.codex()); + assert_eq!(issuer.types(), issuer2.types()); + assert_eq!(issuer.semantics(), issuer2.semantics()); + assert_eq!(issuer.default_api(), issuer2.default_api()); + assert_eq!(issuer.custom_apis().collect::>(), issuer2.custom_apis().collect::>()); + assert_eq!(issuer.codex_libs().collect::>(), issuer2.codex_libs().collect::>()); + let seed = &[0xCA; 30][..]; let mut auth = Sha256::digest(seed); let mut next_auth = || -> AuthToken { @@ -257,9 +278,9 @@ fn main() { .accept_from_file(deeds_path, |_, _, _| Result::<_, Infallible>::Ok(())) .unwrap(); - ledger2 - .export_all_to_file("tests/data/votings-all.deeds") - .unwrap(); + let deeds_path = "tests/data/votings-all.deeds"; + fs::remove_file(deeds_path).ok(); + ledger2.export_all_to_file(deeds_path).unwrap(); } mod libs { From 6f1306ec51eda43cf79e7097a1f7655eeb3133cb Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 19:52:13 +0200 Subject: [PATCH 39/40] test: API adapters --- api/src/state/adaptors.rs | 325 +++++++++++++++++++++++++++++++++++--- 1 file changed, 303 insertions(+), 22 deletions(-) diff --git a/api/src/state/adaptors.rs b/api/src/state/adaptors.rs index fb8beb7..f2f6556 100644 --- a/api/src/state/adaptors.rs +++ b/api/src/state/adaptors.rs @@ -29,13 +29,13 @@ use amplify::num::u256; use sonic_callreq::StateName; use strict_encoding::{SerializeError, StreamReader}; use strict_types::value::{EnumTag, StrictNum}; -use strict_types::{decode, typify, SemId, StrictVal, TypeSystem}; +use strict_types::{decode, typify, Cls, SemId, StrictVal, Ty, TypeSystem}; use ultrasonic::StateValue; use crate::{fe256, StateTy, LIB_NAME_SONIC}; pub(super) const USED_FIEL_BYTES: usize = u256::BYTES as usize - 2; -pub(super) const TOTAL_BYTES: usize = USED_FIEL_BYTES * 3; +pub(super) const MAX_BYTES: usize = USED_FIEL_BYTES * 3; #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] @@ -109,15 +109,15 @@ pub enum StateBuilder { impl StateBuilder { #[allow(clippy::result_large_err)] pub fn build(&self, sem_id: SemId, value: StrictVal, sys: &TypeSystem) -> Result { - let typed = sys.typify(value, sem_id)?; + let typed = sys.typify(value.clone(), sem_id)?; Ok(match self { Self::Unit if typed.as_val() == &StrictVal::Unit => StateValue::None, Self::Unit => return Err(StateBuildError::InvalidUnit), Self::TypedEncoder(ty) => { - let ser = sys.strict_serialize_value::(&typed)?; + let ser = sys.strict_serialize_value::(&typed)?; typed_build(*ty, ser) } - Self::TypedFieldEncoder(ty) => typed_field_build(*ty, typed.unbox())?, + Self::TypedFieldEncoder(ty) => typed_field_build(*ty, value)?, Self::AluVM(_) => return Err(StateBuildError::Unsupported), }) } @@ -164,10 +164,32 @@ pub enum StateConvertError { #[display("state has no data")] UnitState, + #[display("unknown type {0}")] + TypeUnknown(SemId), + + #[display("type of class {0} is not supported by field-based convertor")] + TypeClassUnsupported(Cls), + + #[display("number of fields doesn't match the number of fields in the type")] + TypeFieldCountMismatch, + #[display("AluVM is not yet supported for a state conversion.")] Unsupported, } +// Simplify newtype-like tuples +fn reduce_tuples(mut val: StrictVal) -> StrictVal { + loop { + if let StrictVal::Tuple(ref mut vec) = val { + if vec.len() == 1 { + val = vec.remove(0); + continue; + } + } + return val; + } +} + fn typed_convert( ty: StateTy, sem_id: SemId, @@ -180,7 +202,7 @@ fn typed_convert( return Ok(None); } - let mut buf = [0u8; TOTAL_BYTES]; + let mut buf = [0u8; MAX_BYTES]; let mut i = 1u8; while let Some(el) = value.get(i) { let from = USED_FIEL_BYTES * (i - 1) as usize; @@ -188,23 +210,26 @@ fn typed_convert( buf[from..to].copy_from_slice(&el.to_u256().to_le_bytes()[..USED_FIEL_BYTES]); i += 1; } + let used_bytes = USED_FIEL_BYTES * (i - 1) as usize; debug_assert!(i <= 4); + debug_assert!(used_bytes <= MAX_BYTES); - let mut cursor = StreamReader::cursor::(buf); - // We do not check here that we have reached the end of the buffer, since it may be filled with - // zeros up to the field element length. + let mut cursor = StreamReader::cursor::(&buf[..used_bytes]); let mut val = sys.strict_read_type(sem_id, &mut cursor)?.unbox(); - loop { - if let StrictVal::Tuple(ref mut vec) = val { - if vec.len() == 1 { - val = vec.remove(0); - continue; - } + // We check here that we have reached the end of the buffer data, + // and the rest of the elements are zeros. + let cursor = cursor.unconfine(); + let position = cursor.position() as usize; + let data = cursor.into_inner(); + for item in data.iter().take(used_bytes).skip(position) { + if *item != 0 { + return Err(StateConvertError::NotEntirelyConsumed); } - break; } + val = reduce_tuples(val); + Ok(Some(val)) } @@ -220,17 +245,45 @@ fn typed_field_convert( return Ok(None); } + let ty = sys + .get(sem_id) + .ok_or(StateConvertError::TypeUnknown(sem_id))?; + let fields = match ty { + Ty::Tuple(fields) => fields.iter().copied().collect::>(), + Ty::Struct(fields) => fields.iter().map(|f| f.ty).collect::>(), + _ => return Err(StateConvertError::TypeClassUnsupported(ty.cls())), + }; + + if fields.len() != value.into_iter().count() - 1 { + return Err(StateConvertError::TypeFieldCountMismatch); + } + let mut items = vec![]; - for el in value.into_iter().skip(1) { - let mut cursor = StreamReader::cursor::(el.to_u256().to_le_bytes()); + for (el, sem_id) in value.into_iter().skip(1).zip(fields.into_iter()) { + let mut cursor = StreamReader::cursor::(el.to_u256().to_le_bytes()); let val = sys.strict_read_type(sem_id, &mut cursor)?.unbox(); items.push(val); } - Ok(Some(StrictVal::List(items))) + let mut val = match ty { + Ty::Tuple(_) => StrictVal::Tuple(items), + Ty::Struct(fields) => StrictVal::Struct( + fields + .iter() + .zip(items) + .map(|(f, val)| (f.name.clone(), reduce_tuples(val))) + .collect(), + ), + _ => unreachable!(), + }; + + // Simplify tuples with a single element + val = reduce_tuples(val); + + Ok(Some(val)) } -fn typed_build(ty: StateTy, ser: ConfinedBlob<0, TOTAL_BYTES>) -> StateValue { +fn typed_build(ty: StateTy, ser: ConfinedBlob<0, MAX_BYTES>) -> StateValue { let mut elems = Vec::with_capacity(4); elems.push(ty); for chunk in ser.chunks(USED_FIEL_BYTES) { @@ -250,10 +303,10 @@ fn typed_field_build(ty: StateTy, val: StrictVal) -> Result StateValue::Single { first: fe256::from(ty) }, StrictVal::Number(StrictNum::Uint(i)) => StateValue::Double { first: fe256::from(ty), second: fe256::from(i) }, - StrictVal::String(s) if s.len() < TOTAL_BYTES => { + StrictVal::String(s) if s.len() < MAX_BYTES => { typed_build(ty, Confined::from_iter_checked(s.as_bytes().iter().cloned())) } - StrictVal::Bytes(b) if b.len() < TOTAL_BYTES => typed_build(ty, Confined::from_checked(b.0)), + StrictVal::Bytes(b) if b.len() < MAX_BYTES => typed_build(ty, Confined::from_checked(b.0)), StrictVal::Struct(fields) if fields.len() <= 3 => typed_field_build_items(ty, fields.into_values())?, StrictVal::Enum(EnumTag::Ord(tag)) => StateValue::Double { first: fe256::from(ty), second: fe256::from(tag) }, StrictVal::List(items) | StrictVal::Set(items) | StrictVal::Tuple(items) if items.len() <= 3 => { @@ -298,3 +351,231 @@ fn typed_field_build_item(val: StrictVal) -> Result, StateBuildErro _ => return Err(StateBuildError::UnsupportedValue(val)), }) } + +#[cfg(test)] +mod tests { + #![cfg_attr(coverage_nightly, coverage(off))] + + use strict_types::stl::std_stl; + use strict_types::{LibBuilder, SymbolicSys, SystemBuilder, TypeLib}; + + use super::*; + + pub const LIB_NAME_TEST: &str = "Test"; + + #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] + #[display(lowercase)] + #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] + #[strict_type(lib = LIB_NAME_TEST, tags = repr, try_from_u8, into_u8)] + #[repr(u8)] + pub enum Vote { + #[strict_type(dumb)] + Contra = 0, + Pro = 1, + } + + #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] + #[display(inner)] + #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] + #[strict_type(lib = LIB_NAME_TEST)] + pub struct VoteId(u64); + + #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display, From)] + #[display(inner)] + #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] + #[strict_type(lib = LIB_NAME_TEST)] + pub struct PartyId(u64); + + #[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From, Display)] + #[display("Participant #{party_id} voted {vote} in voting #{vote_id}")] + #[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] + #[strict_type(lib = LIB_NAME_TEST)] + pub struct CastVote { + pub vote_id: VoteId, + pub vote: Vote, + pub party_id: PartyId, + } + + pub fn stl() -> TypeLib { + LibBuilder::with(libname!(LIB_NAME_TEST), [std_stl().to_dependency_types()]) + .transpile::() + .compile() + .expect("invalid Test type library") + } + + #[derive(Debug)] + pub struct Types(SymbolicSys); + + impl Types { + pub fn new() -> Self { + Self( + SystemBuilder::new() + .import(std_stl()) + .unwrap() + .import(stl()) + .unwrap() + .finalize() + .unwrap(), + ) + } + + pub fn type_system(&self) -> TypeSystem { + let stdtypes = std_stl().types; + let types = stl().types; + let types = stdtypes + .into_iter() + .chain(types) + .map(|(tn, ty)| ty.sem_id_named(&tn)); + self.0.as_types().extract(types).unwrap() + } + + pub fn get(&self, name: &'static str) -> SemId { + *self + .0 + .resolve(name) + .unwrap_or_else(|| panic!("type '{name}' is absent in RGB21 type library")) + } + } + + fn typed_roundtrip(name: &'static str, src: StateValue, dst: StrictVal) { + let types = Types::new(); + + let ty = types.get(name); + let val = StateConvertor::TypedEncoder(u256::ONE) + .convert(ty, src, &types.type_system()) + .unwrap() + .unwrap(); + assert_eq!(val, dst); + + let res = StateBuilder::TypedEncoder(u256::ONE) + .build(ty, dst, &types.type_system()) + .unwrap(); + assert_eq!(res, src); + } + + fn typed_field_roundtrip(name: &'static str, src1: StateValue, dst: StrictVal, src2: StrictVal) { + let types = Types::new(); + + let ty = types.get(name); + let val = StateConvertor::TypedFieldEncoder(u256::ONE) + .convert(ty, src1, &types.type_system()) + .unwrap() + .unwrap(); + assert_eq!(val, dst); + + let res = StateBuilder::TypedFieldEncoder(u256::ONE) + .build(ty, src2, &types.type_system()) + .unwrap(); + assert_eq!(res, src1); + } + + #[test] + fn typed() { + typed_roundtrip( + "Std.Bool", + StateValue::Double { first: fe256::from(1u8), second: fe256::from(1u8) }, + svenum!("true"), + ); + } + + #[test] + #[should_panic(expected = "Decode(Decode(Io(Kind(UnexpectedEof))))")] + fn typed_convert_lack() { + let types = Types::new(); + StateConvertor::TypedEncoder(u256::ONE) + .convert(types.get("Std.Bool"), StateValue::Single { first: fe256::from(1u8) }, &types.type_system()) + .unwrap(); + } + + #[test] + #[should_panic(expected = "NotEntirelyConsumed")] + fn typed_convert_excess() { + let types = Types::new(); + StateConvertor::TypedEncoder(u256::ONE) + .convert( + types.get("Std.Bool"), + StateValue::Triple { + first: fe256::from(1u8), + second: fe256::from(1u8), + third: fe256::from(1u8), + }, + &types.type_system(), + ) + .unwrap(); + } + + #[test] + fn typed_field() { + typed_field_roundtrip( + "Test.CastVote", + StateValue::Quadruple { + first: fe256::from(1u8), + second: fe256::from(3u8), + third: fe256::from(1u8), + fourth: fe256::from(5u8), + }, + ston!(voteId 3u8, vote svenum!("pro"), partyId 5u8), + ston!(voteId 3u8, vote svenum!(1), partyId 5u8), + ); + } + + #[test] + #[should_panic(expected = "TypeClassUnsupported(Enum)")] + fn typed_field_convert_enum() { + let types = Types::new(); + let val = StateConvertor::TypedFieldEncoder(u256::ONE) + .convert( + types.get("Std.Bool"), + StateValue::Double { first: fe256::from(1u8), second: fe256::from(1u8) }, + &types.type_system(), + ) + .unwrap(); + assert_eq!(val, Some(svenum!("true"))); + } + + #[test] + #[should_panic(expected = "TypeFieldCountMismatch")] + fn typed_field_convert_lack() { + let types = Types::new(); + StateConvertor::TypedFieldEncoder(u256::ONE) + .convert(types.get("Test.CastVote"), StateValue::Single { first: fe256::from(1u8) }, &types.type_system()) + .unwrap(); + } + + #[test] + #[should_panic(expected = "TypeFieldCountMismatch")] + fn typed_field_convert_excess() { + let types = Types::new(); + StateConvertor::TypedFieldEncoder(u256::ONE) + .convert( + types.get("Test.PartyId"), + StateValue::Triple { + first: fe256::from(1u8), + second: fe256::from(1u8), + third: fe256::from(1u8), + }, + &types.type_system(), + ) + .unwrap(); + } + + #[test] + #[should_panic( + expected = r#"Decode(Decode(EnumTagNotKnown("semid:kr1DHi~j-YSw4n54-o9KnZ9Q-Dlo0pWP-_V9U5oh-Wlzfemk#break-secret-delphi", 5)))"# + )] + fn typed_field_convert_invalid() { + let types = Types::new(); + StateConvertor::TypedFieldEncoder(u256::ONE) + .convert( + types.get("Test.CastVote"), + StateValue::Quadruple { + first: fe256::from(1u8), + second: fe256::from(1u8), + third: fe256::from(5u8), + fourth: fe256::from(1u8), + }, + &types.type_system(), + ) + .unwrap(); + } +} From c74a1543cab2094707026c83541fecce29e6d074 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 20:11:26 +0200 Subject: [PATCH 40/40] test: better API aggregators test coverage --- api/src/state/aggregators.rs | 170 ++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 84 deletions(-) diff --git a/api/src/state/aggregators.rs b/api/src/state/aggregators.rs index c961ea7..31d2179 100644 --- a/api/src/state/aggregators.rs +++ b/api/src/state/aggregators.rs @@ -793,12 +793,12 @@ mod test { let code = aluasm! { ret; }; Lib::assemble(&code).unwrap() } - fn call(aggregator: Aggregator) -> StrictVal { + fn call(aggregator: &Aggregator) -> StrictVal { aggregator .aggregate(&state(), &none!(), &[success_lib()], &types()) .unwrap() } - fn call2(aggregator: Aggregator) -> StrictVal { + fn call2(aggregator: &Aggregator) -> StrictVal { let aggregated = bmap! { vname!("zero") => svnum!(0u64), vname!("two") => svnum!(2u64), @@ -812,57 +812,60 @@ mod test { #[test] fn none() { - assert_eq!(call(Aggregator::None), svnone!()); + let agg = Aggregator::None; + assert_eq!(call(&agg), svnone!()); + assert_eq!(agg.depends_on().count(), 0); } #[test] fn some() { - assert_eq!(call(Aggregator::Some(SubAggregator::Count(vname!("verified")))), svsome!(6u64)); + let agg = Aggregator::Some(SubAggregator::Count(vname!("verified"))); + assert_eq!(call(&agg), svsome!(6u64)); + assert_eq!(agg.depends_on().count(), 0); } #[test] fn or() { - assert_eq!( - call(Aggregator::Or( - SubAggregator::Unwrap(vname!("nonExisting")), - SubAggregator::Count(vname!("verified")) - )), - svnum!(6u64) - ); + let agg = + Aggregator::Or(SubAggregator::Unwrap(vname!("nonExisting")), SubAggregator::Count(vname!("verified"))); + assert_eq!(call(&agg), svnum!(6u64)); + assert_eq!(agg.depends_on().count(), 0); } #[test] #[should_panic] - fn non_existing() { call(Aggregator::Take(SubAggregator::Unwrap(vname!("nonExisting")))); } + fn non_existing() { call(&Aggregator::Take(SubAggregator::Unwrap(vname!("nonExisting")))); } #[test] fn sum() { #![allow(clippy::identity_op)] - assert_eq!( - call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("verified")))), - svnum!(5u64 + 1 + 2 + 3 + 4 + 5) - ); - assert_eq!( - call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("verified")))), - svnum!(5u64 + 1 + 2 + 3 + 4 + 5) - ); + let agg = Aggregator::Take(SubAggregator::SumUnwrap(vname!("verified"))); + assert_eq!(call(&agg), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(agg.depends_on().count(), 0); - assert_eq!(call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified")))), svnum!(0u64)); + let agg = Aggregator::Take(SubAggregator::SumOrDefault(vname!("verified"))); + assert_eq!(call(&agg), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + assert_eq!(agg.depends_on().count(), 0); + + let agg = Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified"))); + assert_eq!(call(&agg), svnum!(0u64)); + assert_eq!(agg.depends_on().count(), 0); } #[test] fn prod() { #![allow(clippy::identity_op)] - assert_eq!( - call(Aggregator::Take(SubAggregator::ProdUnwrap(vname!("verified")))), - svnum!(5u64 * 1 * 2 * 3 * 4 * 5) - ); - assert_eq!( - call(Aggregator::Take(SubAggregator::ProdOrDefault(vname!("verified")))), - svnum!(5u64 * 1 * 2 * 3 * 4 * 5) - ); + let agg = Aggregator::Take(SubAggregator::ProdUnwrap(vname!("verified"))); + assert_eq!(call(&agg), svnum!(5u64 * 1 * 2 * 3 * 4 * 5)); + assert_eq!(agg.depends_on().count(), 0); - assert_eq!(call(Aggregator::Take(SubAggregator::ProdOrDefault(vname!("unverified")))), svnum!(1u64)); + let agg = Aggregator::Take(SubAggregator::ProdOrDefault(vname!("verified"))); + assert_eq!(call(&agg), svnum!(5u64 * 1 * 2 * 3 * 4 * 5)); + assert_eq!(agg.depends_on().count(), 0); + + let agg = Aggregator::Take(SubAggregator::ProdOrDefault(vname!("unverified"))); + assert_eq!(call(&agg), svnum!(1u64)); + assert_eq!(agg.depends_on().count(), 0); } #[test] @@ -872,14 +875,14 @@ mod test { StateSelector::Aggregated(vname!("three")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); - assert_eq!(call2(agg), svnum!(5u64)); + assert_eq!(call2(&agg), svnum!(5u64)); } #[test] fn meg() { let agg = Aggregator::Take(SubAggregator::Neg(StateSelector::Aggregated(vname!("two")))); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two")]); - assert_eq!(call2(agg), svnum!(-2i64)); + assert_eq!(call2(&agg), svnum!(-2i64)); } #[test] @@ -889,7 +892,7 @@ mod test { StateSelector::Aggregated(vname!("two")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("three"), &vname!("two")]); - assert_eq!(call2(agg), svnum!(1u64)); + assert_eq!(call2(&agg), svnum!(1u64)); } #[test] @@ -899,7 +902,7 @@ mod test { StateSelector::Aggregated(vname!("two")), StateSelector::Aggregated(vname!("three")), )); - call2(agg); + call2(&agg); } #[test] @@ -909,7 +912,7 @@ mod test { StateSelector::Aggregated(vname!("three")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); - assert_eq!(call2(agg), svnum!(6u64)); + assert_eq!(call2(&agg), svnum!(6u64)); } #[test] @@ -919,7 +922,7 @@ mod test { StateSelector::Aggregated(vname!("three")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); - assert_eq!(call2(agg), svnum!(0u64)); + assert_eq!(call2(&agg), svnum!(0u64)); } #[test] @@ -929,7 +932,7 @@ mod test { StateSelector::Aggregated(vname!("two")), StateSelector::Aggregated(vname!("zero")), )); - call2(agg); + call2(&agg); } #[test] @@ -939,7 +942,7 @@ mod test { StateSelector::Aggregated(vname!("three")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); - assert_eq!(call2(agg), svnum!(2u64)); + assert_eq!(call2(&agg), svnum!(2u64)); } #[test] @@ -949,46 +952,48 @@ mod test { StateSelector::Aggregated(vname!("three")), )); assert_eq!(agg.depends_on().collect::>(), vec![&vname!("two"), &vname!("three")]); - assert_eq!(call2(agg), svnum!(8u64)); + assert_eq!(call2(&agg), svnum!(8u64)); } #[test] #[should_panic] - fn math_sum_fail() { call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } + fn math_sum_fail() { call(&Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } #[test] #[should_panic] - fn math_prod_fail() { call(Aggregator::Take(SubAggregator::ProdUnwrap(vname!("unverified")))); } + fn math_prod_fail() { call(&Aggregator::Take(SubAggregator::ProdUnwrap(vname!("unverified")))); } + + fn independent(agg: Aggregator, val: StrictVal) { + assert_eq!(call(&agg), val); + assert_eq!(agg.depends_on().count(), 0); + } #[test] fn verified_readers() { - assert_eq!(call(Aggregator::Take(SubAggregator::First(vname!("verified")))), svnum!(5u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 0))), svnum!(5u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 1))), svnum!(1u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::Last(vname!("verified")))), svnum!(5u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 0))), svnum!(5u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 1))), svnum!(4u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::CountUnique(vname!("verified")))), svnum!(5u64)); - assert_eq!( - call(Aggregator::Take(SubAggregator::SetV(vname!("verified")))), - svset!([5u64, 1u64, 2u64, 3u64, 4u64]) - ); - assert_eq!(call(Aggregator::Take(SubAggregator::MapV2U(vname!("verified")))), StrictVal::Map(none!())); - assert_eq!(call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("verified")))), StrictVal::Map(none!())); - assert_eq!(call(Aggregator::Take(SubAggregator::MapV2SetU(vname!("verified")))), StrictVal::Map(none!())); + independent(Aggregator::Take(SubAggregator::First(vname!("verified"))), svnum!(5u64)); + independent(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 0)), svnum!(5u64)); + independent(Aggregator::Take(SubAggregator::Nth(vname!("verified"), 1)), svnum!(1u64)); + independent(Aggregator::Take(SubAggregator::Last(vname!("verified"))), svnum!(5u64)); + independent(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 0)), svnum!(5u64)); + independent(Aggregator::Take(SubAggregator::NthBack(vname!("verified"), 1)), svnum!(4u64)); + independent(Aggregator::Take(SubAggregator::Count(vname!("verified"))), svnum!(6u64)); + independent(Aggregator::Take(SubAggregator::CountUnique(vname!("verified"))), svnum!(5u64)); + independent(Aggregator::Take(SubAggregator::SetV(vname!("verified"))), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + independent(Aggregator::Take(SubAggregator::MapV2U(vname!("verified"))), StrictVal::Map(none!())); + independent(Aggregator::Take(SubAggregator::MapV2ListU(vname!("verified"))), StrictVal::Map(none!())); + independent(Aggregator::Take(SubAggregator::MapV2SetU(vname!("verified"))), StrictVal::Map(none!())); } #[test] fn unverified_readers() { - assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::SetV(vname!("unverified")))), svset!([()])); - assert_eq!( - call(Aggregator::Take(SubAggregator::MapV2U(vname!("unverified")))), - StrictVal::Map(vec![(StrictVal::Unit, svstr!("state 1"))]) + independent(Aggregator::Take(SubAggregator::Count(vname!("verified"))), svnum!(6u64)); + independent(Aggregator::Take(SubAggregator::SetV(vname!("unverified"))), svset!([()])); + independent( + Aggregator::Take(SubAggregator::MapV2U(vname!("unverified"))), + StrictVal::Map(vec![(StrictVal::Unit, svstr!("state 1"))]), ); - assert_eq!( - call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("unverified")))), + independent( + Aggregator::Take(SubAggregator::MapV2ListU(vname!("unverified"))), StrictVal::Map(vec![(StrictVal::Unit, svlist![[ svstr!("state 1"), svstr!("state 2"), @@ -996,10 +1001,10 @@ mod test { svstr!("state 4"), svstr!("state 5"), svstr!("state 6"), - ]])]) + ]])]), ); - assert_eq!( - call(Aggregator::Take(SubAggregator::MapV2SetU(vname!("unverified")))), + independent( + Aggregator::Take(SubAggregator::MapV2SetU(vname!("unverified"))), StrictVal::Map(vec![(StrictVal::Unit, svset![[ svstr!("state 1"), svstr!("state 2"), @@ -1007,51 +1012,48 @@ mod test { svstr!("state 4"), svstr!("state 5"), svstr!("state 6"), - ]])]) + ]])]), ); } #[test] #[should_panic] - fn unverified_sum() { call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } + fn unverified_sum() { call(&Aggregator::Take(SubAggregator::SumUnwrap(vname!("unverified")))); } #[test] fn unverified_sum_default() { - assert_eq!(call(Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified")))), svnum!(0u64)); + independent(Aggregator::Take(SubAggregator::SumOrDefault(vname!("unverified"))), svnum!(0u64)); } #[test] fn pair_readers() { - assert_eq!(call(Aggregator::Take(SubAggregator::Count(vname!("verified")))), svnum!(6u64)); - assert_eq!(call(Aggregator::Take(SubAggregator::SumUnwrap(vname!("pairs")))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); - assert_eq!( - call(Aggregator::Take(SubAggregator::SetV(vname!("pairs")))), - svset!([5u64, 1u64, 2u64, 3u64, 4u64]) - ); - assert_eq!( - call(Aggregator::Take(SubAggregator::MapV2U(vname!("pairs")))), + independent(Aggregator::Take(SubAggregator::Count(vname!("verified"))), svnum!(6u64)); + independent(Aggregator::Take(SubAggregator::SumUnwrap(vname!("pairs"))), svnum!(5u64 + 1 + 2 + 3 + 4 + 5)); + independent(Aggregator::Take(SubAggregator::SetV(vname!("pairs"))), svset!([5u64, 1u64, 2u64, 3u64, 4u64])); + independent( + Aggregator::Take(SubAggregator::MapV2U(vname!("pairs"))), StrictVal::Map(vec![ (svnum!(5u64), svstr!("state 1")), (svnum!(1u64), svstr!("state 2")), (svnum!(2u64), svstr!("state 3")), (svnum!(3u64), svstr!("state 4")), - (svnum!(4u64), svstr!("state 5")) - ]) + (svnum!(4u64), svstr!("state 5")), + ]), ); - assert_eq!( - call(Aggregator::Take(SubAggregator::MapV2ListU(vname!("pairs")))), + independent( + Aggregator::Take(SubAggregator::MapV2ListU(vname!("pairs"))), StrictVal::Map(vec![ (svnum!(5u64), svlist![[svstr!("state 1"), svstr!("state 6")]]), (svnum!(1u64), svlist![[svstr!("state 2")]]), (svnum!(2u64), svlist![[svstr!("state 3")]]), (svnum!(3u64), svlist![[svstr!("state 4")]]), - (svnum!(4u64), svlist![[svstr!("state 5")]]) - ]) + (svnum!(4u64), svlist![[svstr!("state 5")]]), + ]), ); } #[test] #[should_panic] // For now, the fail here indicates forward compatibility with when we allow AluVM - fn aluvm() { call(Aggregator::AluVM(LibSite::new(success_lib().lib_id(), 0))); } + fn aluvm() { call(&Aggregator::AluVM(LibSite::new(success_lib().lib_id(), 0))); } }