diff --git a/soroban-env-common/env.json b/soroban-env-common/env.json index cc0923809..083a2622c 100644 --- a/soroban-env-common/env.json +++ b/soroban-env-common/env.json @@ -1391,6 +1391,18 @@ }, { "export": "8", + "name": "bump_current_contract_instance_and_code", + "args": [ + { + "name": "min", + "type": "U32Val" + } + ], + "return": "Void", + "docs": "Bumps the expiration ledger the current contract instance and code (if applicable), so they will live for `min` ledgers from now. If the current expiration ledger is already large enough (>= last closed ledger + `min` more ledgers), it is untouched." + }, + { + "export": "9", "name": "get_contract_id", "args": [ { @@ -1406,7 +1418,7 @@ "docs": "Get the id of a contract without creating it. `deployer` is address of the contract deployer. `salt` is used to create a unique contract id. Returns the address of the would-be contract." }, { - "export": "9", + "export": "10", "name": "get_asset_contract_id", "args": [ { diff --git a/soroban-env-common/src/meta.rs b/soroban-env-common/src/meta.rs index 6feffe362..f9ed1d461 100644 --- a/soroban-env-common/src/meta.rs +++ b/soroban-env-common/src/meta.rs @@ -42,7 +42,7 @@ pub const ENV_META_V0_SECTION_NAME: &str = "contractenvmetav0"; soroban_env_macros::generate_env_meta_consts!( ledger_protocol_version: 20, - pre_release_version: 48, + pre_release_version: 49, ); pub fn get_ledger_protocol_version(interface_version: u64) -> u32 { diff --git a/soroban-env-host/benches/common/cost_types/vec_ops.rs b/soroban-env-host/benches/common/cost_types/vec_ops.rs index 0d2fc47dc..bb8e548fc 100644 --- a/soroban-env-host/benches/common/cost_types/vec_ops.rs +++ b/soroban-env-host/benches/common/cost_types/vec_ops.rs @@ -18,7 +18,7 @@ impl HostCostMeasurement for VecEntryMeasure { fn new_random_case(_host: &Host, rng: &mut StdRng, input: u64) -> VecEntrySample { let input = 1 + input * Self::STEP_SIZE; let ov = util::to_rawval_u32(0..(input as u32)).collect(); - let vec: MeteredVector<_> = MeteredVector::from_vec(ov).unwrap(); + let vec: MeteredVector<_> = MeteredVector::from_vec(ov); let mut idxs: Vec = (0..input as usize).collect(); idxs.shuffle(rng); VecEntrySample { vec, idxs } diff --git a/soroban-env-host/src/budget.rs b/soroban-env-host/src/budget.rs index 8d004aa8c..9a551b4b9 100644 --- a/soroban-env-host/src/budget.rs +++ b/soroban-env-host/src/budget.rs @@ -438,6 +438,12 @@ impl AsBudget for Host { } } +impl AsBudget for &Host { + fn as_budget(&self) -> &Budget { + self.budget_ref() + } +} + impl Budget { /// Initializes the budget from network configuration settings. pub fn from_configs( diff --git a/soroban-env-host/src/expiration_ledger_bumps.rs b/soroban-env-host/src/expiration_ledger_bumps.rs index 8fd0c1692..7040bfe0c 100644 --- a/soroban-env-host/src/expiration_ledger_bumps.rs +++ b/soroban-env-host/src/expiration_ledger_bumps.rs @@ -1,6 +1,6 @@ use std::rc::Rc; -use crate::xdr::LedgerKey; +use crate::{budget::AsBudget, host::metered_clone, xdr::LedgerKey, HostError}; #[derive(Clone)] pub struct LedgerBump { @@ -9,4 +9,22 @@ pub struct LedgerBump { } #[derive(Clone, Default)] -pub struct ExpirationLedgerBumps(pub Vec); +pub struct ExpirationLedgerBumps(Vec); + +impl ExpirationLedgerBumps { + pub(crate) fn metered_push( + &mut self, + b: impl AsBudget, + elem: LedgerBump, + ) -> Result<(), HostError> { + // The worst case cost of a `vec.push` requires heap reallocation and copying of old data. + // Thus we use the cost of instantiating a size=1 `Vec` as the estimate of the amortized + // cost for it. + metered_clone::charge_container_bulk_init_with_elts::, LedgerBump>( + 1, + b.as_budget(), + )?; + self.0.push(elem); + Ok(()) + } +} diff --git a/soroban-env-host/src/host.rs b/soroban-env-host/src/host.rs index dd453ea90..8125b2d9f 100644 --- a/soroban-env-host/src/host.rs +++ b/soroban-env-host/src/host.rs @@ -1248,7 +1248,7 @@ impl VmCallerEnv for Host { impl_bignum_host_fns_rhs_u32!(i256_shr, checked_shr, I256, Int256Shift); fn map_new(&self, _vmcaller: &mut VmCaller) -> Result { - self.add_host_object(HostMap::new()?) + self.add_host_object(HostMap::new()) } fn map_put( @@ -1507,7 +1507,7 @@ impl VmCallerEnv for Host { self.usize_from_rawval_u32_input("c", c)? }; // TODO: optimize the vector based on capacity - self.add_host_object(HostVec::new()?) + self.add_host_object(HostVec::new()) } fn vec_put( @@ -1718,7 +1718,7 @@ impl VmCallerEnv for Host { vals.as_mut_slice(), |buf| Val::from_payload(u64::from_le_bytes(*buf)), )?; - self.add_host_object(HostVec::from_vec(vals)?) + self.add_host_object(HostVec::from_vec(vals)) } fn vec_unpack_to_linear_memory( @@ -1895,10 +1895,50 @@ impl VmCallerEnv for Host { let min_expiration = self.with_ledger_info(|li| Ok(li.sequence_number.saturating_add(min.into())))?; - self.0.expiration_bumps.borrow_mut().0.push(LedgerBump { - key, - min_expiration, - }); + self.0.expiration_bumps.borrow_mut().metered_push( + self, + LedgerBump { + key, + min_expiration, + }, + )?; + Ok(Val::VOID) + } + + fn bump_current_contract_instance_and_code( + &self, + _vmcaller: &mut VmCaller, + min: U32Val, + ) -> Result { + let min_expiration = + self.with_ledger_info(|li| Ok(li.sequence_number.saturating_add(min.into())))?; + + let contract_id = self.get_current_contract_id_internal()?; + let key = self.contract_instance_ledger_key(&contract_id)?; + self.0.expiration_bumps.borrow_mut().metered_push( + self, + LedgerBump { + key: Rc::clone(&key), + min_expiration, + }, + )?; + + match self + .retrieve_contract_instance_from_storage(&key)? + .executable + { + ContractExecutable::Wasm(wasm_hash) => { + let key = self.contract_code_ledger_key(&wasm_hash)?; + self.0.expiration_bumps.borrow_mut().metered_push( + self, + LedgerBump { + key, + min_expiration, + }, + )?; + } + ContractExecutable::Token => {} + } Ok(Val::VOID) } @@ -2559,7 +2599,7 @@ impl VmCallerEnv for Host { let inner = MeteredVector::from_array(&vals, self.as_budget())?; outer.push(self.add_host_object(inner)?.into()); } - self.add_host_object(HostVec::from_vec(outer)?) + self.add_host_object(HostVec::from_vec(outer)) } fn fail_with_error( diff --git a/soroban-env-host/src/host/conversion.rs b/soroban-env-host/src/host/conversion.rs index 268e8f018..deb86e870 100644 --- a/soroban-env-host/src/host/conversion.rs +++ b/soroban-env-host/src/host/conversion.rs @@ -160,15 +160,6 @@ impl Host { self.storage_key_from_scval(self.from_host_val(k)?, durability) } - pub(crate) fn storage_key_for_contract( - &self, - contract_id: Hash, - key: ScVal, - durability: ContractDataDurability, - ) -> Rc { - self.storage_key_for_address(ScAddress::Contract(contract_id), key, durability) - } - pub(crate) fn storage_key_for_address( &self, contract_address: ScAddress, @@ -183,22 +174,17 @@ impl Host { })) } - pub fn storage_key_from_scval( + pub(crate) fn storage_key_from_scval( &self, key: ScVal, durability: ContractDataDurability, ) -> Result, HostError> { - Ok( - self.storage_key_for_contract( - self.get_current_contract_id_internal()?, - key, - durability, - ), - ) + let contract_id = self.get_current_contract_id_internal()?; + Ok(self.storage_key_for_address(ScAddress::Contract(contract_id), key, durability)) } // Notes on metering: covered by components. - pub fn contract_data_key_from_rawval( + pub(crate) fn contract_data_key_from_rawval( &self, k: Val, durability: ContractDataDurability, @@ -499,7 +485,7 @@ impl Host { for e in v.iter() { vv.push(self.to_host_val(e)?) } - Ok(self.add_host_object(HostVec::from_vec(vv)?)?.into()) + Ok(self.add_host_object(HostVec::from_vec(vv))?.into()) } ScVal::Map(Some(m)) => { metered_clone::charge_heap_alloc::<(Val, Val)>(m.len() as u64, self.as_budget())?; diff --git a/soroban-env-host/src/host/data_helper.rs b/soroban-env-host/src/host/data_helper.rs index 938ef1c4b..8a4734a5b 100644 --- a/soroban-env-host/src/host/data_helper.rs +++ b/soroban-env-host/src/host/data_helper.rs @@ -66,7 +66,10 @@ impl Host { } } - pub(crate) fn wasm_ledger_key(&self, wasm_hash: &Hash) -> Result, HostError> { + pub(crate) fn contract_code_ledger_key( + &self, + wasm_hash: &Hash, + ) -> Result, HostError> { let wasm_hash = wasm_hash.metered_clone(self.as_budget())?; Ok(Rc::new(LedgerKey::ContractCode(LedgerKeyContractCode { hash: wasm_hash, @@ -75,7 +78,7 @@ impl Host { } pub(crate) fn retrieve_wasm_from_storage(&self, wasm_hash: &Hash) -> Result { - let key = self.wasm_ledger_key(wasm_hash)?; + let key = self.contract_code_ledger_key(wasm_hash)?; match &self .0 .storage @@ -101,7 +104,7 @@ impl Host { } pub(crate) fn wasm_exists(&self, wasm_hash: &Hash) -> Result { - let key = self.wasm_ledger_key(wasm_hash)?; + let key = self.contract_code_ledger_key(wasm_hash)?; self.0.storage.borrow_mut().has(&key, self.as_budget()) } diff --git a/soroban-env-host/src/host/declared_size.rs b/soroban-env-host/src/host/declared_size.rs index 4306358d3..2d9a5ecc2 100644 --- a/soroban-env-host/src/host/declared_size.rs +++ b/soroban-env-host/src/host/declared_size.rs @@ -2,6 +2,7 @@ use std::rc::Rc; use crate::{ events::{EventError, HostEvent, InternalContractEvent, InternalEvent}, + expiration_ledger_bumps::LedgerBump, host::Events, host_object::HostObject, storage::AccessType, @@ -95,6 +96,7 @@ impl_declared_size_type!(SymbolSmallIter, 8); impl_declared_size_type!(U256, 32); impl_declared_size_type!(I256, 32); impl_declared_size_type!(HostObject, 48); +impl_declared_size_type!(LedgerBump, 20); // xdr types impl_declared_size_type!(TimePoint, 8); impl_declared_size_type!(Duration, 8); @@ -272,6 +274,7 @@ mod test { expect!["40"].assert_eq(size_of::().to_string().as_str()); #[cfg(target_arch = "aarch64")] expect!["48"].assert_eq(size_of::().to_string().as_str()); + expect!["20"].assert_eq(size_of::().to_string().as_str()); // xdr types expect!["8"].assert_eq(size_of::().to_string().as_str()); expect!["8"].assert_eq(size_of::().to_string().as_str()); @@ -411,6 +414,7 @@ mod test { assert_mem_size_le_declared_size!(U256); assert_mem_size_le_declared_size!(I256); assert_mem_size_le_declared_size!(HostObject); + assert_mem_size_le_declared_size!(LedgerBump); // xdr types assert_mem_size_le_declared_size!(TimePoint); assert_mem_size_le_declared_size!(Duration); diff --git a/soroban-env-host/src/host/metered_clone.rs b/soroban-env-host/src/host/metered_clone.rs index d5c5c618b..fdd2acce9 100644 --- a/soroban-env-host/src/host/metered_clone.rs +++ b/soroban-env-host/src/host/metered_clone.rs @@ -5,6 +5,7 @@ use soroban_env_common::xdr::ScContractInstance; use crate::{ budget::Budget, events::{EventError, HostEvent, InternalContractEvent, InternalEvent}, + expiration_ledger_bumps::LedgerBump, host::Events, host_object::HostObject, storage::AccessType, @@ -193,6 +194,7 @@ impl MeteredClone for SymbolSmallIter {} impl MeteredClone for U256 {} impl MeteredClone for I256 {} impl MeteredClone for HostObject {} +impl MeteredClone for LedgerBump {} // xdr types impl MeteredClone for TimePoint {} impl MeteredClone for Duration {} diff --git a/soroban-env-host/src/host/metered_map.rs b/soroban-env-host/src/host/metered_map.rs index 173759abc..9747a75d7 100644 --- a/soroban-env-host/src/host/metered_map.rs +++ b/soroban-env-host/src/host/metered_map.rs @@ -76,11 +76,11 @@ where V: MeteredClone, Ctx: AsBudget + Compare, { - pub fn new() -> Result { - Ok(MeteredOrdMap { + pub fn new() -> Self { + MeteredOrdMap { map: Vec::new(), ctx: Default::default(), - }) + } } pub fn from_map(map: Vec<(K, V)>, ctx: &Ctx) -> Result { diff --git a/soroban-env-host/src/host/metered_vector.rs b/soroban-env-host/src/host/metered_vector.rs index 8808c1538..5f1a2bee3 100644 --- a/soroban-env-host/src/host/metered_vector.rs +++ b/soroban-env-host/src/host/metered_vector.rs @@ -13,11 +13,19 @@ use std::{cmp::Ordering, ops::Range}; const VEC_OOB: Error = Error::from_type_and_code(ScErrorType::Object, ScErrorCode::IndexBounds); -#[derive(Clone, Default)] +#[derive(Clone)] pub struct MeteredVector { vec: Vec, } +impl Default for MeteredVector { + fn default() -> Self { + Self { + vec: Default::default(), + } + } +} + impl MeteredVector where A: DeclaredSizeForMetering, @@ -40,7 +48,8 @@ impl MeteredVector where A: MeteredClone, { - pub fn new() -> Result { + // Constructs a empty new `MeteredVector`. + pub fn new() -> Self { Self::from_vec(Vec::new()) } @@ -51,19 +60,19 @@ where #[cfg(any(test, feature = "testutils"))] pub fn with_capacity(capacity: usize, budget: &Budget) -> Result { super::metered_clone::charge_heap_alloc::(capacity as u64, budget)?; - Self::from_vec(Vec::with_capacity(capacity)) + Ok(Self::from_vec(Vec::with_capacity(capacity))) } pub fn from_array(buf: &[A], budget: &Budget) -> Result { // we may temporarily go over budget here. let vec: Vec = buf.into(); vec.charge_deep_clone(budget)?; - Self::from_vec(vec) + Ok(Self::from_vec(vec)) } // No meter charge, assuming allocation cost has been covered by the caller from the outside. - pub fn from_vec(vec: Vec) -> Result { - Ok(Self { vec }) + pub fn from_vec(vec: Vec) -> Self { + Self { vec } } pub fn as_slice(&self) -> &[A] { @@ -89,7 +98,7 @@ where // the clone into one (when A::IS_SHALLOW==true). let vec: Vec = iter.collect(); vec.charge_deep_clone(budget)?; - Self::from_vec(vec) + Ok(Self::from_vec(vec)) } else { // This is a logic error, we should never get here. Err((ScErrorType::Object, ScErrorCode::InternalError).into()) @@ -280,7 +289,7 @@ where } } vec.charge_deep_clone(budget)?; - Self::from_vec(vec) + Ok(Self::from_vec(vec)) } pub fn iter(&self) -> std::slice::Iter<'_, A> { diff --git a/soroban-env-host/src/test/ledger.rs b/soroban-env-host/src/test/ledger.rs index 7371a78db..f6b57db30 100644 --- a/soroban-env-host/src/test/ledger.rs +++ b/soroban-env-host/src/test/ledger.rs @@ -10,7 +10,7 @@ use crate::{ fn ledger_network_id() -> Result<(), HostError> { let budget = Budget::default(); let storage = - Storage::with_enforcing_footprint_and_map(Footprint::default(), StorageMap::new()?); + Storage::with_enforcing_footprint_and_map(Footprint::default(), StorageMap::new()); let host = Host::with_storage_and_budget(storage, budget); host.set_ledger_info(LedgerInfo { diff --git a/soroban-env-host/src/test/lifecycle.rs b/soroban-env-host/src/test/lifecycle.rs index 46dbcaf18..e9cbfef53 100644 --- a/soroban-env-host/src/test/lifecycle.rs +++ b/soroban-env-host/src/test/lifecycle.rs @@ -45,7 +45,7 @@ fn get_contract_wasm_ref(host: &Host, contract_id: Hash) -> Hash { } fn get_contract_wasm(host: &Host, wasm_hash: Hash) -> Vec { - let storage_key = host.wasm_ledger_key(&wasm_hash).unwrap(); + let storage_key = host.contract_code_ledger_key(&wasm_hash).unwrap(); host.with_mut_storage(|s: &mut Storage| { assert!(s.has(&storage_key, host.as_budget()).unwrap()); @@ -70,7 +70,7 @@ fn get_bytes_from_sc_val(val: &ScVal) -> Vec { fn test_host() -> Host { let budget = Budget::default(); let storage = - Storage::with_enforcing_footprint_and_map(Footprint::default(), StorageMap::new().unwrap()); + Storage::with_enforcing_footprint_and_map(Footprint::default(), StorageMap::new()); let host = Host::with_storage_and_budget(storage, budget); host.set_ledger_info(LedgerInfo { network_id: generate_bytes_array(), @@ -110,7 +110,7 @@ fn test_create_contract_from_source_account(host: &Host, wasm: &[u8]) -> Hash { .unwrap(); s.footprint .record_access( - &host.wasm_ledger_key(&wasm_hash).unwrap(), + &host.contract_code_ledger_key(&wasm_hash).unwrap(), AccessType::ReadWrite, host.as_budget(), ) @@ -192,7 +192,7 @@ fn create_contract_using_parent_id_test() { .unwrap(); s.footprint .record_access( - &host.wasm_ledger_key(&wasm_hash).unwrap(), + &host.contract_code_ledger_key(&wasm_hash).unwrap(), AccessType::ReadWrite, host.as_budget(), ) diff --git a/soroban-test-wasms/wasm-workspace/complex/src/lib.rs b/soroban-test-wasms/wasm-workspace/complex/src/lib.rs index 3027cffe9..51f7eeb90 100644 --- a/soroban-test-wasms/wasm-workspace/complex/src/lib.rs +++ b/soroban-test-wasms/wasm-workspace/complex/src/lib.rs @@ -37,8 +37,8 @@ impl Contract { hash.copy_into_slice(&mut buf); let vec_with_half_hash = Vec::from_slice(&e, &[Bytes::from_slice(&e, &buf[0..16])]); e.events().publish((data.clone(),), hash); - e.logger() - .log("vec with half hash", &[vec_with_half_hash.to_val()]); + e.logs() + .add("vec with half hash", &[vec_with_half_hash.to_val()]); e.storage().temporary().set(&data, &my_ledger, None); } } diff --git a/soroban-test-wasms/wasm-workspace/fannkuch/src/lib.rs b/soroban-test-wasms/wasm-workspace/fannkuch/src/lib.rs index 9976e0baf..21796b012 100644 --- a/soroban-test-wasms/wasm-workspace/fannkuch/src/lib.rs +++ b/soroban-test-wasms/wasm-workspace/fannkuch/src/lib.rs @@ -54,9 +54,9 @@ fn fannkuchredux(env: Env) -> usize { loop { if r == N { - env.logger() - .log("checksum", &[Val::from_u32(checksum as u32).to_val()]); - env.logger().log( + env.logs() + .add("checksum", &[Val::from_u32(checksum as u32).to_val()]); + env.logs().add( "max_flips", &[Val::from_u32(max_flips_count as u32).to_val()], ); diff --git a/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm index e9d51c50f..d59ce09a5 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/auth_test_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm b/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm index e55fce51f..c7ee86018 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_add_f32.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm b/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm index a248c338b..a6e1dceed 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_add_i32.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm b/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm index f9ae68fc3..dcc0a0862 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_complex.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm b/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm index 1ca6c9d88..2231c80fd 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_contract_data.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm index 4ffb481cd..b0985aeec 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_create_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm b/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm index 749871c99..7c47f95c9 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_fannkuch.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm b/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm index 14494ecf4..0e8f2d5af 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_fib.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm b/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm index bfe7c4e17..c7f080ec0 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_hostile.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm index 0ba10a324..cc53f3101 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_invoke_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm b/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm index d62a59851..c35e05646 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_linear_memory.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm b/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm index 17a9e140e..66ef0783c 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_simple_account.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm b/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm index 1b3c0286e..cf2fd5c28 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_updateable_contract.wasm differ diff --git a/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm b/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm index f376478a6..bda444f2a 100644 Binary files a/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm and b/soroban-test-wasms/wasm-workspace/opt/example_vec.wasm differ