From deaeeb518b780ed815a92ad6c888ee9c4e6f987f Mon Sep 17 00:00:00 2001 From: Hugo Caillard <911307+hugocaillard@users.noreply.github.com> Date: Mon, 11 Mar 2024 22:33:48 +0100 Subject: [PATCH 1/4] feat: return any value type from execute_contract_allow_private --- clarity/src/vm/callables.rs | 4 ++-- clarity/src/vm/contexts.rs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/clarity/src/vm/callables.rs b/clarity/src/vm/callables.rs index 32e7d05514..9cd991ec97 100644 --- a/clarity/src/vm/callables.rs +++ b/clarity/src/vm/callables.rs @@ -340,8 +340,8 @@ impl DefinedFunction { pub fn apply(&self, args: &[Value], env: &mut Environment) -> Result { match self.define_type { DefineType::Private => self.execute_apply(args, env), - DefineType::Public => env.execute_function_as_transaction(self, args, None), - DefineType::ReadOnly => env.execute_function_as_transaction(self, args, None), + DefineType::Public => env.execute_function_as_transaction(self, args, None, false), + DefineType::ReadOnly => env.execute_function_as_transaction(self, args, None, false), } } diff --git a/clarity/src/vm/contexts.rs b/clarity/src/vm/contexts.rs index de7b07036e..0dd98c63f4 100644 --- a/clarity/src/vm/contexts.rs +++ b/clarity/src/vm/contexts.rs @@ -1139,8 +1139,7 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { return Err(CheckErrors::CircularReference(vec![func_identifier.to_string()]).into()) } self.call_stack.insert(&func_identifier, true); - - let res = self.execute_function_as_transaction(&func, &args, Some(&contract.contract_context)); + let res = self.execute_function_as_transaction(&func, &args, Some(&contract.contract_context), allow_private); self.call_stack.remove(&func_identifier, true)?; match res { @@ -1168,6 +1167,7 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { function: &DefinedFunction, args: &[Value], next_contract_context: Option<&ContractContext>, + allow_private: bool, ) -> Result { let make_read_only = function.is_read_only(); @@ -1196,7 +1196,7 @@ impl<'a, 'b, 'hooks> Environment<'a, 'b, 'hooks> { self.global_context.roll_back()?; result } else { - self.global_context.handle_tx_result(result) + self.global_context.handle_tx_result(result, allow_private) } } @@ -1726,7 +1726,11 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> { self.database.roll_back() } - pub fn handle_tx_result(&mut self, result: Result) -> Result { + pub fn handle_tx_result( + &mut self, + result: Result, + allow_private: bool, + ) -> Result { if let Ok(result) = result { if let Value::Response(data) = result { if data.committed { @@ -1735,6 +1739,9 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> { self.roll_back()?; } Ok(Value::Response(data)) + } else if allow_private { + self.commit()?; + Ok(result) } else { Err( CheckErrors::PublicFunctionMustReturnResponse(TypeSignature::type_of(&result)?) From 99b54f5f62109916a0cadd218b226cc31cda694c Mon Sep 17 00:00:00 2001 From: Hugo Caillard <911307+hugocaillard@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:27:37 +0100 Subject: [PATCH 2/4] fix: feature flag allow_private to return any value --- clarity/src/vm/contexts.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clarity/src/vm/contexts.rs b/clarity/src/vm/contexts.rs index 0dd98c63f4..3176fc9551 100644 --- a/clarity/src/vm/contexts.rs +++ b/clarity/src/vm/contexts.rs @@ -1739,7 +1739,7 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> { self.roll_back()?; } Ok(Value::Response(data)) - } else if allow_private { + } else if allow_private && cfg!(feature = "developer-mode") { self.commit()?; Ok(result) } else { From fdf193554e1313ec157a7a99c589d2e9a2d6fe61 Mon Sep 17 00:00:00 2001 From: Hugo Caillard <911307+hugocaillard@users.noreply.github.com> Date: Wed, 13 Mar 2024 16:44:02 +0100 Subject: [PATCH 3/4] refactor: add a new 'devtools' feature in clarity crate --- clarity/Cargo.toml | 2 +- clarity/src/vm/contexts.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clarity/Cargo.toml b/clarity/Cargo.toml index 4d51cf3e4e..36caeb828b 100644 --- a/clarity/Cargo.toml +++ b/clarity/Cargo.toml @@ -55,4 +55,4 @@ default = [] developer-mode = [] slog_json = ["stacks_common/slog_json"] testing = [] - +devtools = [] diff --git a/clarity/src/vm/contexts.rs b/clarity/src/vm/contexts.rs index 3176fc9551..4e408ca540 100644 --- a/clarity/src/vm/contexts.rs +++ b/clarity/src/vm/contexts.rs @@ -1739,7 +1739,7 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> { self.roll_back()?; } Ok(Value::Response(data)) - } else if allow_private && cfg!(feature = "developer-mode") { + } else if allow_private && cfg!(feature = "devtools") { self.commit()?; Ok(result) } else { From 929bf1b577540864bfcf9805b6d8d5de2252cfe0 Mon Sep 17 00:00:00 2001 From: Hugo Caillard <911307+hugocaillard@users.noreply.github.com> Date: Wed, 13 Mar 2024 17:36:36 +0100 Subject: [PATCH 4/4] chore: add comment --- clarity/src/vm/contexts.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clarity/src/vm/contexts.rs b/clarity/src/vm/contexts.rs index 4e408ca540..305c121988 100644 --- a/clarity/src/vm/contexts.rs +++ b/clarity/src/vm/contexts.rs @@ -1726,6 +1726,9 @@ impl<'a, 'hooks> GlobalContext<'a, 'hooks> { self.database.roll_back() } + // the allow_private parameter allows private functions calls to return any Clarity type + // and not just Response. It only has effect is the devtools feature is enabled. eg: + // clarity = { version = "*", features = ["devtools"] } pub fn handle_tx_result( &mut self, result: Result,