Repository: stellar/rs-soroban-env
Pull request #1267 (2023-11-30 06:08:11)

Improve budget tracker
### What

Improve the budget tracker. With a bit code reorg and tightening.
The `BudgetTracker` used to contain the `(iterations, inputs)` pair for each cost type. This PR adds to it the `cpu`, `mem` costs. 

### Why

`get_tracker` can return granular costs which can be filtered/aggregated downstream for better metrics. 

### Known limitations

[TODO or N/A]



Patch:
diff --git a/soroban-env-host/benches/common/measure.rs b/soroban-env-host/benches/common/measure.rs
index 7e85a80a..1af19adc 100644
--- a/soroban-env-host/benches/common/measure.rs
+++ b/soroban-env-host/benches/common/measure.rs
@@ -1,7 +1,7 @@
 use rand::{rngs::StdRng, Rng, SeedableRng};
 use soroban_bench_utils::{tracking_allocator::AllocationGroupToken, HostTracker};
 use soroban_env_host::{
-    budget::{AsBudget, COST_MODEL_LIN_TERM_SCALE_BITS},
+    budget::{AsBudget, CostTracker, COST_MODEL_LIN_TERM_SCALE_BITS},
     cost_runner::{CostRunner, CostType},
     Host,
 };
@@ -315,7 +315,7 @@ pub trait HostCostMeasurement: Sized {
         <Self::Runner as CostRunner>::run(host, samples, recycled_samples)
     }
 
-    fn get_tracker(host: &Host) -> (u64, Option<u64>) {
+    fn get_tracker(host: &Host) -> CostTracker {
         <Self::Runner as CostRunner>::get_tracker(host)
     }
 
@@ -361,10 +361,10 @@ where
 
     // Note: the `iterations` here is not same as `RUN_ITERATIONS`. This is the `N` part of the
     // cost model, which is `RUN_ITERATIONS` * "model iterations from the sample"
-    let (iterations, inputs) = HCM::get_tracker(&host);
+    let ct = HCM::get_tracker(&host);
     Measurement {
-        iterations,
-        inputs,
+        iterations: ct.iterations,
+        inputs: ct.inputs,
         cpu_insns,
         mem_bytes,
         time_nsecs,
diff --git a/soroban-env-host/src/budget.rs b/soroban-env-host/src/budget.rs
index 5e560f17..d6c4477c 100644
--- a/soroban-env-host/src/budget.rs
+++ b/soroban-env-host/src/budget.rs
@@ -25,72 +25,40 @@ use model::ScaledU64;
 use wasmi_helper::FuelConfig;
 
 #[derive(Clone, Default)]
-struct MeterTracker {
+pub struct CostTracker {
+    pub iterations: u64,
+    pub inputs: Option<u64>,
+    pub cpu: u64,
+    pub mem: u64,
+}
+
+#[derive(Clone)]
+struct BudgetTracker {
     // Tracks the `(sum_of_iterations, total_input)` for each `CostType`
-    cost_tracker: [(u64, Option<u64>); ContractCostType::variants().len()],
+    cost_tracker: [CostTracker; ContractCostType::variants().len()],
     // Total number of times the meter is called
-    count: u32,
+    meter_count: u32,
     #[cfg(any(test, feature = "testutils", feature = "bench"))]
     wasm_memory: u64,
 }
 
-impl MeterTracker {
-    #[cfg(any(test, feature = "testutils", feature = "bench"))]
-    fn reset(&mut self) {
-        self.count = 0;
-        for tracker in &mut self.cost_tracker {
-            tracker.0 = 0;
-            tracker.1 = tracker.1.map(|_| 0);
-        }
-        self.wasm_memory = 0;
-    }
-}
-
-#[derive(Clone)]
-pub(crate) struct BudgetImpl {
-    cpu_insns: BudgetDimension,
-    mem_bytes: BudgetDimension,
-    /// For the purpose of calibration and reporting; not used for budget-limiting per se.
-    tracker: MeterTracker,
-    is_in_shadow_mode: bool,
-    fuel_config: FuelConfig,
-    depth_limit: u32,
-}
-
-impl BudgetImpl {
-    /// Initializes the budget from network configuration settings.
-    fn try_from_configs(
-        cpu_limit: u64,
-        mem_limit: u64,
-        cpu_cost_params: ContractCostParams,
-        mem_cost_params: ContractCostParams,
-    ) -> Result<Self, HostError> {
-        let mut b = Self {
-            cpu_insns: BudgetDimension::try_from_config(cpu_cost_params)?,
-            mem_bytes: BudgetDimension::try_from_config(mem_cost_params)?,
-            tracker: Default::default(),
-            is_in_shadow_mode: false,
-            fuel_config: Default::default(),
-            depth_limit: DEFAULT_HOST_DEPTH_LIMIT,
+impl Default for BudgetTracker {
+    fn default() -> Self {
+        let mut mt = Self {
+            cost_tracker: Default::default(),
+            meter_count: Default::default(),
+            #[cfg(any(test, feature = "testutils", feature = "bench"))]
+            wasm_memory: Default::default(),
         };
-
-        b.init_tracker();
-
-        b.cpu_insns.reset(cpu_limit);
-        b.mem_bytes.reset(mem_limit);
-        Ok(b)
-    }
-
-    fn init_tracker(&mut self) {
         for (ct, tracker) in ContractCostType::variants()
             .iter()
-            .zip(self.tracker.cost_tracker.iter_mut())
+            .zip(mt.cost_tracker.iter_mut())
         {
             // Define what inputs actually mean. For any constant-cost types --
             // whether it is a true constant unit cost type, or empirically
             // assigned (via measurement) constant type -- we leave the input as
             // `None`, otherwise, we initialize the input to `Some(0)``.
-            let mut init_input = || tracker.1 = Some(0);
+            let mut init_input = || tracker.inputs = Some(0);
             match ct {
                 ContractCostType::WasmInsnExec => (),
                 ContractCostType::MemAlloc => init_input(), // number of bytes in host memory to allocate
@@ -124,6 +92,55 @@ impl BudgetImpl {
                 ContractCostType::ChaCha20DrawBytes => init_input(), // number of random bytes to draw
             }
         }
+        mt
+    }
+}
+
+impl BudgetTracker {
+    #[cfg(any(test, feature = "testutils", feature = "bench"))]
+    fn reset(&mut self) {
+        self.meter_count = 0;
+        for tracker in &mut self.cost_tracker {
+            tracker.iterations = 0;
+            tracker.inputs = tracker.inputs.map(|_| 0);
+            tracker.cpu = 0;
+            tracker.mem = 0;
+        }
+        self.wasm_memory = 0;
+    }
+}
+
+#[derive(Clone)]
+pub(crate) struct BudgetImpl {
+    cpu_insns: BudgetDimension,
+    mem_bytes: BudgetDimension,
+    /// For the purpose of calibration and reporting; not used for budget-limiting nor does it affect consensus
+    tracker: BudgetTracker,
+    is_in_shadow_mode: bool,
+    fuel_config: FuelConfig,
+    depth_limit: u32,
+}
+
+impl BudgetImpl {
+    /// Initializes the budget from network configuration settings.
+    fn try_from_configs(
+        cpu_limit: u64,
+        mem_limit: u64,
+        cpu_cost_params: ContractCostParams,
+        mem_cost_params: ContractCostParams,
+    ) -> Result<Self, HostError> {
+        let mut b = Self {
+            cpu_insns: BudgetDimension::try_from_config(cpu_cost_params)?,
+            mem_bytes: BudgetDimension::try_from_config(mem_cost_params)?,
+            tracker: Default::default(),
+            is_in_shadow_mode: false,
+            fuel_config: Default::default(),
+            depth_limit: DEFAULT_HOST_DEPTH_LIMIT,
+        };
+
+        b.cpu_insns.reset(cpu_limit);
+        b.mem_bytes.reset(mem_limit);
+        Ok(b)
     }
 
     pub fn charge(
@@ -132,18 +149,17 @@ impl BudgetImpl {
         iterations: u64,
         input: Option<u64>,
     ) -> Result<(), HostError> {
+        let tracker = self
+            .tracker
+            .cost_tracker
+            .get_mut(ty as usize)
+            .ok_or_else(|| HostError::from((ScErrorType::Budget, ScErrorCode::InternalError)))?;
+
         if !self.is_in_shadow_mode {
             // update tracker for reporting
-            self.tracker.count = self.tracker.count.saturating_add(1);
-            let (t_iters, t_inputs) = &mut self
-                .tracker
-                .cost_tracker
-                .get_mut(ty as usize)
-                .ok_or_else(|| {
-                    HostError::from((ScErrorType::Budget, ScErrorCode::InternalError))
-                })?;
-            *t_iters = t_iters.saturating_add(iterations);
-            match (t_inputs, input) {
+            self.tracker.meter_count = self.tracker.meter_count.saturating_add(1);
+            tracker.iterations = tracker.iterations.saturating_add(iterations);
+            match (&mut tracker.inputs, input) {
                 (None, None) => (),
                 (Some(t), Some(i)) => *t = t.saturating_add(i.saturating_mul(iterations)),
                 // internal logic error, a wrong cost type has been passed in
@@ -151,20 +167,31 @@ impl BudgetImpl {
             };
         }
 
-        self.cpu_insns.charge(
+        let cpu_charged = self.cpu_insns.charge(
             ty,
             iterations,
             input,
             IsCpu(true),
             IsShadowMode(self.is_in_shadow_mode),
         )?;
-        self.mem_bytes.charge(
+        if !self.is_in_shadow_mode {
+            tracker.cpu = tracker.cpu.saturating_add(cpu_charged);
+        }
+        self.cpu_insns
+            .check_budget_limit(IsShadowMode(self.is_in_shadow_mode))?;
+
+        let mem_charged = self.mem_bytes.charge(
             ty,
             iterations,
             input,
             IsCpu(false),
             IsShadowMode(self.is_in_shadow_mode),
-        )
+        )?;
+        if !self.is_in_shadow_mode {
+            tracker.mem = tracker.mem.saturating_add(mem_charged);
+        }
+        self.mem_bytes
+            .check_budget_limit(IsShadowMode(self.is_in_shadow_mode))
     }
 
     fn get_wasmi_fuel_remaining(&self) -> Result<u64, HostError> {
@@ -195,8 +222,8 @@ impl BudgetImpl {
 impl Default for BudgetImpl {
     fn default() -> Self {
         let mut b = Self {
-            cpu_insns: BudgetDimension::new(),
-            mem_bytes: BudgetDimension::new(),
+            cpu_insns: BudgetDimension::default(),
+            mem_bytes: BudgetDimension::default(),
             tracker: Default::default(),
             is_in_shadow_mode: false,
             fuel_config: Default::default(),
@@ -425,8 +452,6 @@ impl Default for BudgetImpl {
                     mem.lin_term = ScaledU64(0);
                 }
             }
-
-            b.init_tracker();
         }
 
         // define the limits
@@ -469,10 +494,10 @@ impl Debug for BudgetImpl {
                 f,
                 "{:<25}{:<15}{:<15}{:<15}{:<15}{:<20}{:<20}{:<20}{:<20}",
                 format!("{:?}", ct),
-                self.tracker.cost_tracker[i].0,
-                format!("{:?}", self.tracker.cost_tracker[i].1),
-                self.cpu_insns.counts[i],
-                self.mem_bytes.counts[i],
+                self.tracker.cost_tracker[i].iterations,
+                format!("{:?}", self.tracker.cost_tracker[i].inputs),
+                self.tracker.cost_tracker[i].cpu,
+                self.tracker.cost_tracker[i].mem,
                 self.cpu_insns.cost_models[i].const_term,
                 format!("{}", self.cpu_insns.cost_models[i].lin_term),
                 self.mem_bytes.cost_models[i].const_term,
@@ -484,7 +509,11 @@ impl Debug for BudgetImpl {
             f,
             "Internal details (diagnostics info, does not affect fees) "
         )?;
-        writeln!(f, "Total # times meter was called: {}", self.tracker.count,)?;
+        writeln!(
+            f,
+            "Total # times meter was called: {}",
+            self.tracker.meter_count,
+        )?;
         writeln!(
             f,
             "Shadow cpu limit: {}; used: {}",
@@ -525,8 +554,8 @@ impl Display for BudgetImpl {
                 f,
                 "{:<25}{:<15}{:<15}",
                 format!("{:?}", ct),
-                self.cpu_insns.counts[i],
-                self.mem_bytes.counts[i],
+                self.tracker.cost_tracker[i].cpu,
+                self.tracker.cost_tracker[i].mem,
             )?;
         }
         writeln!(f, "{:=<55}", "")?;
@@ -678,13 +707,13 @@ impl Budget {
         Ok(())
     }
 
-    pub fn get_tracker(&self, ty: ContractCostType) -> Result<(u64, Option<u64>), HostError> {
+    pub fn get_tracker(&self, ty: ContractCostType) -> Result<CostTracker, HostError> {
         self.0
             .try_borrow_or_err()?
             .tracker
             .cost_tracker
             .get(ty as usize)
-            .map(|x| *x)
+            .map(|x| x.clone())
             .ok_or_else(|| (ScErrorType::Budget, ScErrorCode::InternalError).into())
     }
 
diff --git a/soroban-env-host/src/budget/dimension.rs b/soroban-env-host/src/budget/dimension.rs
index 9d760128..c9796fb9 100644
--- a/soroban-env-host/src/budget/dimension.rs
+++ b/soroban-env-host/src/budget/dimension.rs
@@ -1,6 +1,6 @@
-use super::model::{HostCostModel, MeteredCostComponent, ScaledU64};
+use super::model::{HostCostModel, MeteredCostComponent};
 use crate::xdr::{ContractCostParams, ContractCostType, ScErrorCode, ScErrorType};
-use crate::HostError;
+use crate::{Error, HostError};
 use core::fmt::Debug;
 
 /// Helper types to annotate boolean function arguments
@@ -14,15 +14,12 @@ pub(crate) struct BudgetDimension {
     /// tracked by this dimension (eg. cpu or memory). CostType enum values are
     /// used as indexes into this vector, to make runtime lookups as cheap as
     /// possible.
-    pub(crate) cost_models: Vec<MeteredCostComponent>,
+    pub(crate) cost_models: [MeteredCostComponent; ContractCostType::variants().len()],
 
     /// The limit against-which the count is compared to decide if we're
     /// over budget.
     pub(crate) limit: u64,
 
-    /// Tracks the output value from individual cost models
-    pub(crate) counts: Vec<u64>,
-
     /// Tracks the sum of _output_ values from the cost model, for purposes
     /// of comparing to limit.
     pub(crate) total_count: u64,
@@ -47,7 +44,7 @@ impl Debug for BudgetDimension {
         )?;
 
         for ct in ContractCostType::variants() {
-            writeln!(f, "CostType {:?}, count {}", ct, self.counts[ct as usize])?;
+            writeln!(f, "CostType {:?}", ct)?;
             writeln!(f, "model: {:?}", self.cost_models[ct as usize])?;
         }
 
@@ -61,18 +58,6 @@ impl Debug for BudgetDimension {
 }
 
 impl BudgetDimension {
-    pub(crate) fn new() -> Self {
-        let mut bd = BudgetDimension::default();
-        for _ct in ContractCostType::variants() {
-            bd.cost_models.push(MeteredCostComponent {
-                const_term: 0,
-                lin_term: ScaledU64(0),
-            });
-            bd.counts.push(0);
-        }
-        bd
-    }
-
     pub(crate) fn try_from_config(cost_params: ContractCostParams) -> Result<Self, HostError> {
         let cost_models = cost_params
             .0
@@ -81,9 +66,14 @@ impl BudgetDimension {
             .collect::<Result<Vec<MeteredCostComponent>, HostError>>()?;
 
         Ok(Self {
-            cost_models,
+            cost_models: cost_models.try_into().map_err(|_| {
+                // error means the cost_params has the wrong dimension
+                HostError::from(Error::from_type_and_code(
+                    ScErrorType::Budget,
+                    ScErrorCode::InternalError,
+                ))
+            })?,
             limit: Default::default(),
-            counts: vec![0; cost_params.0.len()],
             total_count: Default::default(),
             shadow_limit: Default::default(),
             shadow_total_count: Default::default(),
@@ -112,9 +102,6 @@ impl BudgetDimension {
     pub(crate) fn reset(&mut self, limit: u64) {
         self.limit = limit;
         self.total_count = 0;
-        for v in &mut self.counts {
-            *v = 0;
-        }
         self.shadow_limit = limit;
         self.shadow_total_count = 0;
     }
@@ -138,6 +125,7 @@ impl BudgetDimension {
     /// input, assuming all batched units have the same input size. If input
     /// is `None`, the input is ignored and the model is treated as a constant
     /// model, and amount charged is iterations * const_term.
+    /// Returns the amount charged.
     pub(crate) fn charge(
         &mut self,
         ty: ContractCostType,
@@ -145,7 +133,7 @@ impl BudgetDimension {
         input: Option<u64>,
         _is_cpu: IsCpu,
         is_shadow: IsShadowMode,
-    ) -> Result<(), HostError> {
+    ) -> Result<u64, HostError> {
         let Some(cm) = self.get_cost_model(ty) else {
             return Err((ScErrorType::Budget, ScErrorCode::InternalError).into());
         };
@@ -161,14 +149,10 @@ impl BudgetDimension {
         if is_shadow.0 {
             self.shadow_total_count = self.shadow_total_count.saturating_add(amount);
         } else {
-            let cell = self.counts.get_mut(ty as usize).ok_or_else(|| {
-                HostError::from((ScErrorType::Budget, ScErrorCode::InternalError))
-            })?;
-            *cell = cell.saturating_add(amount);
             self.total_count = self.total_count.saturating_add(amount);
         }
 
-        self.check_budget_limit(is_shadow)
+        Ok(amount)
     }
 
     // Resets all model parameters to zero (so that we can override and test individual ones later).
diff --git a/soroban-env-host/src/budget/model.rs b/soroban-env-host/src/budget/model.rs
index b58e2e5f..8047c080 100644
--- a/soroban-env-host/src/budget/model.rs
+++ b/soroban-env-host/src/budget/model.rs
@@ -38,7 +38,7 @@ pub trait HostCostModel {
 pub const COST_MODEL_LIN_TERM_SCALE_BITS: u32 = 7;
 
 /// A helper type that wraps an u64 to signify the wrapped value have been scaled.
-#[derive(Clone)]
+#[derive(Clone, Default)]
 pub(crate) struct ScaledU64(pub(crate) u64);
 
 impl ScaledU64 {
@@ -78,7 +78,7 @@ impl Debug for ScaledU64 {
     }
 }
 
-#[derive(Clone, Debug)]
+#[derive(Clone, Debug, Default)]
 pub(crate) struct MeteredCostComponent {
     pub(crate) const_term: u64,
     pub(crate) lin_term: ScaledU64,
diff --git a/soroban-env-host/src/cost_runner/experimental/ed25519_scalar_mut.rs b/soroban-env-host/src/cost_runner/experimental/ed25519_scalar_mut.rs
index 7bff818e..f71f911c 100644
--- a/soroban-env-host/src/cost_runner/experimental/ed25519_scalar_mut.rs
+++ b/soroban-env-host/src/cost_runner/experimental/ed25519_scalar_mut.rs
@@ -1,6 +1,9 @@
 use std::hint::black_box;
 
-use crate::cost_runner::{CostRunner, CostType};
+use crate::{
+    budget::CostTracker,
+    cost_runner::{CostRunner, CostType},
+};
 use curve25519_dalek::{edwards, scalar};
 
 use super::ExperimentalCostType;
@@ -32,8 +35,13 @@ impl CostRunner for Ed25519ScalarMulRun {
         black_box(sample)
     }
 
-    fn get_tracker(_host: &crate::Host) -> (u64, Option<u64>) {
-        (Self::RUN_ITERATIONS, None)
+    fn get_tracker(_host: &crate::Host) -> CostTracker {
+        CostTracker {
+            iterations: Self::RUN_ITERATIONS,
+            inputs: None,
+            cpu: 0,
+            mem: 0,
+        }
     }
 
     fn run_baseline_iter(
diff --git a/soroban-env-host/src/cost_runner/experimental/read_xdr.rs b/soroban-env-host/src/cost_runner/experimental/read_xdr.rs
index a8bbfc9b..80639f50 100644
--- a/soroban-env-host/src/cost_runner/experimental/read_xdr.rs
+++ b/soroban-env-host/src/cost_runner/experimental/read_xdr.rs
@@ -1,7 +1,7 @@
 use std::hint::black_box;
 
 use crate::{
-    budget::AsBudget,
+    budget::{AsBudget, CostTracker},
     cost_runner::{experimental::ExperimentalCostType::ReadXdrByteArray, CostRunner, CostType},
     xdr::{ContractCostType::ValDeser, ScVal},
 };
@@ -32,7 +32,7 @@ impl CostRunner for ReadXdrByteArrayRun {
         black_box((None, sample))
     }
 
-    fn get_tracker(host: &crate::Host) -> (u64, Option<u64>) {
+    fn get_tracker(host: &crate::Host) -> CostTracker {
         // internally this is still charged under `ValDeser`
         host.as_budget().get_tracker(ValDeser).unwrap()
     }
diff --git a/soroban-env-host/src/cost_runner/runner.rs b/soroban-env-host/src/cost_runner/runner.rs
index 9f736ba5..6a7e218e 100644
--- a/soroban-env-host/src/cost_runner/runner.rs
+++ b/soroban-env-host/src/cost_runner/runner.rs
@@ -1,5 +1,9 @@
 use super::CostType;
-use crate::{budget::AsBudget, xdr::ContractCostType, Host};
+use crate::{
+    budget::{AsBudget, CostTracker},
+    xdr::ContractCostType,
+    Host,
+};
 use std::hint::black_box;
 
 /// `CostRunner` is an interface to running a host cost entity of a `CostType` (usually a block of
@@ -66,7 +70,7 @@ pub trait CostRunner: Sized {
     /// if overridden, there is a risk of the computed input being diverged from the
     /// actual input from the host's perspective. So use it carefully. This should be
     /// after the `run`, outside of the CPU-and-memory tracking machineary.
-    fn get_tracker(host: &Host) -> (u64, Option<u64>) {
+    fn get_tracker(host: &Host) -> CostTracker {
         match Self::COST_TYPE {
             CostType::Contract(ct) => host.as_budget().get_tracker(ct).unwrap(),
             CostType::Experimental(_) => {


Test patch:
diff --git a/soroban-env-host/observations/test__invocation__error_spoof_rejected.json b/soroban-env-host/observations/test__invocation__error_spoof_rejected.json
index 738da838..e729e51f 100644
--- a/soroban-env-host/observations/test__invocation__error_spoof_rejected.json
+++ b/soroban-env-host/observations/test__invocation__error_spoof_rejected.json
@@ -1,26 +1,26 @@
 {
   "   0 begin": "cpu:14488, mem:0, prngs:-/9b4a753, objs:-/-, vm:-/-, evt:-, store:-/-, foot:-, stk:-, auth:-/-",
-  "   1 call bytes_new_from_slice(1485)": "cpu:14535",
-  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15866, mem:1565, objs:-/1@8466ed3a",
+  "   1 call bytes_new_from_slice(1695)": "cpu:14535",
+  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15918, mem:1775, objs:-/1@f1e33e41",
   "   3 call upload_wasm(Bytes(obj#1))": "",
-  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1225824, mem:1306827, objs:-/2@d76b336c, store:-/1@70e65e7f, foot:1@58e4a0a1",
-  "   5 call bytes_new_from_slice(32)": "cpu:1226264, mem:1306891, objs:-/3@15fd8a7a",
-  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1227233, mem:1307003, objs:-/4@f1e1003b",
+  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1311925, mem:1315555, objs:-/2@af615ad, store:-/1@ffbd8270, foot:1@73eb4dfe",
+  "   5 call bytes_new_from_slice(32)": "cpu:1312365, mem:1315619, objs:-/3@b21e180c",
+  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1313334, mem:1315731, objs:-/4@c506be6b",
   "   7 call create_contract(Address(obj#5), Bytes(obj#3), Bytes(obj#7))": "",
-  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1228876, mem:1307181, objs:-/5@6ec689d2, auth:1@35d71a74/-",
-  "   9 ret obj_cmp -> Ok(0)": "cpu:1229168",
-  "  10 call get_ledger_network_id()": "cpu:1229218, auth:1@35d71a74/1@482b22fc",
-  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1230248, mem:1307293, objs:-/6@62b6080f",
-  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1248381, mem:1310367, objs:-/7@4ddf9c4d, store:-/2@24afdd9, foot:2@fdffc43b, auth:-/1@1323a7ef",
+  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1314977, mem:1315909, objs:-/5@e1e1a149, auth:1@8ac19f00/-",
+  "   9 ret obj_cmp -> Ok(0)": "cpu:1315269",
+  "  10 call get_ledger_network_id()": "cpu:1315319, auth:1@8ac19f00/1@587b8133",
+  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1316349, mem:1316021, objs:-/6@3f2530c",
+  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1334482, mem:1319095, objs:-/7@632cfd1, store:-/2@e5a9ac3c, foot:2@88b4af08, auth:-/1@5bc7d956",
   "  13 call vec_new_from_slice(0)": " auth:-/-",
-  "  14 ret vec_new_from_slice -> Ok(Vec(obj#15))": "cpu:1249342, mem:1310447, objs:-/8@8b790fa4",
+  "  14 ret vec_new_from_slice -> Ok(Vec(obj#15))": "cpu:1335443, mem:1319175, objs:-/8@b419e0e4",
   "  15 call call(Address(obj#13), Symbol(spoof), Vec(obj#15))": "",
-  "  16 push VM:84eb5e8a:spoof()": "cpu:2380350, mem:2616187, objs:-/9@8d818eaa, vm:1114112@a679d6fe/13@1d71d880, stk:1@11fd64b3, auth:1@b714f5c3/-",
-  "  17 pop VM:84eb5e8a:spoof -> Err(Error(Context, InvalidAction))": "cpu:2382831, mem:2616217",
+  "  16 push VM:e921e73a:spoof()": "cpu:2540996, mem:2633433, objs:-/9@838273fa, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@81ee6bc4, auth:1@b714f5c3/-",
+  "  17 pop VM:e921e73a:spoof -> Err(Error(Context, InvalidAction))": "cpu:2543477, mem:2633463",
   "  18 ret call -> Err(Error(Context, InvalidAction))": " vm:-/-, stk:-, auth:-/-",
   "  19 call try_call(Address(obj#13), Symbol(spoof), Vec(obj#15))": "",
-  "  20 push VM:84eb5e8a:spoof()": "cpu:3513839, mem:3921957, objs:-/10@9ae07732, vm:1114112@a679d6fe/13@1d71d880, stk:1@11fd64b3, auth:1@bb297f4a/-",
-  "  21 pop VM:84eb5e8a:spoof -> Err(Error(Context, InvalidAction))": "cpu:3516320, mem:3921987",
+  "  20 push VM:e921e73a:spoof()": "cpu:3749030, mem:3947721, objs:-/10@4ffb5bf8, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@81ee6bc4, auth:1@bb297f4a/-",
+  "  21 pop VM:e921e73a:spoof -> Err(Error(Context, InvalidAction))": "cpu:3751511, mem:3947751",
   "  22 ret try_call -> Ok(Error(Context, InvalidAction))": " vm:-/-, stk:-, auth:-/-",
-  "  23 end": "cpu:3516320, mem:3921987, prngs:-/9b4a753, objs:-/10@9ae07732, vm:-/-, evt:-, store:-/2@24afdd9, foot:2@fdffc43b, stk:-, auth:-/-"
+  "  23 end": "cpu:3751511, mem:3947751, prngs:-/9b4a753, objs:-/10@4ffb5bf8, vm:-/-, evt:-, store:-/2@e5a9ac3c, foot:2@88b4af08, stk:-, auth:-/-"
 }
\ No newline at end of file
diff --git a/soroban-env-host/observations/test__invocation__guest_error.json b/soroban-env-host/observations/test__invocation__guest_error.json
new file mode 100644
index 00000000..b2246bc6
--- /dev/null
+++ b/soroban-env-host/observations/test__invocation__guest_error.json
@@ -0,0 +1,26 @@
+{
+  "   0 begin": "cpu:14488, mem:0, prngs:-/9b4a753, objs:-/-, vm:-/-, evt:-, store:-/-, foot:-, stk:-, auth:-/-",
+  "   1 call bytes_new_from_slice(1695)": "cpu:14535",
+  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15918, mem:1775, objs:-/1@f1e33e41",
+  "   3 call upload_wasm(Bytes(obj#1))": "",
+  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1311925, mem:1315555, objs:-/2@af615ad, store:-/1@ffbd8270, foot:1@73eb4dfe",
+  "   5 call bytes_new_from_slice(32)": "cpu:1312365, mem:1315619, objs:-/3@b21e180c",
+  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1313334, mem:1315731, objs:-/4@c506be6b",
+  "   7 call create_contract(Address(obj#5), Bytes(obj#3), Bytes(obj#7))": "",
+  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1314977, mem:1315909, objs:-/5@e1e1a149, auth:1@8ac19f00/-",
+  "   9 ret obj_cmp -> Ok(0)": "cpu:1315269",
+  "  10 call get_ledger_network_id()": "cpu:1315319, auth:1@8ac19f00/1@587b8133",
+  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1316349, mem:1316021, objs:-/6@3f2530c",
+  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1334482, mem:1319095, objs:-/7@632cfd1, store:-/2@e5a9ac3c, foot:2@88b4af08, auth:-/1@5bc7d956",
+  "  13 call vec_new_from_slice(1)": " auth:-/-",
+  "  14 ret vec_new_from_slice -> Ok(Vec(obj#15))": "cpu:1335445, mem:1319183, objs:-/8@788f2893",
+  "  15 call call(Address(obj#13), Symbol(divide), Vec(obj#15))": "",
+  "  16 push VM:e921e73a:divide(I32(0))": "cpu:2541002, mem:2633457, objs:-/9@a47a559b, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@7e643b7b, auth:1@2731dcec/-",
+  "  17 pop VM:e921e73a:divide -> Err(Error(WasmVm, InvalidAction))": "cpu:2543511, mem:2633503",
+  "  18 ret call -> Err(Error(WasmVm, InvalidAction))": " vm:-/-, stk:-, auth:-/-",
+  "  19 call try_call(Address(obj#13), Symbol(divide), Vec(obj#15))": "",
+  "  20 push VM:e921e73a:divide(I32(0))": "cpu:3749068, mem:3947777, objs:-/10@4f3b1003, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@7e643b7b, auth:1@b746104b/-",
+  "  21 pop VM:e921e73a:divide -> Err(Error(WasmVm, InvalidAction))": "cpu:3751577, mem:3947823",
+  "  22 ret try_call -> Ok(Error(Context, InvalidAction))": " vm:-/-, stk:-, auth:-/-",
+  "  23 end": "cpu:3751577, mem:3947823, prngs:-/9b4a753, objs:-/10@4f3b1003, vm:-/-, evt:-, store:-/2@e5a9ac3c, foot:2@88b4af08, stk:-, auth:-/-"
+}
\ No newline at end of file
diff --git a/soroban-env-host/observations/test__invocation__host_function_error.json b/soroban-env-host/observations/test__invocation__host_function_error.json
new file mode 100644
index 00000000..a21c5b4c
--- /dev/null
+++ b/soroban-env-host/observations/test__invocation__host_function_error.json
@@ -0,0 +1,56 @@
+{
+  "   0 begin": "cpu:14488, mem:0, prngs:-/9b4a753, objs:-/-, vm:-/-, evt:-, store:-/-, foot:-, stk:-, auth:-/-",
+  "   1 call bytes_new_from_slice(1695)": "cpu:14535",
+  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15918, mem:1775, objs:-/1@f1e33e41",
+  "   3 call upload_wasm(Bytes(obj#1))": "",
+  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1311925, mem:1315555, objs:-/2@af615ad, store:-/1@ffbd8270, foot:1@73eb4dfe",
+  "   5 call bytes_new_from_slice(32)": "cpu:1312365, mem:1315619, objs:-/3@b21e180c",
+  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1313334, mem:1315731, objs:-/4@c506be6b",
+  "   7 call create_contract(Address(obj#5), Bytes(obj#3), Bytes(obj#7))": "",
+  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1314977, mem:1315909, objs:-/5@e1e1a149, auth:1@8ac19f00/-",
+  "   9 ret obj_cmp -> Ok(0)": "cpu:1315269",
+  "  10 call get_ledger_network_id()": "cpu:1315319, auth:1@8ac19f00/1@587b8133",
+  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1316349, mem:1316021, objs:-/6@3f2530c",
+  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1334482, mem:1319095, objs:-/7@632cfd1, store:-/2@e5a9ac3c, foot:2@88b4af08, auth:-/1@5bc7d956",
+  "  13 call symbol_new_from_slice(12)": " auth:-/-",
+  "  14 ret symbol_new_from_slice -> Ok(Symbol(obj#15))": "cpu:1335490, mem:1319187, objs:-/8@f03da730",
+  "  15 call vec_new_from_slice(0)": "",
+  "  16 ret vec_new_from_slice -> Ok(Vec(obj#17))": "cpu:1336451, mem:1319267, objs:-/9@c6e4b0b4",
+  "  17 call call(Address(obj#13), Symbol(obj#15), Vec(obj#17))": "",
+  "  18 call symbol_len(Symbol(obj#15))": "cpu:1337323, mem:1319283",
+  "  19 ret symbol_len -> Ok(U32(12))": "cpu:1337445",
+  "  20 call symbol_copy_to_slice(Symbol(obj#15), U32(0), 12)": "",
+  "  21 ret symbol_copy_to_slice -> Ok(())": "cpu:1337549",
+  "  22 push VM:e921e73a:sym#15()": "cpu:2542291, mem:2633525, objs:-/10@5a75c1f5, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@d6b5de5c, auth:1@b86cb58d/-",
+  "  23 call symbol_len(Symbol(obj#15))": "cpu:2544760, mem:2633555",
+  "  24 ret symbol_len -> Ok(U32(12))": "cpu:2544882",
+  "  25 call symbol_copy_to_slice(Symbol(obj#15), U32(0), 12)": "",
+  "  26 ret symbol_copy_to_slice -> Ok(())": "cpu:2544986",
+  "  27 call bytes_new_from_linear_memory(U32(1048576), U32(5))": " vm:-/-",
+  "  28 ret bytes_new_from_linear_memory -> Ok(Bytes(obj#21))": "cpu:2547040, mem:2633640, objs:-/11@a6bd7493",
+  "  29 call compute_hash_sha256(Bytes(obj#21))": "cpu:2547536, mem:2633664, objs:1@b6bed26a/11@a6bd7493, stk:1@4964b58e",
+  "  30 ret compute_hash_sha256 -> Ok(Bytes(obj#23))": "cpu:2552948, mem:2633776, objs:1@b6bed26a/12@b6bf8f24",
+  "  31 call update_current_contract_wasm(Bytes(obj#23))": "cpu:2553444, mem:2633800, objs:2@6c2d529/12@b6bf8f24, stk:1@128a4ab7",
+  "  32 ret update_current_contract_wasm -> Err(Error(Storage, MissingValue))": "cpu:2556429, mem:2634247, store:-/3@1f27f14, foot:3@5d6bddea",
+  "  33 pop VM:e921e73a:sym#15 -> Err(Error(Storage, MissingValue))": " vm:1114112@ba4a7cb7/15@ea6028ca",
+  "  34 ret call -> Err(Error(Storage, MissingValue))": " objs:-/12@b6bf8f24, vm:-/-, store:-/2@e5a9ac3c, stk:-, auth:-/-",
+  "  35 call try_call(Address(obj#13), Symbol(obj#15), Vec(obj#17))": "",
+  "  36 call symbol_len(Symbol(obj#15))": "cpu:2557301, mem:2634263",
+  "  37 ret symbol_len -> Ok(U32(12))": "cpu:2557423",
+  "  38 call symbol_copy_to_slice(Symbol(obj#15), U32(0), 12)": "",
+  "  39 ret symbol_copy_to_slice -> Ok(())": "cpu:2557527",
+  "  40 push VM:e921e73a:sym#15()": "cpu:3762317, mem:3948505, objs:-/13@a31b1c7, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@d6b5de5c, auth:1@ab2e820c/-",
+  "  41 call symbol_len(Symbol(obj#15))": "cpu:3764786, mem:3948535",
+  "  42 ret symbol_len -> Ok(U32(12))": "cpu:3764908",
+  "  43 call symbol_copy_to_slice(Symbol(obj#15), U32(0), 12)": "",
+  "  44 ret symbol_copy_to_slice -> Ok(())": "cpu:3765012",
+  "  45 call bytes_new_from_linear_memory(U32(1048576), U32(5))": " vm:-/-",
+  "  46 ret bytes_new_from_linear_memory -> Ok(Bytes(obj#27))": "cpu:3767066, mem:3948620, objs:-/14@b7d78e18",
+  "  47 call compute_hash_sha256(Bytes(obj#27))": "cpu:3767562, mem:3948644, objs:1@8099ea12/14@b7d78e18, stk:1@975f4843",
+  "  48 ret compute_hash_sha256 -> Ok(Bytes(obj#29))": "cpu:3772974, mem:3948756, objs:1@8099ea12/15@900e289a",
+  "  49 call update_current_contract_wasm(Bytes(obj#29))": "cpu:3773470, mem:3948780, objs:2@5fd5624b/15@900e289a, stk:1@19bf3ce6",
+  "  50 ret update_current_contract_wasm -> Err(Error(Storage, MissingValue))": "cpu:3775718, mem:3949136, store:-/3@1f27f14",
+  "  51 pop VM:e921e73a:sym#15 -> Err(Error(Storage, MissingValue))": " vm:1114112@ba4a7cb7/15@ea6028ca",
+  "  52 ret try_call -> Ok(Error(Context, InvalidAction))": " objs:-/15@900e289a, vm:-/-, store:-/2@e5a9ac3c, stk:-, auth:-/-",
+  "  53 end": "cpu:3775718, mem:3949136, prngs:-/9b4a753, objs:-/15@900e289a, vm:-/-, evt:-, store:-/2@e5a9ac3c, foot:3@5d6bddea, stk:-, auth:-/-"
+}
\ No newline at end of file
diff --git a/soroban-env-host/observations/test__invocation__wasm_invoke_return_err_variants.json b/soroban-env-host/observations/test__invocation__wasm_invoke_return_err_variants.json
index 1a9ad5c8..ba5bf6d8 100644
--- a/soroban-env-host/observations/test__invocation__wasm_invoke_return_err_variants.json
+++ b/soroban-env-host/observations/test__invocation__wasm_invoke_return_err_variants.json
@@ -1,94 +1,94 @@
 {
   "   0 begin": "cpu:14488, mem:0, prngs:-/9b4a753, objs:-/-, vm:-/-, evt:-, store:-/-, foot:-, stk:-, auth:-/-",
-  "   1 call bytes_new_from_slice(1485)": "cpu:14535",
-  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15866, mem:1565, objs:-/1@8466ed3a",
+  "   1 call bytes_new_from_slice(1695)": "cpu:14535",
+  "   2 ret bytes_new_from_slice -> Ok(Bytes(obj#1))": "cpu:15918, mem:1775, objs:-/1@f1e33e41",
   "   3 call upload_wasm(Bytes(obj#1))": "",
-  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1225824, mem:1306827, objs:-/2@d76b336c, store:-/1@70e65e7f, foot:1@58e4a0a1",
-  "   5 call bytes_new_from_slice(32)": "cpu:1226264, mem:1306891, objs:-/3@15fd8a7a",
-  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1227233, mem:1307003, objs:-/4@f1e1003b",
+  "   4 ret upload_wasm -> Ok(Bytes(obj#3))": "cpu:1311925, mem:1315555, objs:-/2@af615ad, store:-/1@ffbd8270, foot:1@73eb4dfe",
+  "   5 call bytes_new_from_slice(32)": "cpu:1312365, mem:1315619, objs:-/3@b21e180c",
+  "   6 ret bytes_new_from_slice -> Ok(Bytes(obj#7))": "cpu:1313334, mem:1315731, objs:-/4@c506be6b",
   "   7 call create_contract(Address(obj#5), Bytes(obj#3), Bytes(obj#7))": "",
-  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1228876, mem:1307181, objs:-/5@6ec689d2, auth:1@35d71a74/-",
-  "   9 ret obj_cmp -> Ok(0)": "cpu:1229168",
-  "  10 call get_ledger_network_id()": "cpu:1229218, auth:1@35d71a74/1@482b22fc",
-  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1230248, mem:1307293, objs:-/6@62b6080f",
-  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1248381, mem:1310367, objs:-/7@4ddf9c4d, store:-/2@24afdd9, foot:2@fdffc43b, auth:-/1@1323a7ef",
+  "   8 call obj_cmp(Address(obj#9), Address(obj#5))": "cpu:1314977, mem:1315909, objs:-/5@e1e1a149, auth:1@8ac19f00/-",
+  "   9 ret obj_cmp -> Ok(0)": "cpu:1315269",
+  "  10 call get_ledger_network_id()": "cpu:1315319, auth:1@8ac19f00/1@587b8133",
+  "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1316349, mem:1316021, objs:-/6@3f2530c",
+  "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1334482, mem:1319095, objs:-/7@632cfd1, store:-/2@e5a9ac3c, foot:2@88b4af08, auth:-/1@5bc7d956",
   "  13 call vec_new_from_slice(0)": " auth:-/-",
-  "  14 ret vec_new_from_slice -> Ok(Vec(obj#15))": "cpu:1249342, mem:1310447, objs:-/8@8b790fa4",
+  "  14 ret vec_new_from_slice -> Ok(Vec(obj#15))": "cpu:1335443, mem:1319175, objs:-/8@b419e0e4",
   "  15 call call(Address(obj#13), Symbol(err_eek), Vec(obj#15))": "",
-  "  16 push VM:84eb5e8a:err_eek()": "cpu:2380350, mem:2616187, objs:-/9@8d818eaa, vm:1114112@a679d6fe/13@1d71d880, stk:1@8a47c6d3, auth:1@c3f76cc4/-",
-  "  17 pop VM:84eb5e8a:err_eek -> Err(Error(Contract, #12345))": "cpu:2382831, mem:2616217",
+  "  16 push VM:e921e73a:err_eek()": "cpu:2540996, mem:2633433, objs:-/9@838273fa, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@5c3c642d, auth:1@c3f76cc4/-",
+  "  17 pop VM:e921e73a:err_eek -> Err(Error(Contract, #12345))": "cpu:2543477, mem:2633463",
   "  18 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  19 call try_call(Address(obj#13), Symbol(err_eek), Vec(obj#15))": "",
-  "  20 push VM:84eb5e8a:err_eek()": "cpu:3513839, mem:3921957, objs:-/10@9ae07732, vm:1114112@a679d6fe/13@1d71d880, stk:1@8a47c6d3, auth:1@bb7ca06b/-",
-  "  21 pop VM:84eb5e8a:err_eek -> Err(Error(Contract, #12345))": "cpu:3516320, mem:3921987",
+  "  20 push VM:e921e73a:err_eek()": "cpu:3749030, mem:3947721, objs:-/10@4ffb5bf8, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@5c3c642d, auth:1@bb7ca06b/-",
+  "  21 pop VM:e921e73a:err_eek -> Err(Error(Contract, #12345))": "cpu:3751511, mem:3947751",
   "  22 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  23 call vec_new_from_slice(0)": "",
-  "  24 ret vec_new_from_slice -> Ok(Vec(obj#21))": "cpu:3517281, mem:3922067, objs:-/11@720ca6c1",
+  "  24 ret vec_new_from_slice -> Ok(Vec(obj#21))": "cpu:3752472, mem:3947831, objs:-/11@ca7fb841",
   "  25 call call(Address(obj#13), Symbol(err_err), Vec(obj#21))": "",
-  "  26 push VM:84eb5e8a:err_err()": "cpu:4648289, mem:5227807, objs:-/12@3718797a, vm:1114112@a679d6fe/13@1d71d880, stk:1@47eef60f, auth:1@53c54c3f/-",
-  "  27 pop VM:84eb5e8a:err_err -> Err(Error(Contract, #12345))": "cpu:4650770, mem:5227837",
+  "  26 push VM:e921e73a:err_err()": "cpu:4958025, mem:5262089, objs:-/12@2dfbead, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@caf29d4a, auth:1@53c54c3f/-",
+  "  27 pop VM:e921e73a:err_err -> Err(Error(Contract, #12345))": "cpu:4960506, mem:5262119",
   "  28 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  29 call try_call(Address(obj#13), Symbol(err_err), Vec(obj#21))": "",
-  "  30 push VM:84eb5e8a:err_err()": "cpu:5781778, mem:6533577, objs:-/13@1a4b1a08, vm:1114112@a679d6fe/13@1d71d880, stk:1@47eef60f, auth:1@c929d5df/-",
-  "  31 pop VM:84eb5e8a:err_err -> Err(Error(Contract, #12345))": "cpu:5784259, mem:6533607",
+  "  30 push VM:e921e73a:err_err()": "cpu:6166059, mem:6576377, objs:-/13@9470892f, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@caf29d4a, auth:1@c929d5df/-",
+  "  31 pop VM:e921e73a:err_err -> Err(Error(Contract, #12345))": "cpu:6168540, mem:6576407",
   "  32 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  33 call vec_new_from_slice(0)": "",
-  "  34 ret vec_new_from_slice -> Ok(Vec(obj#27))": "cpu:5785220, mem:6533687, objs:-/14@b6f1fbec",
+  "  34 ret vec_new_from_slice -> Ok(Vec(obj#27))": "cpu:6169501, mem:6576487, objs:-/14@64ad0d33",
   "  35 call call(Address(obj#13), Symbol(ok_err), Vec(obj#27))": "",
-  "  36 push VM:84eb5e8a:ok_err()": "cpu:6916228, mem:7839427, objs:-/15@1e54303, vm:1114112@a679d6fe/13@1d71d880, stk:1@a8c91d71, auth:1@70cdc4b9/-",
-  "  37 pop VM:84eb5e8a:ok_err -> Err(Error(Contract, #12345))": "cpu:6918709, mem:7839457",
+  "  36 push VM:e921e73a:ok_err()": "cpu:7375054, mem:7890745, objs:-/15@8a14d82d, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@3517974b, auth:1@70cdc4b9/-",
+  "  37 pop VM:e921e73a:ok_err -> Err(Error(Contract, #12345))": "cpu:7377535, mem:7890775",
   "  38 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  39 call try_call(Address(obj#13), Symbol(ok_err), Vec(obj#27))": "",
-  "  40 push VM:84eb5e8a:ok_err()": "cpu:8049717, mem:9145197, objs:-/16@5e0e9f00, vm:1114112@a679d6fe/13@1d71d880, stk:1@a8c91d71, auth:1@d79e4b65/-",
-  "  41 pop VM:84eb5e8a:ok_err -> Err(Error(Contract, #12345))": "cpu:8052198, mem:9145227",
+  "  40 push VM:e921e73a:ok_err()": "cpu:8583088, mem:9205033, objs:-/16@78009f90, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@3517974b, auth:1@d79e4b65/-",
+  "  41 pop VM:e921e73a:ok_err -> Err(Error(Contract, #12345))": "cpu:8585569, mem:9205063",
   "  42 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  43 call symbol_new_from_slice(10)": "",
-  "  44 ret symbol_new_from_slice -> Ok(Symbol(obj#33))": "cpu:8053206, mem:9145317, objs:-/17@d62bfd0f",
+  "  44 ret symbol_new_from_slice -> Ok(Symbol(obj#33))": "cpu:8586577, mem:9205153, objs:-/17@c075fc1e",
   "  45 call vec_new_from_slice(0)": "",
-  "  46 ret vec_new_from_slice -> Ok(Vec(obj#35))": "cpu:8054167, mem:9145397, objs:-/18@891a0fe8",
+  "  46 ret vec_new_from_slice -> Ok(Vec(obj#35))": "cpu:8587538, mem:9205233, objs:-/18@d59eee2f",
   "  47 call call(Address(obj#13), Symbol(obj#33), Vec(obj#35))": "",
-  "  48 call symbol_len(Symbol(obj#33))": "cpu:8055039, mem:9145413",
-  "  49 ret symbol_len -> Ok(U32(10))": "cpu:8055161",
+  "  48 call symbol_len(Symbol(obj#33))": "cpu:8588410, mem:9205249",
+  "  49 ret symbol_len -> Ok(U32(10))": "cpu:8588532",
   "  50 call symbol_copy_to_slice(Symbol(obj#33), U32(0), 10)": "",
-  "  51 ret symbol_copy_to_slice -> Ok(())": "cpu:8055265",
-  "  52 push VM:84eb5e8a:sym#33()": "cpu:9185462, mem:10451137, objs:-/19@9f48e246, vm:1114112@a679d6fe/13@1d71d880, stk:1@3cc5f6a1, auth:1@25b93c38/-",
-  "  53 call symbol_len(Symbol(obj#33))": "cpu:9187931, mem:10451167",
-  "  54 ret symbol_len -> Ok(U32(10))": "cpu:9188053",
+  "  51 ret symbol_copy_to_slice -> Ok(())": "cpu:8588636",
+  "  52 push VM:e921e73a:sym#33()": "cpu:9793378, mem:10519491, objs:-/19@d327e7c7, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@87975549, auth:1@25b93c38/-",
+  "  53 call symbol_len(Symbol(obj#33))": "cpu:9795847, mem:10519521",
+  "  54 ret symbol_len -> Ok(U32(10))": "cpu:9795969",
   "  55 call symbol_copy_to_slice(Symbol(obj#33), U32(0), 10)": "",
-  "  56 ret symbol_copy_to_slice -> Ok(())": "cpu:9188157",
-  "  57 pop VM:84eb5e8a:sym#33 -> Err(Error(Contract, #12345))": "cpu:9188169",
+  "  56 ret symbol_copy_to_slice -> Ok(())": "cpu:9796073",
+  "  57 pop VM:e921e73a:sym#33 -> Err(Error(Contract, #12345))": "cpu:9796085",
   "  58 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  59 call try_call(Address(obj#13), Symbol(obj#33), Vec(obj#35))": "",
-  "  60 call symbol_len(Symbol(obj#33))": "cpu:9189041, mem:10451183",
-  "  61 ret symbol_len -> Ok(U32(10))": "cpu:9189163",
+  "  60 call symbol_len(Symbol(obj#33))": "cpu:9796957, mem:10519537",
+  "  61 ret symbol_len -> Ok(U32(10))": "cpu:9797079",
   "  62 call symbol_copy_to_slice(Symbol(obj#33), U32(0), 10)": "",
-  "  63 ret symbol_copy_to_slice -> Ok(())": "cpu:9189267",
-  "  64 push VM:84eb5e8a:sym#33()": "cpu:10319464, mem:11756907, objs:-/20@b7eeebf0, vm:1114112@a679d6fe/13@1d71d880, stk:1@3cc5f6a1, auth:1@8f7f6e6c/-",
-  "  65 call symbol_len(Symbol(obj#33))": "cpu:10321933, mem:11756937",
-  "  66 ret symbol_len -> Ok(U32(10))": "cpu:10322055",
+  "  63 ret symbol_copy_to_slice -> Ok(())": "cpu:9797183",
+  "  64 push VM:e921e73a:sym#33()": "cpu:11001925, mem:11833779, objs:-/20@cc065606, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@87975549, auth:1@8f7f6e6c/-",
+  "  65 call symbol_len(Symbol(obj#33))": "cpu:11004394, mem:11833809",
+  "  66 ret symbol_len -> Ok(U32(10))": "cpu:11004516",
   "  67 call symbol_copy_to_slice(Symbol(obj#33), U32(0), 10)": "",
-  "  68 ret symbol_copy_to_slice -> Ok(())": "cpu:10322159",
-  "  69 pop VM:84eb5e8a:sym#33 -> Err(Error(Contract, #12345))": "cpu:10322171",
+  "  68 ret symbol_copy_to_slice -> Ok(())": "cpu:11004620",
+  "  69 pop VM:e921e73a:sym#33 -> Err(Error(Contract, #12345))": "cpu:11004632",
   "  70 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  71 call vec_new_from_slice(0)": "",
-  "  72 ret vec_new_from_slice -> Ok(Vec(obj#41))": "cpu:10323132, mem:11757017, objs:-/21@fc8ed8d1",
+  "  72 ret vec_new_from_slice -> Ok(Vec(obj#41))": "cpu:11005593, mem:11833889, objs:-/21@33922094",
   "  73 call call(Address(obj#13), Symbol(err), Vec(obj#41))": "",
-  "  74 push VM:84eb5e8a:err()": "cpu:11454140, mem:13062757, objs:-/22@c71dc84a, vm:1114112@a679d6fe/13@1d71d880, stk:1@8d6f75ab, auth:1@3d3868a5/-",
-  "  75 pop VM:84eb5e8a:err -> Err(Error(Contract, #12345))": "cpu:11456621, mem:13062787",
+  "  74 push VM:e921e73a:err()": "cpu:12211146, mem:13148147, objs:-/22@d76cb892, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@2aa093cf, auth:1@3d3868a5/-",
+  "  75 pop VM:e921e73a:err -> Err(Error(Contract, #12345))": "cpu:12213627, mem:13148177",
   "  76 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  77 call try_call(Address(obj#13), Symbol(err), Vec(obj#41))": "",
-  "  78 push VM:84eb5e8a:err()": "cpu:12587629, mem:14368527, objs:-/23@d020543a, vm:1114112@a679d6fe/13@1d71d880, stk:1@8d6f75ab, auth:1@4d0c8b36/-",
-  "  79 pop VM:84eb5e8a:err -> Err(Error(Contract, #12345))": "cpu:12590110, mem:14368557",
+  "  78 push VM:e921e73a:err()": "cpu:13419180, mem:14462435, objs:-/23@126dfb6d, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@2aa093cf, auth:1@4d0c8b36/-",
+  "  79 pop VM:e921e73a:err -> Err(Error(Contract, #12345))": "cpu:13421661, mem:14462465",
   "  80 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  81 call vec_new_from_slice(0)": "",
-  "  82 ret vec_new_from_slice -> Ok(Vec(obj#47))": "cpu:12591071, mem:14368637, objs:-/24@46a18325",
+  "  82 ret vec_new_from_slice -> Ok(Vec(obj#47))": "cpu:13422622, mem:14462545, objs:-/24@44065991",
   "  83 call call(Address(obj#13), Symbol(val), Vec(obj#47))": "",
-  "  84 push VM:84eb5e8a:val()": "cpu:13722079, mem:15674377, objs:-/25@5e1decd2, vm:1114112@a679d6fe/13@1d71d880, stk:1@fbe417b1, auth:1@355cb42e/-",
-  "  85 pop VM:84eb5e8a:val -> Err(Error(Contract, #12345))": "cpu:13724560, mem:15674407",
+  "  84 push VM:e921e73a:val()": "cpu:14628175, mem:15776803, objs:-/25@c8468a1a, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@af5da4e8, auth:1@355cb42e/-",
+  "  85 pop VM:e921e73a:val -> Err(Error(Contract, #12345))": "cpu:14630656, mem:15776833",
   "  86 ret call -> Err(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
   "  87 call try_call(Address(obj#13), Symbol(val), Vec(obj#47))": "",
-  "  88 push VM:84eb5e8a:val()": "cpu:14855568, mem:16980147, objs:-/26@2a534eb7, vm:1114112@a679d6fe/13@1d71d880, stk:1@fbe417b1, auth:1@a4c04878/-",
-  "  89 pop VM:84eb5e8a:val -> Err(Error(Contract, #12345))": "cpu:14858049, mem:16980177",
+  "  88 push VM:e921e73a:val()": "cpu:15836209, mem:17091091, objs:-/26@11126318, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@af5da4e8, auth:1@a4c04878/-",
+  "  89 pop VM:e921e73a:val -> Err(Error(Contract, #12345))": "cpu:15838690, mem:17091121",
   "  90 ret try_call -> Ok(Error(Contract, #12345))": " vm:-/-, stk:-, auth:-/-",
-  "  91 end": "cpu:14858049, mem:16980177, prngs:-/9b4a753, objs:-/26@2a534eb7, vm:-/-, evt:-, store:-/2@24afdd9, foot:2@fdffc43b, stk:-, auth:-/-"
+  "  91 end": "cpu:15838690, mem:17091121, prngs:-/9b4a753, objs:-/26@11126318, vm:-/-, evt:-, store:-/2@e5a9ac3c, foot:2@88b4af08, stk:-, auth:-/-"
 }
\ No newline at end of file
diff --git a/soroban-env-host/observations/test__stellar_asset_contract__verify_nested_try_call_rollback.json b/soroban-env-host/observations/test__stellar_asset_contract__verify_nested_try_call_rollback.json
index 61658d8a..e0783903 100644
--- a/soroban-env-host/observations/test__stellar_asset_contract__verify_nested_try_call_rollback.json
+++ b/soroban-env-host/observations/test__stellar_asset_contract__verify_nested_try_call_rollback.json
@@ -12,507 +12,507 @@
   "  10 call get_ledger_network_id()": "cpu:1617907, auth:1@3f7f4172/1@b84e07c6",
   "  11 ret get_ledger_network_id -> Ok(Bytes(obj#11))": "cpu:1618937, mem:1346694, objs:-/6@662368ff",
   "  12 ret create_contract -> Ok(Address(obj#13))": "cpu:1637070, mem:1349768, objs:-/7@a6875df3, store:-/2@8e01b4d1, foot:2@300fd7ea, auth:-/1@7e6c4ef9",
-  "  13 call bytes_new_from_slice(1485)": "cpu:1637117, auth:-/-",
-  "  14 ret bytes_new_from_slice -> Ok(Bytes(obj#15))": "cpu:1638448, mem:1351333, objs:-/8@3a212af3",
+  "  13 call bytes_new_from_slice(1695)": "cpu:1637117, auth:-/-",
+  "  14 ret bytes_new_from_slice -> Ok(Bytes(obj#15))": "cpu:1638500, mem:1351543, objs:-/8@bda5fa89",
   "  15 call upload_wasm(Bytes(obj#15))": "",
-  "  16 ret upload_wasm -> Ok(Bytes(obj#17))": "cpu:2849188, mem:2656967, objs:-/9@35cabb87, store:-/3@db4d879, foot:3@b23be4eb",
-  "  17 call bytes_new_from_slice(32)": "cpu:2849628, mem:2657031, objs:-/10@98234933",
-  "  18 ret bytes_new_from_slice -> Ok(Bytes(obj#21))": "cpu:2850597, mem:2657143, objs:-/11@d04005cb",
+  "  16 ret upload_wasm -> Ok(Bytes(obj#17))": "cpu:2935289, mem:2665695, objs:-/9@e5f68d64, store:-/3@59902669, foot:3@27e87f88",
+  "  17 call bytes_new_from_slice(32)": "cpu:2935729, mem:2665759, objs:-/10@781d848c",
+  "  18 ret bytes_new_from_slice -> Ok(Bytes(obj#21))": "cpu:2936698, mem:2665871, objs:-/11@7ecb0cc7",
   "  19 call create_contract(Address(obj#19), Bytes(obj#17), Bytes(obj#21))": "",
-  "  20 call obj_cmp(Address(obj#23), Address(obj#19))": "cpu:2852240, mem:2657321, objs:-/12@b910fe80, auth:1@cf43b39/-",
-  "  21 ret obj_cmp -> Ok(0)": "cpu:2852532",
-  "  22 call get_ledger_network_id()": "cpu:2852582, auth:1@cf43b39/1@90e5b097",
-  "  23 ret get_ledger_network_id -> Ok(Bytes(obj#25))": "cpu:2853612, mem:2657433, objs:-/13@f4726fee",
-  "  24 ret create_contract -> Ok(Address(obj#27))": "cpu:2873027, mem:2660879, objs:-/14@2848efc7, store:-/4@e35545c7, foot:4@16395b42, auth:-/1@764735b1",
-  "  25 call bytes_new_from_slice(44)": "cpu:2875244, mem:2661512, store:-/5@c0161843, foot:5@19d17bae, auth:-/-",
-  "  26 ret bytes_new_from_slice -> Ok(Bytes(obj#29))": "cpu:2876215, mem:2661636, objs:-/15@b67d06c6",
+  "  20 call obj_cmp(Address(obj#23), Address(obj#19))": "cpu:2938341, mem:2666049, objs:-/12@80c56335, auth:1@9d7d4fdc/-",
+  "  21 ret obj_cmp -> Ok(0)": "cpu:2938633",
+  "  22 call get_ledger_network_id()": "cpu:2938683, auth:1@9d7d4fdc/1@10142dc9",
+  "  23 ret get_ledger_network_id -> Ok(Bytes(obj#25))": "cpu:2939713, mem:2666161, objs:-/13@48b98376",
+  "  24 ret create_contract -> Ok(Address(obj#27))": "cpu:2959128, mem:2669607, objs:-/14@28887a37, store:-/4@68ad6035, foot:4@11670a0a, auth:-/1@665fe328",
+  "  25 call bytes_new_from_slice(44)": "cpu:2961345, mem:2670240, store:-/5@d0325e84, foot:5@123e8f31, auth:-/-",
+  "  26 ret bytes_new_from_slice -> Ok(Bytes(obj#29))": "cpu:2962316, mem:2670364, objs:-/15@cd9add84",
   "  27 call create_asset_contract(Bytes(obj#29))": "",
-  "  28 call get_ledger_network_id()": "cpu:2936814, mem:2661768",
-  "  29 ret get_ledger_network_id -> Ok(Bytes(obj#31))": "cpu:2937844, mem:2661880, objs:-/16@be4dfb2c",
-  "  30 call symbol_new_from_slice(10)": "cpu:2955078, mem:2666514, store:-/6@8da19f76, foot:6@fb2e4acf",
-  "  31 ret symbol_new_from_slice -> Ok(Symbol(obj#33))": "cpu:2956086, mem:2666604, objs:-/17@a5fbcdcb",
-  "  32 call symbol_len(Symbol(obj#33))": "cpu:2956526, mem:2666668, objs:-/18@551a4439",
-  "  33 ret symbol_len -> Ok(U32(10))": "cpu:2956648",
+  "  28 call get_ledger_network_id()": "cpu:3022915, mem:2670496",
+  "  29 ret get_ledger_network_id -> Ok(Bytes(obj#31))": "cpu:3023945, mem:2670608, objs:-/16@89f0b4f6",
+  "  30 call symbol_new_from_slice(10)": "cpu:3041179, mem:2675242, store:-/6@307778d5, foot:6@f917f4ef",
+  "  31 ret symbol_new_from_slice -> Ok(Symbol(obj#33))": "cpu:3042187, mem:2675332, objs:-/17@e6bfb86",
+  "  32 call symbol_len(Symbol(obj#33))": "cpu:3042627, mem:2675396, objs:-/18@aad9f38d",
+  "  33 ret symbol_len -> Ok(U32(10))": "cpu:3042749",
   "  34 call symbol_copy_to_slice(Symbol(obj#33), U32(0), 10)": "",
-  "  35 ret symbol_copy_to_slice -> Ok(())": "cpu:2956752",
-  "  36 push SAC:a010db6c:sym#33(Bytes(obj#35))": "cpu:2967159, mem:2668092, objs:-/19@b4fdf111, stk:1@b0da2599, auth:1@25b93c38/-",
+  "  35 ret symbol_copy_to_slice -> Ok(())": "cpu:3042853",
+  "  36 push SAC:a010db6c:sym#33(Bytes(obj#35))": "cpu:3053260, mem:2676820, objs:-/19@5944cf08, stk:1@b0da2599, auth:1@25b93c38/-",
   "  37 call symbol_index_in_strs(Symbol(obj#33), 17)": "",
-  "  38 ret symbol_index_in_strs -> Ok(U32(0))": "cpu:2968954",
+  "  38 ret symbol_index_in_strs -> Ok(U32(0))": "cpu:3055055",
   "  39 call vec_new_from_slice(1)": "",
-  "  40 ret vec_new_from_slice -> Ok(Vec(obj#39))": "cpu:2969917, mem:2668180, objs:-/20@20823080",
+  "  40 ret vec_new_from_slice -> Ok(Vec(obj#39))": "cpu:3056018, mem:2676908, objs:-/20@64848912",
   "  41 call has_contract_data(Vec(obj#39), Instance)": "",
-  "  42 ret has_contract_data -> Ok(False)": "cpu:2970065, stk:1@e3f515bc",
-  "  43 call get_ledger_network_id()": "cpu:3030646, mem:2668312",
-  "  44 ret get_ledger_network_id -> Ok(Bytes(obj#41))": "cpu:3031676, mem:2668424, objs:-/21@e4ccb6e3",
-  "  45 call vec_new_from_slice(1)": "cpu:3042232, mem:2670434, objs:-/22@46268174",
-  "  46 ret vec_new_from_slice -> Ok(Vec(obj#45))": "cpu:3043195, mem:2670522, objs:-/23@11ec8058",
+  "  42 ret has_contract_data -> Ok(False)": "cpu:3056166, stk:1@e3f515bc",
+  "  43 call get_ledger_network_id()": "cpu:3116747, mem:2677040",
+  "  44 ret get_ledger_network_id -> Ok(Bytes(obj#41))": "cpu:3117777, mem:2677152, objs:-/21@318f86eb",
+  "  45 call vec_new_from_slice(1)": "cpu:3128333, mem:2679162, objs:-/22@b5371a01",
+  "  46 ret vec_new_from_slice -> Ok(Vec(obj#45))": "cpu:3129296, mem:2679250, objs:-/23@5dd8f411",
   "  47 call put_contract_data(Vec(obj#45), Address(obj#43), Instance)": "",
-  "  48 ret put_contract_data -> Ok(Void)": "cpu:3043979, mem:2670562, store:1@500c6070/6@8da19f76, stk:1@40572e39",
+  "  48 ret put_contract_data -> Ok(Void)": "cpu:3130080, mem:2679290, store:1@500c6070/6@307778d5, stk:1@40572e39",
   "  49 call string_new_from_slice(4)": "",
-  "  50 ret string_new_from_slice -> Ok(String(obj#47))": "cpu:3044940, mem:2670646, objs:-/24@95a42960",
-  "  51 call bytes_new_from_slice(32)": "cpu:3044986",
-  "  52 ret bytes_new_from_slice -> Ok(Bytes(obj#49))": "cpu:3045955, mem:2670758, objs:-/25@b94c03a3",
+  "  50 ret string_new_from_slice -> Ok(String(obj#47))": "cpu:3131041, mem:2679374, objs:-/24@cd716bb6",
+  "  51 call bytes_new_from_slice(32)": "cpu:3131087",
+  "  52 ret bytes_new_from_slice -> Ok(Bytes(obj#49))": "cpu:3132056, mem:2679486, objs:-/25@bb2a1e39",
   "  53 call bytes_len(Bytes(obj#49))": "",
-  "  54 ret bytes_len -> Ok(U32(32))": "cpu:3046077",
+  "  54 ret bytes_len -> Ok(U32(32))": "cpu:3132178",
   "  55 call vec_new_from_slice(1)": "",
-  "  56 ret vec_new_from_slice -> Ok(Vec(obj#51))": "cpu:3047040, mem:2670846, objs:-/26@c503b22",
+  "  56 ret vec_new_from_slice -> Ok(Vec(obj#51))": "cpu:3133141, mem:2679574, objs:-/26@af99a92a",
   "  57 call map_new_from_slices(2)": "",
-  "  58 call symbol_new_from_slice(10)": "cpu:3047573, mem:2670910",
-  "  59 ret symbol_new_from_slice -> Ok(Symbol(obj#53))": "cpu:3048581, mem:2671000, objs:-/27@2ffb8b48",
-  "  60 call obj_cmp(Symbol(obj#53), Symbol(issuer))": "cpu:3048751",
-  "  61 ret obj_cmp -> Ok(-1)": "cpu:3048917",
-  "  62 ret map_new_from_slices -> Ok(Map(obj#55))": "cpu:3049357, mem:2671064, objs:-/28@e265ff0b",
+  "  58 call symbol_new_from_slice(10)": "cpu:3133674, mem:2679638",
+  "  59 ret symbol_new_from_slice -> Ok(Symbol(obj#53))": "cpu:3134682, mem:2679728, objs:-/27@88d7c695",
+  "  60 call obj_cmp(Symbol(obj#53), Symbol(issuer))": "cpu:3134852",
+  "  61 ret obj_cmp -> Ok(-1)": "cpu:3135018",
+  "  62 ret map_new_from_slices -> Ok(Map(obj#55))": "cpu:3135458, mem:2679792, objs:-/28@ea9d075c",
   "  63 call vec_new_from_slice(2)": "",
-  "  64 ret vec_new_from_slice -> Ok(Vec(obj#57))": "cpu:3050383, mem:2671160, objs:-/29@ae2a8b1e",
+  "  64 ret vec_new_from_slice -> Ok(Vec(obj#57))": "cpu:3136484, mem:2679888, objs:-/29@5f96af2f",
   "  65 call put_contract_data(Vec(obj#51), Vec(obj#57), Instance)": "",
-  "  66 call obj_cmp(Vec(obj#45), Vec(obj#51))": "cpu:3050598, store:-/6@8da19f76, stk:-",
-  "  67 ret obj_cmp -> Ok(-1)": "cpu:3050885",
-  "  68 call obj_cmp(Vec(obj#45), Vec(obj#51))": "cpu:3051466, mem:2671224",
-  "  69 ret obj_cmp -> Ok(-1)": "cpu:3051753",
-  "  70 ret put_contract_data -> Ok(Void)": " store:2@e4aa21f2/6@8da19f76, stk:1@fb59c508",
+  "  66 call obj_cmp(Vec(obj#45), Vec(obj#51))": "cpu:3136699, store:-/6@307778d5, stk:-",
+  "  67 ret obj_cmp -> Ok(-1)": "cpu:3136986",
+  "  68 call obj_cmp(Vec(obj#45), Vec(obj#51))": "cpu:3137567, mem:2679952",
+  "  69 ret obj_cmp -> Ok(-1)": "cpu:3137854",
+  "  70 ret put_contract_data -> Ok(Void)": " store:2@e4aa21f2/6@307778d5, stk:1@fb59c508",
   "  71 call vec_new_from_slice(1)": "",
-  "  72 ret vec_new_from_slice -> Ok(Vec(obj#59))": "cpu:3052716, mem:2671312, objs:-/30@d57f7283",
+  "  72 ret vec_new_from_slice -> Ok(Vec(obj#59))": "cpu:3138817, mem:2680040, objs:-/30@69326c75",
   "  73 call get_contract_data(Vec(obj#59), Instance)": "",
-  "  74 call obj_cmp(Vec(obj#51), Vec(obj#59))": "cpu:3052828, store:-/6@8da19f76, stk:-",
-  "  75 ret obj_cmp -> Ok(0)": "cpu:3053115",
-  "  76 ret get_contract_data -> Ok(Vec(obj#57))": "cpu:3053221, store:2@e4aa21f2/6@8da19f76, stk:1@fb59c508",
+  "  74 call obj_cmp(Vec(obj#51), Vec(obj#59))": "cpu:3138929, store:-/6@307778d5, stk:-",
+  "  75 ret obj_cmp -> Ok(0)": "cpu:3139216",
+  "  76 ret get_contract_data -> Ok(Vec(obj#57))": "cpu:3139322, store:2@e4aa21f2/6@307778d5, stk:1@fb59c508",
   "  77 call vec_get(Vec(obj#57), U32(0))": "",
-  "  78 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3053386",
+  "  78 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3139487",
   "  79 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  "  80 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3053520",
+  "  80 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3139621",
   "  81 call vec_get(Vec(obj#57), U32(1))": "",
-  "  82 ret vec_get -> Ok(Map(obj#55))": "cpu:3053746",
+  "  82 ret vec_get -> Ok(Map(obj#55))": "cpu:3139847",
   "  83 call map_unpack_to_slice(Map(obj#55), 2)": "",
-  "  84 ret map_unpack_to_slice -> Ok(Void)": "cpu:3054097",
+  "  84 ret map_unpack_to_slice -> Ok(Void)": "cpu:3140198",
   "  85 call bytes_len(Bytes(obj#49))": "",
-  "  86 ret bytes_len -> Ok(U32(32))": "cpu:3054219",
+  "  86 ret bytes_len -> Ok(U32(32))": "cpu:3140320",
   "  87 call string_len(String(obj#47))": "",
-  "  88 ret string_len -> Ok(U32(4))": "cpu:3054341",
+  "  88 ret string_len -> Ok(U32(4))": "cpu:3140442",
   "  89 call string_copy_to_slice(String(obj#47), U32(0), 4)": "",
-  "  90 ret string_copy_to_slice -> Ok(())": "cpu:3054444",
-  "  91 call bytes_copy_to_slice(Bytes(obj#49), U32(0), 32)": "cpu:3054894, mem:2671457",
-  "  92 ret bytes_copy_to_slice -> Ok(())": "cpu:3055001",
+  "  90 ret string_copy_to_slice -> Ok(())": "cpu:3140545",
+  "  91 call bytes_copy_to_slice(Bytes(obj#49), U32(0), 32)": "cpu:3140995, mem:2680185",
+  "  92 ret bytes_copy_to_slice -> Ok(())": "cpu:3141102",
   "  93 call string_new_from_slice(57)": "",
-  "  94 ret string_new_from_slice -> Ok(String(obj#61))": "cpu:3055976, mem:2671594, objs:-/31@231cc88b",
+  "  94 ret string_new_from_slice -> Ok(String(obj#61))": "cpu:3142077, mem:2680322, objs:-/31@25fd65a5",
   "  95 call map_new_from_slices(3)": "",
-  "  96 ret map_new_from_slices -> Ok(Map(obj#63))": "cpu:3057128, mem:2671746, objs:-/32@c6743b9e",
+  "  96 ret map_new_from_slices -> Ok(Map(obj#63))": "cpu:3143229, mem:2680474, objs:-/32@8de5c0da",
   "  97 call put_contract_data(Symbol(METADATA), Map(obj#63), Instance)": "",
-  "  98 call obj_cmp(Vec(obj#51), Symbol(METADATA))": "cpu:3057285, store:-/6@8da19f76, stk:-",
-  "  99 ret obj_cmp -> Ok(1)": "cpu:3057407",
+  "  98 call obj_cmp(Vec(obj#51), Symbol(METADATA))": "cpu:3143386, store:-/6@307778d5, stk:-",
+  "  99 ret obj_cmp -> Ok(1)": "cpu:3143508",
   " 100 call obj_cmp(Vec(obj#45), Symbol(METADATA))": "",
-  " 101 ret obj_cmp -> Ok(1)": "cpu:3057529",
-  " 102 call obj_cmp(Symbol(METADATA), Vec(obj#45))": "cpu:3058119, mem:2671834",
-  " 103 ret obj_cmp -> Ok(-1)": "cpu:3058241",
+  " 101 ret obj_cmp -> Ok(1)": "cpu:3143630",
+  " 102 call obj_cmp(Symbol(METADATA), Vec(obj#45))": "cpu:3144220, mem:2680562",
+  " 103 ret obj_cmp -> Ok(-1)": "cpu:3144342",
   " 104 call obj_cmp(Vec(obj#45), Vec(obj#51))": "",
-  " 105 ret obj_cmp -> Ok(-1)": "cpu:3058528",
-  " 106 ret put_contract_data -> Ok(Void)": " store:3@45dc5373/6@8da19f76, stk:1@eee53be4",
-  " 107 pop SAC:a010db6c:sym#33 -> Ok(Void)": "cpu:3068974, mem:2674229, store:3@45dc5373/6@7a3e6ff4",
-  " 108 ret create_asset_contract -> Ok(Address(obj#65))": "cpu:3069475, mem:2674293, objs:-/33@71de66ec, store:-/6@7a3e6ff4, stk:-, auth:-/-",
+  " 105 ret obj_cmp -> Ok(-1)": "cpu:3144629",
+  " 106 ret put_contract_data -> Ok(Void)": " store:3@45dc5373/6@307778d5, stk:1@eee53be4",
+  " 107 pop SAC:a010db6c:sym#33 -> Ok(Void)": "cpu:3155075, mem:2682957, store:3@45dc5373/6@2cf51240",
+  " 108 ret create_asset_contract -> Ok(Address(obj#65))": "cpu:3155576, mem:2683021, objs:-/33@621f9925, store:-/6@2cf51240, stk:-, auth:-/-",
   " 109 call vec_new_from_slice(2)": "",
-  " 110 ret vec_new_from_slice -> Ok(Vec(obj#67))": "cpu:3070501, mem:2674389, objs:-/34@4f3bdc64",
-  " 111 call vec_new()": "cpu:3088542, mem:2679235, objs:-/35@b54c193c",
-  " 112 ret vec_new -> Ok(Vec(obj#71))": "cpu:3089043, mem:2679299, objs:-/36@5492d997",
+  " 110 ret vec_new_from_slice -> Ok(Vec(obj#67))": "cpu:3156602, mem:2683117, objs:-/34@1a8d08a1",
+  " 111 call vec_new()": "cpu:3174643, mem:2687963, objs:-/35@74d66db8",
+  " 112 ret vec_new -> Ok(Vec(obj#71))": "cpu:3175144, mem:2688027, objs:-/36@787cf092",
   " 113 call bytes_new_from_slice(32)": "",
-  " 114 ret bytes_new_from_slice -> Ok(Bytes(obj#73))": "cpu:3090012, mem:2679411, objs:-/37@235af3f0",
+  " 114 ret bytes_new_from_slice -> Ok(Bytes(obj#73))": "cpu:3176113, mem:2688139, objs:-/37@877e903c",
   " 115 call bytes_len(Bytes(obj#73))": "",
-  " 116 ret bytes_len -> Ok(U32(32))": "cpu:3090134",
+  " 116 ret bytes_len -> Ok(U32(32))": "cpu:3176235",
   " 117 call bytes_new_from_slice(64)": "",
-  " 118 ret bytes_new_from_slice -> Ok(Bytes(obj#75))": "cpu:3091111, mem:2679555, objs:-/38@beeed340",
+  " 118 ret bytes_new_from_slice -> Ok(Bytes(obj#75))": "cpu:3177212, mem:2688283, objs:-/38@afadee9e",
   " 119 call bytes_len(Bytes(obj#75))": "",
-  " 120 ret bytes_len -> Ok(U32(64))": "cpu:3091233",
+  " 120 ret bytes_len -> Ok(U32(64))": "cpu:3177334",
   " 121 call map_new_from_slices(2)": "",
-  " 122 call symbol_new_from_slice(10)": "cpu:3091766, mem:2679619",
-  " 123 ret symbol_new_from_slice -> Ok(Symbol(obj#77))": "cpu:3092774, mem:2679709, objs:-/39@a729e8c0",
-  " 124 call obj_cmp(Symbol(obj#77), Symbol(signature))": "cpu:3092944",
-  " 125 ret obj_cmp -> Ok(-1)": "cpu:3093111",
-  " 126 ret map_new_from_slices -> Ok(Map(obj#79))": "cpu:3093551, mem:2679773, objs:-/40@e31a862",
+  " 122 call symbol_new_from_slice(10)": "cpu:3177867, mem:2688347",
+  " 123 ret symbol_new_from_slice -> Ok(Symbol(obj#77))": "cpu:3178875, mem:2688437, objs:-/39@5126f30c",
+  " 124 call obj_cmp(Symbol(obj#77), Symbol(signature))": "cpu:3179045",
+  " 125 ret obj_cmp -> Ok(-1)": "cpu:3179212",
+  " 126 ret map_new_from_slices -> Ok(Map(obj#79))": "cpu:3179652, mem:2688501, objs:-/40@b9529df6",
   " 127 call vec_push_back(Vec(obj#71), Map(obj#79))": "",
-  " 128 ret vec_push_back -> Ok(Vec(obj#81))": "cpu:3094758, mem:2679861, objs:-/41@3b584b6f",
-  " 129 call obj_cmp(Symbol(obj#85), Symbol(signature))": "cpu:3102854, mem:2681113, objs:-/45@55f6fc97",
-  " 130 ret obj_cmp -> Ok(-1)": "cpu:3103021",
-  " 131 call call(Address(obj#65), Symbol(mint), Vec(obj#67))": "cpu:3105885, mem:2681449, objs:-/49@54859c9c, auth:-/1@67829d7d",
-  " 132 push SAC:a010db6c:mint(Address(obj#27), I128(100000000))": "cpu:3136955, mem:2686491, objs:-/50@d65800b8, stk:1@e80130cb, auth:1@329c08c2/1@bec353d1",
+  " 128 ret vec_push_back -> Ok(Vec(obj#81))": "cpu:3180859, mem:2688589, objs:-/41@986011b3",
+  " 129 call obj_cmp(Symbol(obj#85), Symbol(signature))": "cpu:3188955, mem:2689841, objs:-/45@98e0727f",
+  " 130 ret obj_cmp -> Ok(-1)": "cpu:3189122",
+  " 131 call call(Address(obj#65), Symbol(mint), Vec(obj#67))": "cpu:3191986, mem:2690177, objs:-/49@f9ac3ee, auth:-/1@67829d7d",
+  " 132 push SAC:a010db6c:mint(Address(obj#27), I128(100000000))": "cpu:3223056, mem:2695219, objs:-/50@11ae78a3, stk:1@e80130cb, auth:1@329c08c2/1@bec353d1",
   " 133 call symbol_index_in_strs(Symbol(mint), 17)": "",
-  " 134 ret symbol_index_in_strs -> Ok(U32(11))": "cpu:3137703",
+  " 134 ret symbol_index_in_strs -> Ok(U32(11))": "cpu:3223804",
   " 135 call vec_new_from_slice(1)": "",
-  " 136 ret vec_new_from_slice -> Ok(Vec(obj#101))": "cpu:3138666, mem:2686579, objs:-/51@dbde1446",
+  " 136 ret vec_new_from_slice -> Ok(Vec(obj#101))": "cpu:3224767, mem:2695307, objs:-/51@ef4638be",
   " 137 call get_contract_data(Vec(obj#101), Instance)": "",
-  " 138 call obj_cmp(Symbol(obj#115), Symbol(issuer))": "cpu:3148657, mem:2687710, objs:-/60@b477cee3, stk:-",
-  " 139 ret obj_cmp -> Ok(-1)": "cpu:3148823",
-  " 140 call obj_cmp(Symbol(METADATA), Vec(obj#109))": "cpu:3149754, mem:2687838, objs:-/62@ba9afb30",
-  " 141 ret obj_cmp -> Ok(-1)": "cpu:3149876",
+  " 138 call obj_cmp(Symbol(obj#115), Symbol(issuer))": "cpu:3234758, mem:2696438, objs:-/60@c1976b57, stk:-",
+  " 139 ret obj_cmp -> Ok(-1)": "cpu:3234924",
+  " 140 call obj_cmp(Symbol(METADATA), Vec(obj#109))": "cpu:3235855, mem:2696566, objs:-/62@71b0906a",
+  " 141 ret obj_cmp -> Ok(-1)": "cpu:3235977",
   " 142 call obj_cmp(Vec(obj#109), Vec(obj#113))": "",
-  " 143 ret obj_cmp -> Ok(-1)": "cpu:3150163",
-  " 144 call obj_cmp(Vec(obj#109), Vec(obj#101))": "cpu:3150214",
-  " 145 ret obj_cmp -> Ok(-1)": "cpu:3150501",
+  " 143 ret obj_cmp -> Ok(-1)": "cpu:3236264",
+  " 144 call obj_cmp(Vec(obj#109), Vec(obj#101))": "cpu:3236315",
+  " 145 ret obj_cmp -> Ok(-1)": "cpu:3236602",
   " 146 call obj_cmp(Vec(obj#113), Vec(obj#101))": "",
-  " 147 ret obj_cmp -> Ok(0)": "cpu:3150788",
-  " 148 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3150894, store:3@1ac54034/6@7a3e6ff4, stk:1@6dfb5347",
+  " 147 ret obj_cmp -> Ok(0)": "cpu:3236889",
+  " 148 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3236995, store:3@1ac54034/6@2cf51240, stk:1@6dfb5347",
   " 149 call vec_get(Vec(obj#123), U32(0))": "",
-  " 150 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3151059",
+  " 150 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3237160",
   " 151 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  " 152 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3151193",
+  " 152 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3237294",
   " 153 call vec_get(Vec(obj#123), U32(1))": "",
-  " 154 ret vec_get -> Ok(Map(obj#121))": "cpu:3151419",
+  " 154 ret vec_get -> Ok(Map(obj#121))": "cpu:3237520",
   " 155 call map_unpack_to_slice(Map(obj#121), 2)": "",
-  " 156 ret map_unpack_to_slice -> Ok(Void)": "cpu:3151770",
+  " 156 ret map_unpack_to_slice -> Ok(Void)": "cpu:3237871",
   " 157 call bytes_len(Bytes(obj#119))": "",
-  " 158 ret bytes_len -> Ok(U32(32))": "cpu:3151892",
-  " 159 call obj_cmp(Address(obj#125), Address(obj#27))": "cpu:3152485, mem:2687902, objs:-/63@c3dd246d",
-  " 160 ret obj_cmp -> Ok(-1)": "cpu:3152777",
+  " 158 ret bytes_len -> Ok(U32(32))": "cpu:3237993",
+  " 159 call obj_cmp(Address(obj#125), Address(obj#27))": "cpu:3238586, mem:2696630, objs:-/63@11244ee",
+  " 160 ret obj_cmp -> Ok(-1)": "cpu:3238878",
   " 161 call vec_new_from_slice(1)": "",
-  " 162 ret vec_new_from_slice -> Ok(Vec(obj#127))": "cpu:3153740, mem:2687990, objs:-/64@bfc8fcab",
+  " 162 ret vec_new_from_slice -> Ok(Vec(obj#127))": "cpu:3239841, mem:2696718, objs:-/64@a6fee706",
   " 163 call get_contract_data(Vec(obj#127), Instance)": "",
-  " 164 call obj_cmp(Vec(obj#109), Vec(obj#127))": "cpu:3153852, store:-/6@7a3e6ff4, stk:-",
-  " 165 ret obj_cmp -> Ok(0)": "cpu:3154139",
-  " 166 ret get_contract_data -> Ok(Address(obj#111))": "cpu:3154245, store:3@1ac54034/6@7a3e6ff4, stk:1@6dfb5347",
+  " 164 call obj_cmp(Vec(obj#109), Vec(obj#127))": "cpu:3239953, store:-/6@2cf51240, stk:-",
+  " 165 ret obj_cmp -> Ok(0)": "cpu:3240240",
+  " 166 ret get_contract_data -> Ok(Address(obj#111))": "cpu:3240346, store:3@1ac54034/6@2cf51240, stk:1@6dfb5347",
   " 167 call require_auth(Address(obj#111))": "",
-  " 168 call obj_cmp(Address(obj#83), Address(obj#111))": "cpu:3154874, mem:2688022",
-  " 169 ret obj_cmp -> Ok(0)": "cpu:3155166",
+  " 168 call obj_cmp(Address(obj#83), Address(obj#111))": "cpu:3240975, mem:2696750",
+  " 169 ret obj_cmp -> Ok(0)": "cpu:3241267",
   " 170 call obj_cmp(Address(obj#83), Address(obj#111))": " auth:1@329c08c2/-",
-  " 171 ret obj_cmp -> Ok(0)": "cpu:3155458",
+  " 171 ret obj_cmp -> Ok(0)": "cpu:3241559",
   " 172 call obj_cmp(Address(obj#95), Address(obj#99))": "",
-  " 173 ret obj_cmp -> Ok(0)": "cpu:3155750",
+  " 173 ret obj_cmp -> Ok(0)": "cpu:3241851",
   " 174 call obj_cmp(Address(obj#97), Address(obj#27))": "",
-  " 175 ret obj_cmp -> Ok(0)": "cpu:3156042",
-  " 176 call vec_len(Vec(obj#93))": "cpu:3174151, mem:2692820",
-  " 177 ret vec_len -> Ok(U32(1))": "cpu:3174273",
+  " 175 ret obj_cmp -> Ok(0)": "cpu:3242143",
+  " 176 call vec_len(Vec(obj#93))": "cpu:3260252, mem:2701548",
+  " 177 ret vec_len -> Ok(U32(1))": "cpu:3260374",
   " 178 call bytes_new_from_slice(32)": "",
-  " 179 ret bytes_new_from_slice -> Ok(Bytes(obj#129))": "cpu:3175242, mem:2692932, objs:-/65@7e202475",
-  " 180 call vec_get(Vec(obj#93), U32(0))": "cpu:3177175, mem:2693172",
-  " 181 ret vec_get -> Ok(Map(obj#91))": "cpu:3177401",
+  " 179 ret bytes_new_from_slice -> Ok(Bytes(obj#129))": "cpu:3261343, mem:2701660, objs:-/65@cdf8dd71",
+  " 180 call vec_get(Vec(obj#93), U32(0))": "cpu:3263276, mem:2701900",
+  " 181 ret vec_get -> Ok(Map(obj#91))": "cpu:3263502",
   " 182 call map_unpack_to_slice(Map(obj#91), 2)": "",
-  " 183 ret map_unpack_to_slice -> Ok(Void)": "cpu:3177753",
+  " 183 ret map_unpack_to_slice -> Ok(Void)": "cpu:3263854",
   " 184 call bytes_len(Bytes(obj#87))": "",
-  " 185 ret bytes_len -> Ok(U32(32))": "cpu:3177875",
+  " 185 ret bytes_len -> Ok(U32(32))": "cpu:3263976",
   " 186 call bytes_len(Bytes(obj#89))": "",
-  " 187 ret bytes_len -> Ok(U32(64))": "cpu:3177997",
+  " 187 ret bytes_len -> Ok(U32(64))": "cpu:3264098",
   " 188 call verify_sig_ed25519(Bytes(obj#87), Bytes(obj#129), Bytes(obj#89))": "",
-  " 189 ret verify_sig_ed25519 -> Ok(Void)": "cpu:3597207",
+  " 189 ret verify_sig_ed25519 -> Ok(Void)": "cpu:3683308",
   " 190 call bytes_copy_to_slice(Bytes(obj#87), U32(0), 32)": "",
-  " 191 ret bytes_copy_to_slice -> Ok(())": "cpu:3597314",
-  " 192 ret require_auth -> Ok(Void)": "cpu:3603919, mem:2694946, store:3@1ac54034/7@13572a65, foot:7@11158d3a, auth:1@329c08c2/1@78d26b23",
+  " 191 ret bytes_copy_to_slice -> Ok(())": "cpu:3683415",
+  " 192 ret require_auth -> Ok(Void)": "cpu:3690020, mem:2703674, store:3@1ac54034/7@280d58cd, foot:7@ab7131c8, auth:1@329c08c2/1@78d26b23",
   " 193 call extend_current_contract_instance_and_code_ttl(U32(103680), U32(120960))": "",
-  " 194 call get_ledger_sequence()": "cpu:3605225, mem:2695082, store:3@1ac54034/-, foot:-",
+  " 194 call get_ledger_sequence()": "cpu:3691326, mem:2703810, store:3@1ac54034/-, foot:-",
   " 195 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 196 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:3616588, mem:2697319, store:3@1ac54034/7@7d6a91e2, foot:7@11158d3a",
-  " 197 call vec_new_from_slice(2)": "cpu:3616783",
-  " 198 ret vec_new_from_slice -> Ok(Vec(obj#131))": "cpu:3617809, mem:2697415, objs:-/66@4ecff31b",
+  " 196 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:3702689, mem:2706047, store:3@1ac54034/7@9f3ae923, foot:7@ab7131c8",
+  " 197 call vec_new_from_slice(2)": "cpu:3702884",
+  " 198 ret vec_new_from_slice -> Ok(Vec(obj#131))": "cpu:3703910, mem:2706143, objs:-/66@c857b2d0",
   " 199 call has_contract_data(Vec(obj#131), Persistent)": "",
-  " 200 ret has_contract_data -> Ok(False)": "cpu:3622028, mem:2698471, store:3@1ac54034/8@8f3087af, foot:8@762230b3",
+  " 200 ret has_contract_data -> Ok(False)": "cpu:3708129, mem:2707199, store:3@1ac54034/8@3fd08c, foot:8@70d45e46",
   " 201 call vec_new_from_slice(1)": "",
-  " 202 ret vec_new_from_slice -> Ok(Vec(obj#133))": "cpu:3622991, mem:2698559, objs:-/67@38d51e95",
+  " 202 ret vec_new_from_slice -> Ok(Vec(obj#133))": "cpu:3709092, mem:2707287, objs:-/67@e56fc896",
   " 203 call get_contract_data(Vec(obj#133), Instance)": "",
-  " 204 call obj_cmp(Vec(obj#109), Vec(obj#133))": "cpu:3623103, store:-/8@8f3087af, stk:-",
-  " 205 ret obj_cmp -> Ok(-1)": "cpu:3623390",
+  " 204 call obj_cmp(Vec(obj#109), Vec(obj#133))": "cpu:3709204, store:-/8@3fd08c, stk:-",
+  " 205 ret obj_cmp -> Ok(-1)": "cpu:3709491",
   " 206 call obj_cmp(Vec(obj#113), Vec(obj#133))": "",
-  " 207 ret obj_cmp -> Ok(0)": "cpu:3623677",
-  " 208 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3623783, store:3@1ac54034/8@8f3087af, stk:1@6dfb5347",
+  " 207 ret obj_cmp -> Ok(0)": "cpu:3709778",
+  " 208 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3709884, store:3@1ac54034/8@3fd08c, stk:1@6dfb5347",
   " 209 call vec_get(Vec(obj#123), U32(0))": "",
-  " 210 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3623948",
+  " 210 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3710049",
   " 211 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  " 212 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3624082",
+  " 212 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3710183",
   " 213 call vec_get(Vec(obj#123), U32(1))": "",
-  " 214 ret vec_get -> Ok(Map(obj#121))": "cpu:3624308",
+  " 214 ret vec_get -> Ok(Map(obj#121))": "cpu:3710409",
   " 215 call map_unpack_to_slice(Map(obj#121), 2)": "",
-  " 216 ret map_unpack_to_slice -> Ok(Void)": "cpu:3624659",
+  " 216 ret map_unpack_to_slice -> Ok(Void)": "cpu:3710760",
   " 217 call bytes_len(Bytes(obj#119))": "",
-  " 218 ret bytes_len -> Ok(U32(32))": "cpu:3624781",
-  " 219 call vec_new_from_slice(2)": "cpu:3626991, mem:2698799",
-  " 220 ret vec_new_from_slice -> Ok(Vec(obj#135))": "cpu:3628017, mem:2698895, objs:-/68@26f666e",
+  " 218 ret bytes_len -> Ok(U32(32))": "cpu:3710882",
+  " 219 call vec_new_from_slice(2)": "cpu:3713092, mem:2707527",
+  " 220 ret vec_new_from_slice -> Ok(Vec(obj#135))": "cpu:3714118, mem:2707623, objs:-/68@c7d90b5f",
   " 221 call has_contract_data(Vec(obj#135), Persistent)": "",
-  " 222 ret has_contract_data -> Ok(False)": "cpu:3630166, mem:2699175",
+  " 222 ret has_contract_data -> Ok(False)": "cpu:3716267, mem:2707903",
   " 223 call vec_new_from_slice(1)": "",
-  " 224 ret vec_new_from_slice -> Ok(Vec(obj#137))": "cpu:3631129, mem:2699263, objs:-/69@b6e7c484",
+  " 224 ret vec_new_from_slice -> Ok(Vec(obj#137))": "cpu:3717230, mem:2707991, objs:-/69@70e3b07f",
   " 225 call get_contract_data(Vec(obj#137), Instance)": "",
-  " 226 call obj_cmp(Vec(obj#109), Vec(obj#137))": "cpu:3631241, store:-/8@8f3087af, stk:-",
-  " 227 ret obj_cmp -> Ok(-1)": "cpu:3631528",
+  " 226 call obj_cmp(Vec(obj#109), Vec(obj#137))": "cpu:3717342, store:-/8@3fd08c, stk:-",
+  " 227 ret obj_cmp -> Ok(-1)": "cpu:3717629",
   " 228 call obj_cmp(Vec(obj#113), Vec(obj#137))": "",
-  " 229 ret obj_cmp -> Ok(0)": "cpu:3631815",
-  " 230 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3631921, store:3@1ac54034/8@8f3087af, stk:1@6dfb5347",
+  " 229 ret obj_cmp -> Ok(0)": "cpu:3717916",
+  " 230 ret get_contract_data -> Ok(Vec(obj#123))": "cpu:3718022, store:3@1ac54034/8@3fd08c, stk:1@6dfb5347",
   " 231 call vec_get(Vec(obj#123), U32(0))": "",
-  " 232 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3632086",
+  " 232 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:3718187",
   " 233 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  " 234 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3632220",
+  " 234 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:3718321",
   " 235 call vec_get(Vec(obj#123), U32(1))": "",
-  " 236 ret vec_get -> Ok(Map(obj#121))": "cpu:3632446",
+  " 236 ret vec_get -> Ok(Map(obj#121))": "cpu:3718547",
   " 237 call map_unpack_to_slice(Map(obj#121), 2)": "",
-  " 238 ret map_unpack_to_slice -> Ok(Void)": "cpu:3632797",
+  " 238 ret map_unpack_to_slice -> Ok(Void)": "cpu:3718898",
   " 239 call bytes_len(Bytes(obj#119))": "",
-  " 240 ret bytes_len -> Ok(U32(32))": "cpu:3632919",
-  " 241 call vec_new_from_slice(2)": "cpu:3634978, mem:2699503",
-  " 242 ret vec_new_from_slice -> Ok(Vec(obj#139))": "cpu:3636004, mem:2699599, objs:-/70@37eb5ff1",
+  " 240 ret bytes_len -> Ok(U32(32))": "cpu:3719020",
+  " 241 call vec_new_from_slice(2)": "cpu:3721079, mem:2708231",
+  " 242 ret vec_new_from_slice -> Ok(Vec(obj#139))": "cpu:3722105, mem:2708327, objs:-/70@d5c77346",
   " 243 call map_new_from_slices(3)": "",
-  " 244 call symbol_new_from_slice(10)": "cpu:3636543, mem:2699687",
-  " 245 ret symbol_new_from_slice -> Ok(Symbol(obj#141))": "cpu:3637551, mem:2699777, objs:-/71@71bc8ebb",
-  " 246 call obj_cmp(Symbol(amount), Symbol(obj#141))": "cpu:3637602",
-  " 247 ret obj_cmp -> Ok(-1)": "cpu:3637768",
+  " 244 call symbol_new_from_slice(10)": "cpu:3722644, mem:2708415",
+  " 245 ret symbol_new_from_slice -> Ok(Symbol(obj#141))": "cpu:3723652, mem:2708505, objs:-/71@41db0bd8",
+  " 246 call obj_cmp(Symbol(amount), Symbol(obj#141))": "cpu:3723703",
+  " 247 ret obj_cmp -> Ok(-1)": "cpu:3723869",
   " 248 call obj_cmp(Symbol(obj#141), Symbol(clawback))": "",
-  " 249 ret obj_cmp -> Ok(-1)": "cpu:3637935",
-  " 250 ret map_new_from_slices -> Ok(Map(obj#143))": "cpu:3638375, mem:2699841, objs:-/72@5dab92c3",
+  " 249 ret obj_cmp -> Ok(-1)": "cpu:3724036",
+  " 250 ret map_new_from_slices -> Ok(Map(obj#143))": "cpu:3724476, mem:2708569, objs:-/72@5409b088",
   " 251 call put_contract_data(Vec(obj#139), Map(obj#143), Persistent)": "",
-  " 252 ret put_contract_data -> Ok(Void)": "cpu:3645906, mem:2701739, store:3@1ac54034/8@9a107528, foot:8@705e031b",
+  " 252 ret put_contract_data -> Ok(Void)": "cpu:3732007, mem:2710467, store:3@1ac54034/8@468c1920, foot:8@30483a11",
   " 253 call vec_new_from_slice(2)": "",
-  " 254 ret vec_new_from_slice -> Ok(Vec(obj#145))": "cpu:3646932, mem:2701835, objs:-/73@90b81a0b",
+  " 254 ret vec_new_from_slice -> Ok(Vec(obj#145))": "cpu:3733033, mem:2710563, objs:-/73@b1107a79",
   " 255 call extend_contract_data_ttl(Vec(obj#145), Persistent, U32(501120), U32(518400))": "",
-  " 256 call get_ledger_sequence()": "cpu:3649081, mem:2702115, store:3@1ac54034/-, foot:-",
+  " 256 call get_ledger_sequence()": "cpu:3735182, mem:2710843, store:3@1ac54034/-, foot:-",
   " 257 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 258 ret extend_contract_data_ttl -> Ok(Void)": "cpu:3650406, mem:2702675, store:3@1ac54034/8@c9fb35db, foot:8@705e031b",
+  " 258 ret extend_contract_data_ttl -> Ok(Void)": "cpu:3736507, mem:2711403, store:3@1ac54034/8@f3128f36, foot:8@30483a11",
   " 259 call get_contract_data(Symbol(METADATA), Instance)": "",
-  " 260 call obj_cmp(Vec(obj#109), Symbol(METADATA))": "cpu:3650457, store:-/8@c9fb35db, stk:-",
-  " 261 ret obj_cmp -> Ok(1)": "cpu:3650579",
-  " 262 ret get_contract_data -> Ok(Map(obj#107))": "cpu:3650685, store:3@1ac54034/8@c9fb35db, stk:1@6dfb5347",
+  " 260 call obj_cmp(Vec(obj#109), Symbol(METADATA))": "cpu:3736558, store:-/8@f3128f36, stk:-",
+  " 261 ret obj_cmp -> Ok(1)": "cpu:3736680",
+  " 262 ret get_contract_data -> Ok(Map(obj#107))": "cpu:3736786, store:3@1ac54034/8@f3128f36, stk:1@6dfb5347",
   " 263 call map_unpack_to_slice(Map(obj#107), 3)": "",
-  " 264 ret map_unpack_to_slice -> Ok(Void)": "cpu:3651025",
+  " 264 ret map_unpack_to_slice -> Ok(Void)": "cpu:3737126",
   " 265 call vec_new_from_slice(4)": "",
-  " 266 ret vec_new_from_slice -> Ok(Vec(obj#147))": "cpu:3652177, mem:2702787, objs:-/74@bbda6bf2",
+  " 266 ret vec_new_from_slice -> Ok(Vec(obj#147))": "cpu:3738278, mem:2711515, objs:-/74@3ae64c0e",
   " 267 call contract_event(Vec(obj#147), I128(100000000))": "",
-  " 268 ret contract_event -> Ok(Void)": "cpu:3653786, mem:2702964, objs:-/75@f36724f0, evt:1@30577549",
+  " 268 ret contract_event -> Ok(Void)": "cpu:3739887, mem:2711692, objs:-/75@e61762aa, evt:1@30577549",
   " 269 pop SAC:a010db6c:mint -> Ok(Void)": "",
-  " 270 ret call -> Ok(Void)": " store:-/8@c9fb35db, stk:-, auth:-/-",
+  " 270 ret call -> Ok(Void)": " store:-/8@f3128f36, stk:-, auth:-/-",
   " 271 call symbol_new_from_slice(18)": "",
-  " 272 ret symbol_new_from_slice -> Ok(Symbol(obj#151))": "cpu:3654797, mem:2703062, objs:-/76@efe8e6f2",
+  " 272 ret symbol_new_from_slice -> Ok(Symbol(obj#151))": "cpu:3740898, mem:2711790, objs:-/76@addd43d2",
   " 273 call vec_new_from_slice(3)": "",
-  " 274 ret vec_new_from_slice -> Ok(Vec(obj#153))": "cpu:3655947, mem:2703166, objs:-/77@e8fcfc43",
+  " 274 ret vec_new_from_slice -> Ok(Vec(obj#153))": "cpu:3742048, mem:2711894, objs:-/77@4a314da8",
   " 275 call call(Address(obj#13), Symbol(invoke), Vec(obj#153))": "",
-  " 276 push VM:3f977dac:invoke(Address(obj#27), Symbol(obj#151), Address(obj#65))": "cpu:5124284, mem:4047815, objs:-/78@154cb39b, vm:1114112@e6a5c288/9@e2332afc, stk:1@9e5f23cd, auth:1@7dbb1baf/-",
-  " 277 call vec_new_from_linear_memory(U32(1048568), U32(1))": "cpu:5128070, mem:4047965, objs:3@de490b5b/78@154cb39b, vm:-/-, stk:1@362b4888",
-  " 278 ret vec_new_from_linear_memory -> Ok(Vec(obj#157))": "cpu:5131002, mem:4048053, objs:3@de490b5b/79@d1216f7d",
-  " 279 call try_call(Address(obj#27), Symbol(obj#151), Vec(obj#157))": "cpu:5131498, mem:4048077, objs:4@1b7e1f5e/79@d1216f7d, stk:1@934b6a5a",
-  " 280 call symbol_len(Symbol(obj#151))": "cpu:5132682, mem:4048101",
-  " 281 ret symbol_len -> Ok(U32(18))": "cpu:5132804",
+  " 276 push VM:3f977dac:invoke(Address(obj#27), Symbol(obj#151), Address(obj#65))": "cpu:5210385, mem:4056543, objs:-/78@c9318ed7, vm:1114112@e6a5c288/9@e2332afc, stk:1@9e5f23cd, auth:1@7dbb1baf/-",
+  " 277 call vec_new_from_linear_memory(U32(1048568), U32(1))": "cpu:5214171, mem:4056693, objs:3@de490b5b/78@c9318ed7, vm:-/-, stk:1@362b4888",
+  " 278 ret vec_new_from_linear_memory -> Ok(Vec(obj#157))": "cpu:5217103, mem:4056781, objs:3@de490b5b/79@a5b159a0",
+  " 279 call try_call(Address(obj#27), Symbol(obj#151), Vec(obj#157))": "cpu:5217599, mem:4056805, objs:4@1b7e1f5e/79@a5b159a0, stk:1@934b6a5a",
+  " 280 call symbol_len(Symbol(obj#151))": "cpu:5218783, mem:4056829",
+  " 281 ret symbol_len -> Ok(U32(18))": "cpu:5218905",
   " 282 call symbol_copy_to_slice(Symbol(obj#151), U32(0), 18)": "",
-  " 283 ret symbol_copy_to_slice -> Ok(())": "cpu:5132909",
-  " 284 push VM:84eb5e8a:sym#151(Address(obj#65))": "cpu:6263762, mem:5354241, objs:-/80@80d8cd80, vm:1114112@a679d6fe/13@1d71d880, stk:2@8347ec31, auth:2@4bc81287/-",
-  " 285 call symbol_len(Symbol(obj#151))": "cpu:6266670, mem:5354311, objs:1@1a056af1/80@80d8cd80, stk:2@b1dcc41c",
-  " 286 ret symbol_len -> Ok(U32(18))": "cpu:6266792",
+  " 283 ret symbol_copy_to_slice -> Ok(())": "cpu:5219010",
+  " 284 push VM:e921e73a:sym#151(Address(obj#65))": "cpu:6424408, mem:5371487, objs:-/80@daea4e86, vm:1114112@ba4a7cb7/15@ea6028ca, stk:2@d4bda62f, auth:2@4bc81287/-",
+  " 285 call symbol_len(Symbol(obj#151))": "cpu:6427316, mem:5371557, objs:1@1a056af1/80@daea4e86, stk:2@66f97871",
+  " 286 ret symbol_len -> Ok(U32(18))": "cpu:6427438",
   " 287 call symbol_copy_to_slice(Symbol(obj#151), U32(0), 18)": "",
-  " 288 ret symbol_copy_to_slice -> Ok(())": "cpu:6266897",
-  " 289 call symbol_new_from_linear_memory(U32(1048576), U32(18))": " vm:-/-",
-  " 290 ret symbol_new_from_linear_memory -> Ok(Symbol(obj#161))": "cpu:6273263, mem:5354409, objs:1@1a056af1/81@907ffbcb",
-  " 291 call vec_new_from_linear_memory(U32(1048552), U32(1))": "cpu:6273759, mem:5354433, objs:2@3c32a821/81@907ffbcb, stk:2@ba86bb34",
-  " 292 ret vec_new_from_linear_memory -> Ok(Vec(obj#163))": "cpu:6275559, mem:5354521, objs:2@3c32a821/82@9fd9953a",
-  " 293 call contract_event(Vec(obj#163), Void)": "cpu:6276055, mem:5354545, objs:3@4808d22b/82@9fd9953a, stk:2@ee1ec944",
-  " 294 ret contract_event -> Ok(Void)": "cpu:6277974, mem:5354722, objs:3@4808d22b/83@f984717f, evt:2@5c0a5e7c",
+  " 288 ret symbol_copy_to_slice -> Ok(())": "cpu:6427543",
+  " 289 call symbol_new_from_linear_memory(U32(1048581), U32(18))": " vm:-/-",
+  " 290 ret symbol_new_from_linear_memory -> Ok(Symbol(obj#161))": "cpu:6433909, mem:5371655, objs:1@1a056af1/81@d9a94878",
+  " 291 call vec_new_from_linear_memory(U32(1048552), U32(1))": "cpu:6434405, mem:5371679, objs:2@3c32a821/81@d9a94878, stk:2@a7982ab3",
+  " 292 ret vec_new_from_linear_memory -> Ok(Vec(obj#163))": "cpu:6436205, mem:5371767, objs:2@3c32a821/82@a67f01e4",
+  " 293 call contract_event(Vec(obj#163), Void)": "cpu:6436701, mem:5371791, objs:3@4808d22b/82@a67f01e4, stk:2@b8958dd4",
+  " 294 ret contract_event -> Ok(Void)": "cpu:6438620, mem:5371968, objs:3@4808d22b/83@5791ca7, evt:2@5c0a5e7c",
   " 295 call put_contract_data(Symbol(key), Symbol(val), Instance)": "",
-  " 296 ret put_contract_data -> Ok(Void)": "cpu:6279280, mem:5354762, store:1@de8bbb3f/8@c9fb35db, stk:2@2faec951",
+  " 296 ret put_contract_data -> Ok(Void)": "cpu:6439926, mem:5372008, store:1@de8bbb3f/8@f3128f36, stk:2@afa3f13e",
   " 297 call put_contract_data(Symbol(key), Symbol(val), Persistent)": "",
-  " 298 ret put_contract_data -> Ok(Void)": "cpu:6287078, mem:5356908, store:1@de8bbb3f/9@b0c99627, foot:9@5cdfff7f",
+  " 298 ret put_contract_data -> Ok(Void)": "cpu:6447724, mem:5374154, store:1@de8bbb3f/9@5f71adf2, foot:9@35b56f4f",
   " 299 call put_contract_data(Symbol(key), Symbol(val), Temporary)": "",
-  " 300 ret put_contract_data -> Ok(Void)": "cpu:6295844, mem:5359240, store:1@de8bbb3f/10@a1051050, foot:10@94939b8f",
+  " 300 ret put_contract_data -> Ok(Void)": "cpu:6456490, mem:5376486, store:1@de8bbb3f/10@6d990a36, foot:10@1f2338b2",
   " 301 call get_current_contract_address()": "",
-  " 302 ret get_current_contract_address -> Ok(Address(obj#167))": "cpu:6296640, mem:5359304, objs:3@4808d22b/84@bcfacb44",
-  " 303 call vec_new_from_linear_memory(U32(1048552), U32(3))": "cpu:6297136, mem:5359328, objs:4@edabcfe7/84@bcfacb44, stk:2@562756c3",
-  " 304 ret vec_new_from_linear_memory -> Ok(Vec(obj#169))": "cpu:6302557, mem:5359432, objs:4@edabcfe7/85@d16ee99b",
-  " 305 call call(Address(obj#65), Symbol(transfer), Vec(obj#169))": "cpu:6303053, mem:5359456, objs:5@7c258b24/85@d16ee99b, stk:2@f3f52",
-  " 306 push SAC:a010db6c:transfer(Address(obj#167), Address(obj#65), I128(10))": "cpu:6333773, mem:5364698, objs:-/86@d28acf7c, store:-/10@a1051050, stk:3@fda7fb8c, auth:3@9e100d70/-",
+  " 302 ret get_current_contract_address -> Ok(Address(obj#167))": "cpu:6457286, mem:5376550, objs:3@4808d22b/84@f8ba269c",
+  " 303 call vec_new_from_linear_memory(U32(1048552), U32(3))": "cpu:6457782, mem:5376574, objs:4@edabcfe7/84@f8ba269c, stk:2@46ab08a8",
+  " 304 ret vec_new_from_linear_memory -> Ok(Vec(obj#169))": "cpu:6463203, mem:5376678, objs:4@edabcfe7/85@74850c86",
+  " 305 call call(Address(obj#65), Symbol(transfer), Vec(obj#169))": "cpu:6463699, mem:5376702, objs:5@7c258b24/85@74850c86, stk:2@3b0f56a5",
+  " 306 push SAC:a010db6c:transfer(Address(obj#167), Address(obj#65), I128(10))": "cpu:6494419, mem:5381944, objs:-/86@af3451a0, store:-/10@6d990a36, stk:3@c648e61f, auth:3@9e100d70/-",
   " 307 call symbol_index_in_strs(Symbol(transfer), 17)": "",
-  " 308 ret symbol_index_in_strs -> Ok(U32(5))": "cpu:6334531",
+  " 308 ret symbol_index_in_strs -> Ok(U32(5))": "cpu:6495177",
   " 309 call require_auth(Address(obj#167))": "",
-  " 310 call obj_cmp(Address(obj#159), Address(obj#167))": "cpu:6335162, mem:5364738",
-  " 311 ret obj_cmp -> Ok(0)": "cpu:6335454",
+  " 310 call obj_cmp(Address(obj#159), Address(obj#167))": "cpu:6495808, mem:5381984",
+  " 311 ret obj_cmp -> Ok(0)": "cpu:6496100",
   " 312 ret require_auth -> Ok(Void)": "",
   " 313 call extend_current_contract_instance_and_code_ttl(U32(103680), U32(120960))": "",
-  " 314 call get_ledger_sequence()": "cpu:6336779, mem:5364874, store:-/-, foot:-",
+  " 314 call get_ledger_sequence()": "cpu:6497425, mem:5382120, store:-/-, foot:-",
   " 315 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 316 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6346963, mem:5366619, store:-/10@a1051050, foot:10@94939b8f",
-  " 317 call vec_new_from_slice(2)": "cpu:6347158",
-  " 318 ret vec_new_from_slice -> Ok(Vec(obj#173))": "cpu:6348184, mem:5366715, objs:-/87@bb91b503",
+  " 316 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6507609, mem:5383865, store:-/10@6d990a36, foot:10@1f2338b2",
+  " 317 call vec_new_from_slice(2)": "cpu:6507804",
+  " 318 ret vec_new_from_slice -> Ok(Vec(obj#173))": "cpu:6508830, mem:5383961, objs:-/87@b6d54bc7",
   " 319 call has_contract_data(Vec(obj#173), Persistent)": "",
-  " 320 ret has_contract_data -> Ok(True)": "cpu:6350621, mem:5366995",
+  " 320 ret has_contract_data -> Ok(True)": "cpu:6511267, mem:5384241",
   " 321 call get_contract_data(Vec(obj#173), Persistent)": "",
-  " 322 call obj_cmp(Symbol(amount), Symbol(obj#175))": "cpu:6354611, mem:5367453, objs:-/88@4852328e",
-  " 323 ret obj_cmp -> Ok(-1)": "cpu:6354777",
+  " 322 call obj_cmp(Symbol(amount), Symbol(obj#175))": "cpu:6515257, mem:5384699, objs:-/88@9f439cd4",
+  " 323 ret obj_cmp -> Ok(-1)": "cpu:6515423",
   " 324 call obj_cmp(Symbol(obj#175), Symbol(clawback))": "",
-  " 325 ret obj_cmp -> Ok(-1)": "cpu:6354944",
-  " 326 ret get_contract_data -> Ok(Map(obj#177))": "cpu:6355445, mem:5367517, objs:-/89@bba8fbde",
+  " 325 ret obj_cmp -> Ok(-1)": "cpu:6515590",
+  " 326 ret get_contract_data -> Ok(Map(obj#177))": "cpu:6516091, mem:5384763, objs:-/89@99d469db",
   " 327 call map_unpack_to_slice(Map(obj#177), 3)": "",
-  " 328 ret map_unpack_to_slice -> Ok(Void)": "cpu:6355848",
-  " 329 call vec_new_from_slice(2)": "cpu:6355999",
-  " 330 ret vec_new_from_slice -> Ok(Vec(obj#179))": "cpu:6357025, mem:5367613, objs:-/90@42083a82",
+  " 328 ret map_unpack_to_slice -> Ok(Void)": "cpu:6516494",
+  " 329 call vec_new_from_slice(2)": "cpu:6516645",
+  " 330 ret vec_new_from_slice -> Ok(Vec(obj#179))": "cpu:6517671, mem:5384859, objs:-/90@26fada03",
   " 331 call has_contract_data(Vec(obj#179), Persistent)": "",
-  " 332 ret has_contract_data -> Ok(True)": "cpu:6359462, mem:5367893",
+  " 332 ret has_contract_data -> Ok(True)": "cpu:6520108, mem:5385139",
   " 333 call get_contract_data(Vec(obj#179), Persistent)": "",
-  " 334 call obj_cmp(Symbol(amount), Symbol(obj#181))": "cpu:6363452, mem:5368351, objs:-/91@8c2a7cab",
-  " 335 ret obj_cmp -> Ok(-1)": "cpu:6363618",
+  " 334 call obj_cmp(Symbol(amount), Symbol(obj#181))": "cpu:6524098, mem:5385597, objs:-/91@bdd8072a",
+  " 335 ret obj_cmp -> Ok(-1)": "cpu:6524264",
   " 336 call obj_cmp(Symbol(obj#181), Symbol(clawback))": "",
-  " 337 ret obj_cmp -> Ok(-1)": "cpu:6363785",
-  " 338 ret get_contract_data -> Ok(Map(obj#183))": "cpu:6364286, mem:5368415, objs:-/92@39222600",
+  " 337 ret obj_cmp -> Ok(-1)": "cpu:6524431",
+  " 338 ret get_contract_data -> Ok(Map(obj#183))": "cpu:6524932, mem:5385661, objs:-/92@92b7027f",
   " 339 call map_unpack_to_slice(Map(obj#183), 3)": "",
-  " 340 ret map_unpack_to_slice -> Ok(Void)": "cpu:6364689",
+  " 340 ret map_unpack_to_slice -> Ok(Void)": "cpu:6525335",
   " 341 call vec_new_from_slice(2)": "",
-  " 342 ret vec_new_from_slice -> Ok(Vec(obj#185))": "cpu:6365715, mem:5368511, objs:-/93@ef59a717",
+  " 342 ret vec_new_from_slice -> Ok(Vec(obj#185))": "cpu:6526361, mem:5385757, objs:-/93@adde608d",
   " 343 call map_new_from_slices(3)": "",
-  " 344 call symbol_new_from_slice(10)": "cpu:6366254, mem:5368599",
-  " 345 ret symbol_new_from_slice -> Ok(Symbol(obj#187))": "cpu:6367262, mem:5368689, objs:-/94@d414ad2d",
-  " 346 call obj_cmp(Symbol(amount), Symbol(obj#187))": "cpu:6367313",
-  " 347 ret obj_cmp -> Ok(-1)": "cpu:6367479",
+  " 344 call symbol_new_from_slice(10)": "cpu:6526900, mem:5385845",
+  " 345 ret symbol_new_from_slice -> Ok(Symbol(obj#187))": "cpu:6527908, mem:5385935, objs:-/94@75741946",
+  " 346 call obj_cmp(Symbol(amount), Symbol(obj#187))": "cpu:6527959",
+  " 347 ret obj_cmp -> Ok(-1)": "cpu:6528125",
   " 348 call obj_cmp(Symbol(obj#187), Symbol(clawback))": "",
-  " 349 ret obj_cmp -> Ok(-1)": "cpu:6367646",
-  " 350 ret map_new_from_slices -> Ok(Map(obj#189))": "cpu:6368086, mem:5368753, objs:-/95@d4f59d9b",
+  " 349 ret obj_cmp -> Ok(-1)": "cpu:6528292",
+  " 350 ret map_new_from_slices -> Ok(Map(obj#189))": "cpu:6528732, mem:5385999, objs:-/95@b1a4cc76",
   " 351 call put_contract_data(Vec(obj#185), Map(obj#189), Persistent)": "",
-  " 352 ret put_contract_data -> Ok(Void)": "cpu:6378623, mem:5371066, store:-/10@5bbd051b",
+  " 352 ret put_contract_data -> Ok(Void)": "cpu:6539269, mem:5388312, store:-/10@b6d848ab",
   " 353 call vec_new_from_slice(2)": "",
-  " 354 ret vec_new_from_slice -> Ok(Vec(obj#191))": "cpu:6379649, mem:5371162, objs:-/96@7e78c0c",
+  " 354 ret vec_new_from_slice -> Ok(Vec(obj#191))": "cpu:6540295, mem:5388408, objs:-/96@f5e1e88e",
   " 355 call extend_contract_data_ttl(Vec(obj#191), Persistent, U32(501120), U32(518400))": "",
-  " 356 call get_ledger_sequence()": "cpu:6382086, mem:5371442, store:-/-, foot:-",
+  " 356 call get_ledger_sequence()": "cpu:6542732, mem:5388688, store:-/-, foot:-",
   " 357 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 358 ret extend_contract_data_ttl -> Ok(Void)": " store:-/10@5bbd051b, foot:10@94939b8f",
-  " 359 call vec_new_from_slice(2)": "cpu:6382281",
-  " 360 ret vec_new_from_slice -> Ok(Vec(obj#193))": "cpu:6383307, mem:5371538, objs:-/97@c8b18738",
+  " 358 ret extend_contract_data_ttl -> Ok(Void)": " store:-/10@b6d848ab, foot:10@1f2338b2",
+  " 359 call vec_new_from_slice(2)": "cpu:6542927",
+  " 360 ret vec_new_from_slice -> Ok(Vec(obj#193))": "cpu:6543953, mem:5388784, objs:-/97@63910726",
   " 361 call has_contract_data(Vec(obj#193), Persistent)": "",
-  " 362 ret has_contract_data -> Ok(False)": "cpu:6388954, mem:5372873, store:-/11@5754f10d, foot:11@ef335ac2",
+  " 362 ret has_contract_data -> Ok(False)": "cpu:6549600, mem:5390119, store:-/11@dab670da, foot:11@88c71cad",
   " 363 call vec_new_from_slice(1)": "",
-  " 364 ret vec_new_from_slice -> Ok(Vec(obj#195))": "cpu:6389917, mem:5372961, objs:-/98@5273d2ea",
+  " 364 ret vec_new_from_slice -> Ok(Vec(obj#195))": "cpu:6550563, mem:5390207, objs:-/98@810bdf17",
   " 365 call get_contract_data(Vec(obj#195), Instance)": "",
-  " 366 call obj_cmp(Symbol(obj#209), Symbol(issuer))": "cpu:6399908, mem:5374092, objs:-/107@82e34b0f, stk:-",
-  " 367 ret obj_cmp -> Ok(-1)": "cpu:6400074",
-  " 368 call obj_cmp(Symbol(METADATA), Vec(obj#203))": "cpu:6401005, mem:5374220, objs:-/109@faf50cfa",
-  " 369 ret obj_cmp -> Ok(-1)": "cpu:6401127",
+  " 366 call obj_cmp(Symbol(obj#209), Symbol(issuer))": "cpu:6560554, mem:5391338, objs:-/107@525f146c, stk:-",
+  " 367 ret obj_cmp -> Ok(-1)": "cpu:6560720",
+  " 368 call obj_cmp(Symbol(METADATA), Vec(obj#203))": "cpu:6561651, mem:5391466, objs:-/109@b97a3021",
+  " 369 ret obj_cmp -> Ok(-1)": "cpu:6561773",
   " 370 call obj_cmp(Vec(obj#203), Vec(obj#207))": "",
-  " 371 ret obj_cmp -> Ok(-1)": "cpu:6401414",
-  " 372 call obj_cmp(Vec(obj#203), Vec(obj#195))": "cpu:6401465",
-  " 373 ret obj_cmp -> Ok(-1)": "cpu:6401752",
+  " 371 ret obj_cmp -> Ok(-1)": "cpu:6562060",
+  " 372 call obj_cmp(Vec(obj#203), Vec(obj#195))": "cpu:6562111",
+  " 373 ret obj_cmp -> Ok(-1)": "cpu:6562398",
   " 374 call obj_cmp(Vec(obj#207), Vec(obj#195))": "",
-  " 375 ret obj_cmp -> Ok(0)": "cpu:6402039",
-  " 376 ret get_contract_data -> Ok(Vec(obj#217))": "cpu:6402145, store:3@cdf334a4/11@5754f10d, stk:3@8f2207a7",
+  " 375 ret obj_cmp -> Ok(0)": "cpu:6562685",
+  " 376 ret get_contract_data -> Ok(Vec(obj#217))": "cpu:6562791, store:3@cdf334a4/11@dab670da, stk:3@40091d82",
   " 377 call vec_get(Vec(obj#217), U32(0))": "",
-  " 378 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:6402310",
+  " 378 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:6562956",
   " 379 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  " 380 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:6402444",
+  " 380 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:6563090",
   " 381 call vec_get(Vec(obj#217), U32(1))": "",
-  " 382 ret vec_get -> Ok(Map(obj#215))": "cpu:6402670",
+  " 382 ret vec_get -> Ok(Map(obj#215))": "cpu:6563316",
   " 383 call map_unpack_to_slice(Map(obj#215), 2)": "",
-  " 384 ret map_unpack_to_slice -> Ok(Void)": "cpu:6403021",
+  " 384 ret map_unpack_to_slice -> Ok(Void)": "cpu:6563667",
   " 385 call bytes_len(Bytes(obj#213))": "",
-  " 386 ret bytes_len -> Ok(U32(32))": "cpu:6403143",
-  " 387 call vec_new_from_slice(2)": "cpu:6405353, mem:5374460",
-  " 388 ret vec_new_from_slice -> Ok(Vec(obj#219))": "cpu:6406379, mem:5374556, objs:-/110@e7adba0f",
+  " 386 ret bytes_len -> Ok(U32(32))": "cpu:6563789",
+  " 387 call vec_new_from_slice(2)": "cpu:6565999, mem:5391706",
+  " 388 ret vec_new_from_slice -> Ok(Vec(obj#219))": "cpu:6567025, mem:5391802, objs:-/110@b6b63b4b",
   " 389 call has_contract_data(Vec(obj#219), Persistent)": "",
-  " 390 ret has_contract_data -> Ok(False)": "cpu:6408816, mem:5374836",
+  " 390 ret has_contract_data -> Ok(False)": "cpu:6569462, mem:5392082",
   " 391 call vec_new_from_slice(1)": "",
-  " 392 ret vec_new_from_slice -> Ok(Vec(obj#221))": "cpu:6409779, mem:5374924, objs:-/111@fead492e",
+  " 392 ret vec_new_from_slice -> Ok(Vec(obj#221))": "cpu:6570425, mem:5392170, objs:-/111@969eb4d5",
   " 393 call get_contract_data(Vec(obj#221), Instance)": "",
-  " 394 call obj_cmp(Vec(obj#203), Vec(obj#221))": "cpu:6409891, store:-/11@5754f10d, stk:-",
-  " 395 ret obj_cmp -> Ok(-1)": "cpu:6410178",
+  " 394 call obj_cmp(Vec(obj#203), Vec(obj#221))": "cpu:6570537, store:-/11@dab670da, stk:-",
+  " 395 ret obj_cmp -> Ok(-1)": "cpu:6570824",
   " 396 call obj_cmp(Vec(obj#207), Vec(obj#221))": "",
-  " 397 ret obj_cmp -> Ok(0)": "cpu:6410465",
-  " 398 ret get_contract_data -> Ok(Vec(obj#217))": "cpu:6410571, store:3@cdf334a4/11@5754f10d, stk:3@8f2207a7",
+  " 397 ret obj_cmp -> Ok(0)": "cpu:6571111",
+  " 398 ret get_contract_data -> Ok(Vec(obj#217))": "cpu:6571217, store:3@cdf334a4/11@dab670da, stk:3@40091d82",
   " 399 call vec_get(Vec(obj#217), U32(0))": "",
-  " 400 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:6410736",
+  " 400 ret vec_get -> Ok(Symbol(AlphaNum4))": "cpu:6571382",
   " 401 call symbol_index_in_strs(Symbol(AlphaNum4), 3)": "",
-  " 402 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:6410870",
+  " 402 ret symbol_index_in_strs -> Ok(U32(1))": "cpu:6571516",
   " 403 call vec_get(Vec(obj#217), U32(1))": "",
-  " 404 ret vec_get -> Ok(Map(obj#215))": "cpu:6411096",
+  " 404 ret vec_get -> Ok(Map(obj#215))": "cpu:6571742",
   " 405 call map_unpack_to_slice(Map(obj#215), 2)": "",
-  " 406 ret map_unpack_to_slice -> Ok(Void)": "cpu:6411447",
+  " 406 ret map_unpack_to_slice -> Ok(Void)": "cpu:6572093",
   " 407 call bytes_len(Bytes(obj#213))": "",
-  " 408 ret bytes_len -> Ok(U32(32))": "cpu:6411569",
-  " 409 call vec_new_from_slice(2)": "cpu:6413628, mem:5375164",
-  " 410 ret vec_new_from_slice -> Ok(Vec(obj#223))": "cpu:6414654, mem:5375260, objs:-/112@98279d38",
+  " 408 ret bytes_len -> Ok(U32(32))": "cpu:6572215",
+  " 409 call vec_new_from_slice(2)": "cpu:6574274, mem:5392410",
+  " 410 ret vec_new_from_slice -> Ok(Vec(obj#223))": "cpu:6575300, mem:5392506, objs:-/112@507cf5dc",
   " 411 call map_new_from_slices(3)": "",
-  " 412 call symbol_new_from_slice(10)": "cpu:6415193, mem:5375348",
-  " 413 ret symbol_new_from_slice -> Ok(Symbol(obj#225))": "cpu:6416201, mem:5375438, objs:-/113@1cc7ad32",
-  " 414 call obj_cmp(Symbol(amount), Symbol(obj#225))": "cpu:6416252",
-  " 415 ret obj_cmp -> Ok(-1)": "cpu:6416418",
+  " 412 call symbol_new_from_slice(10)": "cpu:6575839, mem:5392594",
+  " 413 ret symbol_new_from_slice -> Ok(Symbol(obj#225))": "cpu:6576847, mem:5392684, objs:-/113@5a8632f3",
+  " 414 call obj_cmp(Symbol(amount), Symbol(obj#225))": "cpu:6576898",
+  " 415 ret obj_cmp -> Ok(-1)": "cpu:6577064",
   " 416 call obj_cmp(Symbol(obj#225), Symbol(clawback))": "",
-  " 417 ret obj_cmp -> Ok(-1)": "cpu:6416585",
-  " 418 ret map_new_from_slices -> Ok(Map(obj#227))": "cpu:6417025, mem:5375502, objs:-/114@db7789c",
+  " 417 ret obj_cmp -> Ok(-1)": "cpu:6577231",
+  " 418 ret map_new_from_slices -> Ok(Map(obj#227))": "cpu:6577671, mem:5392748, objs:-/114@74906da4",
   " 419 call put_contract_data(Vec(obj#223), Map(obj#227), Persistent)": "",
-  " 420 ret put_contract_data -> Ok(Void)": "cpu:6425882, mem:5377679, store:3@cdf334a4/11@ccdc4e71, foot:11@7a0a7060",
+  " 420 ret put_contract_data -> Ok(Void)": "cpu:6586528, mem:5394925, store:3@cdf334a4/11@7fbe520a, foot:11@ce2fe551",
   " 421 call vec_new_from_slice(2)": "",
-  " 422 ret vec_new_from_slice -> Ok(Vec(obj#229))": "cpu:6426908, mem:5377775, objs:-/115@7748fd0f",
+  " 422 ret vec_new_from_slice -> Ok(Vec(obj#229))": "cpu:6587554, mem:5395021, objs:-/115@cec6eba6",
   " 423 call extend_contract_data_ttl(Vec(obj#229), Persistent, U32(501120), U32(518400))": "",
-  " 424 call get_ledger_sequence()": "cpu:6429345, mem:5378055, store:3@cdf334a4/-, foot:-",
+  " 424 call get_ledger_sequence()": "cpu:6589991, mem:5395301, store:3@cdf334a4/-, foot:-",
   " 425 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 426 ret extend_contract_data_ttl -> Ok(Void)": "cpu:6431165, mem:5378819, store:3@cdf334a4/11@46d68017, foot:11@7a0a7060",
+  " 426 ret extend_contract_data_ttl -> Ok(Void)": "cpu:6591811, mem:5396065, store:3@cdf334a4/11@4ffedcf, foot:11@ce2fe551",
   " 427 call get_contract_data(Symbol(METADATA), Instance)": "",
-  " 428 call obj_cmp(Vec(obj#203), Symbol(METADATA))": "cpu:6431216, store:-/11@46d68017, stk:-",
-  " 429 ret obj_cmp -> Ok(1)": "cpu:6431338",
-  " 430 ret get_contract_data -> Ok(Map(obj#201))": "cpu:6431444, store:3@cdf334a4/11@46d68017, stk:3@8f2207a7",
+  " 428 call obj_cmp(Vec(obj#203), Symbol(METADATA))": "cpu:6591862, store:-/11@4ffedcf, stk:-",
+  " 429 ret obj_cmp -> Ok(1)": "cpu:6591984",
+  " 430 ret get_contract_data -> Ok(Map(obj#201))": "cpu:6592090, store:3@cdf334a4/11@4ffedcf, stk:3@40091d82",
   " 431 call map_unpack_to_slice(Map(obj#201), 3)": "",
-  " 432 ret map_unpack_to_slice -> Ok(Void)": "cpu:6431784",
+  " 432 ret map_unpack_to_slice -> Ok(Void)": "cpu:6592430",
   " 433 call vec_new_from_slice(4)": "",
-  " 434 ret vec_new_from_slice -> Ok(Vec(obj#231))": "cpu:6432936, mem:5378931, objs:-/116@86a00717",
+  " 434 ret vec_new_from_slice -> Ok(Vec(obj#231))": "cpu:6593582, mem:5396177, objs:-/116@2bd67271",
   " 435 call contract_event(Vec(obj#231), I128(10))": "",
-  " 436 ret contract_event -> Ok(Void)": "cpu:6434545, mem:5379108, objs:-/117@d1562ec0, evt:3@695a120a",
+  " 436 ret contract_event -> Ok(Void)": "cpu:6595191, mem:5396354, objs:-/117@64acd8d1, evt:3@695a120a",
   " 437 pop SAC:a010db6c:transfer -> Ok(Void)": "",
-  " 438 ret call -> Ok(Void)": " objs:5@7c258b24/117@d1562ec0, store:1@de8bbb3f/11@46d68017, stk:2@f3f52, auth:2@4bc81287/-",
-  " 439 pop VM:84eb5e8a:sym#151 -> Err(Error(Contract, #12345))": " vm:1114112@c78b3564/13@1d71d880",
-  " 440 ret try_call -> Ok(Error(Contract, #12345))": " objs:4@1b7e1f5e/117@d1562ec0, vm:-/-, evt:3@f7990f0c, store:-/8@c9fb35db, stk:1@934b6a5a, auth:1@7dbb1baf/-",
+  " 438 ret call -> Ok(Void)": " objs:5@7c258b24/117@64acd8d1, store:1@de8bbb3f/11@4ffedcf, stk:2@3b0f56a5, auth:2@4bc81287/-",
+  " 439 pop VM:e921e73a:sym#151 -> Err(Error(Contract, #12345))": " vm:1114112@6a0ffbe6/15@ea6028ca",
+  " 440 ret try_call -> Ok(Error(Contract, #12345))": " objs:4@1b7e1f5e/117@64acd8d1, vm:-/-, evt:3@f7990f0c, store:-/8@f3128f36, stk:1@934b6a5a, auth:1@7dbb1baf/-",
   " 441 pop VM:3f977dac:invoke -> Ok(Void)": " vm:1114112@b383fad6/9@e2332afc",
-  " 442 ret call -> Ok(Void)": " objs:-/117@d1562ec0, vm:-/-, stk:-, auth:-/-",
+  " 442 ret call -> Ok(Void)": " objs:-/117@64acd8d1, vm:-/-, stk:-, auth:-/-",
   " 443 call vec_new_from_slice(1)": "",
-  " 444 ret vec_new_from_slice -> Ok(Vec(obj#235))": "cpu:6435569, mem:5379196, objs:-/118@7ea738bb",
+  " 444 ret vec_new_from_slice -> Ok(Vec(obj#235))": "cpu:6596215, mem:5396442, objs:-/118@7e4ec9c0",
   " 445 call call(Address(obj#65), Symbol(balance), Vec(obj#235))": "",
-  " 446 push SAC:a010db6c:balance(Address(obj#27))": "cpu:6465937, mem:5384270, objs:-/119@6e5938e8, stk:1@6b0ee014, auth:1@5e4bb2c9/-",
+  " 446 push SAC:a010db6c:balance(Address(obj#27))": "cpu:6626583, mem:5401516, objs:-/119@276174be, stk:1@6b0ee014, auth:1@5e4bb2c9/-",
   " 447 call symbol_index_in_strs(Symbol(balance), 17)": "",
-  " 448 ret symbol_index_in_strs -> Ok(U32(3))": "cpu:6466685",
+  " 448 ret symbol_index_in_strs -> Ok(U32(3))": "cpu:6627331",
   " 449 call extend_current_contract_instance_and_code_ttl(U32(103680), U32(120960))": "",
-  " 450 call get_ledger_sequence()": "cpu:6468010, mem:5384406, store:-/-, foot:-",
+  " 450 call get_ledger_sequence()": "cpu:6628656, mem:5401652, store:-/-, foot:-",
   " 451 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 452 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6478194, mem:5386151, store:-/8@c9fb35db, foot:11@7a0a7060",
-  " 453 call vec_new_from_slice(2)": "cpu:6478301",
-  " 454 ret vec_new_from_slice -> Ok(Vec(obj#239))": "cpu:6479327, mem:5386247, objs:-/120@3efc7dda",
+  " 452 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6638840, mem:5403397, store:-/8@f3128f36, foot:11@ce2fe551",
+  " 453 call vec_new_from_slice(2)": "cpu:6638947",
+  " 454 ret vec_new_from_slice -> Ok(Vec(obj#239))": "cpu:6639973, mem:5403493, objs:-/120@abf278f7",
   " 455 call has_contract_data(Vec(obj#239), Persistent)": "",
-  " 456 ret has_contract_data -> Ok(True)": "cpu:6481712, mem:5386527",
+  " 456 ret has_contract_data -> Ok(True)": "cpu:6642358, mem:5403773",
   " 457 call get_contract_data(Vec(obj#239), Persistent)": "",
-  " 458 call obj_cmp(Symbol(amount), Symbol(obj#241))": "cpu:6485650, mem:5386985, objs:-/121@7ca5f326",
-  " 459 ret obj_cmp -> Ok(-1)": "cpu:6485816",
+  " 458 call obj_cmp(Symbol(amount), Symbol(obj#241))": "cpu:6646296, mem:5404231, objs:-/121@287bed6a",
+  " 459 ret obj_cmp -> Ok(-1)": "cpu:6646462",
   " 460 call obj_cmp(Symbol(obj#241), Symbol(clawback))": "",
-  " 461 ret obj_cmp -> Ok(-1)": "cpu:6485983",
-  " 462 ret get_contract_data -> Ok(Map(obj#243))": "cpu:6486484, mem:5387049, objs:-/122@7812b178",
+  " 461 ret obj_cmp -> Ok(-1)": "cpu:6646629",
+  " 462 ret get_contract_data -> Ok(Map(obj#243))": "cpu:6647130, mem:5404295, objs:-/122@b2da514d",
   " 463 call vec_new_from_slice(2)": "",
-  " 464 ret vec_new_from_slice -> Ok(Vec(obj#245))": "cpu:6487510, mem:5387145, objs:-/123@9d7d2508",
+  " 464 ret vec_new_from_slice -> Ok(Vec(obj#245))": "cpu:6648156, mem:5404391, objs:-/123@f008e06",
   " 465 call extend_contract_data_ttl(Vec(obj#245), Persistent, U32(501120), U32(518400))": "",
-  " 466 call get_ledger_sequence()": "cpu:6489895, mem:5387425, store:-/-, foot:-",
+  " 466 call get_ledger_sequence()": "cpu:6650541, mem:5404671, store:-/-, foot:-",
   " 467 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 468 ret extend_contract_data_ttl -> Ok(Void)": " store:-/8@c9fb35db, foot:11@7a0a7060",
+  " 468 ret extend_contract_data_ttl -> Ok(Void)": " store:-/8@f3128f36, foot:11@ce2fe551",
   " 469 call map_unpack_to_slice(Map(obj#243), 3)": "",
-  " 470 ret map_unpack_to_slice -> Ok(Void)": "cpu:6490298",
+  " 470 ret map_unpack_to_slice -> Ok(Void)": "cpu:6650944",
   " 471 pop SAC:a010db6c:balance -> Ok(I128(100000000))": "",
   " 472 ret call -> Ok(I128(100000000))": " stk:-, auth:-/-",
   " 473 call vec_new_from_slice(1)": "",
-  " 474 ret vec_new_from_slice -> Ok(Vec(obj#247))": "cpu:6491322, mem:5387513, objs:-/124@cae2422d",
+  " 474 ret vec_new_from_slice -> Ok(Vec(obj#247))": "cpu:6651968, mem:5404759, objs:-/124@e482b82c",
   " 475 call call(Address(obj#65), Symbol(balance), Vec(obj#247))": "",
-  " 476 push SAC:a010db6c:balance(Address(obj#65))": "cpu:6521690, mem:5392587, objs:-/125@5765dee0, stk:1@bb90a730, auth:1@db4f3f5a/-",
+  " 476 push SAC:a010db6c:balance(Address(obj#65))": "cpu:6682336, mem:5409833, objs:-/125@6d6bd52a, stk:1@bb90a730, auth:1@db4f3f5a/-",
   " 477 call symbol_index_in_strs(Symbol(balance), 17)": "",
-  " 478 ret symbol_index_in_strs -> Ok(U32(3))": "cpu:6522438",
+  " 478 ret symbol_index_in_strs -> Ok(U32(3))": "cpu:6683084",
   " 479 call extend_current_contract_instance_and_code_ttl(U32(103680), U32(120960))": "",
-  " 480 call get_ledger_sequence()": "cpu:6523763, mem:5392723, store:-/-, foot:-",
+  " 480 call get_ledger_sequence()": "cpu:6684409, mem:5409969, store:-/-, foot:-",
   " 481 ret get_ledger_sequence -> Ok(U32(123))": "",
-  " 482 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6533947, mem:5394468, store:-/8@c9fb35db, foot:11@7a0a7060",
-  " 483 call vec_new_from_slice(2)": "cpu:6534054",
-  " 484 ret vec_new_from_slice -> Ok(Vec(obj#251))": "cpu:6535080, mem:5394564, objs:-/126@95ba2a1e",
+  " 482 ret extend_current_contract_instance_and_code_ttl -> Ok(Void)": "cpu:6694593, mem:5411714, store:-/8@f3128f36, foot:11@ce2fe551",
+  " 483 call vec_new_from_slice(2)": "cpu:6694700",
+  " 484 ret vec_new_from_slice -> Ok(Vec(obj#251))": "cpu:6695726, mem:5411810, objs:-/126@5b6cb06d",
   " 485 call has_contract_data(Vec(obj#251), Persistent)": "",
-  " 486 ret has_contract_data -> Ok(False)": "cpu:6539010, mem:5395472, store:-/9@95d958f0",
+  " 486 ret has_contract_data -> Ok(False)": "cpu:6699656, mem:5412718, store:-/9@c4f05dd",
   " 487 pop SAC:a010db6c:balance -> Ok(I128(0))": "",
   " 488 ret call -> Ok(I128(0))": " stk:-, auth:-/-",
   " 489 call symbol_new_from_slice(15)": "",
-  " 490 ret symbol_new_from_slice -> Ok(Symbol(obj#253))": "cpu:6540018, mem:5395567, objs:-/127@4365030c",
+  " 490 ret symbol_new_from_slice -> Ok(Symbol(obj#253))": "cpu:6700664, mem:5412813, objs:-/127@550c43b6",
   " 491 call vec_new()": "",
-  " 492 ret vec_new -> Ok(Vec(obj#255))": "cpu:6540519, mem:5395631, objs:-/128@4029db14",
+  " 492 ret vec_new -> Ok(Vec(obj#255))": "cpu:6701165, mem:5412877, objs:-/128@27f6f698",
   " 493 call call(Address(obj#27), Symbol(obj#253), Vec(obj#255))": "",
-  " 494 call symbol_len(Symbol(obj#253))": "cpu:6541391, mem:5395647",
-  " 495 ret symbol_len -> Ok(U32(15))": "cpu:6541513",
+  " 494 call symbol_len(Symbol(obj#253))": "cpu:6702037, mem:5412893",
+  " 495 ret symbol_len -> Ok(U32(15))": "cpu:6702159",
   " 496 call symbol_copy_to_slice(Symbol(obj#253), U32(0), 15)": "",
-  " 497 ret symbol_copy_to_slice -> Ok(())": "cpu:6541617",
-  " 498 push VM:84eb5e8a:sym#253()": "cpu:7672532, mem:6701847, objs:-/129@def72d40, vm:1114112@a679d6fe/13@1d71d880, stk:1@125864, auth:1@1268bc31/-",
-  " 499 call symbol_len(Symbol(obj#253))": "cpu:7675001, mem:6701877",
-  " 500 ret symbol_len -> Ok(U32(15))": "cpu:7675123",
+  " 497 ret symbol_copy_to_slice -> Ok(())": "cpu:6702263",
+  " 498 push VM:e921e73a:sym#253()": "cpu:7907723, mem:6727611, objs:-/129@b958af9d, vm:1114112@ba4a7cb7/15@ea6028ca, stk:1@5a6fd02c, auth:1@1268bc31/-",
+  " 499 call symbol_len(Symbol(obj#253))": "cpu:7910192, mem:6727641",
+  " 500 ret symbol_len -> Ok(U32(15))": "cpu:7910314",
   " 501 call symbol_copy_to_slice(Symbol(obj#253), U32(0), 15)": "",
-  " 502 ret symbol_copy_to_slice -> Ok(())": "cpu:7675227",
+  " 502 ret symbol_copy_to_slice -> Ok(())": "cpu:7910418",
   " 503 call has_contract_data(Symbol(key), Instance)": " vm:-/-",
-  " 504 ret has_contract_data -> Ok(False)": "cpu:7676768, stk:1@e522770e",
+  " 504 ret has_contract_data -> Ok(False)": "cpu:7911959, stk:1@95d29873",
   " 505 call has_contract_data(Symbol(key), Persistent)": "",
-  " 506 ret has_contract_data -> Ok(False)": "cpu:7680405, mem:6702709, store:-/10@c48d6825",
+  " 506 ret has_contract_data -> Ok(False)": "cpu:7915596, mem:6728473, store:-/10@59031a7c",
   " 507 call has_contract_data(Symbol(key), Temporary)": "",
-  " 508 ret has_contract_data -> Ok(False)": "cpu:7684194, mem:6703609, store:-/11@72e6223b",
-  " 509 pop VM:84eb5e8a:sym#253 -> Ok(False)": " vm:1114112@a679d6fe/13@1d71d880",
+  " 508 ret has_contract_data -> Ok(False)": "cpu:7919385, mem:6729373, store:-/11@568bb3c1",
+  " 509 pop VM:e921e73a:sym#253 -> Ok(False)": " vm:1114112@ba4a7cb7/15@ea6028ca",
   " 510 ret call -> Ok(False)": " vm:-/-, stk:-, auth:-/-",
-  " 511 call obj_cmp(Address(obj#27), Address(obj#259))": "cpu:7690758, mem:6705077, objs:-/130@f4c192b",
-  " 512 ret obj_cmp -> Ok(-1)": "cpu:7691050",
-  " 513 call obj_cmp(Address(obj#27), Address(obj#261))": "cpu:7691490, mem:6705141, objs:-/131@fc4b585a",
-  " 514 ret obj_cmp -> Ok(0)": "cpu:7691782",
-  " 515 end": "cpu:7691782, mem:6705141, prngs:-/9b4a753, objs:-/131@fc4b585a, vm:-/-, evt:3@f7990f0c, store:-/11@72e6223b, foot:11@7a0a7060, stk:-, auth:-/-"
+  " 511 call obj_cmp(Address(obj#27), Address(obj#259))": "cpu:7925949, mem:6730841, objs:-/130@c09df1af",
+  " 512 ret obj_cmp -> Ok(-1)": "cpu:7926241",
+  " 513 call obj_cmp(Address(obj#27), Address(obj#261))": "cpu:7926681, mem:6730905, objs:-/131@d548bbf8",
+  " 514 ret obj_cmp -> Ok(0)": "cpu:7926973",
+  " 515 end": "cpu:7926973, mem:6730905, prngs:-/9b4a753, objs:-/131@d548bbf8, vm:-/-, evt:3@f7990f0c, store:-/11@568bb3c1, foot:11@ce2fe551, stk:-, auth:-/-"
 }
\ No newline at end of file
diff --git a/soroban-env-host/src/test/budget_metering.rs b/soroban-env-host/src/test/budget_metering.rs
index e4b1594d..396d1f4f 100644
--- a/soroban-env-host/src/test/budget_metering.rs
+++ b/soroban-env-host/src/test/budget_metering.rs
@@ -38,11 +38,14 @@ fn xdr_object_conversion() -> Result<(), HostError> {
         // - 1 for the vec cpy
         // - 1 for the bulk bytes cpy
         // - 1 for Vec -> MeteredOrdMap element scan
-        assert_eq!(budget.get_tracker(ContractCostType::MemCpy)?.0, 3);
+        assert_eq!(budget.get_tracker(ContractCostType::MemCpy)?.iterations, 3);
         // 120 bytes in total:
         // - 72 bytes copied for the ScVal->Val conversion: 24 (Vec bytes) + 2 (map entries) x (8 (padding bytes) + 8 (key bytes) + 8 (val bytes))
         // - 48 bytes for element scan: 2 elements * 24 bytes per element (8 padding bytes + 8 key bytes + 8 val bytes)
-        assert_eq!(budget.get_tracker(ContractCostType::MemCpy)?.1, Some(120));
+        assert_eq!(
+            budget.get_tracker(ContractCostType::MemCpy)?.inputs,
+            Some(120)
+        );
         Ok(())
     })?;
     Ok(())
@@ -67,11 +70,16 @@ fn vm_hostfn_invocation() -> Result<(), HostError> {
     // try_call
     host.try_call(id_obj, sym, args)?;
     host.with_budget(|budget| {
-        assert_eq!(budget.get_tracker(ContractCostType::InvokeVmFunction)?.0, 1);
+        assert_eq!(
+            budget
+                .get_tracker(ContractCostType::InvokeVmFunction)?
+                .iterations,
+            1
+        );
         assert_eq!(
             budget
                 .get_tracker(ContractCostType::DispatchHostFunction)?
-                .0,
+                .iterations,
             2
         );
         assert_eq!(budget.get_cpu_insns_consumed()?, 30);
@@ -100,7 +108,9 @@ fn test_vm_fuel_metering() -> Result<(), HostError> {
     host.call(id_obj, sym, args)?;
     let (cpu_count, cpu_consumed, mem_consumed, wasm_mem_alloc) = host.with_budget(|budget| {
         Ok((
-            budget.get_tracker(ContractCostType::WasmInsnExec)?.0,
+            budget
+                .get_tracker(ContractCostType::WasmInsnExec)?
+                .iterations,
             budget.get_cpu_insns_consumed()?,
             budget.get_mem_bytes_consumed()?,
             budget.get_wasm_mem_alloc()?,
@@ -181,7 +191,7 @@ fn metered_xdr() -> Result<(), HostError> {
     metered_write_xdr(host.budget_ref(), &scmap, &mut w)?;
     host.with_budget(|budget| {
         assert_eq!(
-            budget.get_tracker(ContractCostType::ValSer)?.1,
+            budget.get_tracker(ContractCostType::ValSer)?.inputs,
             Some(w.len() as u64)
         );
         Ok(())
@@ -190,7 +200,7 @@ fn metered_xdr() -> Result<(), HostError> {
     host.metered_from_xdr::<ScMap>(w.as_slice())?;
     host.with_budget(|budget| {
         assert_eq!(
-            budget.get_tracker(ContractCostType::ValDeser)?.1,
+            budget.get_tracker(ContractCostType::ValDeser)?.inputs,
             Some(w.len() as u64)
         );
         Ok(())
@@ -249,7 +259,12 @@ fn map_insert_key_vec_obj() -> Result<(), HostError> {
         //  + 4 more to do same 2+2 visits when validating order of new map
         //  + 5 lookups on objects returned from 5 host fn calls to check their integrity
         // = 17
-        assert_eq!(budget.get_tracker(ContractCostType::VisitObject)?.0, 17);
+        assert_eq!(
+            budget
+                .get_tracker(ContractCostType::VisitObject)?
+                .iterations,
+            17
+        );
         // upper bound of number of map-accesses, counting both binary-search, point-access and validate-scan.
         Ok(())
     })?;
@@ -292,7 +307,7 @@ fn test_recursive_type_clone() -> Result<(), HostError> {
     expect!["864"].assert_eq(
         host.as_budget()
             .get_tracker(ContractCostType::MemAlloc)?
-            .1
+            .inputs
             .unwrap()
             .to_string()
             .as_str(),
@@ -302,7 +317,7 @@ fn test_recursive_type_clone() -> Result<(), HostError> {
     expect!["888"].assert_eq(
         host.as_budget()
             .get_tracker(ContractCostType::MemCpy)?
-            .1
+            .inputs
             .unwrap()
             .to_string()
             .as_str(),
diff --git a/soroban-env-host/src/test/bytes.rs b/soroban-env-host/src/test/bytes.rs
index 6f7f44f0..98439dba 100644
--- a/soroban-env-host/src/test/bytes.rs
+++ b/soroban-env-host/src/test/bytes.rs
@@ -459,7 +459,7 @@ fn instantiate_oversized_bytes_from_slice() -> Result<(), HostError> {
     assert_eq!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemAlloc)?
-            .1
+            .inputs
             .unwrap(),
         42_000_000
     );
@@ -506,14 +506,14 @@ fn instantiate_oversized_bytes_from_linear_memory() -> Result<(), HostError> {
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemAlloc)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemCpy)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
diff --git a/soroban-env-host/src/test/invocation.rs b/soroban-env-host/src/test/invocation.rs
index f5c00698..ce396169 100644
--- a/soroban-env-host/src/test/invocation.rs
+++ b/soroban-env-host/src/test/invocation.rs
@@ -1,9 +1,9 @@
-use std::rc::Rc;
+use std::{cmp::Ordering, rc::Rc};
 
 use expect_test::expect;
 use soroban_env_common::{
-    xdr::{self, ContractCostType, ScErrorCode},
-    Env, EnvBase, TryFromVal, TryIntoVal, Val,
+    xdr::{self, ContractCostType, ScError, ScErrorCode},
+    Compare, Env, EnvBase, TryFromVal, TryIntoVal, Val,
 };
 
 use crate::{
@@ -416,3 +416,55 @@ fn unrecoverable_error_with_try_call() -> Result<(), HostError> {
     assert!(err.is_code(ScErrorCode::ExceededLimit));
     Ok(())
 }
+
+#[test]
+fn host_function_error() -> Result<(), HostError> {
+    let host = observe_host!(Host::test_host_with_recording_footprint());
+    host.enable_debug()?;
+    let addr = host.register_test_contract_wasm(ERR);
+
+    let sym = Symbol::try_from_val(&*host, &"missing_wasm")?;
+    let args = host.vec_new_from_slice(&[])?;
+    let call_err = host.call(addr, sym, args).err().unwrap();
+    let try_call_res = host.try_call(addr, sym, args)?;
+
+    assert!(call_err.error.is_type(ScErrorType::Storage));
+    assert!(call_err.error.is_code(ScErrorCode::MissingValue));
+
+    // Storage(MissingValue) is a recoverable error
+    // It gets narrowed to a Context error so granular host
+    // error codes aren't hashed in to the blockchain, making the
+    // protocol less flexible in the future
+    let e = Error::from_scerror(ScError::Context(ScErrorCode::InvalidAction));
+    assert_eq!(
+        (*host).compare(&e.to_val(), &try_call_res)?,
+        Ordering::Equal
+    );
+    Ok(())
+}
+
+#[test]
+fn guest_error() -> Result<(), HostError> {
+    let host = observe_host!(Host::test_host_with_recording_footprint());
+    host.enable_debug()?;
+    let addr = host.register_test_contract_wasm(ERR);
+
+    let sym = Symbol::try_from_val(&*host, &"divide")?;
+    let args = host.vec_new_from_slice(&[0.into()])?;
+    let call_err = host.call(addr, sym, args).err().unwrap();
+    let try_call_res = host.try_call(addr, sym, args)?;
+
+    assert!(call_err.error.is_type(ScErrorType::WasmVm));
+    assert!(call_err.error.is_code(ScErrorCode::InvalidAction));
+
+    // WasmVm(InvalidAction) is a recoverable error
+    // It gets narrowed to a Context error so granular host
+    // error codes aren't hashed in to the blockchain, making the
+    // protocol less flexible in the future
+    let e = Error::from_scerror(ScError::Context(ScErrorCode::InvalidAction));
+    assert_eq!(
+        (*host).compare(&e.to_val(), &try_call_res)?,
+        Ordering::Equal
+    );
+    Ok(())
+}
diff --git a/soroban-env-host/src/test/map.rs b/soroban-env-host/src/test/map.rs
index 20ac9283..3a3ea951 100644
--- a/soroban-env-host/src/test/map.rs
+++ b/soroban-env-host/src/test/map.rs
@@ -455,14 +455,14 @@ fn instantiate_oversized_map_from_linear_memory() -> Result<(), HostError> {
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemAlloc)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemCpy)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
diff --git a/soroban-env-host/src/test/vec.rs b/soroban-env-host/src/test/vec.rs
index 53d67922..227f98e4 100644
--- a/soroban-env-host/src/test/vec.rs
+++ b/soroban-env-host/src/test/vec.rs
@@ -471,14 +471,14 @@ fn instantiate_oversized_vec_from_linear_memory() -> Result<(), HostError> {
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemAlloc)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
     assert_ge!(
         host.budget_ref()
             .get_tracker(ContractCostType::MemCpy)?
-            .1
+            .inputs
             .unwrap(),
         480000
     );
diff --git a/soroban-test-wasms/wasm-workspace/err/src/lib.rs b/soroban-test-wasms/wasm-workspace/err/src/lib.rs
index 617410bb..2d5df4e6 100644
--- a/soroban-test-wasms/wasm-workspace/err/src/lib.rs
+++ b/soroban-test-wasms/wasm-workspace/err/src/lib.rs
@@ -1,5 +1,5 @@
 #![no_std]
-use soroban_sdk::{contract, contractimpl, contracterror, Val, Error, Env, Symbol, Address, symbol_short, token};
+use soroban_sdk::{contract, contractimpl, contracterror, Val, Error, Env, Symbol, Address, symbol_short, token, bytes};
 use soroban_env_common::xdr::{ScErrorCode, ScErrorType};
 #[contract]
 pub struct Contract;
@@ -47,6 +47,18 @@ impl Contract {
         Error::from_contract_error(12345).into()
     }
 
+    pub fn missing_wasm(env: Env) {
+        let bin = bytes![&env, [0, 5, 6, 37, 7]];
+
+        let hash = env.crypto().sha256(&bin);
+        env.deployer().update_current_contract_wasm(hash);
+    }
+
+    pub fn divide(denominator: u32) -> u32 {
+        // Pass in zero to error
+        10 / denominator
+    }
+
     // This function is used in a try_call invocation test to make sure
     // state is rolled back on failure.
     pub fn fail_after_updates(env: Env, token: Address) -> Result<(), Error> {