From a3cfbe787dc1234e5f01052d5e25c11ecd3c2e95 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 9 Feb 2026 10:20:30 +0200 Subject: [PATCH 1/7] refactor: switch to the `miden-field` from miden-crypto --- Cargo.toml | 3 +- examples/basic-wallet-tx-script/src/lib.rs | 4 +- examples/counter-note/src/lib.rs | 2 +- .../src/component_macro/storage.rs | 4 +- sdk/base-sys/src/bindings/active_account.rs | 6 +- sdk/base-sys/src/bindings/faucet.rs | 2 +- sdk/base-sys/src/bindings/native_account.rs | 2 +- sdk/field-repr/derive/README.md | 6 +- sdk/field-repr/repr/Cargo.toml | 2 +- sdk/field-repr/repr/src/lib.rs | 24 +- sdk/field-repr/tests/Cargo.toml | 2 +- sdk/field-repr/tests/src/offchain.rs | 140 ++++----- sdk/field-repr/tests/src/onchain.rs | 96 +++--- sdk/field/build.rs | 13 - sdk/field/src/lib.rs | 136 -------- sdk/field/src/native.rs | 203 ------------ sdk/field/src/wasm32.rs | 296 ------------------ sdk/sdk/Cargo.toml | 1 + sdk/sdk/src/lib.rs | 2 - sdk/stdlib-sys/Cargo.toml | 2 +- sdk/stdlib-sys/src/intrinsics/felt.rs | 12 +- sdk/stdlib-sys/src/intrinsics/word.rs | 7 +- sdk/stdlib-sys/src/stdlib/crypto/hashes.rs | 4 +- sdk/stdlib-sys/src/stdlib/mem.rs | 2 +- .../abi_transform/advice_map.rs | 6 +- .../rust_masm_tests/rust_sdk/base/account.rs | 22 +- .../rust_masm_tests/rust_sdk/base/asset.rs | 8 +- .../rust_masm_tests/rust_sdk/base/faucet.rs | 14 +- .../rust_sdk/base/input_note.rs | 18 +- .../rust_sdk/base/output_note.rs | 48 +-- .../src/rust_masm_tests/rust_sdk/base/tx.rs | 2 +- .../rust_sdk/stdlib/collections.rs | 48 +-- .../rust-sdk/account-test/src/lib.rs | 108 +++++++ .../rust-sdk/cross-ctx-account/src/lib.rs | 4 +- .../rust-sdk/cross-ctx-note-word/src/lib.rs | 12 +- .../rust-sdk/cross-ctx-note/src/lib.rs | 4 +- .../src/lib.rs | 22 +- 37 files changed, 359 insertions(+), 928 deletions(-) delete mode 100644 sdk/field/build.rs delete mode 100644 sdk/field/src/lib.rs delete mode 100644 sdk/field/src/native.rs delete mode 100644 sdk/field/src/wasm32.rs create mode 100644 tests/rust-apps-wasm/rust-sdk/account-test/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 544c54632..b88920339 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ members = [ "midenc-log", "midenc-session", "sdk/field-repr/*", - "sdk/field", "sdk/alloc", "sdk/base", "sdk/base-macros", @@ -157,6 +156,8 @@ miden-integration-tests = { path = "tests/integration" } midenc-expect-test = { path = "tools/expect-test" } miden-test-harness = { path = "test-harness/test-harness-lib" } miden-test-harness-macros = { path = "test-harness/test-harness-macros" } +# TODO: switch to version after miden-crypto release +miden-field = { git = "https://github.com/0xMiden/crypto", rev = "ba5aa2b78923b40b50d8170fd287b36808b11ec5", version = "0.22" } [patch.crates-io] #miden-assembly = { git = "https://github.com/0xMiden/miden-vm", rev = "614cd7f9b52f45238b0ab59c71ebb49325051e5d" } diff --git a/examples/basic-wallet-tx-script/src/lib.rs b/examples/basic-wallet-tx-script/src/lib.rs index ae7c5d627..a13d7eb0d 100644 --- a/examples/basic-wallet-tx-script/src/lib.rs +++ b/examples/basic-wallet-tx-script/src/lib.rs @@ -24,9 +24,9 @@ const ASSET_END: usize = 10; #[tx_script] fn run(arg: Word, account: &mut Account) { let num_felts = adv_push_mapvaln(arg.clone()); - let num_felts_u64 = num_felts.as_u64(); + let num_felts_u64 = num_felts.as_canonical_u64(); assert_eq(Felt::from_u32((num_felts_u64 % 4) as u32), felt!(0)); - let num_words = Felt::from_u64_unchecked(num_felts_u64 / 4); + let num_words = Felt::new(num_felts_u64 / 4); let commitment = arg; let input = adv_load_preimage(num_words, commitment); let tag = input[TAG_INDEX]; diff --git a/examples/counter-note/src/lib.rs b/examples/counter-note/src/lib.rs index 2d480918b..11f1016c0 100644 --- a/examples/counter-note/src/lib.rs +++ b/examples/counter-note/src/lib.rs @@ -21,7 +21,7 @@ impl CounterNote { pub fn run(self, _arg: Word) { let initial_value = counter_contract::get_count(); counter_contract::increment_count(); - let expected_value = initial_value + Felt::from_u32(1); + let expected_value = initial_value + felt!(1); let final_value = counter_contract::get_count(); assert_eq(final_value, expected_value); } diff --git a/sdk/base-macros/src/component_macro/storage.rs b/sdk/base-macros/src/component_macro/storage.rs index b85d8a06a..81fcbb73a 100644 --- a/sdk/base-macros/src/component_macro/storage.rs +++ b/sdk/base-macros/src/component_macro/storage.rs @@ -87,8 +87,8 @@ fn slot_id_tokens(id: miden_protocol::account::StorageSlotId) -> proc_macro2::To let prefix = id.prefix().as_int(); quote! { ::miden::StorageSlotId::new( - ::miden::Felt::from_u64_unchecked(#suffix), - ::miden::Felt::from_u64_unchecked(#prefix), + ::miden::Felt::new(#suffix), + ::miden::Felt::new(#prefix), ) } } diff --git a/sdk/base-sys/src/bindings/active_account.rs b/sdk/base-sys/src/bindings/active_account.rs index b335761e4..db39cf898 100644 --- a/sdk/base-sys/src/bindings/active_account.rs +++ b/sdk/base-sys/src/bindings/active_account.rs @@ -139,7 +139,7 @@ pub fn has_non_fungible_asset(asset: Asset) -> bool { asset.inner[2], asset.inner[1], asset.inner[0], - ) != Felt::from_u32(0) + ) != Felt::new(0) } } @@ -174,7 +174,7 @@ pub fn get_num_procedures() -> Felt { pub fn get_procedure_root(index: u8) -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); - extern_active_account_get_procedure_root(index.into(), ret_area.as_mut_ptr()); + extern_active_account_get_procedure_root(Felt::new(index as u64), ret_area.as_mut_ptr()); ret_area.assume_init().reverse() } } @@ -184,7 +184,7 @@ pub fn get_procedure_root(index: u8) -> Word { pub fn has_procedure(proc_root: Word) -> bool { unsafe { extern_active_account_has_procedure(proc_root[3], proc_root[2], proc_root[1], proc_root[0]) - != Felt::from_u32(0) + != Felt::new(0) } } diff --git a/sdk/base-sys/src/bindings/faucet.rs b/sdk/base-sys/src/bindings/faucet.rs index 33ced3fd0..5037d4f4c 100644 --- a/sdk/base-sys/src/bindings/faucet.rs +++ b/sdk/base-sys/src/bindings/faucet.rs @@ -116,6 +116,6 @@ pub fn is_non_fungible_asset_issued(asset: Asset) -> bool { asset.inner[1], asset.inner[0], ); - result != Felt::from_u32(0) + result != Felt::new(0) } } diff --git a/sdk/base-sys/src/bindings/native_account.rs b/sdk/base-sys/src/bindings/native_account.rs index 016436e8c..092f9b940 100644 --- a/sdk/base-sys/src/bindings/native_account.rs +++ b/sdk/base-sys/src/bindings/native_account.rs @@ -121,7 +121,7 @@ pub fn was_procedure_called(proc_root: Word) -> bool { proc_root[2], proc_root[1], proc_root[0], - ) != Felt::from_u32(0) + ) != Felt::new(0) } } diff --git a/sdk/field-repr/derive/README.md b/sdk/field-repr/derive/README.md index c70ddfafd..49fcbd060 100644 --- a/sdk/field-repr/derive/README.md +++ b/sdk/field-repr/derive/README.md @@ -22,8 +22,8 @@ struct AccountId { } let value = AccountId { - prefix: Felt::from_u64_unchecked(1), - suffix: Felt::from_u64_unchecked(2), + prefix: Felt::new(1), + suffix: Felt::new(2), }; let felts = value.to_felt_repr(); let roundtrip = AccountId::try_from(felts.as_slice()).unwrap(); @@ -47,7 +47,7 @@ enum Message { // Ping -> tag = 0 // Transfer -> tag = 1 let value = Message::Transfer { - to: Felt::from_u64_unchecked(7), + to: Felt::new(7), amount: 10, }; let felts = value.to_felt_repr(); diff --git a/sdk/field-repr/repr/Cargo.toml b/sdk/field-repr/repr/Cargo.toml index 0f2666adb..a15d8ad8c 100644 --- a/sdk/field-repr/repr/Cargo.toml +++ b/sdk/field-repr/repr/Cargo.toml @@ -15,8 +15,8 @@ edition.workspace = true crate-type = ["rlib"] [dependencies] -miden-field = { version = "0.10.0", path = "../../field" } miden-field-repr-derive = { path = "../derive", version = "0.10.0" } +miden-field.workspace = true [target.'cfg(not(target_family = "wasm"))'.dependencies] miden-core.workspace = true diff --git a/sdk/field-repr/repr/src/lib.rs b/sdk/field-repr/repr/src/lib.rs index b98cbac7f..c2b6c752c 100644 --- a/sdk/field-repr/repr/src/lib.rs +++ b/sdk/field-repr/repr/src/lib.rs @@ -15,6 +15,8 @@ pub use miden_field::Felt; pub use miden_field_repr_derive::DeriveFromFeltRepr as FromFeltRepr; /// Re-export `DeriveToFeltRepr` as `ToFeltRepr` for `#[derive(ToFeltRepr)]` ergonomics. pub use miden_field_repr_derive::DeriveToFeltRepr as ToFeltRepr; +#[allow(unused_imports)] +use p3_field::PrimeField64; /// Error returned when decoding a type from its felt representation. #[derive(Debug, Clone, PartialEq, Eq)] @@ -274,7 +276,7 @@ impl FromFeltRepr for Felt { impl FromFeltRepr for miden_core::Felt { #[inline(always)] fn from_felt_repr(reader: &mut FeltReader<'_>) -> FeltReprResult { - Ok(Self::from(reader.read()?)) + Self::new(reader.read().as_canonical_u64()) } } @@ -322,7 +324,7 @@ where fn from_felt_repr(reader: &mut FeltReader<'_>) -> FeltReprResult { let pos = reader.pos(); let len = reader.len(); - match reader.read()?.as_u64() { + match reader.read()?.as_canonical_u64() { 0 => Ok(None), 1 => Ok(Some(T::from_felt_repr(reader)?)), tag => Err(FeltReprError::InvalidOptionTag { pos, len, tag }), @@ -377,7 +379,7 @@ impl ToFeltRepr for Felt { impl ToFeltRepr for miden_core::Felt { #[inline(always)] fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { - writer.write((*self).into()); + writer.write(Felt::new(self.as_int())); } } @@ -386,29 +388,29 @@ impl ToFeltRepr for u64 { fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { let lo = (*self & 0xffff_ffff) as u32; let hi = (*self >> 32) as u32; - writer.write(Felt::from_u32(lo)); - writer.write(Felt::from_u32(hi)); + writer.write(Felt::new(lo as u64)); + writer.write(Felt::new(hi as u64)); } } impl ToFeltRepr for u32 { #[inline(always)] fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { - writer.write(Felt::from_u64_unchecked(*self as u64)); + writer.write(Felt::new(*self as u64)); } } impl ToFeltRepr for u8 { #[inline(always)] fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { - writer.write(Felt::from_u64_unchecked(*self as u64)); + writer.write(Felt::new(*self as u64)); } } impl ToFeltRepr for bool { #[inline(always)] fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { - writer.write(Felt::from_u64_unchecked(*self as u64)); + writer.write(Felt::new(*self as u64)); } } @@ -424,9 +426,9 @@ where #[inline(always)] fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { match self { - None => writer.write(Felt::from_u64_unchecked(0)), + None => writer.write(Felt::new(0)), Some(value) => { - writer.write(Felt::from_u64_unchecked(1)); + writer.write(Felt::new(1)); value.write_felt_repr(writer); } } @@ -444,7 +446,7 @@ where fn write_felt_repr(&self, writer: &mut FeltWriter<'_>) { let len = self.len(); assert!(len <= u32::MAX as usize, "Vec: length out of range"); - writer.write(Felt::from_u64_unchecked(len as u64)); + writer.write(Felt::new(len as u64)); let mut i = 0usize; while i < len { diff --git a/sdk/field-repr/tests/Cargo.toml b/sdk/field-repr/tests/Cargo.toml index d95bac27f..5a2256c69 100644 --- a/sdk/field-repr/tests/Cargo.toml +++ b/sdk/field-repr/tests/Cargo.toml @@ -13,9 +13,9 @@ edition.workspace = true publish = false [dependencies] -miden-field = { path = "../../field", version = "0.10.0" } miden-field-repr = { path = "../repr", version = "0.10.0" } miden-core.workspace = true +miden-field.workspace = true [dev-dependencies] # NOTE: Use local paths for dev-only dependency to avoid relying on crates.io during packaging diff --git a/sdk/field-repr/tests/src/offchain.rs b/sdk/field-repr/tests/src/offchain.rs index 2c1ab0022..114523c78 100644 --- a/sdk/field-repr/tests/src/offchain.rs +++ b/sdk/field-repr/tests/src/offchain.rs @@ -5,6 +5,7 @@ use miden_field::Felt; use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; +use p3_field::PrimeField64; /// Serializes `value` off-chain and deserializes it back, asserting equality. fn assert_roundtrip(value: &T) @@ -27,33 +28,33 @@ struct TwoFelts { #[test] fn test_serialization() { let value = TwoFelts { - a: Felt::from_u64_unchecked(12345), - b: Felt::from_u64_unchecked(67890), + a: Felt::new(12345), + b: Felt::new(67890), }; let felts = value.to_felt_repr(); assert_eq!(felts.len(), 2); - assert_eq!(felts[0], Felt::from_u64_unchecked(12345)); - assert_eq!(felts[1], Felt::from_u64_unchecked(67890)); + assert_eq!(felts[0], Felt::new(12345)); + assert_eq!(felts[1], Felt::new(67890)); } #[test] fn test_deserialization() { - let felts = [Felt::from_u64_unchecked(12345), Felt::from_u64_unchecked(67890)]; + let felts = [Felt::new(12345), Felt::new(67890)]; let mut reader = FeltReader::new(&felts); let value = TwoFelts::from_felt_repr(&mut reader).unwrap(); - assert_eq!(value.a, Felt::from_u64_unchecked(12345)); - assert_eq!(value.b, Felt::from_u64_unchecked(67890)); + assert_eq!(value.a, Felt::new(12345)); + assert_eq!(value.b, Felt::new(67890)); } #[test] fn test_roundtrip() { let original = TwoFelts { - a: Felt::from_u64_unchecked(12345), - b: Felt::from_u64_unchecked(67890), + a: Felt::new(12345), + b: Felt::new(67890), }; assert_roundtrip(&original); @@ -173,7 +174,7 @@ struct MixedStruct { #[test] fn test_struct_roundtrip_mixed_types() { let original = MixedStruct { - a: Felt::from_u64_unchecked(11), + a: Felt::new(11), b: 22, c: true, d: 33, @@ -181,10 +182,10 @@ fn test_struct_roundtrip_mixed_types() { let felts = original.to_felt_repr(); assert_eq!(felts.len(), 4); - assert_eq!(felts[0], Felt::from_u64_unchecked(11)); - assert_eq!(felts[1], Felt::from_u64_unchecked(22)); - assert_eq!(felts[2], Felt::from_u64_unchecked(1)); - assert_eq!(felts[3], Felt::from_u64_unchecked(33)); + assert_eq!(felts[0], Felt::new(11)); + assert_eq!(felts[1], Felt::new(22)); + assert_eq!(felts[2], Felt::new(1)); + assert_eq!(felts[3], Felt::new(33)); assert_roundtrip(&original); } @@ -209,7 +210,7 @@ fn test_struct_roundtrip_nested() { let original = Outer { head: 1, inner: Inner { - x: Felt::from_u64_unchecked(2), + x: Felt::new(2), y: 3, }, tail: false, @@ -217,11 +218,11 @@ fn test_struct_roundtrip_nested() { let felts = original.to_felt_repr(); assert_eq!(felts.len(), 5); - assert_eq!(felts[0], Felt::from_u64_unchecked(1)); - assert_eq!(felts[1], Felt::from_u64_unchecked(2)); - assert_eq!(felts[2], Felt::from_u64_unchecked(3)); - assert_eq!(felts[3], Felt::from_u64_unchecked(0)); - assert_eq!(felts[4], Felt::from_u64_unchecked(0)); + assert_eq!(felts[0], Felt::new(1)); + assert_eq!(felts[1], Felt::new(2)); + assert_eq!(felts[2], Felt::new(3)); + assert_eq!(felts[3], Felt::new(0)); + assert_eq!(felts[4], Felt::new(0)); assert_roundtrip(&original); } @@ -238,7 +239,7 @@ enum SimpleEnum { fn test_enum_roundtrip_unit() { let original = SimpleEnum::B; let felts = original.to_felt_repr(); - assert_eq!(felts, vec![Felt::from_u64_unchecked(1)]); + assert_eq!(felts, vec![Felt::new(1)]); assert_roundtrip(&original); } @@ -253,12 +254,12 @@ enum MixedEnum { #[test] fn test_enum_roundtrip_tuple_variant() { - let original = MixedEnum::Pair(Felt::from_u64_unchecked(7), 8); + let original = MixedEnum::Pair(Felt::new(7), 8); let felts = original.to_felt_repr(); assert_eq!(felts.len(), 3); - assert_eq!(felts[0], Felt::from_u64_unchecked(1)); - assert_eq!(felts[1], Felt::from_u64_unchecked(7)); - assert_eq!(felts[2], Felt::from_u64_unchecked(8)); + assert_eq!(felts[0], Felt::new(1)); + assert_eq!(felts[1], Felt::new(7)); + assert_eq!(felts[2], Felt::new(8)); assert_roundtrip(&original); } @@ -267,10 +268,10 @@ fn test_enum_roundtrip_struct_variant() { let original = MixedEnum::Struct { n: 9, flag: true }; let felts = original.to_felt_repr(); assert_eq!(felts.len(), 4); - assert_eq!(felts[0], Felt::from_u64_unchecked(2)); - assert_eq!(felts[1], Felt::from_u64_unchecked(9)); - assert_eq!(felts[2], Felt::from_u64_unchecked(0)); - assert_eq!(felts[3], Felt::from_u64_unchecked(1)); + assert_eq!(felts[0], Felt::new(2)); + assert_eq!(felts[1], Felt::new(9)); + assert_eq!(felts[2], Felt::new(0)); + assert_eq!(felts[3], Felt::new(1)); assert_roundtrip(&original); } @@ -285,9 +286,9 @@ struct WithEnum { #[test] fn test_struct_with_enum_roundtrip() { let original = WithEnum { - prefix: Felt::from_u64_unchecked(10), + prefix: Felt::new(10), msg: MixedEnum::Nested(Inner { - x: Felt::from_u64_unchecked(11), + x: Felt::new(11), y: 12, }), suffix: 13, @@ -296,12 +297,12 @@ fn test_struct_with_enum_roundtrip() { // prefix (1) + msg(tag=3 + Inner(3)) + suffix (1) = 6 felts let felts = original.to_felt_repr(); assert_eq!(felts.len(), 6); - assert_eq!(felts[0], Felt::from_u64_unchecked(10)); - assert_eq!(felts[1], Felt::from_u64_unchecked(3)); - assert_eq!(felts[2], Felt::from_u64_unchecked(11)); - assert_eq!(felts[3], Felt::from_u64_unchecked(12)); - assert_eq!(felts[4], Felt::from_u64_unchecked(0)); - assert_eq!(felts[5], Felt::from_u64_unchecked(13)); + assert_eq!(felts[0], Felt::new(10)); + assert_eq!(felts[1], Felt::new(3)); + assert_eq!(felts[2], Felt::new(11)); + assert_eq!(felts[3], Felt::new(12)); + assert_eq!(felts[4], Felt::new(0)); + assert_eq!(felts[5], Felt::new(13)); assert_roundtrip(&original); } @@ -316,7 +317,7 @@ enum Top { #[test] fn test_enum_nested_with_struct_roundtrip() { let original = Top::Some(WithEnum { - prefix: Felt::from_u64_unchecked(21), + prefix: Felt::new(21), msg: MixedEnum::Struct { n: 22, flag: false }, suffix: 23, }); @@ -338,22 +339,14 @@ struct WithOption { #[test] fn test_struct_roundtrip_option_some() { let original = WithOption { - prefix: Felt::from_u64_unchecked(5), + prefix: Felt::new(5), maybe: Some(42), suffix: true, }; let felts = original.to_felt_repr(); assert_eq!(felts.len(), 4); - assert_eq!( - felts, - vec![ - Felt::from_u64_unchecked(5), - Felt::from_u64_unchecked(1), - Felt::from_u64_unchecked(42), - Felt::from_u64_unchecked(1) - ] - ); + assert_eq!(felts, vec![Felt::new(5), Felt::new(1), Felt::new(42), Felt::new(1)]); assert_roundtrip(&original); } @@ -361,21 +354,14 @@ fn test_struct_roundtrip_option_some() { #[test] fn test_struct_roundtrip_option_none() { let original = WithOption { - prefix: Felt::from_u64_unchecked(7), + prefix: Felt::new(7), maybe: None, suffix: false, }; let felts = original.to_felt_repr(); assert_eq!(felts.len(), 3); - assert_eq!( - felts, - vec![ - Felt::from_u64_unchecked(7), - Felt::from_u64_unchecked(0), - Felt::from_u64_unchecked(0) - ] - ); + assert_eq!(felts, vec![Felt::new(7), Felt::new(0), Felt::new(0)]); assert_roundtrip(&original); } @@ -391,7 +377,7 @@ struct WithVec { #[test] fn test_struct_roundtrip_vec_non_empty() { let original = WithVec { - prefix: Felt::from_u64_unchecked(9), + prefix: Felt::new(9), items: vec![1, 2, 3], suffix: true, }; @@ -402,12 +388,12 @@ fn test_struct_roundtrip_vec_non_empty() { assert_eq!( felts, vec![ - Felt::from_u64_unchecked(9), - Felt::from_u64_unchecked(3), - Felt::from_u64_unchecked(1), - Felt::from_u64_unchecked(2), - Felt::from_u64_unchecked(3), - Felt::from_u64_unchecked(1), + Felt::new(9), + Felt::new(3), + Felt::new(1), + Felt::new(2), + Felt::new(3), + Felt::new(1), ] ); @@ -417,21 +403,14 @@ fn test_struct_roundtrip_vec_non_empty() { #[test] fn test_struct_roundtrip_vec_empty() { let original = WithVec { - prefix: Felt::from_u64_unchecked(10), + prefix: Felt::new(10), items: vec![], suffix: false, }; let felts = original.to_felt_repr(); assert_eq!(felts.len(), 3); - assert_eq!( - felts, - vec![ - Felt::from_u64_unchecked(10), - Felt::from_u64_unchecked(0), - Felt::from_u64_unchecked(0) - ] - ); + assert_eq!(felts, vec![Felt::new(10), Felt::new(0), Felt::new(0)]); assert_roundtrip(&original); } @@ -442,17 +421,10 @@ struct TupleStruct(u32, bool, Felt); #[test] fn test_tuple_struct_roundtrip() { - let original = TupleStruct(22, true, Felt::from_u64_unchecked(33)); + let original = TupleStruct(22, true, Felt::new(33)); let felts = original.to_felt_repr(); - assert_eq!( - felts, - vec![ - Felt::from_u64_unchecked(22), - Felt::from_u64_unchecked(1), - Felt::from_u64_unchecked(33) - ] - ); + assert_eq!(felts, vec![Felt::new(22), Felt::new(1), Felt::new(33)]); assert_roundtrip(&original); } @@ -467,8 +439,8 @@ fn test_u64_roundtrip_uses_u32_limbs() { let expected_lo = value & 0xffff_ffff; let expected_hi = value >> 32; - assert_eq!(felts[0].as_u64(), expected_lo); - assert_eq!(felts[1].as_u64(), expected_hi); + assert_eq!(felts[0].as_canonical_u64(), expected_lo); + assert_eq!(felts[1].as_canonical_u64(), expected_hi); let mut reader = FeltReader::new(&felts); let roundtripped = u64::from_felt_repr(&mut reader).unwrap(); diff --git a/sdk/field-repr/tests/src/onchain.rs b/sdk/field-repr/tests/src/onchain.rs index ae10db74c..74fa4a39c 100644 --- a/sdk/field-repr/tests/src/onchain.rs +++ b/sdk/field-repr/tests/src/onchain.rs @@ -10,12 +10,17 @@ use miden_field::Felt; use miden_field_repr::{Felt as ReprFelt, FeltReader, FromFeltRepr, ToFeltRepr}; use miden_integration_tests::testing::{Initializer, eval_package}; use midenc_frontend_wasm::WasmTranslationConfig; +use p3_field::PrimeField64; use crate::build_felt_repr_test; /// Converts `miden-field-repr` felts to `miden-core` felts for VM memory initialization. fn to_core_felts(felts: &[ReprFelt]) -> Vec { - felts.iter().copied().map(Into::into).collect() + felts + .iter() + .copied() + .map(|felt| miden_core::Felt::new(felt.as_canonical_u64())) + .collect() } fn read_vec_felts( @@ -41,7 +46,7 @@ fn read_vec_felts( .read_from_rust_memory(word_addr) .unwrap_or_else(|| panic!("Failed to read word for element {i}")); let elem_in_word = ((byte_addr % 16) / 4) as usize; - result.push(word[elem_in_word].0.into()); + result.push(ReprFelt::new(word[elem_in_word].0.as_int())); } result @@ -58,8 +63,8 @@ struct TwoFelts { #[test] fn test_felt_reader() { let original = TwoFelts { - a: Felt::from_u64_unchecked(12345), - b: Felt::from_u64_unchecked(67890), + a: Felt::new(12345), + b: Felt::new(67890), }; let serialized = original.to_felt_repr(); @@ -86,8 +91,8 @@ fn test_felt_reader() { let out_byte_addr = out_elem_addr * 4; let input_word: Vec = vec![ - serialized[0].into(), - serialized[1].into(), + miden_core::Felt::new(serialized[0].as_canonical_u64()), + miden_core::Felt::new(serialized[1].as_canonical_u64()), miden_core::Felt::new(0), miden_core::Felt::new(0), ]; @@ -107,7 +112,10 @@ fn test_felt_reader() { .read_from_rust_memory(out_byte_addr) .expect("Failed to read result from memory"); - let result_felts = [result_word[0].0.into(), result_word[1].0.into()]; + let result_felts = [ + ReprFelt::new(result_word[0].0.as_int()), + ReprFelt::new(result_word[1].0.as_int()), + ]; let mut reader = FeltReader::new(&result_felts); let result_struct = TwoFelts::from_felt_repr(&mut reader).unwrap(); @@ -126,8 +134,8 @@ fn test_felt_reader() { #[test] fn test_two_felts_struct_round_trip() { let original = TwoFelts { - a: Felt::from_u64_unchecked(12345), - b: Felt::from_u64_unchecked(67890), + a: Felt::new(12345), + b: Felt::new(67890), }; let serialized = original.to_felt_repr(); @@ -156,7 +164,10 @@ fn test_two_felts_struct_round_trip() { let in_byte_addr = in_elem_addr * 4; let out_byte_addr = out_elem_addr * 4; - let input_felts: Vec = vec![serialized[0].into(), serialized[1].into()]; + let input_felts: Vec = vec![ + miden_core::Felt::new(serialized[0].as_canonical_u64()), + miden_core::Felt::new(serialized[1].as_canonical_u64()), + ]; let initializers = [Initializer::MemoryFelts { addr: in_elem_addr, @@ -193,16 +204,16 @@ struct FiveFelts { #[test] fn test_five_felts_struct_round_trip() { let original = FiveFelts { - a: Felt::from_u64_unchecked(11111), - b: Felt::from_u64_unchecked(22222), - c: Felt::from_u64_unchecked(33333), - d: Felt::from_u64_unchecked(44444), - e: Felt::from_u64_unchecked(55555), + a: Felt::new(11111), + b: Felt::new(22222), + c: Felt::new(33333), + d: Felt::new(44444), + e: Felt::new(55555), }; let serialized = original.to_felt_repr(); assert_eq!(serialized.len(), 5); - assert_eq!(serialized[4], Felt::from_u64_unchecked(55555)); + assert_eq!(serialized[4], Felt::new(55555)); let onchain_code = r#"(input: [Felt; 5]) -> Vec { use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; @@ -359,10 +370,10 @@ struct MixedTypesNoU64 { #[test] fn test_mixed_types_no_u64_round_trip() { let original = MixedTypesNoU64 { - f1: Felt::from_u64_unchecked(111111), - f2: Felt::from_u64_unchecked(222222), - f3: Felt::from_u64_unchecked(333333), - f4: Felt::from_u64_unchecked(444444), + f1: Felt::new(111111), + f2: Felt::new(222222), + f3: Felt::new(333333), + f4: Felt::new(444444), x: 55555, y: 66, }; @@ -450,9 +461,9 @@ struct Outer { #[test] fn test_nested_struct_round_trip() { let original = Outer { - a: Felt::from_u64_unchecked(111111), + a: Felt::new(111111), inner: Inner { - x: Felt::from_u64_unchecked(222222), + x: Felt::new(222222), y: 333333, }, b: 44444, @@ -544,14 +555,14 @@ fn test_enum_unit_round_trip() { } let original = Wrapper { - pad: Felt::from_u64_unchecked(999), + pad: Felt::new(999), value: SimpleEnum::B, }; let serialized = original.to_felt_repr(); assert_eq!(serialized.len(), 2); - assert_eq!(serialized[0], Felt::from_u64_unchecked(999)); - assert_eq!(serialized[1], Felt::from_u64_unchecked(1)); + assert_eq!(serialized[0], Felt::new(999)); + assert_eq!(serialized[1], Felt::new(1)); let onchain_code = r#"(input: [Felt; 2]) -> Vec { use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; @@ -613,13 +624,13 @@ fn test_enum_tuple_round_trip() { Struct { x: u64, flag: bool }, } - let original = MixedEnum::Pair(Felt::from_u64_unchecked(111), 222); + let original = MixedEnum::Pair(Felt::new(111), 222); let serialized = original.to_felt_repr(); assert_eq!(serialized.len(), 3); - assert_eq!(serialized[0], Felt::from_u64_unchecked(1)); - assert_eq!(serialized[1], Felt::from_u64_unchecked(111)); - assert_eq!(serialized[2], Felt::from_u64_unchecked(222)); + assert_eq!(serialized[0], Felt::new(1)); + assert_eq!(serialized[1], Felt::new(111)); + assert_eq!(serialized[2], Felt::new(222)); let onchain_code = r#"(input: [Felt; 3]) -> Vec { use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; @@ -689,10 +700,10 @@ fn test_struct_with_enum_round_trip() { } let original = Outer { - prefix: Felt::from_u64_unchecked(999), + prefix: Felt::new(999), kind: Kind::Inline { inner: Inner { - a: Felt::from_u64_unchecked(111), + a: Felt::new(111), b: 222, }, ok: true, @@ -783,8 +794,8 @@ fn test_enum_nested_with_struct_round_trip() { } let original = Top::Wrap(Wrapper { - left: Felt::from_u64_unchecked(7), - right: Felt::from_u64_unchecked(8), + left: Felt::new(7), + right: Felt::new(8), state: State::B { n: 999_999, f: false, @@ -862,12 +873,12 @@ struct WithOption { #[test] fn test_struct_with_option_round_trip() { let original_none = WithOption { - prefix: Felt::from_u64_unchecked(7), + prefix: Felt::new(7), maybe: None, suffix: false, }; let original_some = WithOption { - prefix: Felt::from_u64_unchecked(5), + prefix: Felt::new(5), maybe: Some(42), suffix: true, }; @@ -908,7 +919,7 @@ fn test_struct_with_option_round_trip() { // `[Felt; 4]` so we can reuse the same compiled package for both `None` and `Some`. // The extra trailing `0` is never read by `FromFeltRepr`. let mut input_none = serialized_none.clone(); - input_none.resize(4, ReprFelt::from_u64_unchecked(0)); + input_none.resize(4, ReprFelt::new(0)); let initializers = [Initializer::MemoryFelts { addr: in_elem_addr, felts: Cow::from(to_core_felts(&input_none)), @@ -952,7 +963,7 @@ struct WithVec { #[test] fn test_struct_with_vec_round_trip() { let original = WithVec { - prefix: Felt::from_u64_unchecked(9), + prefix: Felt::new(9), items: vec![1, 2, 3], suffix: true, }; @@ -1010,16 +1021,9 @@ struct TupleStruct(u32, bool, Felt); #[test] fn test_tuple_struct_round_trip() { - let original = TupleStruct(22, true, Felt::from_u64_unchecked(33)); + let original = TupleStruct(22, true, Felt::new(33)); let serialized = original.to_felt_repr(); - assert_eq!( - serialized, - vec![ - ReprFelt::from_u64_unchecked(22), - ReprFelt::from_u64_unchecked(1), - ReprFelt::from_u64_unchecked(33), - ] - ); + assert_eq!(serialized, vec![ReprFelt::new(22), ReprFelt::new(1), ReprFelt::new(33),]); let onchain_code = r#"(input: [Felt; 3]) -> Vec { use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; diff --git a/sdk/field/build.rs b/sdk/field/build.rs deleted file mode 100644 index 733da30b9..000000000 --- a/sdk/field/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -use std::env; - -fn main() { - println!("cargo::rerun-if-env-changed=MIDENC_TARGET_IS_MIDEN_VM"); - println!("cargo::rustc-check-cfg=cfg(miden)"); - - // `cargo-miden` compiles Rust to Wasm which will then be compiled to Miden VM code by `midenc`. - // When targeting a "real" Wasm runtime (e.g. `wasm32-unknown-unknown` for a web SDK), we want a - // regular felt representation instead. - if env::var_os("MIDENC_TARGET_IS_MIDEN_VM").is_some() { - println!("cargo::rustc-cfg=miden"); - } -} diff --git a/sdk/field/src/lib.rs b/sdk/field/src/lib.rs deleted file mode 100644 index 2bab6fd7c..000000000 --- a/sdk/field/src/lib.rs +++ /dev/null @@ -1,136 +0,0 @@ -//! A unified `Felt` for on-chain and off-chain Miden Rust code. -//! -//! This crate provides a single `Felt` type that can be used in both on-chain (Wasm) and off-chain -//! (native) Rust code: -//! - When targeting the Miden VM via Wasm, `Felt` is backed by an on-chain felt. -//! - Otherwise, `Felt` is backed by a felt (`miden-core`'s field element). - -#![no_std] -#![deny(warnings)] - -use core::{fmt, hash::Hash}; - -/// The field modulus, `2^64 - 2^32 + 1`. -pub const MODULUS: u64 = 0xffff_ffff_0000_0001; - -/// Errors returned by [`Felt::new`]. -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub enum FeltError { - /// The provided value was not a valid canonical felt. - InvalidValue, -} - -/// A crate-local trait capturing the API surface shared by all `Felt` representations. -/// -/// This is used to ensure the on-chain and off-chain implementations don't drift in the common -/// "core" operations, and that required operator traits are implemented consistently. -pub(crate) trait FeltImpl: - Copy - + Clone - + fmt::Debug - + fmt::Display - + Eq - + Ord - + Hash - + core::ops::Add - + core::ops::Sub - + core::ops::Mul - + core::ops::Div - + core::ops::Neg - + core::ops::AddAssign - + core::ops::SubAssign - + core::ops::MulAssign - + core::ops::DivAssign -{ - /// Creates a `Felt` from `value`. - /// - /// # Panics - /// - /// Panics if `value > Felt::M`. - fn from_u64_unchecked(value: u64) -> Self; - - /// Creates a `Felt` from a `u32` value. - fn from_u32(value: u32) -> Self; - - /// Returns the canonical `u64` value of this felt. - fn as_u64(self) -> u64; - - /// Returns true if this felt is odd. - fn is_odd(self) -> bool; - - /// Returns `self^-1`. Fails if `self = 0`. - fn inv(self) -> Self; - - /// Returns `2^self`. Fails if `self > 63`. - fn pow2(self) -> Self; - - /// Returns `self^other`. - fn exp(self, other: Self) -> Self; -} - -#[cfg(all(target_family = "wasm", miden))] -mod wasm32; -#[cfg(all(target_family = "wasm", miden))] -pub use wasm32::Felt; - -#[cfg(not(all(target_family = "wasm", miden)))] -mod native; -#[cfg(not(all(target_family = "wasm", miden)))] -pub use native::Felt; - -impl Felt { - /// Field modulus = 2^64 - 2^32 + 1. - pub const M: u64 = MODULUS; - - /// Creates a `Felt` from `value` without range checks. - #[inline(always)] - pub fn from_u64_unchecked(value: u64) -> Self { - ::from_u64_unchecked(value) - } - - /// Creates a `Felt` from a `u32` value. - #[inline(always)] - pub fn from_u32(value: u32) -> Self { - ::from_u32(value) - } - - /// Creates a `Felt` from `value`, returning an error if it is out of range. - #[inline(always)] - pub fn new(value: u64) -> Result { - if value >= Self::M { - Err(FeltError::InvalidValue) - } else { - Ok(Self::from_u64_unchecked(value)) - } - } - - /// Returns the canonical `u64` value of this felt. - #[inline(always)] - pub fn as_u64(self) -> u64 { - ::as_u64(self) - } - - /// Returns true if this felt is odd. - #[inline(always)] - pub fn is_odd(self) -> bool { - ::is_odd(self) - } - - /// Returns `self^-1`. Fails if `self = 0`. - #[inline(always)] - pub fn inv(self) -> Self { - ::inv(self) - } - - /// Returns `2^self`. Fails if `self > 63`. - #[inline(always)] - pub fn pow2(self) -> Self { - ::pow2(self) - } - - /// Returns `self^other`. - #[inline(always)] - pub fn exp(self, other: Self) -> Self { - ::exp(self, other) - } -} diff --git a/sdk/field/src/native.rs b/sdk/field/src/native.rs deleted file mode 100644 index 1b352f699..000000000 --- a/sdk/field/src/native.rs +++ /dev/null @@ -1,203 +0,0 @@ -//! Off-chain implementation of [`crate::Felt`]. - -use miden_core::{Felt as CoreFelt, FieldElement}; - -use crate::FeltImpl; - -#[repr(transparent)] -#[derive(Copy, Clone, Debug)] -/// A `Felt` represented as a felt (`miden_core::Felt`). -pub struct Felt(pub miden_core::Felt); - -impl FeltImpl for Felt { - #[inline(always)] - fn from_u64_unchecked(value: u64) -> Self { - assert!(value <= Felt::M, "value {value} is larger than field modulus {}", Felt::M); - Self(CoreFelt::new(value)) - } - - #[inline(always)] - fn from_u32(value: u32) -> Self { - Self::from_u64_unchecked(value as u64) - } - - #[inline(always)] - fn as_u64(self) -> u64 { - self.0.as_int() - } - - #[inline(always)] - fn is_odd(self) -> bool { - self.as_u64() & 1 == 1 - } - - #[inline(always)] - fn inv(self) -> Self { - Self(self.0.inv()) - } - - #[inline(always)] - fn pow2(self) -> Self { - let n = self.as_u64(); - assert!(n <= 63, "pow2: exponent out of range"); - Self(CoreFelt::new(1u64 << (n as u32))) - } - - #[inline(always)] - fn exp(self, other: Self) -> Self { - Self(self.0.exp(other.as_u64())) - } -} - -impl From for Felt { - fn from(value: CoreFelt) -> Self { - Self(value) - } -} - -impl From for CoreFelt { - fn from(value: Felt) -> Self { - value.0 - } -} - -impl From for u64 { - fn from(felt: Felt) -> u64 { - felt.as_u64() - } -} - -impl From for Felt { - fn from(value: u32) -> Self { - Self::from_u32(value) - } -} - -impl From for Felt { - fn from(value: u16) -> Self { - Self::from_u64_unchecked(value as u64) - } -} - -impl From for Felt { - fn from(value: u8) -> Self { - Self::from_u64_unchecked(value as u64) - } -} - -#[cfg(target_pointer_width = "32")] -impl From for Felt { - fn from(value: usize) -> Self { - Self::from_u64_unchecked(value as u64) - } -} - -impl core::ops::Add for Felt { - type Output = Self; - - #[inline(always)] - fn add(self, other: Self) -> Self { - Self(self.0 + other.0) - } -} - -impl core::ops::AddAssign for Felt { - #[inline(always)] - fn add_assign(&mut self, other: Self) { - *self = *self + other; - } -} - -impl core::ops::Sub for Felt { - type Output = Self; - - #[inline(always)] - fn sub(self, other: Self) -> Self { - Self(self.0 - other.0) - } -} - -impl core::ops::SubAssign for Felt { - #[inline(always)] - fn sub_assign(&mut self, other: Self) { - *self = *self - other; - } -} - -impl core::ops::Mul for Felt { - type Output = Self; - - #[inline(always)] - fn mul(self, other: Self) -> Self { - Self(self.0 * other.0) - } -} - -impl core::ops::MulAssign for Felt { - #[inline(always)] - fn mul_assign(&mut self, other: Self) { - *self = *self * other; - } -} - -impl core::ops::Div for Felt { - type Output = Self; - - #[inline(always)] - fn div(self, other: Self) -> Self { - Self(self.0 / other.0) - } -} - -impl core::ops::DivAssign for Felt { - #[inline(always)] - fn div_assign(&mut self, other: Self) { - *self = *self / other; - } -} - -impl core::ops::Neg for Felt { - type Output = Self; - - #[inline(always)] - fn neg(self) -> Self { - Self(-self.0) - } -} - -impl PartialEq for Felt { - #[inline(always)] - fn eq(&self, other: &Self) -> bool { - self.as_u64() == other.as_u64() - } -} - -impl Eq for Felt {} - -impl PartialOrd for Felt { - #[inline(always)] - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Felt { - #[inline(always)] - fn cmp(&self, other: &Self) -> core::cmp::Ordering { - self.as_u64().cmp(&other.as_u64()) - } -} - -impl core::fmt::Display for Felt { - #[inline] - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - core::fmt::Display::fmt(&self.as_u64(), f) - } -} - -impl core::hash::Hash for Felt { - #[inline] - fn hash(&self, state: &mut H) { - core::hash::Hash::hash(&self.as_u64(), state); - } -} diff --git a/sdk/field/src/wasm32.rs b/sdk/field/src/wasm32.rs deleted file mode 100644 index 550ef65db..000000000 --- a/sdk/field/src/wasm32.rs +++ /dev/null @@ -1,296 +0,0 @@ -//! On-chain implementation of [`crate::Felt`]. - -use crate::FeltImpl; - -#[repr(transparent)] -#[derive(Copy, Clone, Debug)] -/// A `Felt` represented as an on-chain felt. -pub struct Felt { - /// The backing type is `f32` which will be treated as a felt by the compiler. - /// We're basically hijacking the Wasm `f32` type and treat as felt. - pub inner: f32, - // We cannot define this type as `Felt(f32)` since there is no struct tuple support in WIT. - // For the type remapping to work the bindings are expecting the remapped type to be the same - // shape as the one generated from WIT. - // In WIT it's defined as - // ```wit - // record felt { - // inner: f32, - // } - // - //``` - // see sdk/base-macros/wit/miden.wit so we have to define it like that here. - // -} - -unsafe extern "C" { - #[link_name = "intrinsics::felt::from_u64_unchecked"] - pub(crate) fn extern_from_u64_unchecked(value: u64) -> Felt; - - #[link_name = "intrinsics::felt::from_u32"] - pub(crate) fn extern_from_u32(value: u32) -> Felt; - - #[link_name = "intrinsics::felt::as_u64"] - pub(crate) fn extern_as_u64(felt: Felt) -> u64; - - #[link_name = "intrinsics::felt::sub"] - pub(crate) fn extern_sub(a: Felt, b: Felt) -> Felt; - - #[link_name = "intrinsics::felt::mul"] - pub(crate) fn extern_mul(a: Felt, b: Felt) -> Felt; - - #[link_name = "intrinsics::felt::div"] - pub(crate) fn extern_div(a: Felt, b: Felt) -> Felt; - - #[link_name = "intrinsics::felt::neg"] - pub(crate) fn extern_neg(a: Felt) -> Felt; - - #[link_name = "intrinsics::felt::inv"] - pub(crate) fn extern_inv(a: Felt) -> Felt; - - #[link_name = "intrinsics::felt::pow2"] - pub(crate) fn extern_pow2(a: Felt) -> Felt; - - #[link_name = "intrinsics::felt::exp"] - pub(crate) fn extern_exp(a: Felt, b: Felt) -> Felt; - - #[link_name = "intrinsics::felt::eq"] - pub(crate) fn extern_eq(a: Felt, b: Felt) -> i32; - - #[link_name = "intrinsics::felt::gt"] - pub(crate) fn extern_gt(a: Felt, b: Felt) -> i32; - - #[link_name = "intrinsics::felt::lt"] - pub(crate) fn extern_lt(a: Felt, b: Felt) -> i32; - - #[link_name = "intrinsics::felt::ge"] - pub(crate) fn extern_ge(a: Felt, b: Felt) -> i32; - - #[link_name = "intrinsics::felt::le"] - pub(crate) fn extern_le(a: Felt, b: Felt) -> i32; - - #[link_name = "intrinsics::felt::is_odd"] - pub(crate) fn extern_is_odd(a: Felt) -> i32; - - #[link_name = "intrinsics::felt::add"] - pub(crate) fn extern_add(a: Felt, b: Felt) -> Felt; -} - -// Note: inherent `Felt` methods live in `sdk/field/src/lib.rs` and delegate to the crate-local -// `FeltImpl` trait to ensure the on-chain/off-chain APIs don't drift. - -impl FeltImpl for Felt { - #[inline(always)] - fn from_u64_unchecked(value: u64) -> Self { - assert!(value <= Felt::M, "value {value} is larger than field modulus {}", Felt::M); - unsafe { extern_from_u64_unchecked(value) } - } - - #[inline(always)] - fn from_u32(value: u32) -> Self { - unsafe { extern_from_u32(value) } - } - - #[inline(always)] - fn as_u64(self) -> u64 { - unsafe { extern_as_u64(self) } - } - - #[inline(always)] - fn is_odd(self) -> bool { - unsafe { extern_is_odd(self) != 0 } - } - - #[inline(always)] - fn inv(self) -> Self { - unsafe { extern_inv(self) } - } - - #[inline(always)] - fn pow2(self) -> Self { - unsafe { extern_pow2(self) } - } - - #[inline(always)] - fn exp(self, other: Self) -> Self { - unsafe { extern_exp(self, other) } - } -} - -impl From for u64 { - fn from(felt: Felt) -> u64 { - felt.as_u64() - } -} - -impl From for Felt { - fn from(value: u32) -> Self { - Self { - inner: f32::from_bits(value), - } - } -} - -impl From for Felt { - fn from(value: u16) -> Self { - Self { - inner: f32::from_bits(value as u32), - } - } -} - -impl From for Felt { - fn from(value: u8) -> Self { - Self { - inner: f32::from_bits(value as u32), - } - } -} - -#[cfg(target_pointer_width = "32")] -impl From for Felt { - fn from(value: usize) -> Self { - Self { - inner: f32::from_bits(value as u32), - } - } -} - -impl core::ops::Add for Felt { - type Output = Self; - - #[inline(always)] - fn add(self, other: Self) -> Self { - unsafe { extern_add(self, other) } - } -} - -impl core::ops::AddAssign for Felt { - #[inline(always)] - fn add_assign(&mut self, other: Self) { - *self = *self + other; - } -} - -impl core::ops::Sub for Felt { - type Output = Self; - - #[inline(always)] - fn sub(self, other: Self) -> Self { - unsafe { extern_sub(self, other) } - } -} - -impl core::ops::SubAssign for Felt { - #[inline(always)] - fn sub_assign(&mut self, other: Self) { - *self = *self - other; - } -} - -impl core::ops::Mul for Felt { - type Output = Self; - - #[inline(always)] - fn mul(self, other: Self) -> Self { - unsafe { extern_mul(self, other) } - } -} - -impl core::ops::MulAssign for Felt { - #[inline(always)] - fn mul_assign(&mut self, other: Self) { - *self = *self * other; - } -} - -impl core::ops::Div for Felt { - type Output = Self; - - #[inline(always)] - fn div(self, other: Self) -> Self { - unsafe { extern_div(self, other) } - } -} - -impl core::ops::DivAssign for Felt { - #[inline(always)] - fn div_assign(&mut self, other: Self) { - *self = *self / other; - } -} - -impl core::ops::Neg for Felt { - type Output = Self; - - #[inline(always)] - fn neg(self) -> Self { - unsafe { extern_neg(self) } - } -} - -impl PartialEq for Felt { - #[inline(always)] - fn eq(&self, other: &Self) -> bool { - unsafe { extern_eq(*self, *other) == 1 } - } -} - -impl Eq for Felt {} - -impl PartialOrd for Felt { - #[inline(always)] - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } - - #[inline(always)] - fn gt(&self, other: &Self) -> bool { - unsafe { extern_gt(*self, *other) != 0 } - } - - #[inline(always)] - fn ge(&self, other: &Self) -> bool { - unsafe { extern_ge(*self, *other) != 0 } - } - - #[inline(always)] - fn lt(&self, other: &Self) -> bool { - unsafe { extern_lt(*self, *other) != 0 } - } - - #[inline(always)] - fn le(&self, other: &Self) -> bool { - unsafe { extern_le(*self, *other) != 0 } - } -} - -impl Ord for Felt { - #[inline(always)] - fn cmp(&self, other: &Self) -> core::cmp::Ordering { - if self.lt(other) { - core::cmp::Ordering::Less - } else if self.gt(other) { - core::cmp::Ordering::Greater - } else { - core::cmp::Ordering::Equal - } - } -} - -// Note: public `assert` helpers live in `sdk/field/src/lib.rs` to preserve their stable paths in -// emitted WASM and expected-file tests. - -impl core::fmt::Display for Felt { - #[inline] - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - core::fmt::Display::fmt(&self.as_u64(), f) - } -} - -impl core::hash::Hash for Felt { - #[inline] - fn hash(&self, state: &mut H) { - core::hash::Hash::hash(&self.as_u64(), state); - } -} diff --git a/sdk/sdk/Cargo.toml b/sdk/sdk/Cargo.toml index 5c83c4166..4511ab380 100644 --- a/sdk/sdk/Cargo.toml +++ b/sdk/sdk/Cargo.toml @@ -22,6 +22,7 @@ miden-base-macros = { version = "0.10.0", path = "../base-macros" } miden-base-sys = { version = "0.10.0", path = "../base-sys" } miden-field-repr = { version = "0.10.0", path = "../field-repr/repr" } miden-field = { version = "0.10.0", path = "../field" } +miden-field.workspace = true wit-bindgen = { version = "0.46", default-features = false, features = ["macros"] } [features] diff --git a/sdk/sdk/src/lib.rs b/sdk/sdk/src/lib.rs index 2e71404d2..fbbea2eb7 100644 --- a/sdk/sdk/src/lib.rs +++ b/sdk/sdk/src/lib.rs @@ -6,8 +6,6 @@ pub use miden_base_macros::{component, export_type, generate, note, note_script, pub use miden_base_sys::bindings::*; /// Unified `Felt` and related helpers. pub use miden_field as felt; -/// Error type for [`felt::Felt::new`]. -pub use miden_field::FeltError; /// Felt representation helpers. pub use miden_field_repr as felt_repr; pub use miden_sdk_alloc::BumpAlloc; diff --git a/sdk/stdlib-sys/Cargo.toml b/sdk/stdlib-sys/Cargo.toml index b17008a13..62aac7d1f 100644 --- a/sdk/stdlib-sys/Cargo.toml +++ b/sdk/stdlib-sys/Cargo.toml @@ -17,7 +17,7 @@ links = "miden_stdlib_sys_stubs" crate-type = ["rlib"] [dependencies] -miden-field = { version = "0.10.0", path = "../field" } +miden-field.workspace = true [features] default = [] diff --git a/sdk/stdlib-sys/src/intrinsics/felt.rs b/sdk/stdlib-sys/src/intrinsics/felt.rs index 7079ba8a2..0a5e0e649 100644 --- a/sdk/stdlib-sys/src/intrinsics/felt.rs +++ b/sdk/stdlib-sys/src/intrinsics/felt.rs @@ -1,6 +1,6 @@ //! Felt-related intrinsics and helpers. -pub use miden_field::{Felt, FeltError}; +pub use miden_field::Felt; #[cfg(all(target_family = "wasm", miden))] unsafe extern "C" { @@ -39,7 +39,7 @@ pub fn assert_eq(a: Felt, b: Felt) { #[cfg(not(all(target_family = "wasm", miden)))] #[inline(always)] pub fn assert(a: Felt) { - if a != Felt::from_u64_unchecked(1) { + if a != Felt::new(1) { panic!("assert: expected 1"); } } @@ -48,7 +48,7 @@ pub fn assert(a: Felt) { #[cfg(not(all(target_family = "wasm", miden)))] #[inline(always)] pub fn assertz(a: Felt) { - if a != Felt::from_u64_unchecked(0) { + if a != Felt::new(0) { panic!("assertz: expected 0"); } } @@ -70,10 +70,6 @@ macro_rules! felt { ($value:literal) => {{ const VALUE: u64 = $value as u64; // assert!(VALUE <= Felt::M, "Invalid Felt value, must be >= 0 and <= 2^64 - 2^32 + 1"); - // Temporarily switch to `from_u32` to use `bitcast` and avoid checks. - // see https://github.com/0xMiden/compiler/issues/361 - assert!(VALUE <= u32::MAX as u64, "Invalid value, must be >= 0 and <= 2^32"); - const VALUE_U32: u32 = $value as u32; - $crate::Felt::from_u32(VALUE_U32) + $crate::Felt::new(VALUE) }}; } diff --git a/sdk/stdlib-sys/src/intrinsics/word.rs b/sdk/stdlib-sys/src/intrinsics/word.rs index 41b61d540..dc97ffc7d 100644 --- a/sdk/stdlib-sys/src/intrinsics/word.rs +++ b/sdk/stdlib-sys/src/intrinsics/word.rs @@ -23,12 +23,7 @@ impl Word { #[inline(always)] pub fn from_u64_unchecked(a: u64, b: u64, c: u64, d: u64) -> Self { Self { - inner: ( - Felt::from_u64_unchecked(a), - Felt::from_u64_unchecked(b), - Felt::from_u64_unchecked(c), - Felt::from_u64_unchecked(d), - ), + inner: (Felt::new(a), Felt::new(b), Felt::new(c), Felt::new(d)), } } diff --git a/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs b/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs index 2930e8a90..b06a529dd 100644 --- a/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs +++ b/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs @@ -279,7 +279,7 @@ mod imp { let result_ptr = ret_area.as_mut_ptr() as *mut Felt; let miden_ptr = rust_ptr / 4; // Since our BumpAlloc produces word-aligned allocations the pointer should be word-aligned - assert_eq(Felt::from_u32(miden_ptr % 4), felt!(0)); + assert_eq(Felt::new((miden_ptr % 4) as u64), felt!(0)); if element_count.is_multiple_of(4) { let start_addr = miden_ptr; @@ -306,7 +306,7 @@ mod imp { let miden_ptr = rust_ptr / 4; // It's safe to assume the `words` ptr is word-aligned. - assert_eq(Felt::from_u32(miden_ptr % 4), felt!(0)); + assert_eq(Felt::new((miden_ptr % 4) as u64), felt!(0)); unsafe { let mut ret_area = core::mem::MaybeUninit::::uninit(); diff --git a/sdk/stdlib-sys/src/stdlib/mem.rs b/sdk/stdlib-sys/src/stdlib/mem.rs index dcc3bfa5b..31d7fe009 100644 --- a/sdk/stdlib-sys/src/stdlib/mem.rs +++ b/sdk/stdlib-sys/src/stdlib/mem.rs @@ -185,7 +185,7 @@ pub fn pipe_double_words_to_memory(_num_words: Felt) -> (Word, Vec) { #[cfg(all(target_family = "wasm", miden))] pub fn adv_load_preimage(num_words: Felt, commitment: Word) -> Vec { // Allocate a Vec with the specified capacity - let num_words_usize = num_words.as_u64() as usize; + let num_words_usize = num_words.as_canonical_u64() as usize; let num_felts = num_words_usize * 4; let mut result: Vec = Vec::with_capacity(num_felts); diff --git a/tests/integration/src/rust_masm_tests/abi_transform/advice_map.rs b/tests/integration/src/rust_masm_tests/abi_transform/advice_map.rs index e9430d34c..763eadf26 100644 --- a/tests/integration/src/rust_masm_tests/abi_transform/advice_map.rs +++ b/tests/integration/src/rust_masm_tests/abi_transform/advice_map.rs @@ -30,9 +30,9 @@ fn test_adv_load_preimage() { let num_felts = intrinsics::advice::adv_push_mapvaln(key.clone()); - let num_felts_u64 = num_felts.as_u64(); - assert_eq(Felt::from_u32((num_felts_u64 % 4) as u32), felt!(0)); - let num_words = Felt::from_u64_unchecked(num_felts_u64 / 4); + let num_felts_u64 = num_felts.as_canonical_u64(); + assert_eq(Felt::new((num_felts_u64 % 4) as u64), felt!(0)); + let num_words = Felt::new(num_felts_u64 / 4); let commitment = key; let input = adv_load_preimage(num_words, commitment); diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/account.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/account.rs index 8b97aa2f0..1b9eacd12 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/account.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/account.rs @@ -128,7 +128,7 @@ fn rust_sdk_account_get_initial_balance_binding() { run_account_binding_test( "rust_sdk_account_get_initial_balance_binding", "pub fn binding(&self) -> Felt { - let faucet = AccountId { prefix: Felt::from_u32(1), suffix: Felt::from_u32(0) }; + let faucet = AccountId { prefix: Felt::new(1), suffix: Felt::new(0) }; self.get_initial_balance(faucet) }", ); @@ -139,11 +139,11 @@ fn rust_sdk_account_has_non_fungible_asset_binding() { run_account_binding_test( "rust_sdk_account_has_non_fungible_asset_binding", "pub fn binding(&self) -> Felt { - let asset = Asset::from([Felt::from_u32(0); 4]); + let asset = Asset::from([Felt::new(0); 4]); if self.has_non_fungible_asset(asset) { - Felt::from_u32(1) + Felt::new(1) } else { - Felt::from_u32(0) + Felt::new(0) } }", ); @@ -194,11 +194,11 @@ fn rust_sdk_account_has_procedure_binding() { run_account_binding_test( "rust_sdk_account_has_procedure_binding", "pub fn binding(&self) -> Felt { - let proc_root = Word::from([Felt::from_u32(0); 4]); + let proc_root = Word::from([Felt::new(0); 4]); if self.has_procedure(proc_root) { - Felt::from_u32(1) + Felt::new(1) } else { - Felt::from_u32(0) + Felt::new(0) } }", ); @@ -209,11 +209,11 @@ fn rust_sdk_account_was_procedure_called_binding() { run_account_binding_test( "rust_sdk_account_was_procedure_called_binding", "pub fn binding(&self) -> Felt { - let proc_root = Word::from([Felt::from_u32(0); 4]); + let proc_root = Word::from([Felt::new(0); 4]); if self.was_procedure_called(proc_root) { - Felt::from_u32(1) + Felt::new(1) } else { - Felt::from_u32(0) + Felt::new(0) } }", ); @@ -242,7 +242,7 @@ fn rust_sdk_account_storage_get_initial_map_item_binding() { map: StorageMap, }"#, "pub fn binding(&self) -> Word { - let key = Word::from([Felt::from_u32(0); 4]); + let key = Word::from([Felt::new(0); 4]); storage::get_initial_map_item(Self::default().map.slot, &key) }", ); diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/asset.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/asset.rs index edbbf56f8..284ebcf3c 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/asset.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/asset.rs @@ -72,8 +72,8 @@ fn rust_sdk_account_asset_build_fungible_asset_binding() { run_asset_binding_test( "rust_sdk_account_asset_build_fungible_asset_binding", "pub fn binding(&self) -> Asset { - let faucet = AccountId { prefix: Felt::from_u32(1), suffix: Felt::from_u32(0) }; - asset::build_fungible_asset(faucet, Felt::from_u32(10)) + let faucet = AccountId { prefix: Felt::new(1), suffix: Felt::new(0) }; + asset::build_fungible_asset(faucet, Felt::new(10)) }", ); } @@ -83,8 +83,8 @@ fn rust_sdk_account_asset_build_non_fungible_asset_binding() { run_asset_binding_test( "rust_sdk_account_asset_build_non_fungible_asset_binding", "pub fn binding(&self) -> Asset { - let faucet = AccountId { prefix: Felt::from_u32(1), suffix: Felt::from_u32(0) }; - let hash = Word::from([Felt::from_u32(0); 4]); + let faucet = AccountId { prefix: Felt::new(1), suffix: Felt::new(0) }; + let hash = Word::from([Felt::new(0); 4]); asset::build_non_fungible_asset(faucet, hash) }", ); diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/faucet.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/faucet.rs index 90beb90bf..21a58ad1b 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/faucet.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/faucet.rs @@ -72,7 +72,7 @@ fn rust_sdk_account_faucet_create_fungible_asset_binding() { run_faucet_binding_test( "rust_sdk_account_faucet_create_fungible_asset_binding", "pub fn binding(&self) -> Asset { - faucet::create_fungible_asset(Felt::from_u32(10)) + faucet::create_fungible_asset(Felt::new(10)) }", ); } @@ -82,7 +82,7 @@ fn rust_sdk_account_faucet_create_non_fungible_asset_binding() { run_faucet_binding_test( "rust_sdk_account_faucet_create_non_fungible_asset_binding", "pub fn binding(&self) -> Asset { - let hash = Word::from([Felt::from_u32(0); 4]); + let hash = Word::from([Felt::new(0); 4]); faucet::create_non_fungible_asset(hash) }", ); @@ -93,7 +93,7 @@ fn rust_sdk_account_faucet_mint_binding() { run_faucet_binding_test( "rust_sdk_account_faucet_mint_binding", "pub fn binding(&self) -> Asset { - let asset = Asset::from([Felt::from_u32(0); 4]); + let asset = Asset::from([Felt::new(0); 4]); faucet::mint(asset) }", ); @@ -104,7 +104,7 @@ fn rust_sdk_account_faucet_burn_binding() { run_faucet_binding_test( "rust_sdk_account_faucet_burn_binding", "pub fn binding(&self) -> Asset { - let asset = Asset::from([Felt::from_u32(0); 4]); + let asset = Asset::from([Felt::new(0); 4]); faucet::burn(asset) }", ); @@ -125,11 +125,11 @@ fn rust_sdk_account_faucet_is_non_fungible_asset_issued_binding() { run_faucet_binding_test( "rust_sdk_account_faucet_is_non_fungible_asset_issued_binding", "pub fn binding(&self) -> Felt { - let asset = Asset::from([Felt::from_u32(0); 4]); + let asset = Asset::from([Felt::new(0); 4]); if faucet::is_non_fungible_asset_issued(asset) { - Felt::from_u32(1) + Felt::new(1) } else { - Felt::from_u32(0) + Felt::new(0) } }", ); diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs index d0c0150bc..9157f02b4 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs @@ -75,7 +75,7 @@ fn rust_sdk_input_note_get_assets_info_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_assets_info_binding", "pub fn binding(&self) -> Felt { - let info = input_note::get_assets_info(NoteIdx { inner: Felt::from_u32(0) }); + let info = input_note::get_assets_info(NoteIdx { inner: Felt::new(0) }); info.num_assets }", ); @@ -86,8 +86,8 @@ fn rust_sdk_input_note_get_assets_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_assets_binding", "pub fn binding(&self) -> Felt { - let assets = input_note::get_assets(NoteIdx { inner: Felt::from_u32(0) }); - Felt::from_u32(assets.len() as u32) + let assets = input_note::get_assets(NoteIdx { inner: Felt::new(0) }); + Felt::new(assets.len() as u64) }", ); } @@ -97,7 +97,7 @@ fn rust_sdk_input_note_get_recipient_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_recipient_binding", "pub fn binding(&self) -> Recipient { - input_note::get_recipient(NoteIdx { inner: Felt::from_u32(0) }) + input_note::get_recipient(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -107,7 +107,7 @@ fn rust_sdk_input_note_get_metadata_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_metadata_binding", "pub fn binding(&self) -> Word { - input_note::get_metadata(NoteIdx { inner: Felt::from_u32(0) }).header + input_note::get_metadata(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -117,7 +117,7 @@ fn rust_sdk_input_note_get_sender_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_sender_binding", "pub fn binding(&self) -> AccountId { - input_note::get_sender(NoteIdx { inner: Felt::from_u32(0) }) + input_note::get_sender(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -127,7 +127,7 @@ fn rust_sdk_input_note_get_inputs_info_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_inputs_info_binding", "pub fn binding(&self) -> Felt { - let info = input_note::get_inputs_info(NoteIdx { inner: Felt::from_u32(0) }); + let info = input_note::get_inputs_info(NoteIdx { inner: Felt::new(0) }); info.num_inputs }", ); @@ -138,7 +138,7 @@ fn rust_sdk_input_note_get_script_root_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_script_root_binding", "pub fn binding(&self) -> Word { - input_note::get_script_root(NoteIdx { inner: Felt::from_u32(0) }) + input_note::get_script_root(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -148,7 +148,7 @@ fn rust_sdk_input_note_get_serial_number_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_serial_number_binding", "pub fn binding(&self) -> Word { - input_note::get_serial_number(NoteIdx { inner: Felt::from_u32(0) }) + input_note::get_serial_number(NoteIdx { inner: Felt::new(0) }) }", ); } diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs index 89f3ea1de..cc34c7f52 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs @@ -77,7 +77,7 @@ fn rust_sdk_output_note_get_assets_info_binding() { run_output_note_binding_test( "rust_sdk_output_note_get_assets_info_binding", "pub fn binding(&self) -> Felt { - let info = output_note::get_assets_info(NoteIdx { inner: Felt::from_u32(0) }); + let info = output_note::get_assets_info(NoteIdx { inner: Felt::new(0) }); info.num_assets }", ); @@ -88,8 +88,8 @@ fn rust_sdk_output_note_get_assets_binding() { run_output_note_binding_test( "rust_sdk_output_note_get_assets_binding", "pub fn binding(&self) -> Felt { - let assets = output_note::get_assets(NoteIdx { inner: Felt::from_u32(0) }); - Felt::from_u32(assets.len() as u32) + let assets = output_note::get_assets(NoteIdx { inner: Felt::new(0) }); + Felt::new(assets.len() as u64) }", ); } @@ -99,7 +99,7 @@ fn rust_sdk_output_note_get_recipient_binding() { run_output_note_binding_test( "rust_sdk_output_note_get_recipient_binding", "pub fn binding(&self) -> Recipient { - output_note::get_recipient(NoteIdx { inner: Felt::from_u32(0) }) + output_note::get_recipient(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -109,7 +109,7 @@ fn rust_sdk_output_note_get_metadata_binding() { run_output_note_binding_test( "rust_sdk_output_note_get_metadata_binding", "pub fn binding(&self) -> Word { - output_note::get_metadata(NoteIdx { inner: Felt::from_u32(0) }).header + output_note::get_metadata(NoteIdx { inner: Felt::new(0) }) }", ); } @@ -119,9 +119,9 @@ fn rust_sdk_output_note_create_binding() { run_output_note_binding_test( "rust_sdk_output_note_create_binding", "pub fn binding(&self) -> NoteIdx { - let recipient = Recipient::from([Felt::from_u32(0); 4]); - let tag = Tag { inner: Felt::from_u32(0) }; - let note_type = NoteType { inner: Felt::from_u32(1) }; + let recipient = Recipient::from([Felt::new(0); 4]); + let tag = Tag { inner: Felt::new(0) }; + let note_type = NoteType { inner: Felt::new(1) }; output_note::create(tag, note_type, recipient) }", ); @@ -132,10 +132,10 @@ fn rust_sdk_output_note_add_asset_binding() { run_output_note_binding_test( "rust_sdk_output_note_add_asset_binding", "pub fn binding(&self) -> Felt { - let asset = Asset::from([Felt::from_u32(0); 4]); - let idx = NoteIdx { inner: Felt::from_u32(0) }; + let asset = Asset::from([Felt::new(0); 4]); + let idx = NoteIdx { inner: Felt::new(0) }; output_note::add_asset(asset, idx); - Felt::from_u32(0) + Felt::new(0) }", ); } @@ -145,12 +145,12 @@ fn rust_sdk_output_note_set_attachment_binding() { run_output_note_binding_test( "rust_sdk_output_note_set_attachment_binding", "pub fn binding(&self) -> Felt { - let idx = NoteIdx { inner: Felt::from_u32(0) }; - let attachment_scheme = Felt::from_u32(0); - let attachment_kind = Felt::from_u32(0); - let attachment = Word::from([Felt::from_u32(0); 4]); + let idx = NoteIdx { inner: Felt::new(0) }; + let attachment_scheme = Felt::new(0); + let attachment_kind = Felt::new(0); + let attachment = Word::from([Felt::new(0); 4]); output_note::set_attachment(idx, attachment_scheme, attachment_kind, attachment); - Felt::from_u32(0) + Felt::new(0) }", ); } @@ -160,11 +160,11 @@ fn rust_sdk_output_note_set_word_attachment_binding() { run_output_note_binding_test( "rust_sdk_output_note_set_word_attachment_binding", "pub fn binding(&self) -> Felt { - let idx = NoteIdx { inner: Felt::from_u32(0) }; - let attachment_scheme = Felt::from_u32(0); - let attachment = Word::from([Felt::from_u32(0); 4]); + let idx = NoteIdx { inner: Felt::new(0) }; + let attachment_scheme = Felt::new(0); + let attachment = Word::from([Felt::new(0); 4]); output_note::set_word_attachment(idx, attachment_scheme, attachment); - Felt::from_u32(0) + Felt::new(0) }", ); } @@ -174,11 +174,11 @@ fn rust_sdk_output_note_set_array_attachment_binding() { run_output_note_binding_test( "rust_sdk_output_note_set_array_attachment_binding", "pub fn binding(&self) -> Felt { - let idx = NoteIdx { inner: Felt::from_u32(0) }; - let attachment_scheme = Felt::from_u32(0); - let attachment = Word::from([Felt::from_u32(0); 4]); + let idx = NoteIdx { inner: Felt::new(0) }; + let attachment_scheme = Felt::new(0); + let attachment = Word::from([Felt::new(0); 4]); output_note::set_array_attachment(idx, attachment_scheme, attachment); - Felt::from_u32(0) + Felt::new(0) }", ); } diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/tx.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/tx.rs index fcb6dda7f..fdbb9ff0e 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/tx.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/tx.rs @@ -118,7 +118,7 @@ fn rust_sdk_account_tx_get_expiration_block_delta_binding() { fn rust_sdk_account_tx_update_expiration_block_delta_binding() { run_tx_binding_test( "rust_sdk_account_tx_update_expiration_block_delta_binding", - "tx::update_expiration_block_delta(Felt::from_u32(42));", + "tx::update_expiration_block_delta(Felt::new(42));", ); } diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/stdlib/collections.rs b/tests/integration/src/rust_masm_tests/rust_sdk/stdlib/collections.rs index 87ffb793f..85ec19efe 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/stdlib/collections.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/stdlib/collections.rs @@ -97,15 +97,15 @@ fn test_smt_get_binding() { let value = result.value; let returned_root = result.root; - let expected = Word::new([ - Felt::from_u64_unchecked({ev0}), - Felt::from_u64_unchecked({ev1}), - Felt::from_u64_unchecked({ev2}), - Felt::from_u64_unchecked({ev3}), - ]); - assert_eq!(value, expected, "smt_get returned unexpected value"); - assert_eq!(returned_root, root, "smt_get should not mutate the root"); - }}"#, + let expected = Word::new([ + Felt::new({ev0}), + Felt::new({ev1}), + Felt::new({ev2}), + Felt::new({ev3}), + ]); + assert_eq!(value, expected, "smt_get returned unexpected value"); + assert_eq!(returned_root, root, "smt_get should not mutate the root"); + }}"#, ev0 = expected_value_u64[0], ev1 = expected_value_u64[1], ev2 = expected_value_u64[2], @@ -175,21 +175,21 @@ fn test_smt_set_binding() { let old_value = result.old_value; let new_root = result.new_root; - let expected_old = Word::new([ - Felt::from_u64_unchecked({eo0}), - Felt::from_u64_unchecked({eo1}), - Felt::from_u64_unchecked({eo2}), - Felt::from_u64_unchecked({eo3}), - ]); - let expected_new = Word::new([ - Felt::from_u64_unchecked({en0}), - Felt::from_u64_unchecked({en1}), - Felt::from_u64_unchecked({en2}), - Felt::from_u64_unchecked({en3}), - ]); - assert_eq!(old_value, expected_old, "smt_set returned unexpected old value"); - assert_eq!(new_root, expected_new, "smt_set returned unexpected new root"); - }}"#, + let expected_old = Word::new([ + Felt::new({eo0}), + Felt::new({eo1}), + Felt::new({eo2}), + Felt::new({eo3}), + ]); + let expected_new = Word::new([ + Felt::new({en0}), + Felt::new({en1}), + Felt::new({en2}), + Felt::new({en3}), + ]); + assert_eq!(old_value, expected_old, "smt_set returned unexpected old value"); + assert_eq!(new_root, expected_new, "smt_set returned unexpected new root"); + }}"#, eo0 = expected_old_u64[0], eo1 = expected_old_u64[1], eo2 = expected_old_u64[2], diff --git a/tests/rust-apps-wasm/rust-sdk/account-test/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/account-test/src/lib.rs new file mode 100644 index 000000000..a0876f028 --- /dev/null +++ b/tests/rust-apps-wasm/rust-sdk/account-test/src/lib.rs @@ -0,0 +1,108 @@ +#![no_std] +#![feature(alloc_error_handler)] + +extern crate alloc; + +use miden::*; + +#[global_allocator] +static ALLOC: BumpAlloc = BumpAlloc::new(); + +pub struct Account; + +impl Account { + #[unsafe(no_mangle)] + pub fn get_wallet_magic_number() -> Felt { + let acc_id = miden::active_account::get_id(); + let magic = felt!(42); + magic + acc_id.into() + } + + #[unsafe(no_mangle)] + pub fn test_add_asset() -> Felt { + let asset_in = Asset::new([felt!(1), felt!(2), felt!(3), felt!(4)]); + let asset_out = miden::native_account::add_asset(asset_in); + asset_out.as_word()[0] + } + + #[unsafe(no_mangle)] + pub fn test_felt_ops_smoke(a: Felt, b: Felt) -> Felt { + let d = a.as_canonical_u64(); + if a > b { + a.inv() + b + } else if a < b { + a.exp(b) - b + } else if a <= b { + a.square() * b + } else if a >= b { + b / a + } else if a == b { + miden::assert_eq(a, b); + a + Felt::new(d) + } else if a != b { + -a + } else if b.is_odd() { + assert(a); + b + } else { + assertz(b); + a + } + } +} + +pub struct Note; + +impl Note { + #[unsafe(no_mangle)] + pub fn note_script() -> Felt { + let mut sum = Felt::new(0); + for input in miden::active_note::get_inputs() { + sum = sum + input; + } + sum + } +} + +#[unsafe(no_mangle)] +pub fn test_blake3_hash(input: [u8; 32]) -> [u8; 32] { + blake3_hash(input) +} + +#[unsafe(no_mangle)] +pub fn test_blake3_merge(input: [u8; 64]) -> [u8; 32] { + blake3_merge(input) +} + +#[unsafe(no_mangle)] +pub fn test_rpo_falcon512_verify(pk: Word, msg: Word) { + rpo_falcon512_verify(pk, msg) +} + +#[unsafe(no_mangle)] +pub fn test_pipe_words_to_memory(num_words: Felt) -> (Word, Vec) { + pipe_words_to_memory(num_words) +} + +#[unsafe(no_mangle)] +pub fn test_pipe_double_words_to_memory(num_words: Felt) -> (Word, Vec) { + pipe_double_words_to_memory(num_words) +} + +#[unsafe(no_mangle)] +pub fn test_remove_asset(asset: Asset) -> Felt { + let asset_out = miden::native_account::remove_asset(asset); + asset_out.as_word()[0] +} + +#[unsafe(no_mangle)] +pub fn test_create_note( + asset: Asset, + tag: Tag, + note_type: NoteType, + recipient: Recipient, +) -> NoteIdx { + let note_idx = miden::output_note::create(tag, note_type, recipient); + miden::output_note::add_asset(asset, note_idx); + note_idx +} diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account/src/lib.rs index b5a07e001..2298ae70f 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account/src/lib.rs @@ -40,8 +40,8 @@ struct MyFoo; impl foo::Guest for MyFoo { fn process_felt(input: Felt) -> Felt { - let res = input + Felt::from_u32(unsafe { FOO }); - unsafe { FOO = res.as_u64() as u32 }; + let res = input + Felt::new(unsafe { FOO } as u64); + unsafe { FOO = res.as_canonical_u64() as u32 }; res } } diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs index 3439fc992..0536db9fb 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs @@ -78,7 +78,7 @@ impl Guest for MyNote { let mixed_input = MixedStruct { f: u64::MAX - 1000, - a: Felt::new(Felt::M - 1 - 6).unwrap(), + a: Felt::new(Felt::ORDER_U64 - 1 - 6), b: u32::MAX - 10, c: felt!(50), d: 111, @@ -90,12 +90,12 @@ impl Guest for MyNote { // fail assert_eq!(0, 1); } - assert_eq(mixed_output.a, Felt::new(Felt::M - 1).unwrap()); // M - 1 - 6 + 6 - assert_eq(mixed_output.b.into(), Felt::from_u32(u32::MAX)); // u32::MAX - 10 + 10 + assert_eq(mixed_output.a, Felt::new(Felt::ORDER_U64 - 1)); // M - 1 - 6 + 6 + assert_eq(mixed_output.b.into(), Felt::new(u32::MAX as u64)); // u32::MAX - 10 + 10 assert_eq(mixed_output.c, felt!(57)); // 50 + 7 - assert_eq(mixed_output.d.into(), Felt::from_u32(122)); - assert_eq(Felt::from_u32(mixed_output.e as u32), felt!(1)); - assert_eq(mixed_output.g.into(), Felt::from_u32(12)); + assert_eq(mixed_output.d.into(), Felt::new(122)); + assert_eq(Felt::new(mixed_output.e as u64), felt!(1)); + assert_eq(mixed_output.g.into(), Felt::new(12)); let nested_input = NestedStruct { inner: Pair { diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note/src/lib.rs index 0c5339152..bb0216671 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note/src/lib.rs @@ -42,10 +42,10 @@ struct MyNote; impl Guest for MyNote { fn run(_arg: Word) { - let input = Felt::from_u32(unsafe { BAR }); + let input = Felt::new(unsafe { BAR } as u64); assert_eq(input, felt!(11)); let output = process_felt(input); assert_eq(output, felt!(53)); - unsafe { BAR = output.as_u64() as u32 }; + unsafe { BAR = output.as_canonical_u64() as u32 }; } } diff --git a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs index c8d6d692d..babb638cf 100644 --- a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs @@ -46,7 +46,7 @@ impl InvalidStackOffsetMovupNote { let note_assets = active_note::get_assets(); let num_assets = note_assets.len(); - assert_eq(Felt::from_u32(num_assets as u32), felt!(1)); + assert_eq(Felt::new(num_assets as u64), felt!(1)); let note_asset = note_assets[0]; let assets_match = if offered_asset_word == note_asset { @@ -102,7 +102,7 @@ impl InvalidStackOffsetMovupNote { /// Calculates the output amount for the given swap parameters. fn calculate_output_amount(offered_total: Felt, requested_total: Felt, input_amount: Felt) -> Felt { - let precision_factor = Felt::from_u32(100000); + let precision_factor = Felt::new(100000); if offered_total > requested_total { let ratio = (offered_total * precision_factor) / requested_total; @@ -124,10 +124,10 @@ fn create_p2id_note(serial_num: Word, input_asset: Asset, recipient_id: AccountI let note_type = get_note_type(); let _p2id_note_root_digest = Digest::from_word(Word::new([ - Felt::from_u64_unchecked(6412241294473976817), - Felt::from_u64_unchecked(10671567784403105513), - Felt::from_u64_unchecked(4275774806771663409), - Felt::from_u64_unchecked(17933276983439992403), + Felt::new(6412241294473976817), + Felt::new(10671567784403105513), + Felt::new(4275774806771663409), + Felt::new(17933276983439992403), ])); let recipient = Recipient::compute( @@ -190,8 +190,8 @@ fn create_swapp_note( /// Extracts the note tag from the active note metadata. fn get_note_tag() -> Tag { let metadata = active_note::get_metadata().header; - let left_shifted_32 = metadata[2] * Felt::from_u32(2u32.pow(32)); - let tag_felt = left_shifted_32 / (Felt::from_u32(2u32.pow(32))); + let left_shifted_32 = metadata[2] * Felt::new(2u32.pow(32)); + let tag_felt = left_shifted_32 / (Felt::new(2u32.pow(32))); Tag::from(tag_felt) } @@ -199,7 +199,9 @@ fn get_note_tag() -> Tag { fn get_note_type() -> NoteType { let metadata = active_note::get_metadata().header; let second_felt = metadata[1]; - let left_shifted_56 = second_felt * Felt::from_u32(2u32.pow(56)); - let note_type_felt = left_shifted_56 / Felt::from_u32(2u32.pow(62)); + let pow_56 = Felt::new(2u64.pow(56)); + let pow_62 = Felt::new(2u64.pow(62)); + let left_shifted_56 = second_felt * pow_56; + let note_type_felt = left_shifted_56 / pow_62; NoteType::from(note_type_felt) } From 05b32834991d4a7433dd1709797cbb4eb5b3c0a0 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Fri, 13 Feb 2026 15:06:08 +0200 Subject: [PATCH 2/7] refactor: remove `Word` type and use `miden_field::Word` instead --- Cargo.toml | 2 +- examples/counter-contract/src/lib.rs | 16 +-- examples/storage-example/src/lib.rs | 6 +- sdk/base-sys/src/bindings/active_account.rs | 16 +-- sdk/base-sys/src/bindings/active_note.rs | 8 +- sdk/base-sys/src/bindings/asset.rs | 4 +- sdk/base-sys/src/bindings/faucet.rs | 8 +- sdk/base-sys/src/bindings/input_note.rs | 12 +- sdk/base-sys/src/bindings/native_account.rs | 4 +- sdk/base-sys/src/bindings/output_note.rs | 6 +- sdk/base-sys/src/bindings/storage.rs | 12 +- sdk/base-sys/src/bindings/tx.rs | 6 +- sdk/base-sys/src/bindings/types.rs | 6 +- sdk/sdk/src/lib.rs | 2 +- sdk/stdlib-sys/src/intrinsics/felt.rs | 2 +- sdk/stdlib-sys/src/intrinsics/mod.rs | 9 +- sdk/stdlib-sys/src/intrinsics/word.rs | 110 ------------------ sdk/stdlib-sys/src/stdlib/collections/smt.rs | 8 +- sdk/stdlib-sys/src/stdlib/crypto/hashes.rs | 4 +- tests/examples/counter/src/lib.rs | 4 +- .../src/mockchain/counter_contract.rs | 4 +- .../src/mockchain/counter_contract_no_auth.rs | 4 +- .../src/mockchain/helpers.rs | 11 +- .../rust-sdk/component-macros-note/src/lib.rs | 2 +- .../src/lib.rs | 7 +- 25 files changed, 87 insertions(+), 186 deletions(-) delete mode 100644 sdk/stdlib-sys/src/intrinsics/word.rs diff --git a/Cargo.toml b/Cargo.toml index b88920339..68de45871 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -157,7 +157,7 @@ midenc-expect-test = { path = "tools/expect-test" } miden-test-harness = { path = "test-harness/test-harness-lib" } miden-test-harness-macros = { path = "test-harness/test-harness-macros" } # TODO: switch to version after miden-crypto release -miden-field = { git = "https://github.com/0xMiden/crypto", rev = "ba5aa2b78923b40b50d8170fd287b36808b11ec5", version = "0.22" } +miden-field = { path = "../../unified-felt/crypto/miden-field", version = "0.22" } [patch.crates-io] #miden-assembly = { git = "https://github.com/0xMiden/miden-vm", rev = "614cd7f9b52f45238b0ab59c71ebb49325051e5d" } diff --git a/examples/counter-contract/src/lib.rs b/examples/counter-contract/src/lib.rs index cfea0814f..4f0a71090 100644 --- a/examples/counter-contract/src/lib.rs +++ b/examples/counter-contract/src/lib.rs @@ -7,7 +7,7 @@ // // extern crate alloc; -use miden::{Felt, StorageMap, StorageMapAccess, Word, component, felt}; +use miden::{Felt, StorageMap, StorageMapAccess, Word, component, felt, miden_field::word}; /// Main contract structure for the counter example. #[component] @@ -21,16 +21,18 @@ struct CounterContract { impl CounterContract { /// Returns the current counter value stored in the contract's storage map. pub fn get_count(&self) -> Felt { - let key = Word::from_u64_unchecked(0, 0, 0, 1); - self.count_map.get(&key) + let key = Word::new([Felt::ZERO, Felt::ZERO, Felt::ZERO, felt!(1)]); + let word: Word = self.count_map.get(&key); + word[3] } /// Increments the counter value stored in the contract's storage map by one. pub fn increment_count(&mut self) -> Felt { - let key = Word::from_u64_unchecked(0, 0, 0, 1); - let current_value: Felt = self.count_map.get(&key); - let new_value = current_value + felt!(1); - self.count_map.set(key, new_value); + let key = Word::new([Felt::ZERO, Felt::ZERO, Felt::ZERO, felt!(1)]); + let current_value_word: Word = self.count_map.get(&key); + let new_value = current_value_word[3] + felt!(1); + let new_value_word = Word::new([Felt::ZERO, Felt::ZERO, Felt::ZERO, new_value]); + self.count_map.set(key, new_value_word); new_value } } diff --git a/examples/storage-example/src/lib.rs b/examples/storage-example/src/lib.rs index ad88966db..ac6d3ed85 100644 --- a/examples/storage-example/src/lib.rs +++ b/examples/storage-example/src/lib.rs @@ -32,13 +32,15 @@ impl foo::Guest for MyAccount { let mut my_account = MyAccount::default(); let owner_key: Word = my_account.owner_public_key.read(); if pub_key == owner_key { - my_account.asset_qty_map.set(asset, qty); + let new_value_word = Word::new([qty, Felt::ZERO, Felt::ZERO, Felt::ZERO]); + my_account.asset_qty_map.set(asset, new_value_word); } } /// Returns the stored quantity for `asset`, or 0 if not present. fn get_asset_qty(asset: Asset) -> Felt { let my_account = MyAccount::default(); - my_account.asset_qty_map.get(&asset) + let word: Word = my_account.asset_qty_map.get(&asset); + word[3] } } diff --git a/sdk/base-sys/src/bindings/active_account.rs b/sdk/base-sys/src/bindings/active_account.rs index db39cf898..358d447b8 100644 --- a/sdk/base-sys/src/bindings/active_account.rs +++ b/sdk/base-sys/src/bindings/active_account.rs @@ -70,7 +70,7 @@ pub fn get_initial_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_initial_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -80,7 +80,7 @@ pub fn compute_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_compute_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -90,7 +90,7 @@ pub fn get_code_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_code_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -100,7 +100,7 @@ pub fn get_initial_storage_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_initial_storage_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -110,7 +110,7 @@ pub fn compute_storage_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_compute_storage_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -149,7 +149,7 @@ pub fn get_initial_vault_root() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_initial_vault_root(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -159,7 +159,7 @@ pub fn get_vault_root() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_vault_root(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -175,7 +175,7 @@ pub fn get_procedure_root(index: u8) -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_active_account_get_procedure_root(Felt::new(index as u64), ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/active_note.rs b/sdk/base-sys/src/bindings/active_note.rs index 66f250f11..44ea63c6a 100644 --- a/sdk/base-sys/src/bindings/active_note.rs +++ b/sdk/base-sys/src/bindings/active_note.rs @@ -95,7 +95,7 @@ pub fn get_recipient() -> Recipient { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_note_get_recipient(ret_area.as_mut_ptr()); let mut recipient = ret_area.assume_init(); - recipient.inner = recipient.inner.reverse(); + recipient.inner = recipient.inner.reversed(); recipient } } @@ -105,7 +105,7 @@ pub fn get_script_root() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_note_get_script_root(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -114,7 +114,7 @@ pub fn get_serial_number() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_note_get_serial_number(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -123,6 +123,6 @@ pub fn get_metadata() -> NoteMetadata { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_note_get_metadata(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/asset.rs b/sdk/base-sys/src/bindings/asset.rs index 4f1e58e99..c809faeff 100644 --- a/sdk/base-sys/src/bindings/asset.rs +++ b/sdk/base-sys/src/bindings/asset.rs @@ -33,7 +33,7 @@ pub fn build_fungible_asset(faucet_id: AccountId, amount: Felt) -> Asset { amount, ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -50,6 +50,6 @@ pub fn build_non_fungible_asset(faucet_id: AccountId, data_hash: Word) -> Asset data_hash[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/faucet.rs b/sdk/base-sys/src/bindings/faucet.rs index 5037d4f4c..db03263d3 100644 --- a/sdk/base-sys/src/bindings/faucet.rs +++ b/sdk/base-sys/src/bindings/faucet.rs @@ -51,7 +51,7 @@ pub fn create_fungible_asset(amount: Felt) -> Asset { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_faucet_create_fungible_asset(amount, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -66,7 +66,7 @@ pub fn create_non_fungible_asset(data_hash: Word) -> Asset { data_hash[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -81,7 +81,7 @@ pub fn mint(asset: Asset) -> Asset { asset.inner[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -96,7 +96,7 @@ pub fn burn(asset: Asset) -> Asset { asset.inner[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/input_note.rs b/sdk/base-sys/src/bindings/input_note.rs index 4c2b7daf2..0bb662193 100644 --- a/sdk/base-sys/src/bindings/input_note.rs +++ b/sdk/base-sys/src/bindings/input_note.rs @@ -51,7 +51,7 @@ pub fn get_assets_info(note_index: NoteIdx) -> InputNoteAssetsInfo { extern_input_note_get_assets_info(note_index.inner, ret_area.as_mut_ptr()); let (commitment, num_assets) = ret_area.assume_init(); InputNoteAssetsInfo { - commitment: commitment.reverse(), + commitment: commitment.reversed(), num_assets, } } @@ -77,7 +77,7 @@ pub fn get_recipient(note_index: NoteIdx) -> Recipient { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_input_note_get_recipient(note_index.inner, ret_area.as_mut_ptr()); let mut recipient = ret_area.assume_init(); - recipient.inner = recipient.inner.reverse(); + recipient.inner = recipient.inner.reversed(); recipient } } @@ -87,7 +87,7 @@ pub fn get_metadata(note_index: NoteIdx) -> NoteMetadata { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_input_note_get_metadata(note_index.inner, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -107,7 +107,7 @@ pub fn get_inputs_info(note_index: NoteIdx) -> InputNoteInputsInfo { extern_input_note_get_inputs_info(note_index.inner, ret_area.as_mut_ptr()); let (commitment, num_inputs) = ret_area.assume_init(); InputNoteInputsInfo { - commitment: commitment.reverse(), + commitment: commitment.reversed(), num_inputs, } } @@ -118,7 +118,7 @@ pub fn get_script_root(note_index: NoteIdx) -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_input_note_get_script_root(note_index.inner, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -127,6 +127,6 @@ pub fn get_serial_number(note_index: NoteIdx) -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_input_note_get_serial_number(note_index.inner, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/native_account.rs b/sdk/base-sys/src/bindings/native_account.rs index 092f9b940..41c403159 100644 --- a/sdk/base-sys/src/bindings/native_account.rs +++ b/sdk/base-sys/src/bindings/native_account.rs @@ -92,7 +92,7 @@ pub fn remove_asset(asset: Asset) -> Asset { asset.inner[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -108,7 +108,7 @@ pub fn compute_delta_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_native_account_compute_delta_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/output_note.rs b/sdk/base-sys/src/bindings/output_note.rs index c2f868db1..44b3c85d3 100644 --- a/sdk/base-sys/src/bindings/output_note.rs +++ b/sdk/base-sys/src/bindings/output_note.rs @@ -197,7 +197,7 @@ pub fn get_assets_info(note_index: NoteIdx) -> OutputNoteAssetsInfo { extern_output_note_get_assets_info(note_index.inner, ret_area.as_mut_ptr()); let (commitment, num_assets) = ret_area.assume_init(); OutputNoteAssetsInfo { - commitment: commitment.reverse(), + commitment: commitment.reversed(), num_assets, } } @@ -224,7 +224,7 @@ pub fn get_recipient(note_index: NoteIdx) -> Recipient { extern_output_note_get_recipient(note_index.inner, ret_area.as_mut_ptr()); let recipient = ret_area.assume_init(); Recipient { - inner: recipient.inner.reverse(), + inner: recipient.inner.reversed(), } } } @@ -234,6 +234,6 @@ pub fn get_metadata(note_index: NoteIdx) -> NoteMetadata { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_output_note_get_metadata(note_index.inner, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/storage.rs b/sdk/base-sys/src/bindings/storage.rs index 6f144935a..bb2c58a8a 100644 --- a/sdk/base-sys/src/bindings/storage.rs +++ b/sdk/base-sys/src/bindings/storage.rs @@ -77,7 +77,7 @@ pub fn get_item(slot_id: StorageSlotId) -> Word { let (prefix, suffix) = slot_id.to_prefix_suffix(); extern_get_storage_item(prefix, suffix, ret_area.as_mut_ptr()); let word = ret_area.assume_init(); - word.reverse() + word.reversed() } } @@ -88,7 +88,7 @@ pub fn get_initial_item(slot_id: StorageSlotId) -> Word { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); let (prefix, suffix) = slot_id.to_prefix_suffix(); extern_get_initial_storage_item(prefix, suffix, ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -118,7 +118,7 @@ pub fn set_item(slot_id: StorageSlotId, value: Word) -> Word { value[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -149,7 +149,7 @@ pub fn get_map_item(slot_id: StorageSlotId, key: &Word) -> Word { key[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -168,7 +168,7 @@ pub fn get_initial_map_item(slot_id: StorageSlotId, key: &Word) -> Word { key[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -204,6 +204,6 @@ pub fn set_map_item(slot_id: StorageSlotId, key: Word, value: Word) -> Word { value[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/tx.rs b/sdk/base-sys/src/bindings/tx.rs index 0d7c212e4..4253617ad 100644 --- a/sdk/base-sys/src/bindings/tx.rs +++ b/sdk/base-sys/src/bindings/tx.rs @@ -40,7 +40,7 @@ pub fn get_input_notes_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_tx_get_input_notes_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -49,7 +49,7 @@ pub fn get_block_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_tx_get_block_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } @@ -85,6 +85,6 @@ pub fn get_output_notes_commitment() -> Word { unsafe { let mut ret_area = ::core::mem::MaybeUninit::::uninit(); extern_tx_get_output_notes_commitment(ret_area.as_mut_ptr()); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/types.rs b/sdk/base-sys/src/bindings/types.rs index 1128d7104..1a847a2b4 100644 --- a/sdk/base-sys/src/bindings/types.rs +++ b/sdk/base-sys/src/bindings/types.rs @@ -63,9 +63,9 @@ impl Asset { } #[inline] - pub(crate) fn reverse(&self) -> Self { + pub(crate) fn reversed(&self) -> Self { Self { - inner: self.inner.reverse(), + inner: self.inner.reversed(), } } } @@ -108,7 +108,7 @@ impl Recipient { /// /// Where `inputs_commitment` is the RPO256 hash of the provided `inputs`. pub fn compute(serial_num: Word, script_digest: Digest, inputs: Vec) -> Self { - let empty_word = Word::from_u64_unchecked(0, 0, 0, 0); + let empty_word = Word::empty(); let serial_num_hash = merge([Digest::from_word(serial_num), Digest::from_word(empty_word)]); let merge_script = merge([serial_num_hash, script_digest]); diff --git a/sdk/sdk/src/lib.rs b/sdk/sdk/src/lib.rs index fbbea2eb7..f251a7296 100644 --- a/sdk/sdk/src/lib.rs +++ b/sdk/sdk/src/lib.rs @@ -5,7 +5,7 @@ pub use miden_base::*; pub use miden_base_macros::{component, export_type, generate, note, note_script, tx_script}; pub use miden_base_sys::bindings::*; /// Unified `Felt` and related helpers. -pub use miden_field as felt; +pub use miden_field; /// Felt representation helpers. pub use miden_field_repr as felt_repr; pub use miden_sdk_alloc::BumpAlloc; diff --git a/sdk/stdlib-sys/src/intrinsics/felt.rs b/sdk/stdlib-sys/src/intrinsics/felt.rs index 0a5e0e649..7bd274296 100644 --- a/sdk/stdlib-sys/src/intrinsics/felt.rs +++ b/sdk/stdlib-sys/src/intrinsics/felt.rs @@ -1,6 +1,6 @@ //! Felt-related intrinsics and helpers. -pub use miden_field::Felt; +use miden_field::Felt; #[cfg(all(target_family = "wasm", miden))] unsafe extern "C" { diff --git a/sdk/stdlib-sys/src/intrinsics/mod.rs b/sdk/stdlib-sys/src/intrinsics/mod.rs index 588328821..4029bed25 100644 --- a/sdk/stdlib-sys/src/intrinsics/mod.rs +++ b/sdk/stdlib-sys/src/intrinsics/mod.rs @@ -1,26 +1,29 @@ use core::ops::{Deref, DerefMut}; +pub use miden_field::{Felt, Word}; + pub use self::{ crypto::Digest, - felt::{Felt, assert, assert_eq, assertz}, - word::Word, + felt::{assert, assert_eq, assertz}, }; pub mod advice; pub mod crypto; pub mod debug; pub mod felt; -pub mod word; +/// A wrapper type which ensures that the wrapped value is aligned to 32 bytes. #[repr(C, align(32))] pub struct WordAligned(T); impl WordAligned { #[inline(always)] + /// Wraps the provided value. pub const fn new(t: T) -> Self { Self(t) } #[inline(always)] + /// Returns the wrapped value. pub fn into_inner(self) -> T { self.0 } diff --git a/sdk/stdlib-sys/src/intrinsics/word.rs b/sdk/stdlib-sys/src/intrinsics/word.rs deleted file mode 100644 index dc97ffc7d..000000000 --- a/sdk/stdlib-sys/src/intrinsics/word.rs +++ /dev/null @@ -1,110 +0,0 @@ -use core::ops::{Index, IndexMut}; - -use super::felt::Felt; -use crate::felt; - -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] -#[repr(C, align(16))] -pub struct Word { - pub inner: (Felt, Felt, Felt, Felt), -} -impl Word { - pub const fn new(word: [Felt; 4]) -> Self { - Self { - inner: (word[0], word[1], word[2], word[3]), - } - } - - /// Converts each of the `values` to `Felt`. - /// - /// # Panics - /// - /// Panics if a value is larger than `Felt::M`. - #[inline(always)] - pub fn from_u64_unchecked(a: u64, b: u64, c: u64, d: u64) -> Self { - Self { - inner: (Felt::new(a), Felt::new(b), Felt::new(c), Felt::new(d)), - } - } - - #[inline(always)] - pub fn reverse(&self) -> Word { - Word { - inner: (self.inner.3, self.inner.2, self.inner.1, self.inner.0), - } - } -} -impl From<(Felt, Felt, Felt, Felt)> for Word { - fn from(word: (Felt, Felt, Felt, Felt)) -> Self { - Self { inner: word } - } -} -impl From<[Felt; 4]> for Word { - fn from(word: [Felt; 4]) -> Self { - Self { - inner: (word[0], word[1], word[2], word[3]), - } - } -} -impl From for (Felt, Felt, Felt, Felt) { - #[inline(always)] - fn from(word: Word) -> Self { - word.inner - } -} -impl From for [Felt; 4] { - #[inline(always)] - fn from(word: Word) -> Self { - [word.inner.0, word.inner.1, word.inner.2, word.inner.3] - } -} -impl From<&Word> for [Felt; 4] { - #[inline(always)] - fn from(word: &Word) -> Self { - [word.inner.0, word.inner.1, word.inner.2, word.inner.3] - } -} -impl From for Word { - fn from(value: Felt) -> Self { - Word { - inner: (felt!(0), felt!(0), felt!(0), value), - } - } -} -impl From for Felt { - fn from(value: Word) -> Self { - value.inner.3 - } -} -impl Index for Word { - type Output = Felt; - - #[inline(always)] - fn index(&self, index: usize) -> &Self::Output { - match index { - 0 => &self.inner.0, - 1 => &self.inner.1, - 2 => &self.inner.2, - 3 => &self.inner.3, - _ => unreachable!(), - } - } -} -impl IndexMut for Word { - #[inline(always)] - fn index_mut(&mut self, index: usize) -> &mut Self::Output { - match index { - 0 => &mut self.inner.0, - 1 => &mut self.inner.1, - 2 => &mut self.inner.2, - 3 => &mut self.inner.3, - _ => unreachable!(), - } - } -} - -impl AsRef for Word { - fn as_ref(&self) -> &Word { - self - } -} diff --git a/sdk/stdlib-sys/src/stdlib/collections/smt.rs b/sdk/stdlib-sys/src/stdlib/collections/smt.rs index 6ea261277..54dbb20ec 100644 --- a/sdk/stdlib-sys/src/stdlib/collections/smt.rs +++ b/sdk/stdlib-sys/src/stdlib/collections/smt.rs @@ -84,8 +84,8 @@ pub fn smt_get(key: Word, root: Word) -> SmtGetResponse { extern_smt_get(key[3], key[2], key[1], key[0], root[3], root[2], root[1], root[0], ptr); let (value, returned_root) = ret_area.assume_init().into_inner(); SmtGetResponse { - value: value.reverse(), - root: returned_root.reverse(), + value: value.reversed(), + root: returned_root.reversed(), } } } @@ -105,8 +105,8 @@ pub fn smt_set(value: Word, key: Word, root: Word) -> SmtSetResponse { ); let (old_value, new_root) = ret_area.assume_init().into_inner(); SmtSetResponse { - old_value: old_value.reverse(), - new_root: new_root.reverse(), + old_value: old_value.reversed(), + new_root: new_root.reversed(), } } } diff --git a/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs b/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs index b06a529dd..aaee703f6 100644 --- a/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs +++ b/sdk/stdlib-sys/src/stdlib/crypto/hashes.rs @@ -289,7 +289,7 @@ mod imp { extern_hash_elements(miden_ptr, num_elements, result_ptr); } - Digest::from_word(ret_area.assume_init().reverse()) + Digest::from_word(ret_area.assume_init().reversed()) } } @@ -315,7 +315,7 @@ mod imp { let end_addr = start_addr + (words.len() as u32 * 4); extern_hash_words(start_addr, end_addr, result_ptr); - Digest::from_word(ret_area.assume_init().reverse()) + Digest::from_word(ret_area.assume_init().reversed()) } } } diff --git a/tests/examples/counter/src/lib.rs b/tests/examples/counter/src/lib.rs index 85ae7719a..19f81220d 100644 --- a/tests/examples/counter/src/lib.rs +++ b/tests/examples/counter/src/lib.rs @@ -25,13 +25,13 @@ mod component { impl CounterContract { /// Returns the current counter value stored in the contract's storage map. pub fn get_count(&self) -> Felt { - let key = Word::from_u64_unchecked(0, 0, 0, 1); + let key = word!("0x1000000000000000200000000000000030000000000000004000000000000000"); self.count_map.get(&key) } /// Increments the counter value stored in the contract's storage map by one. pub fn increment_count(&mut self) -> Felt { - let key = Word::from_u64_unchecked(0, 0, 0, 1); + let key = word!("0x1000000000000000200000000000000030000000000000004000000000000000"); let current_value: Felt = self.count_map.get(&key); let new_value = current_value + felt!(1); self.count_map.set(key, new_value); diff --git a/tests/integration-network/src/mockchain/counter_contract.rs b/tests/integration-network/src/mockchain/counter_contract.rs index 2060a4079..66a377e17 100644 --- a/tests/integration-network/src/mockchain/counter_contract.rs +++ b/tests/integration-network/src/mockchain/counter_contract.rs @@ -21,6 +21,7 @@ use super::{ compile_rust_package, create_note_from_package, execute_tx, }, }; +use crate::mockchain::helpers::COUNTER_CONTRACT_STORAGE_KEY; /// Tests the counter contract deployment and note consumption workflow on a mock chain. #[test] @@ -29,13 +30,12 @@ pub fn test_counter_contract() { let contract_package = compile_rust_package("../../examples/counter-contract", true); let note_package = compile_rust_package("../../examples/counter-note", true); - let key = Word::from([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); let value = Word::from([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); let counter_storage_slot = StorageSlotName::new("miden::component::miden_counter_contract::count_map").unwrap(); let storage_slots = vec![StorageSlot::with_map( counter_storage_slot.clone(), - StorageMap::with_entries([(key, value)]).unwrap(), + StorageMap::with_entries([(COUNTER_CONTRACT_STORAGE_KEY, value)]).unwrap(), )]; let counter_component = account_component_from_package(contract_package, storage_slots); diff --git a/tests/integration-network/src/mockchain/counter_contract_no_auth.rs b/tests/integration-network/src/mockchain/counter_contract_no_auth.rs index b66039cd2..892cebbd6 100644 --- a/tests/integration-network/src/mockchain/counter_contract_no_auth.rs +++ b/tests/integration-network/src/mockchain/counter_contract_no_auth.rs @@ -22,6 +22,7 @@ use super::{ create_note_from_package, execute_tx, }, }; +use crate::mockchain::helpers::COUNTER_CONTRACT_STORAGE_KEY; /// Tests the counter contract with a "no-auth" authentication component. /// @@ -38,13 +39,12 @@ pub fn test_counter_contract_no_auth() { let no_auth_auth_component = compile_rust_package("../../examples/auth-component-no-auth", true); - let key = Word::from([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); let value = Word::from([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); let counter_storage_slot = StorageSlotName::new("miden::component::miden_counter_contract::count_map").unwrap(); let counter_storage_slots = vec![StorageSlot::with_map( counter_storage_slot.clone(), - StorageMap::with_entries([(key, value)]).unwrap(), + StorageMap::with_entries([(COUNTER_CONTRACT_STORAGE_KEY, value)]).unwrap(), )]; let mut builder = MockChain::builder(); diff --git a/tests/integration-network/src/mockchain/helpers.rs b/tests/integration-network/src/mockchain/helpers.rs index 6cf420314..8db86481c 100644 --- a/tests/integration-network/src/mockchain/helpers.rs +++ b/tests/integration-network/src/mockchain/helpers.rs @@ -286,20 +286,21 @@ fn auth_public_key_slot_name() -> StorageSlotName { .expect("auth component storage slot name should be valid") } +pub const COUNTER_CONTRACT_STORAGE_KEY: Word = + Word::new([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); + /// Asserts the counter value stored in the counter contract's storage map at `storage_slot`. pub(super) fn assert_counter_storage( counter_account_storage: &AccountStorage, storage_slot: &StorageSlotName, expected: u64, ) { - // according to `examples/counter-contract` for inner (slot, key) values - let counter_contract_storage_key = Word::from([Felt::ZERO, Felt::ZERO, Felt::ZERO, Felt::ONE]); - let word = counter_account_storage - .get_map_item(storage_slot, counter_contract_storage_key) + .get_map_item(storage_slot, COUNTER_CONTRACT_STORAGE_KEY) .expect("Failed to get counter value from storage slot"); - let val = word.last().unwrap(); + // According to the counter-contract the counter value is stored in the last element. + let val = word[3]; assert_eq!( val.as_int(), expected, diff --git a/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs index 55a808465..da95c2cf8 100644 --- a/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs @@ -14,7 +14,7 @@ struct MyNote; impl MyNote { #[note_script] pub fn execute(self, _arg: Word) { - let foo_val = Word::from_u64_unchecked(11, 22, 33, 44); + let foo_val = Word::new([felt!(11), felt!(22), felt!(33), felt!(44)]); let asset = Asset::new([felt!(99), felt!(88), felt!(77), felt!(66)]); let value = StructA { foo: foo_val, diff --git a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs index babb638cf..65abb15ee 100644 --- a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs @@ -9,7 +9,7 @@ #[macro_use] extern crate alloc; -use miden::*; +use miden::{miden_field::word, *}; #[note] struct InvalidStackOffsetMovupNote; @@ -74,7 +74,10 @@ impl InvalidStackOffsetMovupNote { // active_note::add_assets_to_account(); - let routing_serial = add_word(current_note_serial, Word::from_u64_unchecked(0, 0, 0, 1)); + let routing_serial = add_word( + current_note_serial, + Word::new([Felt::ZERO, Felt::ZERO, Felt::ZERO, felt!(1)]), + ); let aux_value = offered_out; let input_asset = Asset::new(Word::from([inputs[0], inputs[1], inputs[2], input_amount])); From 2ff05d6c7a27600c42a811ecf05b07f60c7fa0eb Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 16 Feb 2026 09:36:01 +0200 Subject: [PATCH 3/7] refactor: simplified `StorageMapAccess` for `StorageMap` --- examples/counter-contract/src/lib.rs | 2 +- examples/storage-example/src/lib.rs | 2 +- sdk/base-sys/src/bindings/types.rs | 7 +++++-- sdk/base/src/types/storage.rs | 12 +++++------- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/counter-contract/src/lib.rs b/examples/counter-contract/src/lib.rs index 4f0a71090..a0f636356 100644 --- a/examples/counter-contract/src/lib.rs +++ b/examples/counter-contract/src/lib.rs @@ -7,7 +7,7 @@ // // extern crate alloc; -use miden::{Felt, StorageMap, StorageMapAccess, Word, component, felt, miden_field::word}; +use miden::{Felt, StorageMap, StorageMapAccess, Word, component, felt}; /// Main contract structure for the counter example. #[component] diff --git a/examples/storage-example/src/lib.rs b/examples/storage-example/src/lib.rs index ac6d3ed85..0ddc29ea9 100644 --- a/examples/storage-example/src/lib.rs +++ b/examples/storage-example/src/lib.rs @@ -33,7 +33,7 @@ impl foo::Guest for MyAccount { let owner_key: Word = my_account.owner_public_key.read(); if pub_key == owner_key { let new_value_word = Word::new([qty, Felt::ZERO, Felt::ZERO, Felt::ZERO]); - my_account.asset_qty_map.set(asset, new_value_word); + my_account.asset_qty_map.set(asset.into(), new_value_word); } } diff --git a/sdk/base-sys/src/bindings/types.rs b/sdk/base-sys/src/bindings/types.rs index 1a847a2b4..344bdb251 100644 --- a/sdk/base-sys/src/bindings/types.rs +++ b/sdk/base-sys/src/bindings/types.rs @@ -1,6 +1,7 @@ extern crate alloc; use alloc::vec::Vec; +use core::ops::Deref; use miden_field_repr::FromFeltRepr; use miden_stdlib_sys::{Digest, Felt, Word, hash_elements, intrinsics::crypto::merge}; @@ -88,8 +89,10 @@ impl From for Word { } } -impl AsRef for Asset { - fn as_ref(&self) -> &Word { +impl Deref for Asset { + type Target = Word; + + fn deref(&self) -> &Self::Target { &self.inner } } diff --git a/sdk/base/src/types/storage.rs b/sdk/base/src/types/storage.rs index ee5538ce6..94dd10d6b 100644 --- a/sdk/base/src/types/storage.rs +++ b/sdk/base/src/types/storage.rs @@ -37,18 +37,16 @@ pub struct StorageMap { pub slot: StorageSlotId, } -impl + AsRef, V: From + Into> StorageMapAccess - for StorageMap -{ +impl + Into> StorageMapAccess for StorageMap { /// Returns a map item value from the account storage. #[inline(always)] - fn get(&self, key: &K) -> V { - storage::get_map_item(self.slot, key.as_ref()).into() + fn get(&self, key: &Word) -> V { + storage::get_map_item(self.slot, key).into() } /// Sets a map item `value` in the account storage and returns the previous value. #[inline(always)] - fn set(&mut self, key: K, value: V) -> V { - storage::set_map_item(self.slot, key.into(), value.into()).into() + fn set(&mut self, key: Word, value: V) -> V { + storage::set_map_item(self.slot, key, value.into()).into() } } From 4f31ac2d0efdcebf6b6e1ac8b1748595ee9712b5 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Mon, 16 Feb 2026 11:14:16 +0200 Subject: [PATCH 4/7] refactor: change the shape of the `Word` type from tuple to named fields --- Cargo.lock | 205 +++++++++++++++++- sdk/base-macros/wit/miden.wit | 6 +- sdk/sdk/Cargo.toml | 1 - .../component-macros-account/src/lib.rs | 7 +- .../rust-sdk/component-macros-note/src/lib.rs | 4 +- .../cross-ctx-account-word-arg/src/lib.rs | 22 +- .../cross-ctx-account-word/src/lib.rs | 16 +- .../cross-ctx-note-word-arg/src/lib.rs | 15 +- .../rust-sdk/cross-ctx-note-word/src/lib.rs | 21 +- 9 files changed, 252 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f0d11c64..28b00d158 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1181,7 +1181,7 @@ dependencies = [ "futures-core", "futures-sink", "nanorand", - "spin", + "spin 0.9.8", ] [[package]] @@ -2492,9 +2492,17 @@ dependencies = [ [[package]] name = "miden-field" -version = "0.10.0" +version = "0.22.2" dependencies = [ - "miden-core", + "miden-serde-utils", + "num-bigint", + "p3-challenger", + "p3-field", + "p3-goldilocks", + "paste", + "rand", + "serde", + "thiserror", ] [[package]] @@ -2608,7 +2616,7 @@ dependencies = [ "rustc_version 0.2.3", "rustversion", "serde_json", - "spin", + "spin 0.9.8", "strip-ansi-escapes", "supports-color", "supports-hyperlinks", @@ -2757,6 +2765,14 @@ dependencies = [ name = "miden-sdk-alloc" version = "0.10.0" +[[package]] +name = "miden-serde-utils" +version = "0.22.2" +dependencies = [ + "p3-field", + "p3-goldilocks", +] + [[package]] name = "miden-standards" version = "0.13.3" @@ -3570,6 +3586,162 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +[[package]] +name = "p3-challenger" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20e42ba74a49c08c6e99f74cd9b343bfa31aa5721fea55079b18e3fd65f1dcbc" +dependencies = [ + "p3-field", + "p3-maybe-rayon", + "p3-monty-31", + "p3-symmetric", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-dft" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63fa5eb1bd12a240089e72ae3fe10350944d9c166d00a3bfd2a1794db65cf5c" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "spin 0.10.0", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ebfdb6ef992ae64e9e8f449ac46516ffa584f11afbdf9ee244288c2a633cdf4" +dependencies = [ + "itertools 0.14.0", + "num-bigint", + "p3-maybe-rayon", + "p3-util", + "paste", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-goldilocks" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64716244b5612622d4e78a4f48b74f6d3bb7b4085b7b6b25364b1dfca7198c66" +dependencies = [ + "num-bigint", + "p3-challenger", + "p3-dft", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "paste", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5542f96504dae8100c91398fb1e3f5ec669eb9c73d9e0b018a93b5fe32bad230" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", + "transpose", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e5669ca75645f99cd001e9d0289a4eeff2bc2cd9dc3c6c3aaf22643966e83df" + +[[package]] +name = "p3-mds" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038763af23df9da653065867fd85b38626079031576c86fd537097e5be6a0da0" +dependencies = [ + "p3-dft", + "p3-field", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-monty-31" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a981d60da3d8cbf8561014e2c186068578405fd69098fa75b43d4afb364a47" +dependencies = [ + "itertools 0.14.0", + "num-bigint", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "p3-util", + "paste", + "rand", + "serde", + "spin 0.10.0", + "tracing", + "transpose", +] + +[[package]] +name = "p3-poseidon2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903b73e4f9a7781a18561c74dc169cf03333497b57a8dd02aaeb130c0f386599" +dependencies = [ + "p3-field", + "p3-mds", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-symmetric" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cd788f04e86dd5c35dd87cad29eefdb6371d2fd5f7664451382eeacae3c3ed0" +dependencies = [ + "itertools 0.14.0", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "663b16021930bc600ecada915c6c3965730a3b9d6a6c23434ccf70bfc29d6881" +dependencies = [ + "serde", +] + [[package]] name = "page_size" version = "0.6.0" @@ -4687,6 +4859,15 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.7.3" @@ -4709,6 +4890,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + [[package]] name = "string_cache" version = "0.8.9" @@ -5346,6 +5533,16 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + [[package]] name = "try-lock" version = "0.2.5" diff --git a/sdk/base-macros/wit/miden.wit b/sdk/base-macros/wit/miden.wit index 2820dc315..c62f81960 100644 --- a/sdk/base-macros/wit/miden.wit +++ b/sdk/base-macros/wit/miden.wit @@ -13,9 +13,11 @@ interface core-types { /// A group of four field elements in the Miden base field. - // type word = tuple; record word { - inner: tuple + a: felt, + b: felt, + c: felt, + d: felt, } /// A cryptographic digest representing a 256-bit hash value. diff --git a/sdk/sdk/Cargo.toml b/sdk/sdk/Cargo.toml index 4511ab380..7942783c8 100644 --- a/sdk/sdk/Cargo.toml +++ b/sdk/sdk/Cargo.toml @@ -21,7 +21,6 @@ miden-base = { version = "0.10.0", path = "../base" } miden-base-macros = { version = "0.10.0", path = "../base-macros" } miden-base-sys = { version = "0.10.0", path = "../base-sys" } miden-field-repr = { version = "0.10.0", path = "../field-repr/repr" } -miden-field = { version = "0.10.0", path = "../field" } miden-field.workspace = true wit-bindgen = { version = "0.46", default-features = false, features = ["macros"] } diff --git a/tests/rust-apps-wasm/rust-sdk/component-macros-account/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/component-macros-account/src/lib.rs index 353e82912..bb4a8290b 100644 --- a/tests/rust-apps-wasm/rust-sdk/component-macros-account/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/component-macros-account/src/lib.rs @@ -54,8 +54,7 @@ struct MyAccount; impl MyAccount { /// Exercises exported user-defined type and SDK type in signatures and return value. pub fn test_custom_types(&self, a: StructA, asset: Asset) -> StructB { - let foo_val = - Word::from([a.foo.inner.0, asset.inner.inner.0, a.foo.inner.1, a.foo.inner.2]); + let foo_val = Word::from([a.foo.a, asset.a, a.foo.b, a.foo.c]); let val_a = StructA { foo: foo_val, @@ -84,8 +83,8 @@ impl MyAccount { fn test_custom_types_private(&self, a: StructA, _asset: Asset) -> StructD { StructD { - bar: a.foo.inner.0, - baz: a.foo.inner.1, + bar: a.foo.a, + baz: a.foo.b, } } } diff --git a/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs index da95c2cf8..628df1676 100644 --- a/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/component-macros-note/src/lib.rs @@ -22,8 +22,8 @@ impl MyNote { }; let result = test_custom_types(value, asset); let expected = StructB { - bar: foo_val.inner.0, - baz: asset.inner.inner.0, + bar: foo_val.a, + baz: asset.inner.a, }; assert_eq!(result.bar, expected.bar); diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word-arg/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word-arg/src/lib.rs index 028dec1b2..29d7abbc6 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word-arg/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word-arg/src/lib.rs @@ -47,20 +47,18 @@ impl foo::Guest for MyFoo { ) -> Felt { // Use weighted sum to encode the order of elements. Different weights ensure different // results if elements are reordered during the flattening - let sum1 = input1.inner.0 * felt!(1) - + input1.inner.1 * felt!(2) - + input1.inner.2 * felt!(4) - + input1.inner.3 * felt!(8); + let sum1 = + input1.a * felt!(1) + input1.b * felt!(2) + input1.c * felt!(4) + input1.d * felt!(8); - let sum2 = input2.inner.0 * felt!(16) - + input2.inner.1 * felt!(32) - + input2.inner.2 * felt!(64) - + input2.inner.3 * felt!(128); + let sum2 = input2.a * felt!(16) + + input2.b * felt!(32) + + input2.c * felt!(64) + + input2.d * felt!(128); - let sum3 = input3.inner.0 * felt!(256) - + input3.inner.1 * felt!(512) - + input3.inner.2 * felt!(1024) - + input3.inner.3 * felt!(2048); + let sum3 = input3.a * felt!(256) + + input3.b * felt!(512) + + input3.c * felt!(1024) + + input3.d * felt!(2048); let felt_sum = felt1 * felt!(4096) + felt2 * felt!(8192) + felt3 * felt!(16384); diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word/src/lib.rs index 643aa2f90..15698722a 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-account-word/src/lib.rs @@ -39,10 +39,10 @@ struct MyFoo; impl foo::Guest for MyFoo { fn process_word(input: Word) -> Word { let result = Word::new([ - input.inner.0 + felt!(1), - input.inner.1 + felt!(2), - input.inner.2 + felt!(3), - input.inner.3 + felt!(4), + input.a + felt!(1), + input.b + felt!(2), + input.c + felt!(3), + input.d + felt!(4), ]); result @@ -52,10 +52,10 @@ impl foo::Guest for MyFoo { // The same signature, different name and body fn process_another_word(input: Word) -> Word { let result = Word::new([ - input.inner.0 + felt!(2), - input.inner.1 + felt!(3), - input.inner.2 + felt!(4), - input.inner.3 + felt!(5), + input.a + felt!(2), + input.b + felt!(3), + input.c + felt!(4), + input.d + felt!(5), ]); result diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word-arg/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word-arg/src/lib.rs index 7f3eed4d8..73b436189 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word-arg/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word-arg/src/lib.rs @@ -39,13 +39,22 @@ struct MyNote; impl Guest for MyNote { fn run(_arg: Word) { let input1 = Word { - inner: (felt!(1), felt!(2), felt!(3), felt!(4)), + a: felt!(1), + b: felt!(2), + c: felt!(3), + d: felt!(4), }; let input2 = Word { - inner: (felt!(5), felt!(6), felt!(7), felt!(8)), + a: felt!(5), + b: felt!(6), + c: felt!(7), + d: felt!(8), }; let input3 = Word { - inner: (felt!(9), felt!(10), felt!(11), felt!(12)), + a: felt!(9), + b: felt!(10), + c: felt!(11), + d: felt!(12), }; let felt1 = felt!(13); let felt2 = felt!(14); diff --git a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs index 0536db9fb..42c00c4fb 100644 --- a/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/cross-ctx-note-word/src/lib.rs @@ -37,22 +37,25 @@ struct MyNote; impl Guest for MyNote { fn run(_arg: Word) { let input = Word { - inner: (felt!(2), felt!(3), felt!(4), felt!(5)), + a: felt!(2), + b: felt!(3), + c: felt!(4), + d: felt!(5), }; let output = process_word(input.clone()); - assert_eq(output.inner.0, felt!(3)); - assert_eq(output.inner.1, felt!(5)); - assert_eq(output.inner.2, felt!(7)); - assert_eq(output.inner.3, felt!(9)); + assert_eq(output.a, felt!(3)); + assert_eq(output.b, felt!(5)); + assert_eq(output.c, felt!(7)); + assert_eq(output.d, felt!(9)); let output = process_another_word(input); - assert_eq(output.inner.0, felt!(4)); - assert_eq(output.inner.1, felt!(6)); - assert_eq(output.inner.2, felt!(8)); - assert_eq(output.inner.3, felt!(10)); + assert_eq(output.a, felt!(4)); + assert_eq(output.b, felt!(6)); + assert_eq(output.c, felt!(8)); + assert_eq(output.d, felt!(10)); let felt_input = felt!(9); let felt_output = process_felt(felt_input); From b1a39d80469f19bc486a9732bdbeb969737693ea Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Thu, 19 Feb 2026 10:03:12 +0200 Subject: [PATCH 5/7] fix: after rebase, remove `p3-field` dependency and use re-exported trait from the `miden-field`. --- Cargo.lock | 2 ++ Cargo.toml | 3 ++- sdk/base-sys/src/bindings/native_account.rs | 2 +- sdk/base-sys/src/bindings/types.rs | 6 +++--- sdk/field-repr/repr/src/lib.rs | 4 ++-- sdk/field-repr/tests/src/offchain.rs | 3 +-- sdk/field-repr/tests/src/onchain.rs | 3 +-- .../src/rust_masm_tests/rust_sdk/base/input_note.rs | 2 +- .../src/rust_masm_tests/rust_sdk/base/output_note.rs | 2 +- .../rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs | 4 ++-- 10 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28b00d158..76312a14f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2493,6 +2493,7 @@ dependencies = [ [[package]] name = "miden-field" version = "0.22.2" +source = "git+https://github.com/0xMiden/crypto?rev=21199a35d0a9e60bd210e95f72f08491c7af54dc#21199a35d0a9e60bd210e95f72f08491c7af54dc" dependencies = [ "miden-serde-utils", "num-bigint", @@ -2768,6 +2769,7 @@ version = "0.10.0" [[package]] name = "miden-serde-utils" version = "0.22.2" +source = "git+https://github.com/0xMiden/crypto?rev=21199a35d0a9e60bd210e95f72f08491c7af54dc#21199a35d0a9e60bd210e95f72f08491c7af54dc" dependencies = [ "p3-field", "p3-goldilocks", diff --git a/Cargo.toml b/Cargo.toml index 68de45871..d43770fa8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -157,7 +157,8 @@ midenc-expect-test = { path = "tools/expect-test" } miden-test-harness = { path = "test-harness/test-harness-lib" } miden-test-harness-macros = { path = "test-harness/test-harness-macros" } # TODO: switch to version after miden-crypto release -miden-field = { path = "../../unified-felt/crypto/miden-field", version = "0.22" } +# miden-field = { path = "../../unified-felt/crypto/miden-field", version = "0.22" } +miden-field = { git = "https://github.com/0xMiden/crypto", rev = "21199a35d0a9e60bd210e95f72f08491c7af54dc", version = "0.22" } [patch.crates-io] #miden-assembly = { git = "https://github.com/0xMiden/miden-vm", rev = "614cd7f9b52f45238b0ab59c71ebb49325051e5d" } diff --git a/sdk/base-sys/src/bindings/native_account.rs b/sdk/base-sys/src/bindings/native_account.rs index 41c403159..317a6c08e 100644 --- a/sdk/base-sys/src/bindings/native_account.rs +++ b/sdk/base-sys/src/bindings/native_account.rs @@ -72,7 +72,7 @@ pub fn add_asset(asset: Asset) -> Asset { asset.inner[0], ret_area.as_mut_ptr(), ); - ret_area.assume_init().reverse() + ret_area.assume_init().reversed() } } diff --git a/sdk/base-sys/src/bindings/types.rs b/sdk/base-sys/src/bindings/types.rs index 344bdb251..c3ea279d7 100644 --- a/sdk/base-sys/src/bindings/types.rs +++ b/sdk/base-sys/src/bindings/types.rs @@ -141,10 +141,10 @@ impl NoteMetadata { } #[inline] - pub(crate) fn reverse(self) -> Self { + pub(crate) fn reversed(self) -> Self { Self { - attachment: self.attachment.reverse(), - header: self.header.reverse(), + attachment: self.attachment.reversed(), + header: self.header.reversed(), } } } diff --git a/sdk/field-repr/repr/src/lib.rs b/sdk/field-repr/repr/src/lib.rs index c2b6c752c..2d26143cf 100644 --- a/sdk/field-repr/repr/src/lib.rs +++ b/sdk/field-repr/repr/src/lib.rs @@ -11,12 +11,12 @@ extern crate alloc; use alloc::vec::Vec; pub use miden_field::Felt; +#[cfg(not(target_family = "wasm"))] +use miden_field::PrimeField64; /// Re-export `DeriveFromFeltRepr` as `FromFeltRepr` for `#[derive(FromFeltRepr)]` ergonomics. pub use miden_field_repr_derive::DeriveFromFeltRepr as FromFeltRepr; /// Re-export `DeriveToFeltRepr` as `ToFeltRepr` for `#[derive(ToFeltRepr)]` ergonomics. pub use miden_field_repr_derive::DeriveToFeltRepr as ToFeltRepr; -#[allow(unused_imports)] -use p3_field::PrimeField64; /// Error returned when decoding a type from its felt representation. #[derive(Debug, Clone, PartialEq, Eq)] diff --git a/sdk/field-repr/tests/src/offchain.rs b/sdk/field-repr/tests/src/offchain.rs index 114523c78..f4f16ba15 100644 --- a/sdk/field-repr/tests/src/offchain.rs +++ b/sdk/field-repr/tests/src/offchain.rs @@ -3,9 +3,8 @@ //! These tests verify the correctness of `ToFeltRepr` and `FromFeltRepr` implementations without //! involving on-chain execution. -use miden_field::Felt; +use miden_field::{Felt, PrimeField64}; use miden_field_repr::{FeltReader, FromFeltRepr, ToFeltRepr}; -use p3_field::PrimeField64; /// Serializes `value` off-chain and deserializes it back, asserting equality. fn assert_roundtrip(value: &T) diff --git a/sdk/field-repr/tests/src/onchain.rs b/sdk/field-repr/tests/src/onchain.rs index 74fa4a39c..2c86be950 100644 --- a/sdk/field-repr/tests/src/onchain.rs +++ b/sdk/field-repr/tests/src/onchain.rs @@ -6,11 +6,10 @@ use std::borrow::Cow; use miden_debug::{ExecutionTrace, Felt as TestFelt}; -use miden_field::Felt; +use miden_field::{Felt, PrimeField64}; use miden_field_repr::{Felt as ReprFelt, FeltReader, FromFeltRepr, ToFeltRepr}; use miden_integration_tests::testing::{Initializer, eval_package}; use midenc_frontend_wasm::WasmTranslationConfig; -use p3_field::PrimeField64; use crate::build_felt_repr_test; diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs index 9157f02b4..7aced2769 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/input_note.rs @@ -107,7 +107,7 @@ fn rust_sdk_input_note_get_metadata_binding() { run_input_note_binding_test( "rust_sdk_input_note_get_metadata_binding", "pub fn binding(&self) -> Word { - input_note::get_metadata(NoteIdx { inner: Felt::new(0) }) + input_note::get_metadata(NoteIdx { inner: Felt::new(0) }).header }", ); } diff --git a/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs b/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs index cc34c7f52..0a9a4442e 100644 --- a/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs +++ b/tests/integration/src/rust_masm_tests/rust_sdk/base/output_note.rs @@ -109,7 +109,7 @@ fn rust_sdk_output_note_get_metadata_binding() { run_output_note_binding_test( "rust_sdk_output_note_get_metadata_binding", "pub fn binding(&self) -> Word { - output_note::get_metadata(NoteIdx { inner: Felt::new(0) }) + output_note::get_metadata(NoteIdx { inner: Felt::new(0) }).header }", ); } diff --git a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs index 65abb15ee..97d6ebeb1 100644 --- a/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs +++ b/tests/rust-apps-wasm/rust-sdk/issue-invalid-stack-offset-movup/src/lib.rs @@ -193,8 +193,8 @@ fn create_swapp_note( /// Extracts the note tag from the active note metadata. fn get_note_tag() -> Tag { let metadata = active_note::get_metadata().header; - let left_shifted_32 = metadata[2] * Felt::new(2u32.pow(32)); - let tag_felt = left_shifted_32 / (Felt::new(2u32.pow(32))); + let left_shifted_32 = metadata[2] * Felt::new(2u64.pow(32)); + let tag_felt = left_shifted_32 / (Felt::new(2u64.pow(32))); Tag::from(tag_felt) } From 87825be2883cf0d693f5147a72474625887b8e43 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Thu, 19 Feb 2026 12:35:42 +0200 Subject: [PATCH 6/7] fix: `miden-field-repr` build for the release checks CI job --- sdk/field-repr/repr/Cargo.toml | 3 +++ sdk/field-repr/repr/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/field-repr/repr/Cargo.toml b/sdk/field-repr/repr/Cargo.toml index a15d8ad8c..2b09984c0 100644 --- a/sdk/field-repr/repr/Cargo.toml +++ b/sdk/field-repr/repr/Cargo.toml @@ -23,3 +23,6 @@ miden-core.workspace = true [features] default = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ["cfg(miden)"] } diff --git a/sdk/field-repr/repr/src/lib.rs b/sdk/field-repr/repr/src/lib.rs index 2d26143cf..be335310b 100644 --- a/sdk/field-repr/repr/src/lib.rs +++ b/sdk/field-repr/repr/src/lib.rs @@ -11,7 +11,7 @@ extern crate alloc; use alloc::vec::Vec; pub use miden_field::Felt; -#[cfg(not(target_family = "wasm"))] +#[cfg(not(all(target_family = "wasm", miden)))] use miden_field::PrimeField64; /// Re-export `DeriveFromFeltRepr` as `FromFeltRepr` for `#[derive(FromFeltRepr)]` ergonomics. pub use miden_field_repr_derive::DeriveFromFeltRepr as FromFeltRepr; From 436c6ef83b8a5f10fd726717f3d36e1af9492653 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Thu, 19 Feb 2026 14:34:45 +0200 Subject: [PATCH 7/7] chore: update git commit for `miden-field` --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76312a14f..78c92a0a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2493,7 +2493,7 @@ dependencies = [ [[package]] name = "miden-field" version = "0.22.2" -source = "git+https://github.com/0xMiden/crypto?rev=21199a35d0a9e60bd210e95f72f08491c7af54dc#21199a35d0a9e60bd210e95f72f08491c7af54dc" +source = "git+https://github.com/0xMiden/crypto?rev=7e5a2cbc1de2c0b289590d6c25ac476b319dd148#7e5a2cbc1de2c0b289590d6c25ac476b319dd148" dependencies = [ "miden-serde-utils", "num-bigint", @@ -2769,7 +2769,7 @@ version = "0.10.0" [[package]] name = "miden-serde-utils" version = "0.22.2" -source = "git+https://github.com/0xMiden/crypto?rev=21199a35d0a9e60bd210e95f72f08491c7af54dc#21199a35d0a9e60bd210e95f72f08491c7af54dc" +source = "git+https://github.com/0xMiden/crypto?rev=7e5a2cbc1de2c0b289590d6c25ac476b319dd148#7e5a2cbc1de2c0b289590d6c25ac476b319dd148" dependencies = [ "p3-field", "p3-goldilocks", diff --git a/Cargo.toml b/Cargo.toml index d43770fa8..e06b0b87f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -158,7 +158,7 @@ miden-test-harness = { path = "test-harness/test-harness-lib" } miden-test-harness-macros = { path = "test-harness/test-harness-macros" } # TODO: switch to version after miden-crypto release # miden-field = { path = "../../unified-felt/crypto/miden-field", version = "0.22" } -miden-field = { git = "https://github.com/0xMiden/crypto", rev = "21199a35d0a9e60bd210e95f72f08491c7af54dc", version = "0.22" } +miden-field = { git = "https://github.com/0xMiden/crypto", rev = "7e5a2cbc1de2c0b289590d6c25ac476b319dd148", version = "0.22" } [patch.crates-io] #miden-assembly = { git = "https://github.com/0xMiden/miden-vm", rev = "614cd7f9b52f45238b0ab59c71ebb49325051e5d" }