From 0db522baf9d56ad5723f4d20197f9afea9285bf1 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Tue, 28 Oct 2025 10:53:29 +0100 Subject: [PATCH 01/29] chore: make aac macros usable from other modules, #6627 --- stackslib/src/chainstate/tests/consensus.rs | 18 ++++++++++-------- stackslib/src/chainstate/tests/mod.rs | 1 + 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/stackslib/src/chainstate/tests/consensus.rs b/stackslib/src/chainstate/tests/consensus.rs index 851ded28e55..6a6d888b6ed 100644 --- a/stackslib/src/chainstate/tests/consensus.rs +++ b/stackslib/src/chainstate/tests/consensus.rs @@ -55,7 +55,7 @@ use crate::net::tests::NakamotoBootPlan; /// The epochs to test for consensus are the current and upcoming epochs. /// This constant must be changed when new epochs are introduced. /// Note that contract deploys MUST be done in each epoch >= 2.0. -const EPOCHS_TO_TEST: &[StacksEpochId] = &[StacksEpochId::Epoch32, StacksEpochId::Epoch33]; +pub const EPOCHS_TO_TEST: &[StacksEpochId] = &[StacksEpochId::Epoch32, StacksEpochId::Epoch33]; pub const SK_1: &str = "a1289f6438855da7decf9b61b852c882c398cff1446b2a0f823538aa2ebef92e01"; pub const SK_2: &str = "4ce9a8f7539ea93753a36405b16e8b57e15a552430410709c2b6d65dca5c02e201"; @@ -100,7 +100,7 @@ const fn clarity_versions_for_epoch(epoch: StacksEpochId) -> &'static [ClarityVe /// [`TestTxFactory`] for transaction generation. It provides convenience methods to /// automate test scenarios involving contract deployments and calls across multiple /// epochs and Clarity versions. -struct ContractConsensusTest<'a> { +pub struct ContractConsensusTest<'a> { tx_factory: TestTxFactory, consensus_test: ConsensusTest<'a>, } @@ -282,14 +282,14 @@ macro_rules! contract_call_consensus_test { let contract_name = $contract_name; // Handle deploy_epochs parameter (default to all epochs >= 3.0 if not provided) - let deploy_epochs = StacksEpochId::ALL_GTE_30; + let deploy_epochs = clarity::types::StacksEpochId::ALL_GTE_30; $(let deploy_epochs = $deploy_epochs;)? // Handle call_epochs parameter (default to EPOCHS_TO_TEST if not provided) - let call_epochs = EPOCHS_TO_TEST; + let call_epochs = $crate::chainstate::tests::consensus::EPOCHS_TO_TEST; $(let call_epochs = $call_epochs;)? - let mut contract_test = ContractConsensusTest::new(function_name!()); + let mut contract_test = $crate::chainstate::tests::consensus::ContractConsensusTest::new(function_name!()); let result = contract_test.run( contract_name, $contract_code, @@ -303,6 +303,7 @@ macro_rules! contract_call_consensus_test { } }; } +pub(crate) use contract_call_consensus_test; /// Generates a consensus test for contract deployment across multiple Stacks epochs. /// @@ -344,7 +345,7 @@ macro_rules! contract_deploy_consensus_test { $name, contract_name: $contract_name, contract_code: $contract_code, - deploy_epochs: EPOCHS_TO_TEST, + deploy_epochs: $crate::chainstate::tests::consensus::EPOCHS_TO_TEST, ); }; ( @@ -353,7 +354,7 @@ macro_rules! contract_deploy_consensus_test { contract_code: $contract_code:expr, deploy_epochs: $deploy_epochs:expr, ) => { - contract_call_consensus_test!( + $crate::chainstate::tests::consensus::contract_call_consensus_test!( $name, contract_name: $contract_name, contract_code: $contract_code, @@ -364,6 +365,7 @@ macro_rules! contract_deploy_consensus_test { ); }; } +pub(crate) use contract_deploy_consensus_test; /// The type of transaction to create. pub enum TestTxSpec<'a> { @@ -503,7 +505,7 @@ impl TestTxFactory { let tx_bytes = make_contract_publish_versioned( sender, *nonce, - (code.len() * 100) as u64, + (1) as u64, self.default_chain_id, name, code, diff --git a/stackslib/src/chainstate/tests/mod.rs b/stackslib/src/chainstate/tests/mod.rs index 7b2dcfdb5cc..8844374cd7e 100644 --- a/stackslib/src/chainstate/tests/mod.rs +++ b/stackslib/src/chainstate/tests/mod.rs @@ -13,6 +13,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . pub mod consensus; +mod parse_tests; use std::fs; From 1eead86fe8b0a72a2869f1c323517e6f0579f527 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Tue, 28 Oct 2025 10:55:12 +0100 Subject: [PATCH 02/29] chore: aac add clarity_types as test dependency for doc purpose, #6627 --- Cargo.lock | 1 + stackslib/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index f0235d82fbf..0b6393bdce6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3518,6 +3518,7 @@ dependencies = [ "assert-json-diff 1.1.0", "chrono", "clarity 0.0.1", + "clarity-types", "ed25519-dalek", "insta", "lazy_static", diff --git a/stackslib/Cargo.toml b/stackslib/Cargo.toml index 10e94f4b470..705a9f9e9a2 100644 --- a/stackslib/Cargo.toml +++ b/stackslib/Cargo.toml @@ -76,6 +76,7 @@ chrono = "0.4.19" tempfile = "3.3" proptest = { version = "1.6.0", default-features = false, features = ["std"] } insta = { version = "1.37.0", features = ["ron"] } +clarity-types = { package = "clarity-types", path = "../clarity-types", default-features = false } [features] default = [] From c01f81e06891fdc594b283d6446254f6ad390c01 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Tue, 28 Oct 2025 10:57:35 +0100 Subject: [PATCH 03/29] test: aac add consensus coverage for ParseError variants subset (11), #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 stackslib/src/chainstate/tests/parse_tests.rs diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs new file mode 100644 index 00000000000..828ebf49370 --- /dev/null +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -0,0 +1,150 @@ +// Copyright (C) 2025 Stacks Open Internet Foundation +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; +use clarity::vm::MAX_CALL_STACK_DEPTH; +#[allow(unused_imports)] +use clarity_types::errors::ParseErrors; // Just used for documentation purpose +use crate::chainstate::tests::consensus::contract_deploy_consensus_test; + +/// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] +/// Caused by: nested contract body exceeding stack depth limit +/// Outcome: block rejected. +contract_deploy_consensus_test!( + parse_error__stack_depth_too_deep, + contract_name: "my-contract", + contract_code: &{ + let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64); + let body_start = "{ a : ".repeat(count as usize); + let body_end = "} ".repeat(count as usize); + format!("{body_start}u1 {body_end}") + }, +); + +/// ParserError: [`ParseErrors::FailedParsingIntValue`] +/// Caused by: number bigger than i128 +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__failed_parsing_int_value, + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-int int 340282366920938463463374607431768211455) + "}, +); + +/// ParserError [`ParseErrors::FailedParsingUIntValue`] +/// Caused by: number bigger than u128 +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__failed_parsing_uint_value, + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-uint uint u999340282366920938463463374607431768211455) + "}, +); + +/// ParserError [`ParseErrors::CircularReference`] +/// Caused by: interdependent functions +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__circular_reference, + contract_name: "my-contract", + contract_code: &{" + (define-constant my-a my-b) + (define-constant my-b my-a) + "}, +); + +/// ParserError [`ParseErrors::NameAlreadyUsed`] +/// Caused by: trait name conflicts only +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__named_already_used, + contract_name: "my-contract", + contract_code: &{" + (define-trait trait-1 ( + (get-1 (uint) (response uint uint)))) + (define-trait trait-1 ( + (get-1 (int) (response uint uint)))) + "}, +); + +/// ParserError [`ParseErrors::TraitReferenceNotAllowed`] +/// Caused by: trait reference can not be stored +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__trait_ref_not_allowed, + contract_name: "my-contract", + contract_code: &{" + (define-trait trait-1 ( + (get-1 (uint) (response uint uint)))) + (define-map kv-store { key: uint } { value: }) + "}, +); + +/// ParserError [`ParseErrors::ImportTraitBadSignature`] +/// Caused by: trait import with bad signature (missing trait name or identifier) +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__import_trait_bad_signature, + contract_name: "my-contract", + contract_code: &{" + (use-trait) + "}, +); + +/// ParserError [`ParseErrors::DefineTraitBadSignature`] +/// Caused by: trait define with bad signature (missing trait name or definition) +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__define_trait_bad_signature, + contract_name: "my-contract", + contract_code: &{" + (define-trait) + "}, +); + +/// ParserError [`ParseErrors::ImplTraitBadSignature`] +/// Caused by: trait implementation with bad signature (missing trait identifier) +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__impl_trait_bad_signature, + contract_name: "my-contract", + contract_code: &{" + (impl-trait) + "}, +); + +/// ParserError [`ParseErrors::TraitReferenceUnknown`] +/// Caused by: referencing an undeclared trait. +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__trait_reference_unknown, + contract_name: "my-contract", + contract_code: &{" + (+ 1 ) + "}, +); + +/// ParserError: [`ParseErrors::Lexer`] +/// Caused by: unknown symbol +/// Outcome: block accepted. +contract_deploy_consensus_test!( + parse_error__lexer__unknown_symbol, + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-uint uint _) + "}, +); From fe6a8d5c3176ca67f36f07df2721f4e684a2f820 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 30 Oct 2025 10:29:35 +0100 Subject: [PATCH 04/29] refactor: aac consensus macro just produce a test body, #6627 --- stackslib/src/chainstate/tests/consensus.rs | 94 +++--- stackslib/src/chainstate/tests/parse_tests.rs | 268 +++++++++++------- ..._tests__consensus__succesfully_deploy.snap | 202 +++++++++++++ ...ests__parse_tests__circular_reference.snap | 216 ++++++++++++++ ...rse_tests__define_trait_bad_signature.snap | 216 ++++++++++++++ ..._tests__parse_tests__expected_closing.snap | 216 ++++++++++++++ ...parse_tests__failed_parsing_int_value.snap | 216 ++++++++++++++ ...arse_tests__failed_parsing_uint_value.snap | 216 ++++++++++++++ ...parse_tests__impl_trait_bad_signature.snap | 216 ++++++++++++++ ...rse_tests__import_trait_bad_signature.snap | 216 ++++++++++++++ ...ts__parse_tests__lexer_unknown_symbol.snap | 216 ++++++++++++++ ...ests__parse_tests__named_already_used.snap | 216 ++++++++++++++ ...ests__parse_tests__note_to_match_this.snap | 216 ++++++++++++++ ...s__parse_tests__stack_depth_too_deep.snap} | 16 +- ...s__parse_tests__trait_ref_not_allowed.snap | 216 ++++++++++++++ ..._parse_tests__trait_reference_unknown.snap | 216 ++++++++++++++ 16 files changed, 3014 insertions(+), 158 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__succesfully_deploy.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__named_already_used.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap rename stackslib/src/chainstate/tests/snapshots/{blockstack_lib__chainstate__tests__consensus__chainstate_error_expression_stack_depth_too_deep.snap => blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap} (62%) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_ref_not_allowed.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap diff --git a/stackslib/src/chainstate/tests/consensus.rs b/stackslib/src/chainstate/tests/consensus.rs index 6a6d888b6ed..da83ab52ec2 100644 --- a/stackslib/src/chainstate/tests/consensus.rs +++ b/stackslib/src/chainstate/tests/consensus.rs @@ -27,10 +27,9 @@ use clarity::types::chainstate::{StacksAddress, StacksPrivateKey, StacksPublicKe use clarity::types::{StacksEpoch, StacksEpochId}; use clarity::util::hash::{MerkleTree, Sha512Trunc256Sum}; use clarity::util::secp256k1::MessageSignature; -use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::costs::ExecutionCost; use clarity::vm::types::PrincipalData; -use clarity::vm::{ClarityVersion, Value as ClarityValue, MAX_CALL_STACK_DEPTH}; +use clarity::vm::{ClarityVersion, Value as ClarityValue}; use serde::{Deserialize, Serialize, Serializer}; use stacks_common::bitvec::BitVec; @@ -231,7 +230,7 @@ impl ContractConsensusTest<'_> { } } -/// Generates a consensus test for executing a contract function across multiple Stacks epochs. +/// Generates a consensus test body for executing a contract function across multiple Stacks epochs. /// /// This macro automates both contract deployment and function invocation across different /// epochs and Clarity versions. @@ -248,7 +247,6 @@ impl ContractConsensusTest<'_> { /// /// # Arguments /// -/// * `$name` — Name of the generated test function. /// * `contract_name` — The name of the contract. /// * `contract_code` — The Clarity source code for the contract. /// * `function_name` — The public function to call. @@ -259,17 +257,18 @@ impl ContractConsensusTest<'_> { /// # Example /// /// ```rust,ignore -/// contract_call_consensus_test!( -/// my_test, -/// contract_name: "my-contract", -/// contract_code: "(define-public (get-message) (ok \"hello\"))", -/// function_name: "get-message", -/// function_args: &[], -/// ); +/// #[test] +/// fn test_my_contract_call_consensus() { +/// contract_call_consensus_test!( +/// contract_name: "my-contract", +/// contract_code: "(define-public (get-message) (ok \"hello\"))", +/// function_name: "get-message", +/// function_args: &[], +/// ); +/// } /// ``` macro_rules! contract_call_consensus_test { ( - $name:ident, contract_name: $contract_name:expr, contract_code: $contract_code:expr, function_name: $function_name:expr, @@ -277,8 +276,7 @@ macro_rules! contract_call_consensus_test { $(deploy_epochs: $deploy_epochs:expr,)? $(call_epochs: $call_epochs:expr,)? ) => { - #[test] - fn $name() { + { let contract_name = $contract_name; // Handle deploy_epochs parameter (default to all epochs >= 3.0 if not provided) @@ -305,7 +303,7 @@ macro_rules! contract_call_consensus_test { } pub(crate) use contract_call_consensus_test; -/// Generates a consensus test for contract deployment across multiple Stacks epochs. +/// Generates a consensus test body for contract deployment across multiple Stacks epochs. /// /// This macro automates deploying a contract across different Stacks epochs and /// Clarity versions. It is primarily used for consensus-critical testing of contract @@ -320,7 +318,6 @@ pub(crate) use contract_call_consensus_test; /// /// # Arguments /// -/// * `$name` — Name of the generated test function. /// * `contract_name` — Name of the contract being tested. /// * `contract_code` — The Clarity source code of the contract. /// * `deploy_epochs` — *(optional)* Epochs in which to deploy the contract. Defaults to [`EPOCHS_TO_TEST`]. @@ -328,34 +325,33 @@ pub(crate) use contract_call_consensus_test; /// # Example /// /// ```rust,ignore -/// contract_deploy_consensus_test!( -/// deploy_test, -/// contract_name: "my-contract", -/// contract_code: "(define-public (init) (ok true))", -/// ); +/// #[test] +/// fn test_my_contract_deploy_consensus() { +/// contract_deploy_consensus_test!( +/// deploy_test, +/// contract_name: "my-contract", +/// contract_code: "(define-public (init) (ok true))", +/// ); +/// } /// ``` macro_rules! contract_deploy_consensus_test { // Handle the case where deploy_epochs is not provided ( - $name:ident, contract_name: $contract_name:expr, contract_code: $contract_code:expr, ) => { contract_deploy_consensus_test!( - $name, contract_name: $contract_name, contract_code: $contract_code, deploy_epochs: $crate::chainstate::tests::consensus::EPOCHS_TO_TEST, ); }; ( - $name:ident, contract_name: $contract_name:expr, contract_code: $contract_code:expr, deploy_epochs: $deploy_epochs:expr, ) => { $crate::chainstate::tests::consensus::contract_call_consensus_test!( - $name, contract_name: $contract_name, contract_code: $contract_code, function_name: "", // No function calls, just deploys @@ -505,7 +501,7 @@ impl TestTxFactory { let tx_bytes = make_contract_publish_versioned( sender, *nonce, - (1) as u64, + (code.len() * 100) as u64, self.default_chain_id, name, code, @@ -1138,27 +1134,25 @@ fn test_append_stx_transfers_success() { insta::assert_ron_snapshot!(result); } -// Example of using the `contract_call_consensus_test!` macro -// Deploys a contract to each epoch, for each Clarity version, -// then calls a function in that contract and snapshots the results. -contract_call_consensus_test!( - successfully_deploy_and_call, - contract_name: "foo_contract", - contract_code: FOO_CONTRACT, - function_name: "bar", - function_args: &[ClarityValue::UInt(1)], -); - -// Example of using the `contract_deploy_consensus_test!` macro -// Deploys a contract that exceeds the maximum allowed stack depth -// and verifies that deployment fails with the expected error. -contract_deploy_consensus_test!( - chainstate_error_expression_stack_depth_too_deep, - contract_name: "test-exceeds", - contract_code: &{ - let exceeds_repeat_factor = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64); - let tx_exceeds_body_start = "{ a : ".repeat(exceeds_repeat_factor as usize); - let tx_exceeds_body_end = "} ".repeat(exceeds_repeat_factor as usize); - format!("{tx_exceeds_body_start}u1 {tx_exceeds_body_end}") - }, -); +/// Example of using the `contract_call_consensus_test!` macro +/// Deploys a contract to each epoch, for each Clarity version, +/// then calls a function in that contract and snapshots the results. +#[test] +fn test_successfully_deploy_and_call() { + contract_call_consensus_test!( + contract_name: "foo_contract", + contract_code: FOO_CONTRACT, + function_name: "bar", + function_args: &[ClarityValue::UInt(1)], + ); +} + +/// Example of using the `contract_deploy_consensus_test!` macro +/// Deploys a contract to all epoch, for each Clarity version +#[test] +fn test_succesfully_deploy() { + contract_deploy_consensus_test!( + contract_name: "foo_contract", + contract_code: FOO_CONTRACT, + ); +} diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 828ebf49370..c8121b93244 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -13,138 +13,206 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use clarity::codec::StacksMessageCodec; +/// This module contains consensus tests related to Clarity Parse errors. +use clarity::vm::ast::parser::v2::MAX_CONTRACT_NAME_LEN; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; -#[allow(unused_imports)] -use clarity_types::errors::ParseErrors; // Just used for documentation purpose +#[allow(unused_imports)] // Just used for documentation purpose +use clarity_types::{errors::ParseErrors, ContractName}; + use crate::chainstate::tests::consensus::contract_deploy_consensus_test; /// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] /// Caused by: nested contract body exceeding stack depth limit -/// Outcome: block rejected. -contract_deploy_consensus_test!( - parse_error__stack_depth_too_deep, - contract_name: "my-contract", - contract_code: &{ - let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64); - let body_start = "{ a : ".repeat(count as usize); - let body_end = "} ".repeat(count as usize); - format!("{body_start}u1 {body_end}") - }, -); +/// Outcome: block rejected +#[test] +fn test_stack_depth_too_deep() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64); + let body_start = "{ a : ".repeat(count as usize); + let body_end = "} ".repeat(count as usize); + format!("{body_start}u1 {body_end}") + }, + ); +} /// ParserError: [`ParseErrors::FailedParsingIntValue`] /// Caused by: number bigger than i128 -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__failed_parsing_int_value, - contract_name: "my-contract", - contract_code: &{" - (define-data-var my-int int 340282366920938463463374607431768211455) - "}, -); +/// Outcome: block accepted +#[test] +fn test_failed_parsing_int_value() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-int int 340282366920938463463374607431768211455) + "}, + ); +} /// ParserError [`ParseErrors::FailedParsingUIntValue`] /// Caused by: number bigger than u128 -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__failed_parsing_uint_value, - contract_name: "my-contract", - contract_code: &{" - (define-data-var my-uint uint u999340282366920938463463374607431768211455) - "}, -); +/// Outcome: block accepted +#[test] +fn test_failed_parsing_uint_value() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-uint uint u999340282366920938463463374607431768211455) + "}, + ); +} /// ParserError [`ParseErrors::CircularReference`] /// Caused by: interdependent functions -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__circular_reference, - contract_name: "my-contract", - contract_code: &{" - (define-constant my-a my-b) - (define-constant my-b my-a) - "}, -); +/// Outcome: block accepted +#[test] +fn test_circular_reference() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-constant my-a my-b) + (define-constant my-b my-a) + "}, + ); +} /// ParserError [`ParseErrors::NameAlreadyUsed`] /// Caused by: trait name conflicts only -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__named_already_used, - contract_name: "my-contract", - contract_code: &{" - (define-trait trait-1 ( - (get-1 (uint) (response uint uint)))) - (define-trait trait-1 ( - (get-1 (int) (response uint uint)))) - "}, -); +/// Outcome: block accepted +#[test] +fn test_named_already_used() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-trait trait-1 ( + (get-1 (uint) (response uint uint)))) + (define-trait trait-1 ( + (get-1 (int) (response uint uint)))) + "}, + ); +} /// ParserError [`ParseErrors::TraitReferenceNotAllowed`] /// Caused by: trait reference can not be stored -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__trait_ref_not_allowed, - contract_name: "my-contract", - contract_code: &{" - (define-trait trait-1 ( - (get-1 (uint) (response uint uint)))) - (define-map kv-store { key: uint } { value: }) - "}, -); +/// Outcome: block accepted +#[test] +fn test_trait_ref_not_allowed() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-trait trait-1 ( + (get-1 (uint) (response uint uint)))) + (define-map kv-store { key: uint } { value: }) + "}, + ); +} /// ParserError [`ParseErrors::ImportTraitBadSignature`] /// Caused by: trait import with bad signature (missing trait name or identifier) -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__import_trait_bad_signature, - contract_name: "my-contract", - contract_code: &{" - (use-trait) - "}, -); +/// Outcome: block accepted +#[test] +fn test_import_trait_bad_signature() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (use-trait) + "}, + ); +} /// ParserError [`ParseErrors::DefineTraitBadSignature`] /// Caused by: trait define with bad signature (missing trait name or definition) -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__define_trait_bad_signature, - contract_name: "my-contract", - contract_code: &{" - (define-trait) - "}, -); +/// Outcome: block accepted +#[test] +fn test_define_trait_bad_signature() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-trait) + "}, + ); +} /// ParserError [`ParseErrors::ImplTraitBadSignature`] /// Caused by: trait implementation with bad signature (missing trait identifier) -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__impl_trait_bad_signature, - contract_name: "my-contract", - contract_code: &{" - (impl-trait) - "}, -); +/// Outcome: block accepted +#[test] +fn test_impl_trait_bad_signature() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (impl-trait) + "}, + ); +} /// ParserError [`ParseErrors::TraitReferenceUnknown`] -/// Caused by: referencing an undeclared trait. -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__trait_reference_unknown, - contract_name: "my-contract", - contract_code: &{" - (+ 1 ) - "}, -); +/// Caused by: referencing an undeclared trait +/// Outcome: block accepted +#[test] +fn test_trait_reference_unknown() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (+ 1 ) + "}, + ); +} /// ParserError: [`ParseErrors::Lexer`] /// Caused by: unknown symbol -/// Outcome: block accepted. -contract_deploy_consensus_test!( - parse_error__lexer__unknown_symbol, - contract_name: "my-contract", - contract_code: &{" - (define-data-var my-uint uint _) - "}, -); +/// Outcome: block accepted +#[test] +fn test_lexer_unknown_symbol() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + (define-data-var my-uint uint _) + "}, + ); +} + +/// ParserError: [`ParseErrors::ContractNameTooLong`] +/// Caused by: contract name longer than [`MAX_CONTRACT_NAME_LEN`] +/// Outcome: Panic +/// Due to [`ContractName::consensus_serialize`] when creating the transaction, +/// this error variant is unreachable. +#[test] +#[should_panic] +fn test_contract_name_too_long() { + contract_deploy_consensus_test!( + contract_name: &{"n".repeat(MAX_CONTRACT_NAME_LEN + 1)}, + contract_code: &{" + () + "}, + ); +} + +/// ParserError: [`ParseErrors::ExpectedClosing`] +/// Caused by: missing closing parenthesis +/// Outcome: block accepted +#[test] +fn test_expected_closing() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + ( + "}, + ); +} + +/// ParserError: [`ParseErrors::NoteToMatchThis`] +/// Caused by: missing open parenthesis matching the close one +/// Outcome: block accepted +#[test] +fn test_note_to_match_this() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{" + ()) + "}, + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__succesfully_deploy.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__succesfully_deploy.snap new file mode 100644 index 00000000000..c1ed029bf3f --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__succesfully_deploy.snap @@ -0,0 +1,202 @@ +--- +source: stackslib/src/chainstate/tests/consensus.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "496a856f3b69fc6c4f6d4277c456694ffa78cabc1c0b493f96b1a6b8724a6ce6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f5e7ece4d362b07f48aa7ef07431f804e7687b4f09dd7f709ef799a66503f37e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "00e06f9f426b6fa8fb9eae89ca0f01910bb02e8640cfaee396834fba87eacd1c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "25f09341a9588862e0873f2531bdf2c00f2df3e84f66f3bc07c693922fe7ef7f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "958e98e1b8fb971aa9520baa2e1a50ebfc713b9904c450efc71ed3cd2cf14d23", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a4b11e0ed562af28bda25f9527825f869545a987e01e2228869bdf292cb8c7ef", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f9361bcbcee101baa4b01eb0733a61cb9622ce3ca5e166477cb6a41e5e07c8ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: foo_contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "None [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: true, + data: Bool(true), + )), + cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 121, + write_count: 2, + read_length: 1, + read_count: 1, + runtime: 11968, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap new file mode 100644 index 00000000000..23ff81ae1a3 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "05dc24ba66298c622ee1aa6cbc8d693e53b471c89f2fb71ba6ae6733f8e48bf1", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "47c6a3b54010cd1c77a6535edc91816bdb663742546c576920edafa0062fa3af", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "79a42adaf0b03eb9ff51fd0c11ecc196a4baf6ba5d2573c4fc0537f7b33032ca", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e2fdace035b2f3e8dcb90bbff491f2a6eaae3d1e3f780e6189d324b38b06ab0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "554f6ca71f55547718b0a78e9a98df8396c5a57fba8ee8b9f1360109c5bac47d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "82901ece41213f92302450e9f33005c57c79bee762ea6e502562c68304c44cb5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a4ea9c2e4e0492a16478c207a7efcd043c3c6a539403fe2136f9f9b080b2d8c2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2838, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap new file mode 100644 index 00000000000..1003095245a --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5517eea3900746f31e52fddc1d692c25584e8f0900f71792804b11f16bacbf1b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90658c94b3da80f13fd8139aba89d4bff8f32ece40c8751be2056d98cfc4d04c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9e4a3b5517777287a847ed8fc9cfc32016459d741fd4d6dcd52ba8df174af9b8", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff79c169ccd215091fcb424636beba9b0af2e92d675b8b3cf623b1b859ba4f32", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c4b9134460e340a6cbae087eb2174116cc08f6b35f3ae01196372901a4099045", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e65b7a3f4510fee663413c739d592a3447d9dc55f9bf22940b003ca437c1eee0", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d44214033f9e2ffb9033c024b8ed5d090528753b96ce04a35a6769eee4b5ad20", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some((define-trait ...) expects a trait name and a trait definition) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap new file mode 100644 index 00000000000..d5a3d87bc8f --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "6690ad0bb6badb0f415b2f704b5565834eba67002b4d0eab210934ce72e9be7f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "75fb8ac4116ce51407f50ea1658f5090401b16be798b11bd3b66ceb9b7d373c2", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3b126ae5f3105250a49820bfa087769e6d7050352505fe0d19bb0410c33cd5df", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c11300470bbefd7e2634d0ff684196c6e88f3e2bf824b3d2ec4b0c22cf3bd477", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c09918aaa4c39f4e4e99cdf664b69782f889bdeee648a54d40c23337c71419b3", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fd9b4799b32cdb27c5710d65c922481e51bf2956c59cc919fbd7341a97f0d4c5", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0534ef6ac6116e4ab017a2820e41d95a7ea108852a747b907c32baa703dba3b1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected closing \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 702, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap new file mode 100644 index 00000000000..51745ca2d0e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ce88d2843e7408b9fa8ce0b297c6001a296023d210078f5a1c5a85b219f21b77", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9037156350085549d781a5770039869c634676494d83b18238c5b63410263709", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9b95693beb982033050716954379fd745a63cddbe48975b61e70a16800a49adb", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "44c9352a97ef603e8ce58a8eacfaed56e207d6e89f7a8abf0c2c226aa8781238", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e48ec6a272088c9a7e796eb3b2785bf4f7407b81c1271c79721d1d961740eec8", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e924cc323b03ec388840d30af0501bd6ca3148fffeeb08548eedeb2a42627728", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "24e44617dcb2d89b231ddf9f09cd81b07a80832e4bd7ba8b2066b6cc603e7226", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Failed to parse int literal \'340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2592, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap new file mode 100644 index 00000000000..0576dfc1696 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "83d2689a1e82cce514212d89789dc9c458824aa97c5162b4aa7a6f2ab8f9c080", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "eb209df789f88ad8b325b9f858af5cacec69e414ad7994bdd0275a752d763a07", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c1e77490a28287279086e424edc95b69caa55d820db1352596c18211c3277986", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "528dc2d4847cf46f43419ea996f7290e67dc2d8d01a3ebff5865b9124327f789", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "76ce54b8149149408f6e43c09c499b632bc8cba0a0883ec4341d6239485bb429", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7de7f86f24acd0571e4db9b5aa37ca32b8d32dcd6867d9fc2168f2a3b6b0fa0e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6f611de4dbed384903a572ba479738614de692babca065bae15d57ddd2e22345", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(Failed to parse uint literal \'u999340282366920938463463374607431768211455\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2673, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap new file mode 100644 index 00000000000..0a1ccf93d53 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "c05af958a57d7083200f4f2bcd5d31e22ca0eb92d593db65016b992382e8bd65", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0abf49fd17b43c0f68cdf6a3b61616bb7f3bb644c0d3274c9923d9217e0b0476", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ee0f6d328ac97fa9cd5bf23893f46bb0759d6b9321310154c9f6053970293819", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d35517ae09e989d6ef913e8738e5a3a4e0d4668c6be3b28ecb3714ad7d6859ad", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "280be2d637cbf670fafeef3aba3ee22483cd56ad830880a3d1fdabccaaa922ec", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1c086c5c4fa1f8d58ca8f81cbfd9c0c4b7446c728489569a18796cb569d34c4c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fe4e671cafc5e268e735d461105e6f782d71b9856ac154a6c687f031d2fa2576", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some((impl-trait ...) expects a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1071, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap new file mode 100644 index 00000000000..fc59a0617a9 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5517eea3900746f31e52fddc1d692c25584e8f0900f71792804b11f16bacbf1b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a93eba0085e13452864f823afec6659a4ec6ebace0f976cb304d27a6b43fe823", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9e90ea569ad5980cdc209c497ebf1eef6ef4cf51db9f5ae47aa5bae78c6a202e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "851daba1b3c35f4ea3b64d6204dbd3e8d0181d096355df5007a8489dfa3984ee", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c89f45df44cf4b020572c866453874a2983be461a8a5308301dbadfb70ac4a9c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cca60fb71ecdd425252627f4f853c9cbbd8a6b3cee6bd8e975fe55e52b08723a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1bb9f6bee8c3a28c5198ecb65e2433566cef0bad8523dfcb62b9860790b3de9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some((use-trait ...) expects a trait name and a trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1125, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap new file mode 100644 index 00000000000..edbc5cfff14 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "8aed1d90965b333f3a7c95d509d97eb833097f1bc8304b34074db30ba0b99fc3", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2a6de49fe280a66ae4539ebccb553d7dabaa90504b962b4923f7a13323b0b2f1", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "fe04618e4b81a2e51a0cc8b236cdc14ec544d89efd071c6b4e771bf8b18a2260", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8009cb0b6c38a2417f10609802ba7cb0e0e235fe7ad1f60b7f308c2749daffd9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8a6427825359a5f2805b40c730927f41644d47aa63fa3abbf1c4117f16cae730", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90ea350046765408a3156ae28225d3ef5fb551098c8e76bd39f73e33eaa9ba43", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7741e17ae1ee1dc445ab2ec3943870c85815d7ef0fe23f170b17be04e1ee1279", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(unknown symbol, \'_\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1539, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__named_already_used.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__named_already_used.snap new file mode 100644 index 00000000000..e36a9c26ceb --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__named_already_used.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "f5327281a18ab4beec644f70c8ccde7d0a12231b1f357501cc4c1bc0ac538eb5", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "50f3ad3e4294e1a78e6986aa170e58fad931819d12e532691863155a3dd95ea3", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b87e6d2f69c730c15b721b606d15a38eabd21118db8c29db32ee4aa01e52fb4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "302106e4c1cfe79bffecb5098c4ab66836507e22efe70f4289ebe12d8069de32", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9c0ec3e68b33d3108e04f54c30d2becddd1b54708d0de3731f049a67520adc27", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0b20742d9f58a16d2954cb59f4fc6d3ad413177446a08fa63276bd25a15ffefc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7c41ff0ef9fa3d0ceb570cef859751a640da98be65e7aa6a11843eccf384aa06", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(defining \'trait-1\' conflicts with previous value) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 5256, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap new file mode 100644 index 00000000000..470d532ae0f --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "18f8c6b70c8ff455b64a71366fc11028830b48152c79b6284a217fa083778e06", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "308fbbebc290b15709ee174792ee1bec259efc7e2df83fccaf4080234c3502f3", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "795507eaee1f82efb6c3aac2c39fc9ebacbae632e2eef0536d479280e5acd34b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e32a435a177c59af20a4a98fb9ba86b9d59f573000693f3920265c1039a8efca", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1ea886dc33c718809154b663037b242999bd1bb8bd07a311228170d59d72277f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "48de1d10d8dc2752979e7bbfeb8b85dd29222e411bf84083fe8a935a5c3515e2", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "21626d26f93958de2115267ef20579c06b3ea526c1749cd4c6b0c3e917ba5c3c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 756, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__chainstate_error_expression_stack_depth_too_deep.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap similarity index 62% rename from stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__chainstate_error_expression_stack_depth_too_deep.snap rename to stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap index 704e5073bc0..81566fd36cb 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__consensus__chainstate_error_expression_stack_depth_too_deep.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap @@ -1,13 +1,13 @@ --- -source: stackslib/src/chainstate/tests/consensus.rs +source: stackslib/src/chainstate/tests/parse_tests.rs expression: result --- [ - Failure("Invalid Stacks block 7e31cbb71c79284d65fcf9ed65e7263e6320f267f8b29eb31aca3a8fcb65302b: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 1204d27abf8c5274ca561a1f9d14c7d64c3f802ff2b78a164d7d29eb8808d547: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 435d0c567d8f970c7fde521b4b22e270e78ffbb8c8b09e33bbc6d5b4e7d0257f: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block c391035a8457de4600bb9d48e2d4fd7e54a553f4143758db09740f0fc61374df: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 01082196750dcd7f830d841338a95a1400a96f35e91135d3992db57fd907dba7: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 1044b36b10f92b9ee71a0424d5e6c1e52d3059a5d9f512499b1b6ecc54ce85a3: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block a3eaa78beaae7d208893cadb3a11541b6d1f85c8473ba39e1886ed041dce13a6: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block d7f56cedfd67b8bcbbd6b5be686816494ca72e8b3a260a0968a67e302baae570: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 851fd3bfd93311da6f9f760957b9737972fabcd227216582e14726e24bfb2124: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block d18eddca88053b4ab7b25653a51046b5860b96cf8be9a9ab3d680dfe4c0540e8: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 006a865e22caf2109ef781a6ecef262de282200bf65cbaea480cd1e5ccf3752f: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 9eb937232d9a7e9ffb6346d90f5001923419bf83f60faf16e9bb67275917b4cb: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 4533fa8569f846aa82f0351dd80b3defd31101b8181e9e78e80a69b56ba34309: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 9a6832af6f28cc3b09414238e6b0592dfdfe7d2af33fecc269b2b23802fd6318: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_ref_not_allowed.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_ref_not_allowed.snap new file mode 100644 index 00000000000..2aeb12093e2 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_ref_not_allowed.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "479b5263dd49afdd361acac081dd8104f9edcd42f09ef6ee865f0a167d210b0f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b3df049877169f74b69c7185b0b73929ceb07e5cb3a4cb7dcc17414a7faa8f7a", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6f79eefb0163233382f3b67bf16a44d5c54c64487ac1e90cc9b36ffec7e60d94", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "29808be3b6a7a132383a92908938bb340eb8c753e5d6893bb6d2ba02a16823de", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8036cf117cfacd54b588bbc7f9a8115f1e7156f208b04bf3e527df6006a7ff6f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "61fa04e633dd451540dd583d32fd9edf8fd271b45aa966da8ea2cf707d6f96aa", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5591c033ad91ad9c38fd4032c09a4bb43886db056dc6424c13977865b8ce5326", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(trait references can not be stored) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4857, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap new file mode 100644 index 00000000000..c0c4b28c5cb --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "8d5503c4a1ba547c75f39fe47f8890fac13249132c4552ac650f404606df4c2b", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cbb36320745890293adcd8e6d56c5dcf69ac636d2f7c092c1788cc28aa5d01d4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b0759cd4dc9340504c1022c7aae2c95717bfd49617d6527eec0071819238b143", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c8ddbd83ce85738c4d001576dc9cc2a64235021c0cc92e1b848b95fd5b9d6ac6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e4803ce7de79e98319f7492dbd43f2010fc08133c0f81a8510f6642d2fa34be", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4f7ed7e5ecb1dc64a68eaba82af53e57efe91be76292f5d53487216a056adbfd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "90164c399d7f56205be6a667b3a56e5ef02b57677f0a27cb0bcf032154fa95e6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(use of undeclared trait ) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1206, + ), + )), +] From 2ac068b038c378c4bc82b22c10f449f533eb4648 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 30 Oct 2025 18:05:48 +0100 Subject: [PATCH 05/29] crc: remove clarity_types dependency and use clarity crate aliases, #6627 --- Cargo.lock | 1 - stackslib/Cargo.toml | 1 - stackslib/src/chainstate/tests/parse_tests.rs | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b6393bdce6..f0235d82fbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3518,7 +3518,6 @@ dependencies = [ "assert-json-diff 1.1.0", "chrono", "clarity 0.0.1", - "clarity-types", "ed25519-dalek", "insta", "lazy_static", diff --git a/stackslib/Cargo.toml b/stackslib/Cargo.toml index 705a9f9e9a2..10e94f4b470 100644 --- a/stackslib/Cargo.toml +++ b/stackslib/Cargo.toml @@ -76,7 +76,6 @@ chrono = "0.4.19" tempfile = "3.3" proptest = { version = "1.6.0", default-features = false, features = ["std"] } insta = { version = "1.37.0", features = ["ron"] } -clarity-types = { package = "clarity-types", path = "../clarity-types", default-features = false } [features] default = [] diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 113f6e4ca90..a5428cae9a0 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -17,9 +17,9 @@ use clarity::vm::ast::parser::v2::MAX_CONTRACT_NAME_LEN; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; -#[allow(unused_imports)] // Just used for documentation purpose -use clarity_types::{errors::ParseErrors, ContractName}; +#[allow(unused_imports)] // Just used for documentation purpose +use clarity::vm::{ast::errors::ParseErrors, representations::ContractName}; use crate::chainstate::tests::consensus::contract_deploy_consensus_test; /// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] From 730fc6d98f71ea21ce4126ac6c11f9bb0b7df77d Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 30 Oct 2025 18:12:32 +0100 Subject: [PATCH 06/29] crc: clean contract code string literal, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 52 ++++++------------- ...ests__parse_tests__circular_reference.snap | 6 +-- ...rse_tests__define_trait_bad_signature.snap | 42 +++++++-------- ..._tests__parse_tests__expected_closing.snap | 42 +++++++-------- ...parse_tests__failed_parsing_int_value.snap | 42 +++++++-------- ...arse_tests__failed_parsing_uint_value.snap | 42 +++++++-------- ...parse_tests__impl_trait_bad_signature.snap | 42 +++++++-------- ...rse_tests__import_trait_bad_signature.snap | 42 +++++++-------- ...ts__parse_tests__lexer_unknown_symbol.snap | 42 +++++++-------- ...ests__parse_tests__note_to_match_this.snap | 42 +++++++-------- ..._parse_tests__trait_reference_unknown.snap | 42 +++++++-------- 11 files changed, 208 insertions(+), 228 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index a5428cae9a0..e0acbd63f56 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -45,9 +45,7 @@ fn test_stack_depth_too_deep() { fn test_failed_parsing_int_value() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (define-data-var my-int int 340282366920938463463374607431768211455) - "}, + contract_code: "(define-data-var my-int int 340282366920938463463374607431768211455)", ); } @@ -58,9 +56,7 @@ fn test_failed_parsing_int_value() { fn test_failed_parsing_uint_value() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (define-data-var my-uint uint u999340282366920938463463374607431768211455) - "}, + contract_code: "(define-data-var my-uint uint u999340282366920938463463374607431768211455)", ); } @@ -71,10 +67,10 @@ fn test_failed_parsing_uint_value() { fn test_circular_reference() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" + contract_code: " (define-constant my-a my-b) (define-constant my-b my-a) - "}, + ", ); } @@ -85,12 +81,12 @@ fn test_circular_reference() { fn test_named_already_used() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" + contract_code: " (define-trait trait-1 ( (get-1 (uint) (response uint uint)))) (define-trait trait-1 ( (get-1 (int) (response uint uint)))) - "}, + ", ); } @@ -101,11 +97,11 @@ fn test_named_already_used() { fn test_trait_ref_not_allowed() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" + contract_code: " (define-trait trait-1 ( (get-1 (uint) (response uint uint)))) (define-map kv-store { key: uint } { value: }) - "}, + ", ); } @@ -116,9 +112,7 @@ fn test_trait_ref_not_allowed() { fn test_import_trait_bad_signature() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (use-trait) - "}, + contract_code: "(use-trait)", ); } @@ -129,9 +123,7 @@ fn test_import_trait_bad_signature() { fn test_define_trait_bad_signature() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (define-trait) - "}, + contract_code: "(define-trait)", ); } @@ -142,9 +134,7 @@ fn test_define_trait_bad_signature() { fn test_impl_trait_bad_signature() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (impl-trait) - "}, + contract_code: "(impl-trait)", ); } @@ -155,9 +145,7 @@ fn test_impl_trait_bad_signature() { fn test_trait_reference_unknown() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (+ 1 ) - "}, + contract_code: "(+ 1 )", ); } @@ -168,9 +156,7 @@ fn test_trait_reference_unknown() { fn test_lexer_unknown_symbol() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - (define-data-var my-uint uint _) - "}, + contract_code: "(define-data-var my-uint uint _)", ); } @@ -184,9 +170,7 @@ fn test_lexer_unknown_symbol() { fn test_contract_name_too_long() { contract_deploy_consensus_test!( contract_name: &{"n".repeat(MAX_CONTRACT_NAME_LEN + 1)}, - contract_code: &{" - () - "}, + contract_code: "()", ); } @@ -197,9 +181,7 @@ fn test_contract_name_too_long() { fn test_expected_closing() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - ( - "}, + contract_code: "(", ); } @@ -210,8 +192,6 @@ fn test_expected_closing() { fn test_note_to_match_this() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: &{" - ()) - "}, + contract_code: "())", ); } diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap index 718a04b734b..faa8783403e 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__circular_reference.snap @@ -69,7 +69,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", - vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -159,7 +159,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", - vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -189,7 +189,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", - vm_error: "Some(detected interdependent functions (my-b, my-a)) [NON-CONSENSUS BREAKING]", + vm_error: "Some(detected interdependent functions (my-a, my-b)) [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap index cd701491433..037d48e5f44 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__define_trait_bad_signature.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "34b362f8dadde6564274df15d3dfbeece020b820eaaf9eb7c7e6a1208f049522", + marf_hash: "a3d1a1085f34e65565204169b55ed662e51e038162b8eb72b2e71bde4ef1760b", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "a303708fb184f6dab99fc9129a7351d40707acad1723acb5bed17bff518261a3", + marf_hash: "ab910b5c1e09eff4f3169dd918d6c1ea199345876254b15b480a0d1a2f2f85c3", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "ef42fe0e865b95557a47138dac274236f62fd85f57caf45ecdcb72f3db6cec02", + marf_hash: "6978f819c2b1e4470844fd03b83d2714fbe379bf8405fd8eaf772cd2bae2ac81", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "b346221ab3b38fc46fbe723eaff80f0e0969e44db5f99fa01012cadb8acbeebb", + marf_hash: "a0fb3f6fb695248dc400bc27e95c77c79240187c95326be8eda5ad23399ebc6f", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "fd4c883b4c7c7716875faf16438bf52bcf6e520e58cda8dbaf1a56cc97e8f668", + marf_hash: "1b5de6233dff8436d126fbbb2fb8a00ba0f2e64cb6e00a90bbe4c912a570b5ae", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "0260023a1bc690bb7a1e025636132f84f8d757222ece925c1ef207aa67c4d028", + marf_hash: "9a6aa80b153a24b20f16f58fe936781d0d8b060576a3a8af64a9f5844a404558", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), Success(ExpectedBlockOutput( - marf_hash: "6848b0dd731cf49041f83c01654d16b5adfb8987bf5e49d670e368449d1cdf1c", + marf_hash: "5b3e7bd76dd17a978fec8b073e1895a3317869f8e0aa2fd5526ab62c8e1316a3", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 531, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap index 0914a1403b1..8f584a975a6 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_closing.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "f66cce81e51343282596b8c2ce5e59e61090471ddb0901e3dbf5ccaa045429e3", + marf_hash: "74dede3e56ec3a3017817269d4089b3cfbdfcb99ffb2a63329fcad7c0f5a32d1", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "f07aebb13430bc0da77cd57790c12a0c14ccdfd83cae0a81912f24a65a277776", + marf_hash: "8b545070c629f8bd6d5848c004f6d19a8eea35c0e0fddca7b3007b1356a0e1f8", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "cd29621a55f05cef5537c0ac47e3f13530f6ce2c1110685a0c42a374d77e8e76", + marf_hash: "3efcd52909d707341032967e4b116e8d0f2cf92479dbc6bab6bf60aa8ed441bb", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "f0e0b8ecf8fd98702d60763eb54d3891e2b8de39004ea086e9f4d5a63a2f21c4", + marf_hash: "086be1fc5651c1b9384d71995ad6074e66f86614d0c1f211f652b988a36522d0", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "b24f737a177f4f5f9c1a12d1a1eef1cce6f596012bb41f087ebc09b48074126e", + marf_hash: "9b1debcddbe398a4aca760c4c66c650aa72508d62c764202098f57db0e0ed2e6", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "8810b3734cee27caf61a39d4c800978d96e0ac8dec30437576fcfbcb648b6534", + marf_hash: "f2d08f43a6f639b209f8da6e93c1e906de89c82c8dad8fe157bbbe2de123298e", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), Success(ExpectedBlockOutput( - marf_hash: "8d10d9495a8e4ae47cb6ce2028481cb39ee4996ea237fc5d709f890f3c301774", + marf_hash: "8196c7bbf9d5624fdabc4674d5ad5c176d1450bbad6f5ae4b42daf3c9506fc0e", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 702, + runtime: 108, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap index 2ad38f6c964..b170750058d 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_int_value.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "1f2fc1b89c6f89df000b1f3910330db5be3c35df72ad37dc074bff28a0a90ab3", + marf_hash: "fd7c206bc3374109ec1c7b921c99c1c35c231f331dcbb08b7c98698feb23dc0a", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "71684981d59580f18275a2162bed20f5a9ffa785058ce87a56decfe999de88eb", + marf_hash: "5d459c16bc5be7450d348b38f68c8c9accfe26d5228fcb4983de03dad8505655", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "5913258c1d6a62a4406d411764ee09526a7176d82ab93c87b774cc7b4a7bff77", + marf_hash: "30ac037a88a07cff0efca60e162a845806f1ab4a8947dd6829d18518192b74a2", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "ac4ca078d180f0ba9a4f81e559acb0b449333744a7409f7488537ffca4e66ccc", + marf_hash: "3f4c4e9d1a7c22eeb698c722e735a70932597fdac950225972188391013c2531", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "b502ec89315a5c6c3379e85144ce33291275bd9eda7b39e60d86adaa8241372a", + marf_hash: "01ce2ff85ee7f0e41d3ee1f22c933513ea75ea8da36b01f1c0e4fbd70d1c3ff3", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "c245f90dac86b2d5524ae5a930bb489f9ece346c3c98847fb0e19e2c990d15b4", + marf_hash: "fc8f6a3992d97abac3f7968106a9c1647201e540f75b475e325ce998cab8756a", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), Success(ExpectedBlockOutput( - marf_hash: "a062178841b1f5b5362e3c4c76673ab6b63e62edc53c0707812ef1683a9b30a4", + marf_hash: "37e9a4252a64d3ca0b238f0692ddf239ccaf294de95580f520beca5eba4b9aee", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2592, + runtime: 1917, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap index cb6407f4fc7..877948158e7 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__failed_parsing_uint_value.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "d94a92c95383c8d92307833a8c156260edb0189c886ab54258af5dadf7fa3489", + marf_hash: "ef74c1a19d770af9ef3cc59d21a428f2bfb638a74c4179a928168138ff9f3b11", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "781d627370509bf67e3096c3b8d1253948777ea920960cca13ed7f662395f070", + marf_hash: "6f382b7d786857a76149dc6f5f90876c4c20a56f8576c2bd03df30c24572001c", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "36536c8e3f9b19a36f2dee9a90a51aead1b5bc71e199cf5b4d2b35e43bbee45c", + marf_hash: "f356cd8c386fc7561b6dddac42a0a1d52d53663d6d36fa360cc4571406cc2624", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "ec8d8bb2b052175660352058ef18ce2fca72a7903267373404aa27047fad554a", + marf_hash: "c8eeeed0c48bdeafa2d8e029a09b474244babc0ef162454c6f66f6fdf0e5ce48", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "aae19876c5d98e321738edd300c8c0a4580d56d3cddde7a105067d0deb2d1903", + marf_hash: "a0c9d2f0181b578487fc4f613671d4471a69fc6a3a866994fc7c763f4baba6d0", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "c990dd5c8847f4310b10014169bce0b657e403ce93db6eb01cd547a744c57472", + marf_hash: "b0b9df5504a434fa5c8244f5a0ece76f769f875ada260fbcd2c956df0c7f6bd7", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), Success(ExpectedBlockOutput( - marf_hash: "e9a683da852b22d4dae0bb0b4fff6bab980fccc80a6eacfdf71b20f8a46b62ee", + marf_hash: "e6262ceba9110a5eca15ecb9127dec3c43e844a1753729385e184073653d25c1", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2673, + runtime: 2079, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap index 5b22f8af03f..701a3fbe0b7 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__impl_trait_bad_signature.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "6c07c6f4a33fe0591307018d79f917c13aa4ba6fe6af53fef764b14a85810a95", + marf_hash: "20c5afd9821d7beb28daa33b747ed2c73cf388d928576ea98b85a0e404114158", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "eb9707bfa4c9673bbfb9e04231dc979c611977ef083d112d9ea1b335c5a63855", + marf_hash: "71da0614e0647b539b7a38bc801b90348f3364ee690d63e420f9873eb056ec44", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "2ea5007c4b67a41cfcdde4244e684782024b4ae9b74e9f86b1fbe8949a6728d9", + marf_hash: "6d624625f0448841db8a77803c6d2e71d9101714582629db7c44237543f9e356", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "d68449dcc61f06a3a6f8a2d4b3f3ef43624b0a80ae736169c875dd38a2bc6edf", + marf_hash: "f3f4b6e30815f7f4b1fad31a9dff2a11de5c955b0418157a5c00edc243e3bddb", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "ad321b653db3a8c627c128b4e78110caaa82d87be5c82e01db60349049162570", + marf_hash: "1e4a0d77bb0efe6a2bac24c4f2276f2678cd952ec1158b1d294f1a8fcddc28bc", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "d1076e772e25d8007de244b1ec7d3c1e99ee542ba3296b99d59ff5fbf7ed2183", + marf_hash: "39631de0ee4bcf20160c5b24a5c97a8488b2f3eaaec09b97b49e07229b6ba671", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), Success(ExpectedBlockOutput( - marf_hash: "0645a5439e224bfa7014f3e524dc0b284cba175df787e8d1ffb61f8cd8b8249c", + marf_hash: "2bf18a64e97e85e3560ff6a4703dbda0f49c222b16371677dfec5c5d01f665d0", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1071, + runtime: 477, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap index 1cc903d4f75..eb71219f4fb 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__import_trait_bad_signature.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "34b362f8dadde6564274df15d3dfbeece020b820eaaf9eb7c7e6a1208f049522", + marf_hash: "c9790438f19f0eba4e0a6a7bed5bd5fda59cabddee79d6345a44eb0fe2c21e08", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "0685a58d5206c99b7895622782fdaad59170d4db63a786ae712b6b4b91ffd94d", + marf_hash: "961a4cbcc51614dcb90bd507bbbb464edaad657082d8b90a8ed0e4fc999f7eb2", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "736b55764c89feda96d186bad5badf80f4adca930f647a7a1758a7f99bb5bda9", + marf_hash: "063d2161e46f226dc7735b2ca49bcfa1432048f3cf2115554c4c459d9cefb00e", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "b0d3e8db3ed6229186cc084a0895f05c30977a1230a6dd54755cc8dd2bec5c41", + marf_hash: "56a143fdd32d80d2ae59f37f61b5339d4c840a62f03396b03ca259b09c87021c", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "935cbae06c92e6c12cd4987dc28a43bf90468af4971ddb8169cfecf4447880d4", + marf_hash: "7ef9b162d64df5bb630fda7aac0d0700e2d13dc2ec3a9d60ad92b1a147b081d5", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "76b58407ed1562aa0387e1d0dcf0c3d31bccbe568336298eddabab37ccd9eb81", + marf_hash: "c84142a078fa0c943b36bc5b0750b6662d265c1c5f849355d8d2953291be1782", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), Success(ExpectedBlockOutput( - marf_hash: "059dfa532c602455db2128c2127c90daaf75ac0ea8ce75546df6a4ad4f222b36", + marf_hash: "16644ab73dbaf40763fde3583bce27ee8c17d68ca3b2c62dfce3b2dab45414c2", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1125, + runtime: 450, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap index 77c1fef6686..bf5a49730e3 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__lexer_unknown_symbol.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "2e04612d8108edabfd313a55df6da545f8179637cbcd40c51a1f4918e5caaa68", + marf_hash: "d5b59f773e6001ae66d3f157abc1a9dc17dbd4c8648c1aa4eb83fb8840104c7c", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "bb69d92673fe9a3da0eb16b0cdd475131d9e1936f55ce31732fddc445fed4c4f", + marf_hash: "f7ebc30b4e54de778c6c2a5eec09ea30b00d14eb45e37679f007cbe823a2a898", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "855f3fef045d4dcc47328d39e3ea32b2b43b9b54516e3728a125f0956b850d87", + marf_hash: "762a7bdbba2f0a0225a4a6e64e234ac0ae0d1b762ea12d7768ac247b22ce881e", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "c7bc172e8d2fec85877b90e9a26a8c89e1bca09ebebff02958d54f41af734edc", + marf_hash: "2addac6e29256d7e8e978b769f80acd0d9ca21992d85efbc9650a199906fe7b1", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "d00c9f5003a5e411923e547d9d71ab6179a2ccb86956760238e43936a0c3d254", + marf_hash: "2b6d37a9ed3a456dd29b8f40c4716c2f7e2871bbcc8c825f67bf1bb6d6547e9d", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "820f8f683b07ceed29b75b328146f8650c094310368a5e1012d471bf936d6ca6", + marf_hash: "8770b1663cc37395567d892028d3763842380368668369ee400eba0c9dd4c583", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), Success(ExpectedBlockOutput( - marf_hash: "5fe8c201c11f87245bbc8d382562766febce8c8433c72628382d22903013a37d", + marf_hash: "32418028fb74f480544b9590de0a1ef73e05efd9f686efef87d4cb9898c8f7db", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1539, + runtime: 945, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap index a1ca5356fb7..96779c28554 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "5ad517322daee7a5aaca3c7cbbc0bcdefa9a3445e082cd183f627f5bc844e123", + marf_hash: "23d2c3143ea24b0e9c20ef9d1affc74980cc8cb39753bccf746ee3b5945a37db", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "3ce3b2565855c8f6ae6cc66513efb7a6d21e867dd106eec71adf21ff122d95fb", + marf_hash: "0fb9ffa31987842b9981efcb238528037f1bb426260775534ffee7251f8b8865", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "e7fabb6539f56089e214c640762437cbe47b58493ccb22a2a1625968e802197f", + marf_hash: "91edee319dcdb787f702d1a166248f28c7ebc51810ea130e0b407fb199e67d33", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "99a7d4793a461202b4d2585fe2c0cd629eaf40be2ff87c31a98a1518203b3719", + marf_hash: "4edf407419031364fe8f982b59d20f2ad84246334834b7808d815af28e42445f", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "443b383933894964dd3d01df4cbf95bfbe572e09be3df897169ca040d5d1de20", + marf_hash: "35fb4f79998401e46f5a12814c1c387c92855c9acbf880d89df77aa7fa052bcc", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "54f3efff84025e0a474955989bc914823dbf80781b92e5229859941cda67a88b", + marf_hash: "f88c184325401421e332ee069af266678fa208cacd5d359d81fe057a8f178ccf", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), Success(ExpectedBlockOutput( - marf_hash: "609855b85f93fc5fd9a0619e6f970c696b78dff9acba2c8e675d1d1f9461a78b", + marf_hash: "a59799deb707fece7579c0522419c7ba531c31c08c16a4dba02c3556ec97f9ef", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 756, + runtime: 162, ), )), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap index 84c8baec414..2b9597756cc 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__trait_reference_unknown.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "e0e3c1dcdbf5e09b8f893a598ac1f405d53112eea188f7937bd42249a5772429", + marf_hash: "5ba074a74da014e52ff1a01d1058774e6968b715ae3c20db1c2eaf82b5f098d6", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "24661d0f4db422dfecfbfa05c25bc231cbc08c9eaf736a3f13a043383e72cd2e", + marf_hash: "30c94116dde6b4a7418ccfcdc570b7d02281c43bba28988eb21d92732c187373", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "9169fa131c7b0d8cad2735a774a4bffe2a2eb14999f2db5213527516c06b988c", + marf_hash: "09da0bbbffb8658ce81aedbdded8005d22ffbc691d55a779a6acd14b7f4a9b01", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "7e4d58d3bece27f7586b47bc2579bb42e15f46966fc3d296cab3d2c298dad659", + marf_hash: "38f4e99db1b7935b01c26725baf4f6874e8f6cc347fac9c12dca0e1f059932e7", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "86a05b8f76d9fc646b86e6493414a9db38a6d7820b5c7024bb75f168b806a062", + marf_hash: "15ce10d0f401ad8f58069e3052ea5704046f6fd259ea25938be5c5207395487b", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "1b6a5a9c9dfa8af43a840fcd6b40071ce4d1106bcb2188c01c46da83d68acee6", + marf_hash: "cc7500cd84c69bcabfd276e818d55360a6fcecffd90416d066f66563f39118ff", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), Success(ExpectedBlockOutput( - marf_hash: "c654f9d0757600e515b3215d432bdd0ce16c9518679c5e304bdb9903318da74c", + marf_hash: "25ad958864afdd949039be1542e5491224ba2c6b28cb8bca67e6412a26e0f479", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 1206, + runtime: 585, ), )), ] From a81db5d24f6e1a8c9759b4dfb3fd853191f7cfa7 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 31 Oct 2025 13:08:25 +0100 Subject: [PATCH 07/29] chore: aac fix ParseError::CircularReference indeterminism, #6627 --- clarity/src/vm/ast/definition_sorter/mod.rs | 7 +++++-- stackslib/src/chainstate/tests/parse_tests.rs | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clarity/src/vm/ast/definition_sorter/mod.rs b/clarity/src/vm/ast/definition_sorter/mod.rs index bc12151af1b..2ccb6eb8e12 100644 --- a/clarity/src/vm/ast/definition_sorter/mod.rs +++ b/clarity/src/vm/ast/definition_sorter/mod.rs @@ -90,7 +90,7 @@ impl DefinitionSorter { let sorted_indexes = walker.get_sorted_dependencies(&self.graph); if let Some(deps) = walker.get_cycling_dependencies(&self.graph, &sorted_indexes) { - let functions_names = deps + let mut function_names = deps .into_iter() .filter_map(|i| { let exp = &contract_ast.pre_expressions[i]; @@ -99,7 +99,10 @@ impl DefinitionSorter { .map(|i| i.0.to_string()) .collect::>(); - let error = ParseError::new(ParseErrors::CircularReference(functions_names)); + // Sorting function names to make the error contents deterministic + function_names.sort(); + + let error = ParseError::new(ParseErrors::CircularReference(function_names)); return Err(error); } diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index e0acbd63f56..c8203d78112 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -17,9 +17,9 @@ use clarity::vm::ast::parser::v2::MAX_CONTRACT_NAME_LEN; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; - #[allow(unused_imports)] // Just used for documentation purpose use clarity::vm::{ast::errors::ParseErrors, representations::ContractName}; + use crate::chainstate::tests::consensus::contract_deploy_consensus_test; /// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] From d28f8bc83515893d184da0584c535fc312808057 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 00:18:02 +0100 Subject: [PATCH 08/29] test: add unit tests for build_ast, #6627 --- clarity/src/vm/ast/mod.rs | 115 ++++++++++++++++++++++++++++++++++++ clarity/src/vm/costs/mod.rs | 43 ++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/clarity/src/vm/ast/mod.rs b/clarity/src/vm/ast/mod.rs index da65d20521b..9437e2a6d72 100644 --- a/clarity/src/vm/ast/mod.rs +++ b/clarity/src/vm/ast/mod.rs @@ -446,4 +446,119 @@ mod test { } } } + + #[test] + fn test_build_ast_exceeding_cost_balance_due_to_ast_parse() { + let limit = ExecutionCost { + read_count: u64::MAX, + write_count: u64::MAX, + read_length: u64::MAX, + write_length: u64::MAX, + runtime: 1, + }; + let mut tracker = LimitedCostTracker::new_with_limit(StacksEpochId::Epoch33, limit); + + let err = build_ast( + &QualifiedContractIdentifier::transient(), + "(define-constant my-const u1)", + &mut tracker, + ClarityVersion::Clarity4, + StacksEpochId::Epoch33, + ) + .unwrap_err(); + + assert!( + matches!(*err.err, ParseErrors::CostBalanceExceeded(_, _)), + "Instead found: {err}" + ); + } + + #[test] + fn test_build_ast_exceeding_cost_balance_due_to_ast_cycle_detection_with_0_edges() { + let expected_ast_parse_cost = 1215; + let expected_cycle_det_cost = 72; + let expected_total = expected_ast_parse_cost + expected_cycle_det_cost; + + let limit = ExecutionCost { + read_count: u64::MAX, + write_count: u64::MAX, + read_length: u64::MAX, + write_length: u64::MAX, + runtime: expected_ast_parse_cost, + }; + let mut tracker = LimitedCostTracker::new_with_limit(StacksEpochId::Epoch33, limit); + + let err = build_ast( + &QualifiedContractIdentifier::transient(), + "(define-constant a 0)(define-constant b 1)", // no dependency = 0 graph edge + &mut tracker, + ClarityVersion::Clarity4, + StacksEpochId::Epoch33, + ) + .expect_err("Expected parse error, but found success!"); + + let total = match *err.err { + ParseErrors::CostBalanceExceeded(total, _) => total, + _ => panic!("Expected CostBalanceExceeded, but found: {err}"), + }; + + assert_eq!(expected_total, total.runtime); + } + + #[test] + fn test_build_ast_exceeding_cost_balance_due_to_ast_cycle_detection_with_1_edge() { + let expected_ast_parse_cost = 1215; + let expected_cycle_det_cost = 213; + let expected_total = expected_ast_parse_cost + expected_cycle_det_cost; + + let limit = ExecutionCost { + read_count: u64::MAX, + write_count: u64::MAX, + read_length: u64::MAX, + write_length: u64::MAX, + runtime: expected_ast_parse_cost, + }; + let mut tracker = LimitedCostTracker::new_with_limit(StacksEpochId::Epoch33, limit); + + let err = build_ast( + &QualifiedContractIdentifier::transient(), + "(define-constant a 0)(define-constant b a)", // 1 dependency = 1 graph edge + &mut tracker, + ClarityVersion::Clarity4, + StacksEpochId::Epoch33, + ) + .expect_err("Expected parse error, but found success!"); + + let total = match *err.err { + ParseErrors::CostBalanceExceeded(total, _) => total, + _ => panic!("Expected CostBalanceExceeded, but found: {err}"), + }; + + assert_eq!(expected_total, total.runtime); + } + + #[test] + fn test_build_ast_vary_stack_too_deep_error() { + // This contract pass the parse v2 MAX_NESTING_DEPTH but fails the [`VaryStackDepthChecker`] + let contract = { + let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64) - 1; + let body_start = "(list ".repeat(count as usize); + let body_end = ")".repeat(count as usize); + format!("{{ a: {body_start}u1 {body_end} }}") + }; + + let err = build_ast( + &QualifiedContractIdentifier::transient(), + &contract, + &mut (), + ClarityVersion::Clarity4, + StacksEpochId::Epoch33, + ) + .expect_err("Expected parse error, but found success!"); + + assert!( + matches!(*err.err, ParseErrors::VaryExpressionStackDepthTooDeep), + "Instead found: {err}" + ); + } } diff --git a/clarity/src/vm/costs/mod.rs b/clarity/src/vm/costs/mod.rs index 669f6f483dc..adb67922af0 100644 --- a/clarity/src/vm/costs/mod.rs +++ b/clarity/src/vm/costs/mod.rs @@ -852,6 +852,49 @@ impl LimitedCostTracker { }; Ok(result) } + + /// Create a [`LimitedCostTracker`] given an epoch id and an execution cost limit for testing purpose + /// + /// Autoconfigure itself loading all clarity const functions without the need of passing a clarity database + #[cfg(any(test, feature = "testing"))] + pub fn new_with_limit(epoch_id: StacksEpochId, limit: ExecutionCost) -> LimitedCostTracker { + use stacks_common::consts::CHAIN_ID_TESTNET; + + let contract_name = LimitedCostTracker::default_cost_contract_for_epoch(epoch_id) + .expect("Failed retrieving cost contract!"); + let boot_costs_id = boot_code_id(&contract_name, false); + + let version = DefaultVersion::try_from(false, &boot_costs_id) + .expect("Failed defining default version!"); + + let mut cost_functions = HashMap::new(); + for each in ClarityCostFunction::ALL { + let evaluator = ClarityCostFunctionEvaluator::Default( + ClarityCostFunctionReference { + contract_id: boot_costs_id.clone(), + function_name: each.get_name(), + }, + each.clone(), + version, + ); + cost_functions.insert(each, evaluator); + } + + let cost_tracker = TrackerData { + cost_function_references: cost_functions, + cost_contracts: HashMap::new(), + contract_call_circuits: HashMap::new(), + limit, + memory_limit: CLARITY_MEMORY_LIMIT, + total: ExecutionCost::ZERO, + memory: 0, + epoch: epoch_id, + mainnet: false, + chain_id: CHAIN_ID_TESTNET, + }; + + LimitedCostTracker::Limited(cost_tracker) + } } impl TrackerData { From 83f08ad3cc9a7b70a0b5bc5a10fdc9472d74aa31 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 00:19:46 +0100 Subject: [PATCH 09/29] test: improve parse consensus test and add VaryExpressionStackDepthTooDeep variant test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 59 +++++++++++++++++-- ...h_too_deep_case_1_tuple_only_parsing.snap} | 14 ++--- ...pth_too_deep_case_2_list_only_parsing.snap | 13 ++++ ...pth_too_deep_case_3_list_only_checker.snap | 13 ++++ ...ts__vary_stack_depth_too_deep_checker.snap | 13 ++++ 5 files changed, 101 insertions(+), 11 deletions(-) rename stackslib/src/chainstate/tests/snapshots/{blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap => blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_1_tuple_only_parsing.snap} (64%) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_2_list_only_parsing.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_3_list_only_checker.snap create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__vary_stack_depth_too_deep_checker.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index c8203d78112..6bf0692b194 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -14,7 +14,7 @@ // along with this program. If not, see . /// This module contains consensus tests related to Clarity Parse errors. -use clarity::vm::ast::parser::v2::MAX_CONTRACT_NAME_LEN; +use clarity::vm::ast::parser::v2::{MAX_CONTRACT_NAME_LEN, MAX_NESTING_DEPTH}; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; #[allow(unused_imports)] // Just used for documentation purpose @@ -23,14 +23,15 @@ use clarity::vm::{ast::errors::ParseErrors, representations::ContractName}; use crate::chainstate::tests::consensus::contract_deploy_consensus_test; /// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] -/// Caused by: nested contract body exceeding stack depth limit +/// Caused by: nested contract body exceeding stack depth limit on parsing tuples /// Outcome: block rejected #[test] -fn test_stack_depth_too_deep() { +fn test_stack_depth_too_deep_case_1_tuple_only_parsing() { contract_deploy_consensus_test!( contract_name: "my-contract", contract_code: &{ - let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64); + // In parse v2, open brace '{' have a stack count of 2. + let count = MAX_NESTING_DEPTH / 2 + 1; let body_start = "{ a : ".repeat(count as usize); let body_end = "} ".repeat(count as usize); format!("{body_start}u1 {body_end}") @@ -38,6 +39,56 @@ fn test_stack_depth_too_deep() { ); } +/// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] +/// Caused by: nested contract body exceeding stack depth limit on parsing lists +/// Outcome: block rejected +#[test] +fn test_stack_depth_too_deep_case_2_list_only_parsing() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + // In parse v2, open parent '(' have a stack count of 1. + let count = MAX_NESTING_DEPTH; + let body_start = "(list ".repeat(count as usize); + let body_end = ")".repeat(count as usize); + format!("{body_start}u1 {body_end}") + }, + ); +} + +/// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] +/// Caused by: nested contract body exceeding stack depth limit on checking lists ast +/// Outcome: block rejected +#[test] +fn test_stack_depth_too_deep_case_3_list_only_checker() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + // In parse v2, open parent '(' have a stack count of 1. + let count = AST_CALL_STACK_DEPTH_BUFFER + MAX_CALL_STACK_DEPTH as u64; + let body_start = "(list ".repeat(count as usize); + let body_end = ")".repeat(count as usize); + format!("{body_start}u1 {body_end}") + }, + ); +} + +/// ParserError: [`ParseErrors::VaryExpressionStackDepthTooDeep`] +/// Caused by: nested contract body exceeding stack depth limit on checking vary list/tuple ast +/// Outcome: block rejected +#[test] +fn test_vary_stack_depth_too_deep_checker() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64) - 1; + let body_start = "(list ".repeat(count as usize); + let body_end = ")".repeat(count as usize); + format!("{{ a: {body_start}u1 {body_end} }}") + }, + ); +} + /// ParserError: [`ParseErrors::FailedParsingIntValue`] /// Caused by: number bigger than i128 /// Outcome: block accepted diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_1_tuple_only_parsing.snap similarity index 64% rename from stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap rename to stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_1_tuple_only_parsing.snap index 36f09a47b13..f0aed35ef5c 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_1_tuple_only_parsing.snap @@ -3,11 +3,11 @@ source: stackslib/src/chainstate/tests/parse_tests.rs expression: result --- [ - Failure("Invalid Stacks block ac67c796c42af78177f41f5bfaa242763cf768605a78aa97c74d3d09c848bd51: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 2abf2fe1577dd15d16c58d034c7bd5198b7aecf7d5b864e353be579c47e50777: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 348a5a7c9b7c225d94018b557cfaec5cf16fdb3a3c010b1a621ace29f2cdf752: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 7404fb192410627500be0f8ba5e533a8a8cb15fc2e5ff41461df6e3c9cfb0300: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 11aac718d1276584504cb726d97da643abc2d89e105cd44b1ef69167705d7c62: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block b47f430b610745ee70f08a98d12ff8762f8889406e4da2c655bae90def3ab3be: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), - Failure("Invalid Stacks block 5db34beb749c249dce37c64d8460c31b24e9690dfdef2ba377bfe8840ff96b7a: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block eee942941840b5db1a7fc05d20acb5d2f200ed647bde7bcc0ba3309e695469eb: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block c8983f3af8d5a2fa9b1eb8e906c6950dd5c7b0c0057a6d265f604f2772777417: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 61b6c4d3ffbaf3a978de58caf85d3a2223009c66158f2abc34cc99182ed49c5e: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block c336a60df8f343ba813e142dfd10d6bdb7c1a3348f83347c7021241eb8541788: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block a7a3174b62e287d6e48a3e34f5c143237cfb84b3d67b11809dbe28b65640c9ec: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 515c90a569195265c29e0282aca733f6c6de1c503bb31d8432268dda88a1f645: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block c1816691eaf780dd2555b575d2f185ae7db86f6c1aa964aab64ec05ef2eb3fe0: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), ] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_2_list_only_parsing.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_2_list_only_parsing.snap new file mode 100644 index 00000000000..939874e6362 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_2_list_only_parsing.snap @@ -0,0 +1,13 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Failure("Invalid Stacks block 4c2dc4e4b2dd883494871f7ca262bc2433f10f4e2db67730829c64e867dec99c: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 03a3bd721492f73d156261ffb1e58dbd332a848ebaaba01fdef22e0b0d182e80: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 6057f35bb81ce5c2c92d06be9c9896fbe17da8db99f85faf7543ac9a56ad0a7e: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block d104a3c57238a85d6e26102c96f19509b83f260216e7d68cf1160b1ab34e096c: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block f921461ac04e9067df84ff89f9c4588017fe79e1945cdbc7c5e8d701bdd72765: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 1dc3586fb63d71b491f39f0c76f511791c9e86128989dfa401899c89a1aa6a7a: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block e10cd0c718c6b8a06afc14f8257cd7c0f1d34f311d344b1ac7e42d398eb741d8: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_3_list_only_checker.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_3_list_only_checker.snap new file mode 100644 index 00000000000..f4ca2336df9 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__stack_depth_too_deep_case_3_list_only_checker.snap @@ -0,0 +1,13 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Failure("Invalid Stacks block aa2b76f30d5fd36e874bda64bfbf34dfebf2fd31134e538d6e0739524bfb9912: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block f1207424636581f5572aed14578877192c9ce0197785edead14a526110c983d2: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 9df8dc7011856ff6c92fffb1237afe8aebc41ebdd55740c5df5c2be573e47d60: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 0bd7cebc7cb7f017726d5fec98eea4fa9764b839f91bd78f84ec27e56dbc765f: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block ddb83008e30bf87982ed58e6098fc09998dadf4285577a893bb169f159a3b165: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 96f60e2433bd9513a2bba01375b5ab977c67cf1fd4a0feaa43ae91a94687d8a3: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 909b3bc78b09d74e3a47e26d092b427b4c1c11b383f2cbecf663840f3c39719b: ClarityError(Parse(ParseError { err: ExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__vary_stack_depth_too_deep_checker.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__vary_stack_depth_too_deep_checker.snap new file mode 100644 index 00000000000..1bb95e93e2e --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__vary_stack_depth_too_deep_checker.snap @@ -0,0 +1,13 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Failure("Invalid Stacks block b085a5de95bae8d7ae5622ffed3417f32ba32784b4a68812e6de93a8d80b25bd: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 48181af8c3de9084fcb542d9db61bafab67119999e95e07a141594e60bf58796: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block bcb3cbdb3df50befd9b216ba0ef49f8b0cb987dd68e0db480f97f1c49af38b1c: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 1420e0265448dde5f05b702f814f02e95a21043c69c7aefc7ff8707a5ad9949c: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 22ff43430d5b9802ccae90589ffcc5ca7eb40a2a8bc6cb1f096c32e9531dd1bb: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 57631dae5417f3444e699094dc9a91486f9c7e68e551bade03b628bcbd1630a9: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), + Failure("Invalid Stacks block 9e492e7997f60358f29e0f5ce3df2941903e92d524bd3a31d3b1cc1d838557f2: ClarityError(Parse(ParseError { err: VaryExpressionStackDepthTooDeep, pre_expressions: None, diagnostic: Diagnostic { level: Error, message: \"AST has too deep of an expression nesting. The maximum stack depth is 64\", spans: [], suggestion: None } }))"), +] From 1ea97d3cab4adb6ee6421f5b8a630abd0c097e24 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 00:27:45 +0100 Subject: [PATCH 10/29] test: add ExpectedWhitespace aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 12 + ...ts__parse_tests__expected_white_space.snap | 216 ++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_white_space.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 6bf0692b194..53050c5b199 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -246,3 +246,15 @@ fn test_note_to_match_this() { contract_code: "())", ); } + +/// ParserError: [`ParseErrors::ExpectedWhitespace`] +/// Caused by: missing space before expression +/// Outcome: block accepted +#[test] +fn test_expected_white_space() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + //miss space between (get-one) and (ok u1) + contract_code: "(define-public (get-one)(ok u1))", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_white_space.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_white_space.snap new file mode 100644 index 00000000000..bc3d72f7890 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_white_space.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "d5b59f773e6001ae66d3f157abc1a9dc17dbd4c8648c1aa4eb83fb8840104c7c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e7806daa79ed9b134f038aca00f26798ec949122c5b83fcc9a78173d88df4f0e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b46ed328ae04ddcbedd56b788d1e1445310adbd2e35c554fb08c1b905caf521c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a08150342b5733b46708e548bed0fecfc64da84b47959903ba573839071eef44", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8315a49e5ec79593cae3e58e97f91e62aac0c40e558adadc729ce69c2a67e8e1", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9e6357f91a80a21285d8f7e68fecfa32dcf7b6088002b05028dcb80f55ae889f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3c2cd34922d7dbe15950c4ded5500794faa681bc8499a961a71083ccf8c57282", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected whitespace before expression) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 945, + ), + )), +] From dc157e41e9d1f6abf8e1ab1090100964a3c8ae50 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 01:31:06 +0100 Subject: [PATCH 11/29] test: add UnexpectedToken aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 108 +++++++-- ..._tests__parse_tests__unexpected_token.snap | 216 ++++++++++++++++++ 2 files changed, 309 insertions(+), 15 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__unexpected_token.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 53050c5b199..ee31ffda3dc 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -14,7 +14,7 @@ // along with this program. If not, see . /// This module contains consensus tests related to Clarity Parse errors. -use clarity::vm::ast::parser::v2::{MAX_CONTRACT_NAME_LEN, MAX_NESTING_DEPTH}; +use clarity::vm::ast::parser::v2::MAX_NESTING_DEPTH; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; #[allow(unused_imports)] // Just used for documentation purpose @@ -211,20 +211,6 @@ fn test_lexer_unknown_symbol() { ); } -/// ParserError: [`ParseErrors::ContractNameTooLong`] -/// Caused by: contract name longer than [`MAX_CONTRACT_NAME_LEN`] -/// Outcome: Panic -/// Due to [`ContractName::consensus_serialize`] when creating the transaction, -/// this error variant is unreachable. -#[test] -#[should_panic] -fn test_contract_name_too_long() { - contract_deploy_consensus_test!( - contract_name: &{"n".repeat(MAX_CONTRACT_NAME_LEN + 1)}, - contract_code: "()", - ); -} - /// ParserError: [`ParseErrors::ExpectedClosing`] /// Caused by: missing closing parenthesis /// Outcome: block accepted @@ -258,3 +244,95 @@ fn test_expected_white_space() { contract_code: "(define-public (get-one)(ok u1))", ); } + +/// ParserError: [`ParseErrors::UnexpectedToken`] +/// Caused by: unexpected token in the expression (rightest paranthesis) +/// Outcome: block accepted +#[test] +fn test_unexpected_token() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "(define-public (get-one) (ok u1)) )", + ); +} + +fn variant_coverage_report(variant: ParseErrors) { + enum VariantCoverage { + Unreachable_Functionally, + Unreachable_ExpectLike, + Unreachable_NotUsed, + Skipped, + Tested, + + TODO, + } + + use ParseErrors::*; + use VariantCoverage::*; + + _ = match variant { + // Costs + CostOverflow => Unreachable_ExpectLike, + CostBalanceExceeded(_, _) => Unreachable_Functionally, + MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, + CostComputationFailed(_) => Unreachable_ExpectLike, + ExecutionTimeExpired => Unreachable_NotUsed, // To re-check + + TooManyExpressions => Unreachable_ExpectLike, + ExpressionStackDepthTooDeep => Tested, + VaryExpressionStackDepthTooDeep => Tested, + FailedParsingIntValue(_) => Tested, + CircularReference(_) => Tested, + NameAlreadyUsed(_) => Tested, + TraitReferenceNotAllowed => Tested, + ImportTraitBadSignature => Tested, + DefineTraitBadSignature => Tested, + ImplTraitBadSignature => Tested, + TraitReferenceUnknown(_) => Tested, + + Lexer(LexerError) => Tested, + ContractNameTooLong(String) => Unreachable_Functionally, + ExpectedClosing(Token) => Tested, + ExpectedContractIdentifier => TODO, + ExpectedTraitIdentifier => TODO, + ExpectedWhitespace => Tested, + FailedParsingUIntValue(_) => Tested, + IllegalTraitName(_) => TODO, + InvalidPrincipalLiteral => TODO, + InvalidBuffer => TODO, + NameTooLong(_) => TODO, + UnexpectedToken(_) => Tested, + TupleColonExpectedv2 => TODO, + TupleCommaExpectedv2 => TODO, + TupleValueExpected => TODO, + IllegalClarityName(_) => TODO, + IllegalASCIIString(_) => TODO, + IllegalContractName(_) => TODO, + NoteToMatchThis(_) => Tested, + UnexpectedParserFailure => Unreachable_ExpectLike, + InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection + + // V1 + FailedCapturingInput + | SeparatorExpected(_) + | SeparatorExpectedAfterColon(_) + | ProgramTooLarge + | IllegalVariableName(_) + | FailedParsingBuffer(_) + | FailedParsingHexValue(_, _) + | FailedParsingPrincipal(_) + | FailedParsingField(_) + | FailedParsingRemainder(_) + | ClosingParenthesisUnexpected + | ClosingParenthesisExpected + | ClosingTupleLiteralUnexpected + | ClosingTupleLiteralExpected + | TupleColonExpected(_) + | TupleCommaExpected(_) + | TupleItemExpected(_) + | CommaSeparatorUnexpected + | ColonSeparatorUnexpected + | InvalidCharactersDetected + | InvalidEscaping => Skipped, //parser v1 should be removed?! + } +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__unexpected_token.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__unexpected_token.snap new file mode 100644 index 00000000000..8211cc7a8d8 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__unexpected_token.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "43bd53a10611e249b013aee865a9d9d482d7e58b8c6f713fbeee24c9805507fd", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5bcafed522353ec7f7884380ead701ee55346e396518ba2052481db08641ee28", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "533348112048f63dcb3f1b7974ec41a6530e48e2c3e5f8695844d0c52b677c6f", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "79b61578b821fef1af5352522afb62f9f5f0c19013fa308570b5bbcb6d813acd", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "bf79944f45d80e3dbf193a6429811e3d9d6b1a738086fb7faaabdfad77fcd17b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "0dee2823d39e8349caeb535c163515101ba74666b2e2f1e75d02bfcd7c18760d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b1c6f63facb9b84d1fcb59872ec91a9ca1322f98cb9575fdbb73e973493d62eb", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 1026, + ), + )), +] From d9c6948bb921e1167bb0356a4ec4e5d2bb95fa85 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 01:52:38 +0100 Subject: [PATCH 12/29] test: add NameTooLong aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 24 +- ...te__tests__parse_tests__name_too_long.snap | 216 ++++++++++++++++++ 2 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__name_too_long.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index ee31ffda3dc..58cff5be6c3 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -13,12 +13,12 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -/// This module contains consensus tests related to Clarity Parse errors. -use clarity::vm::ast::parser::v2::MAX_NESTING_DEPTH; +//! This module contains consensus tests related to Clarity Parse errors. + +use clarity::vm::ast::errors::ParseErrors; +use clarity::vm::ast::parser::v2::{MAX_NESTING_DEPTH, MAX_STRING_LEN}; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; -#[allow(unused_imports)] // Just used for documentation purpose -use clarity::vm::{ast::errors::ParseErrors, representations::ContractName}; use crate::chainstate::tests::consensus::contract_deploy_consensus_test; @@ -256,6 +256,20 @@ fn test_unexpected_token() { ); } +/// ParserError: [`ParseErrors::NameTooLong`] +/// Caused by: identifier longer than [`MAX_STRING_LEN`] +/// Outcome: block accepted +#[test] +fn test_name_too_long() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + let name = "n".repeat(MAX_STRING_LEN + 1); + format!("(define-public ({name}) (ok u1))") + }, + ); +} + fn variant_coverage_report(variant: ParseErrors) { enum VariantCoverage { Unreachable_Functionally, @@ -300,7 +314,7 @@ fn variant_coverage_report(variant: ParseErrors) { IllegalTraitName(_) => TODO, InvalidPrincipalLiteral => TODO, InvalidBuffer => TODO, - NameTooLong(_) => TODO, + NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, TupleColonExpectedv2 => TODO, TupleCommaExpectedv2 => TODO, diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__name_too_long.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__name_too_long.snap new file mode 100644 index 00000000000..56c102081d4 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__name_too_long.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ce3a6dbe78916361d949029be0b513a16af9d39c041c8296f31cae195c873eeb", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f20eec13b5f50b5488628255c831ea1cd76f82ea690812b97b32cb3445980dd2", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ef12e7ccde7b9e55b58c90b770042fbba7bb45db5bf1a79602c5a87621ec66e1", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f6de6f4c9fa822b6d3f70b5d4f1c90ae96199fbe5843b351c52acea71c6064da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c0927e01324b2e05befe6e1bdfbfb81862d9ae8a4daba805fa243c6565597448", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d8966bd79892eb5a17be027cd67465089945d691fba859335fd58ceae5915b65", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "68b36add6ed58a89a2dab505d542bf3626e48a14befb3e0ab3e95f196934c474", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(illegal name (too long), \'nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\') [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 4266, + ), + )), +] From a0f34a846508c9de91ecc7ef7bdc2c717b8f3a4c Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 09:38:33 +0100 Subject: [PATCH 13/29] chore: document variant_coverate_report, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 176 ++++++++++-------- 1 file changed, 95 insertions(+), 81 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 58cff5be6c3..35ad319155b 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -22,6 +22,101 @@ use clarity::vm::MAX_CALL_STACK_DEPTH; use crate::chainstate::tests::consensus::contract_deploy_consensus_test; +/// Generates a coverage classification report for a specific [`ParseErrors`] variant. +/// +/// This method exists purely for **documentation and tracking purposes**. +/// It helps maintainers understand which error variants have been: +/// +/// - ✅ **Tested** — verified through consensus tests. +/// - ⚙️ **Ignored** — not tested on purpose. (e.g. parser v1 errors). +/// - 🚫 **Unreachable** — not testable from consensus test side for reasons. +#[allow(dead_code)] +fn variant_coverage_report(variant: ParseErrors) { + enum VariantCoverage { + // Cannot occur through valid execution + Unreachable_Functionally, + // Unexpected error, that should never happen + Unreachable_ExpectLike, + // Defined but never used + Unreachable_NotUsed, + // Not tested on purpose + Ignored, + // Covered by consensus tests + Tested, + + TODO, + } + + use ParseErrors::*; + use VariantCoverage::*; + + _ = match variant { + // Costs + CostOverflow => Unreachable_ExpectLike, + CostBalanceExceeded(_, _) => Unreachable_Functionally, + MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, + CostComputationFailed(_) => Unreachable_ExpectLike, + ExecutionTimeExpired => Unreachable_NotUsed, // To re-check + + TooManyExpressions => Unreachable_ExpectLike, + ExpressionStackDepthTooDeep => Tested, + VaryExpressionStackDepthTooDeep => Tested, + FailedParsingIntValue(_) => Tested, + CircularReference(_) => Tested, + NameAlreadyUsed(_) => Tested, + TraitReferenceNotAllowed => Tested, + ImportTraitBadSignature => Tested, + DefineTraitBadSignature => Tested, + ImplTraitBadSignature => Tested, + TraitReferenceUnknown(_) => Tested, + + Lexer(LexerError) => Tested, + ContractNameTooLong(String) => Unreachable_Functionally, + ExpectedClosing(Token) => Tested, + ExpectedContractIdentifier => TODO, + ExpectedTraitIdentifier => TODO, + ExpectedWhitespace => Tested, + FailedParsingUIntValue(_) => Tested, + IllegalTraitName(_) => TODO, + InvalidPrincipalLiteral => TODO, + InvalidBuffer => TODO, + NameTooLong(_) => Tested, + UnexpectedToken(_) => Tested, + TupleColonExpectedv2 => TODO, + TupleCommaExpectedv2 => TODO, + TupleValueExpected => TODO, + IllegalClarityName(_) => TODO, + IllegalASCIIString(_) => TODO, + IllegalContractName(_) => TODO, + NoteToMatchThis(_) => Tested, + UnexpectedParserFailure => Unreachable_ExpectLike, + InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection + + // V1 + FailedCapturingInput + | SeparatorExpected(_) + | SeparatorExpectedAfterColon(_) + | ProgramTooLarge + | IllegalVariableName(_) + | FailedParsingBuffer(_) + | FailedParsingHexValue(_, _) + | FailedParsingPrincipal(_) + | FailedParsingField(_) + | FailedParsingRemainder(_) + | ClosingParenthesisUnexpected + | ClosingParenthesisExpected + | ClosingTupleLiteralUnexpected + | ClosingTupleLiteralExpected + | TupleColonExpected(_) + | TupleCommaExpected(_) + | TupleItemExpected(_) + | CommaSeparatorUnexpected + | ColonSeparatorUnexpected + | InvalidCharactersDetected + | InvalidEscaping => Ignored, //parser v1 should be removed?! + } +} + /// ParserError: [`ParseErrors::ExpressionStackDepthTooDeep`] /// Caused by: nested contract body exceeding stack depth limit on parsing tuples /// Outcome: block rejected @@ -269,84 +364,3 @@ fn test_name_too_long() { }, ); } - -fn variant_coverage_report(variant: ParseErrors) { - enum VariantCoverage { - Unreachable_Functionally, - Unreachable_ExpectLike, - Unreachable_NotUsed, - Skipped, - Tested, - - TODO, - } - - use ParseErrors::*; - use VariantCoverage::*; - - _ = match variant { - // Costs - CostOverflow => Unreachable_ExpectLike, - CostBalanceExceeded(_, _) => Unreachable_Functionally, - MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, - CostComputationFailed(_) => Unreachable_ExpectLike, - ExecutionTimeExpired => Unreachable_NotUsed, // To re-check - - TooManyExpressions => Unreachable_ExpectLike, - ExpressionStackDepthTooDeep => Tested, - VaryExpressionStackDepthTooDeep => Tested, - FailedParsingIntValue(_) => Tested, - CircularReference(_) => Tested, - NameAlreadyUsed(_) => Tested, - TraitReferenceNotAllowed => Tested, - ImportTraitBadSignature => Tested, - DefineTraitBadSignature => Tested, - ImplTraitBadSignature => Tested, - TraitReferenceUnknown(_) => Tested, - - Lexer(LexerError) => Tested, - ContractNameTooLong(String) => Unreachable_Functionally, - ExpectedClosing(Token) => Tested, - ExpectedContractIdentifier => TODO, - ExpectedTraitIdentifier => TODO, - ExpectedWhitespace => Tested, - FailedParsingUIntValue(_) => Tested, - IllegalTraitName(_) => TODO, - InvalidPrincipalLiteral => TODO, - InvalidBuffer => TODO, - NameTooLong(_) => Tested, - UnexpectedToken(_) => Tested, - TupleColonExpectedv2 => TODO, - TupleCommaExpectedv2 => TODO, - TupleValueExpected => TODO, - IllegalClarityName(_) => TODO, - IllegalASCIIString(_) => TODO, - IllegalContractName(_) => TODO, - NoteToMatchThis(_) => Tested, - UnexpectedParserFailure => Unreachable_ExpectLike, - InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection - - // V1 - FailedCapturingInput - | SeparatorExpected(_) - | SeparatorExpectedAfterColon(_) - | ProgramTooLarge - | IllegalVariableName(_) - | FailedParsingBuffer(_) - | FailedParsingHexValue(_, _) - | FailedParsingPrincipal(_) - | FailedParsingField(_) - | FailedParsingRemainder(_) - | ClosingParenthesisUnexpected - | ClosingParenthesisExpected - | ClosingTupleLiteralUnexpected - | ClosingTupleLiteralExpected - | TupleColonExpected(_) - | TupleCommaExpected(_) - | TupleItemExpected(_) - | CommaSeparatorUnexpected - | ColonSeparatorUnexpected - | InvalidCharactersDetected - | InvalidEscaping => Skipped, //parser v1 should be removed?! - } -} From a04618bec120ca0beee1c00a81245df3428aa7d1 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 11:11:22 +0100 Subject: [PATCH 14/29] test: add InvalidPrincipalLiteral aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 19 +- ..._tests__invalid_principal_literal.snap.new | 218 ++++++++++++++++++ 2 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 35ad319155b..f5acf85f993 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -53,7 +53,7 @@ fn variant_coverage_report(variant: ParseErrors) { _ = match variant { // Costs CostOverflow => Unreachable_ExpectLike, - CostBalanceExceeded(_, _) => Unreachable_Functionally, + CostBalanceExceeded(_, _) => Unreachable_Functionally, // due to epoch runtime epoch limits configuration. MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, CostComputationFailed(_) => Unreachable_ExpectLike, ExecutionTimeExpired => Unreachable_NotUsed, // To re-check @@ -71,14 +71,14 @@ fn variant_coverage_report(variant: ParseErrors) { TraitReferenceUnknown(_) => Tested, Lexer(LexerError) => Tested, - ContractNameTooLong(String) => Unreachable_Functionally, + ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_serialize with panic ExpectedClosing(Token) => Tested, ExpectedContractIdentifier => TODO, ExpectedTraitIdentifier => TODO, ExpectedWhitespace => Tested, FailedParsingUIntValue(_) => Tested, - IllegalTraitName(_) => TODO, - InvalidPrincipalLiteral => TODO, + IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors + InvalidPrincipalLiteral => Tested, InvalidBuffer => TODO, NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, @@ -364,3 +364,14 @@ fn test_name_too_long() { }, ); } + +/// ParserError: [`ParseErrors::InvalidPrincipalLiteral`] +/// Caused by: valid principal chars but wrong format (due to the starting "AAA") +/// Outcome: block accepted +#[test] +fn test_invalid_principal_literal() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "(define-constant my-principal 'AAAST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA)", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new new file mode 100644 index 00000000000..3dcd69adcc6 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new @@ -0,0 +1,218 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +assertion_line: 373 +expression: result +snapshot_kind: text +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "761d99d7caec93ccc37fa1b130b57fbb3a9bed921e4d3d1ea681e1a9883ccaea", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87511e8b7f5538b7a9b465c6b43cb5f44e17a458be0e1348cc6086622108e6c7", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9f38f9843e5fec376fc2a33e98ff11497af762c5c87c6e01d1a9ac3aa134c811", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4bbfa6f99df434c36edebfd52a0cb1ede7a6c74dad152657fb7c48ed4ea93438", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4e5653278ea9abeb931a081ce1794900ab5a6f83ead3ba685bd6b99efab50792", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cd957b5f2ee4fb5cda2221b7d9886f6336a67f9c2b9dfb30654be9f9f27ac28c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "53de4f0d9a90d2285e50b047d37a6d75f3a57f3a49918d4d510a3e169706916a", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(invalid principal literal) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2133, + ), + )), +] From 42f94d622510d2fea8db3a607390e5a07f756e78 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 11:54:38 +0100 Subject: [PATCH 15/29] test: add InvalidBuffer as unreachable, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index f5acf85f993..b69ca0a6cdf 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -71,7 +71,7 @@ fn variant_coverage_report(variant: ParseErrors) { TraitReferenceUnknown(_) => Tested, Lexer(LexerError) => Tested, - ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_serialize with panic + ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_deserialize (panic) ExpectedClosing(Token) => Tested, ExpectedContractIdentifier => TODO, ExpectedTraitIdentifier => TODO, @@ -79,7 +79,7 @@ fn variant_coverage_report(variant: ParseErrors) { FailedParsingUIntValue(_) => Tested, IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors InvalidPrincipalLiteral => Tested, - InvalidBuffer => TODO, + InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_deserialize with MAX_TRASACTION_LEN (panic) NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, TupleColonExpectedv2 => TODO, From 9e74b7cc535d7a09314976377c99cc726e81d296 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:06:20 +0100 Subject: [PATCH 16/29] test: add ExpectedContractIdentifier aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 13 +- ...e_tests__expected_contract_identifier.snap | 216 ++++++++++++++++++ ...rse_tests__invalid_principal_literal.snap} | 2 - 3 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap rename stackslib/src/chainstate/tests/snapshots/{blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new => blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap} (99%) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index b69ca0a6cdf..86ccdc445af 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -73,7 +73,7 @@ fn variant_coverage_report(variant: ParseErrors) { Lexer(LexerError) => Tested, ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_deserialize (panic) ExpectedClosing(Token) => Tested, - ExpectedContractIdentifier => TODO, + ExpectedContractIdentifier => Tested, ExpectedTraitIdentifier => TODO, ExpectedWhitespace => Tested, FailedParsingUIntValue(_) => Tested, @@ -375,3 +375,14 @@ fn test_invalid_principal_literal() { contract_code: "(define-constant my-principal 'AAAST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA)", ); } + +/// ParserError: [`ParseErrors::ExpectedContractIdentifier`] +/// Caused by: missing name in contract identifier (nothing after the dot '.') +/// Outcome: block accepted +#[test] +fn test_expected_contract_identifier() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "(define-constant my-contract-id 'ST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA.)", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap new file mode 100644 index 00000000000..e936230c036 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "ef74c1a19d770af9ef3cc59d21a428f2bfb638a74c4179a928168138ff9f3b11", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4047d3b1d3194eededae9d78ff10d211a62f42e9e157842542a9fa1a56c92c7e", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b26a4be99619445a5c8bd0dadf70304c453b61ece8b871b15e9addfe9f812108", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "9150bf8f8302c11eadbb15fed56c17e1034f1cb3bd7e3b18817133bd1d0cb426", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "87a9a00b09f78310eac97b4b397d75bd7ceee30e67ee1016aa3c965a3f48aa22", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8d59a8edb7a7f35508f21b29a02bd3ee37e887bfa4bd443e5362a126eb8bd819", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e18a29a4794f88b7a2aade2db3fb2541f45e3e269d0f972269491497332dc652", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected contract identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2079, + ), + )), +] diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap similarity index 99% rename from stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new rename to stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap index 3dcd69adcc6..3d9dc41b02d 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap.new +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__invalid_principal_literal.snap @@ -1,8 +1,6 @@ --- source: stackslib/src/chainstate/tests/parse_tests.rs -assertion_line: 373 expression: result -snapshot_kind: text --- [ Success(ExpectedBlockOutput( From 190f7026ed5348056544c3d352ffe01422b38918 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:14:10 +0100 Subject: [PATCH 17/29] test: add ExpectedTraitIdentifier aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 13 +- ..._tests__expected_trait_identifier.snap.new | 218 ++++++++++++++++++ 2 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 86ccdc445af..a0e36ee2a78 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -74,7 +74,7 @@ fn variant_coverage_report(variant: ParseErrors) { ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_deserialize (panic) ExpectedClosing(Token) => Tested, ExpectedContractIdentifier => Tested, - ExpectedTraitIdentifier => TODO, + ExpectedTraitIdentifier => Tested, ExpectedWhitespace => Tested, FailedParsingUIntValue(_) => Tested, IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors @@ -386,3 +386,14 @@ fn test_expected_contract_identifier() { contract_code: "(define-constant my-contract-id 'ST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA.)", ); } + +/// ParserError: [`ParseErrors::ExpectedTraitIdentifier`] +/// Caused by: missing name in trait identifier (nothing after the dot '.') +/// Outcome: block accepted +#[test] +fn test_expected_trait_identifier() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "(define-constant my-trait-id 'ST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA.contract.)", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new new file mode 100644 index 00000000000..f2280f6fe79 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new @@ -0,0 +1,218 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +assertion_line: 392 +expression: result +snapshot_kind: text +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "7c4d5ca86ed4a521b0d7a5eda246b2f4c7240a7d2cda8cbc16f78946fb40ea4c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "395a385ef11c1149db8de981d2841c39eb46ea62deaa634874b935ad5f160ba6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "8000125b032fe2ce6011e2f7844b63cdfb218f8c5b34e116730d47c7d3c2b1b4", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "1e2481ce672455b85e0e7d404e0c55a03435fd1ec4d0101426a3a4d319c2c8da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "4068542f04aeec233e6f4af81cfa455d10fc800c9828f6a682647d8d94362a8d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c51e5094886527e3458cb3630494bfa3ec2a3f3bd479eddb0124606d1f7a8a52", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "430501fc80c22f9cc2489dea09e2ac9eee2671819aa3af1e1526c38a931b8288", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected trait identifier) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 2295, + ), + )), +] From 03368c7ea153db0c0388e844c17f12360dee96e6 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:20:56 +0100 Subject: [PATCH 18/29] test: add TupleColonExpectedv2 aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 13 +- ...se_tests__tuple_colon_expected_v2.snap.new | 218 ++++++++++++++++++ 2 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index a0e36ee2a78..54b0fdf3eec 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -82,7 +82,7 @@ fn variant_coverage_report(variant: ParseErrors) { InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_deserialize with MAX_TRASACTION_LEN (panic) NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, - TupleColonExpectedv2 => TODO, + TupleColonExpectedv2 => Tested, TupleCommaExpectedv2 => TODO, TupleValueExpected => TODO, IllegalClarityName(_) => TODO, @@ -397,3 +397,14 @@ fn test_expected_trait_identifier() { contract_code: "(define-constant my-trait-id 'ST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA.contract.)", ); } + +/// ParserError: [`ParseErrors::TupleColonExpectedv2`] +/// Caused by: missing colon in tuple definition +/// Outcome: block accepted +#[test] +fn test_tuple_colon_expected_v2() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "{ a 1 }", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new new file mode 100644 index 00000000000..00b71558952 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new @@ -0,0 +1,218 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +assertion_line: 403 +expression: result +snapshot_kind: text +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "d24d8e0f69f6ac54831eeb7e091647e999cbc1479c1b0b81592b87fe2d5afc99", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "f473466546e8afd0f3565921220ac78e0385f2e128cfdfcc5db88de2aee63683", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "3639d67c5d5ed1886cb2e9161e3ac8bb286f6a2c822d139a977b45abfa4a17b0", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "099a652b55749c757b02422ffc9e95e0f02e66ed0921fdb2be44766da2483f1b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d03ddcabb9cacda14a778f06de68ea72995166739ddbf08ee59fcb0c0f3532e9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ea0f2be563d7d5f3c940f7fdadebde6166e63db9e2976a671c95503524c34f7c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2136429658e58dd1daa72e180b2ef681bcd830d38d13e5d0e3e3585b32b4effc", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected \':\' after key in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 270, + ), + )), +] From 6145f1de22ff98ba1a6bb3b5deb2f9ac64856d10 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:25:13 +0100 Subject: [PATCH 19/29] test: add TupleCommaExpectedv2 aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 15 +- ...rse_tests__expected_trait_identifier.snap} | 2 - ...parse_tests__tuple_colon_expected_v2.snap} | 2 - ..._parse_tests__tuple_comma_expected_v2.snap | 216 ++++++++++++++++++ 4 files changed, 229 insertions(+), 6 deletions(-) rename stackslib/src/chainstate/tests/snapshots/{blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new => blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap} (99%) rename stackslib/src/chainstate/tests/snapshots/{blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new => blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap} (99%) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 54b0fdf3eec..f716bb87f22 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -83,7 +83,7 @@ fn variant_coverage_report(variant: ParseErrors) { NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, TupleColonExpectedv2 => Tested, - TupleCommaExpectedv2 => TODO, + TupleCommaExpectedv2 => Tested, TupleValueExpected => TODO, IllegalClarityName(_) => TODO, IllegalASCIIString(_) => TODO, @@ -399,7 +399,7 @@ fn test_expected_trait_identifier() { } /// ParserError: [`ParseErrors::TupleColonExpectedv2`] -/// Caused by: missing colon in tuple definition +/// Caused by: missing colon in tuple definition separating field name and value /// Outcome: block accepted #[test] fn test_tuple_colon_expected_v2() { @@ -408,3 +408,14 @@ fn test_tuple_colon_expected_v2() { contract_code: "{ a 1 }", ); } + +/// ParserError: [`ParseErrors::TupleCommaExpectedv2`] +/// Caused by: missing comma in tuple definition separating fields +/// Outcome: block accepted +#[test] +fn test_tuple_comma_expected_v2() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "{ a : 1 b : 2}", + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap similarity index 99% rename from stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new rename to stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap index f2280f6fe79..79ffa93b9b3 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap.new +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_trait_identifier.snap @@ -1,8 +1,6 @@ --- source: stackslib/src/chainstate/tests/parse_tests.rs -assertion_line: 392 expression: result -snapshot_kind: text --- [ Success(ExpectedBlockOutput( diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap similarity index 99% rename from stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new rename to stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap index 00b71558952..21ea2dd0b27 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap.new +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_colon_expected_v2.snap @@ -1,8 +1,6 @@ --- source: stackslib/src/chainstate/tests/parse_tests.rs -assertion_line: 403 expression: result -snapshot_kind: text --- [ Success(ExpectedBlockOutput( diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap new file mode 100644 index 00000000000..86f26f6877d --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5ba074a74da014e52ff1a01d1058774e6968b715ae3c20db1c2eaf82b5f098d6", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "890df89eb9f94e1e9b28dff765328ab7cf481f450854b57976857f371b312ff9", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5591043f6136a5c9ee8432858146201ab4d4a8ddfa5d7cd65ff29c42de893e1c", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "6b4a909c7058890ad296da350481f21757b75daa6649418ba56ed438f1a730a6", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff481fad45e44589eb2349bd0436158a10ba264215b272327ebf129c5e2567da", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "de5296a16f8c10575f0812aba5ad64c05b43142041fe25045b3838ad18372631", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e517199c8af01e01e7f613f4de332b78cecc5f63cb464ba9138c68559f9f2f29", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected \',\' separating key-value pairs in tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 513, + ), + )), +] From 49935ab7944a1387398dfa47e1990575f241f17b Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:31:27 +0100 Subject: [PATCH 20/29] test: add TupleValueExpected aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 21 +- ..._parse_tests__tuple_comma_expected_v2.snap | 12 +- ...ts__parse_tests__tuple_value_expected.snap | 216 ++++++++++++++++++ 3 files changed, 238 insertions(+), 11 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_value_expected.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index f716bb87f22..9dd01c58724 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -84,7 +84,7 @@ fn variant_coverage_report(variant: ParseErrors) { UnexpectedToken(_) => Tested, TupleColonExpectedv2 => Tested, TupleCommaExpectedv2 => Tested, - TupleValueExpected => TODO, + TupleValueExpected => Tested, IllegalClarityName(_) => TODO, IllegalASCIIString(_) => TODO, IllegalContractName(_) => TODO, @@ -113,7 +113,7 @@ fn variant_coverage_report(variant: ParseErrors) { | CommaSeparatorUnexpected | ColonSeparatorUnexpected | InvalidCharactersDetected - | InvalidEscaping => Ignored, //parser v1 should be removed?! + | InvalidEscaping => Ignored, //parser v1 is deprecated and maybe removed in the next future. } } @@ -399,7 +399,7 @@ fn test_expected_trait_identifier() { } /// ParserError: [`ParseErrors::TupleColonExpectedv2`] -/// Caused by: missing colon in tuple definition separating field name and value +/// Caused by: missing colon between field name and value in tuple definition /// Outcome: block accepted #[test] fn test_tuple_colon_expected_v2() { @@ -410,12 +410,23 @@ fn test_tuple_colon_expected_v2() { } /// ParserError: [`ParseErrors::TupleCommaExpectedv2`] -/// Caused by: missing comma in tuple definition separating fields +/// Caused by: missing comma between fields in tuple definition /// Outcome: block accepted #[test] fn test_tuple_comma_expected_v2() { contract_deploy_consensus_test!( contract_name: "my-contract", - contract_code: "{ a : 1 b : 2}", + contract_code: "{ a : 1 b : 2 }", + ); +} + +/// ParserError: [`ParseErrors::TupleValueExpected`] +/// Caused by: missing value for field in tuple definition +/// Outcome: block accepted +#[test] +fn test_tuple_value_expected() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: "{ a : ", ); } diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap index 86f26f6877d..95690fddf0f 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_comma_expected_v2.snap @@ -34,7 +34,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "890df89eb9f94e1e9b28dff765328ab7cf481f450854b57976857f371b312ff9", + marf_hash: "a924ca50126300995e83004095441e3ebdcfd0a655b801fa6603ac7063ff1730", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -64,7 +64,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "5591043f6136a5c9ee8432858146201ab4d4a8ddfa5d7cd65ff29c42de893e1c", + marf_hash: "03b01587fc890301bfaf885e8f9a1fe8cf8a593868d8ab1befab9d94b729b259", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -94,7 +94,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "6b4a909c7058890ad296da350481f21757b75daa6649418ba56ed438f1a730a6", + marf_hash: "6a3333354e378de36ff638181fd61a35f7f6d65963bbb2e0d8ba9ca62dada206", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -124,7 +124,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "ff481fad45e44589eb2349bd0436158a10ba264215b272327ebf129c5e2567da", + marf_hash: "87cfc5ebd65e627a75ea827a7a354b56b295f9f02e95ad747fca02fa9be81d25", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -154,7 +154,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "de5296a16f8c10575f0812aba5ad64c05b43142041fe25045b3838ad18372631", + marf_hash: "ea91648a33f918f1ae2cb459cb9ac15e7e6072e715f3477572b8268c4aa3771b", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -184,7 +184,7 @@ expression: result ), )), Success(ExpectedBlockOutput( - marf_hash: "e517199c8af01e01e7f613f4de332b78cecc5f63cb464ba9138c68559f9f2f29", + marf_hash: "9072574e1e52098ebbc6522a50e6509eebbbefba1f7dc94d5c0501cf8b659bc0", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_value_expected.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_value_expected.snap new file mode 100644 index 00000000000..51209c99426 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__tuple_value_expected.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "28efa87cf58aa612cbc1c79bf1b119d527fc5f862a97d2e80555ba51c70c0d93", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "d301cfc403af39194c5d684da3e60869bdce4ba5a99ca982fdaa9e0d9b3dc310", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "580d31de8a8b833093e32803a245d4a900e0c7fe5eca2a98248bd24d67913e63", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "889b459187c7b72d7cc87f4e60d8c0c4538fb122a9bdc7aa7dd9b1725a86a514", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "81f1a9856b387d3a5796b5edb4d7c0074a5d17f131ea14445b824eb80431d60b", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "7ea49bd1417727df0eed5cdc9fc15677508ac5db1c6df14c2352f6e2a8a4278d", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "a493bb53a3953b11b086581bf45d3d599f66600088a7523589d3d70ebe0976d9", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(expected value expression for tuple) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 243, + ), + )), +] From 4b70a35430a497540aa18e5bea1ce249dcd32ae5 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 6 Nov 2025 12:52:17 +0100 Subject: [PATCH 21/29] test: add ContractNameTooLong aac test, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 18 +- ...__parse_tests__contract_name_too_long.snap | 216 ++++++++++++++++++ 2 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__contract_name_too_long.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 9dd01c58724..76b17cc07a2 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -16,7 +16,7 @@ //! This module contains consensus tests related to Clarity Parse errors. use clarity::vm::ast::errors::ParseErrors; -use clarity::vm::ast::parser::v2::{MAX_NESTING_DEPTH, MAX_STRING_LEN}; +use clarity::vm::ast::parser::v2::{MAX_CONTRACT_NAME_LEN, MAX_NESTING_DEPTH, MAX_STRING_LEN}; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::MAX_CALL_STACK_DEPTH; @@ -71,7 +71,7 @@ fn variant_coverage_report(variant: ParseErrors) { TraitReferenceUnknown(_) => Tested, Lexer(LexerError) => Tested, - ContractNameTooLong(String) => Unreachable_Functionally, // prevented by ContractName::consensus_deserialize (panic) + ContractNameTooLong(String) => Tested, ExpectedClosing(Token) => Tested, ExpectedContractIdentifier => Tested, ExpectedTraitIdentifier => Tested, @@ -430,3 +430,17 @@ fn test_tuple_value_expected() { contract_code: "{ a : ", ); } + +/// ParserError: [`ParseErrors::ContractNameTooLong`] +/// Caused by: contract name longer than [`MAX_CONTRACT_NAME_LEN`] +/// Outcome: block accepted +#[test] +fn test_contract_name_too_long() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + let name = "a".repeat(MAX_CONTRACT_NAME_LEN + 1); + format!("(define-constant my-contract-id 'ST3J2GVMMM2R07ZFBJDWTYEYAR8FZH5WKDTFJ9AHA.{name})") + }, + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__contract_name_too_long.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__contract_name_too_long.snap new file mode 100644 index 00000000000..70b72889846 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__contract_name_too_long.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "5dcb6edb64938bbbb0a665a070bd1f92239669b9a138e96388809d57ee46f0a5", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "cdcbaf5ae21f1b23d6beebbac12429c339942015c06d2b9c6cbd45e1117a6fad", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5eb8a72e4ac7121e7b29682e00ded4c35b501d4ed84ead04e912346db1dde356", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "5e29e797d2a4aafa3e8e7662bd47615a5dd9042fc67f0f845141ff45ea5b770c", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "40212bf5c5a2f61bb42ca298d312578ec3f9d2f02c454b606e5dfd302e04833e", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "647d7820cf0bb3c47af71fdb88dde4b788d44015be25e5b4a7505965a6b0a1df", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "b972bd7a77ebe1c0077b35dab186b4a1f749e01d49c3566fc99b0640853093be", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(contract name \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\' is too long) [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 3240, + ), + )), +] From 5a1b8c37bc5b33b39f883f339bdc81af7b52d8a0 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 7 Nov 2025 12:10:19 +0100 Subject: [PATCH 22/29] test: add IllegalASCIIString aac test, #6627 --- clarity-types/src/errors/ast.rs | 121 ++++++---- clarity/src/vm/ast/mod.rs | 31 ++- stackslib/src/chainstate/tests/parse_tests.rs | 25 +- ...ts__parse_tests__illegal_ascii_string.snap | 216 ++++++++++++++++++ 4 files changed, 343 insertions(+), 50 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap diff --git a/clarity-types/src/errors/ast.rs b/clarity-types/src/errors/ast.rs index f2b774bd1b7..f460b1a55f9 100644 --- a/clarity-types/src/errors/ast.rs +++ b/clarity-types/src/errors/ast.rs @@ -24,7 +24,7 @@ use crate::token::Token; pub type ParseResult = Result; -#[derive(Debug, PartialEq)] +#[derive(PartialEq)] pub enum ParseErrors { // Cost errors CostOverflow, @@ -149,45 +149,9 @@ impl fmt::Display for ParseError { } } -impl error::Error for ParseError { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - None - } -} - -impl From for ParseError { - fn from(err: ParseErrors) -> Self { - ParseError::new(err) - } -} - -impl From for ParseError { - fn from(err: CostErrors) -> Self { - match err { - CostErrors::CostOverflow => ParseError::new(ParseErrors::CostOverflow), - CostErrors::CostBalanceExceeded(a, b) => { - ParseError::new(ParseErrors::CostBalanceExceeded(a, b)) - } - CostErrors::MemoryBalanceExceeded(a, b) => { - ParseError::new(ParseErrors::MemoryBalanceExceeded(a, b)) - } - CostErrors::CostComputationFailed(s) => { - ParseError::new(ParseErrors::CostComputationFailed(s)) - } - CostErrors::CostContractLoadFailure => ParseError::new( - ParseErrors::CostComputationFailed("Failed to load cost contract".into()), - ), - CostErrors::InterpreterFailure | CostErrors::Expect(_) => { - ParseError::new(ParseErrors::InterpreterFailure) - } - CostErrors::ExecutionTimeExpired => ParseError::new(ParseErrors::ExecutionTimeExpired), - } - } -} - -impl DiagnosableError for ParseErrors { - fn message(&self) -> String { - match &self { +impl fmt::Display for ParseErrors { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let message = match &self { ParseErrors::CostOverflow => "Used up cost budget during the parse".into(), ParseErrors::CostBalanceExceeded(bal, used) => { format!("Used up cost budget during the parse: {bal} balance, {used} used") @@ -295,14 +259,89 @@ impl DiagnosableError for ParseErrors { } ParseErrors::TupleValueExpected => "expected value expression for tuple".into(), ParseErrors::IllegalClarityName(name) => format!("illegal clarity name, '{name}'"), - ParseErrors::IllegalASCIIString(s) => format!("illegal ascii string \"{s}\""), + ParseErrors::IllegalASCIIString(s) => { + // Protect against console flooding and process hanging while running tests, + // using a purely arbitrary max chars limit. + #[cfg(any(test, feature = "testing"))] + let s = shorten_string_for_test(s, 100); + + format!("illegal ascii string \"{s}\"") + } ParseErrors::ExpectedWhitespace => "expected whitespace before expression".into(), ParseErrors::NoteToMatchThis(token) => format!("to match this '{token}'"), ParseErrors::UnexpectedParserFailure => "unexpected failure while parsing".to_string(), ParseErrors::InterpreterFailure => "unexpected failure while parsing".to_string(), ParseErrors::ExecutionTimeExpired => "max execution time expired".to_string(), + }; + write!(f, "{message}") + } +} + +/// Test helper function to shorten big strings while running tests +/// +/// This prevents both: +/// - Console flooding with multi-megabyte output during test runs. +/// - Potential test process blocking or hanging due to stdout buffering limits. +/// +/// In case a the input `string` need to be shortned based on `max_chars`, +/// the resulting string will be ellipsed showing the original character count. +#[cfg(any(test, feature = "testing"))] +fn shorten_string_for_test(string: &str, max_chars: usize) -> String { + let char_count = string.chars().count(); + if char_count <= max_chars { + string.into() + } else { + let shortened: String = string.chars().take(max_chars).collect(); + format!("{shortened}...[{char_count}]") + } +} + +impl fmt::Debug for ParseErrors { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl error::Error for ParseError { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + None + } +} + +impl From for ParseError { + fn from(err: ParseErrors) -> Self { + ParseError::new(err) + } +} + +impl From for ParseError { + fn from(err: CostErrors) -> Self { + match err { + CostErrors::CostOverflow => ParseError::new(ParseErrors::CostOverflow), + CostErrors::CostBalanceExceeded(a, b) => { + ParseError::new(ParseErrors::CostBalanceExceeded(a, b)) + } + CostErrors::MemoryBalanceExceeded(a, b) => { + ParseError::new(ParseErrors::MemoryBalanceExceeded(a, b)) + } + CostErrors::CostComputationFailed(s) => { + ParseError::new(ParseErrors::CostComputationFailed(s)) + } + CostErrors::CostContractLoadFailure => ParseError::new( + ParseErrors::CostComputationFailed("Failed to load cost contract".into()), + ), + CostErrors::InterpreterFailure | CostErrors::Expect(_) => { + ParseError::new(ParseErrors::InterpreterFailure) + } + CostErrors::ExecutionTimeExpired => ParseError::new(ParseErrors::ExecutionTimeExpired), } } +} + +impl DiagnosableError for ParseErrors { + fn message(&self) -> String { + format!("{self}") + } fn suggestion(&self) -> Option { None diff --git a/clarity/src/vm/ast/mod.rs b/clarity/src/vm/ast/mod.rs index 9437e2a6d72..e1f5764054c 100644 --- a/clarity/src/vm/ast/mod.rs +++ b/clarity/src/vm/ast/mod.rs @@ -237,6 +237,7 @@ pub fn build_ast( mod test { use std::collections::HashMap; + use clarity_types::types::MAX_VALUE_SIZE; use stacks_common::types::StacksEpochId; use crate::vm::ast::build_ast; @@ -448,7 +449,7 @@ mod test { } #[test] - fn test_build_ast_exceeding_cost_balance_due_to_ast_parse() { + fn test_build_ast_error_exceeding_cost_balance_due_to_ast_parse() { let limit = ExecutionCost { read_count: u64::MAX, write_count: u64::MAX, @@ -474,7 +475,7 @@ mod test { } #[test] - fn test_build_ast_exceeding_cost_balance_due_to_ast_cycle_detection_with_0_edges() { + fn test_build_ast_error_exceeding_cost_balance_due_to_ast_cycle_detection_with_0_edges() { let expected_ast_parse_cost = 1215; let expected_cycle_det_cost = 72; let expected_total = expected_ast_parse_cost + expected_cycle_det_cost; @@ -506,7 +507,7 @@ mod test { } #[test] - fn test_build_ast_exceeding_cost_balance_due_to_ast_cycle_detection_with_1_edge() { + fn test_build_ast_error_exceeding_cost_balance_due_to_ast_cycle_detection_with_1_edge() { let expected_ast_parse_cost = 1215; let expected_cycle_det_cost = 213; let expected_total = expected_ast_parse_cost + expected_cycle_det_cost; @@ -538,7 +539,7 @@ mod test { } #[test] - fn test_build_ast_vary_stack_too_deep_error() { + fn test_build_ast_error_vary_stack_too_deep() { // This contract pass the parse v2 MAX_NESTING_DEPTH but fails the [`VaryStackDepthChecker`] let contract = { let count = AST_CALL_STACK_DEPTH_BUFFER + (MAX_CALL_STACK_DEPTH as u64) - 1; @@ -561,4 +562,26 @@ mod test { "Instead found: {err}" ); } + + #[test] + fn test_build_ast_error_illegal_ascii_string_due_to_size() { + let contract = { + let string = "a".repeat(MAX_VALUE_SIZE as usize + 1); + format!("(define-constant my-str \"{string}\")") + }; + + let err = build_ast( + &QualifiedContractIdentifier::transient(), + &contract, + &mut (), + ClarityVersion::Clarity4, + StacksEpochId::Epoch33, + ) + .expect_err("Expected parse error, but found success!"); + + assert!( + matches!(*err.err, ParseErrors::IllegalASCIIString(_)), + "Instead found: {err}" + ); + } } diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 76b17cc07a2..07c8ad63eb2 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -18,6 +18,7 @@ use clarity::vm::ast::errors::ParseErrors; use clarity::vm::ast::parser::v2::{MAX_CONTRACT_NAME_LEN, MAX_NESTING_DEPTH, MAX_STRING_LEN}; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; +use clarity::vm::types::MAX_VALUE_SIZE; use clarity::vm::MAX_CALL_STACK_DEPTH; use crate::chainstate::tests::consensus::contract_deploy_consensus_test; @@ -79,14 +80,14 @@ fn variant_coverage_report(variant: ParseErrors) { FailedParsingUIntValue(_) => Tested, IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors InvalidPrincipalLiteral => Tested, - InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_deserialize with MAX_TRASACTION_LEN (panic) + InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_serialize with MAX_TRASACTION_LEN (panic) NameTooLong(_) => Tested, UnexpectedToken(_) => Tested, TupleColonExpectedv2 => Tested, TupleCommaExpectedv2 => Tested, TupleValueExpected => Tested, - IllegalClarityName(_) => TODO, - IllegalASCIIString(_) => TODO, + IllegalClarityName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors + IllegalASCIIString(_) => Tested, IllegalContractName(_) => TODO, NoteToMatchThis(_) => Tested, UnexpectedParserFailure => Unreachable_ExpectLike, @@ -410,7 +411,7 @@ fn test_tuple_colon_expected_v2() { } /// ParserError: [`ParseErrors::TupleCommaExpectedv2`] -/// Caused by: missing comma between fields in tuple definition +/// Caused by: missing comma between fields in tuple definition /// Outcome: block accepted #[test] fn test_tuple_comma_expected_v2() { @@ -435,7 +436,7 @@ fn test_tuple_value_expected() { /// Caused by: contract name longer than [`MAX_CONTRACT_NAME_LEN`] /// Outcome: block accepted #[test] -fn test_contract_name_too_long() { +fn test_contract_name_too_long() { contract_deploy_consensus_test!( contract_name: "my-contract", contract_code: &{ @@ -444,3 +445,17 @@ fn test_contract_name_too_long() { }, ); } + +/// ParserError: [`ParseErrors::IllegalASCIIString`] +/// Caused by: string longer than [`MAX_VALUE_SIZE`] +/// Outcome: block accepted +#[test] +fn test_illegal_ascii_string() { + contract_deploy_consensus_test!( + contract_name: "my-contract", + contract_code: &{ + let string = "a".repeat(MAX_VALUE_SIZE as usize + 1); + format!("(define-constant my-str \"{string}\")") + }, + ); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap new file mode 100644 index 00000000000..dfafb841b81 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap @@ -0,0 +1,216 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Success(ExpectedBlockOutput( + marf_hash: "f93aeb5803dbf8fa4ff3e972f2e55bce70785a5cb4181f164ec3aeca2234b497", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "31ecb7d8ffdc48eb7e0949fe07bf4af226e72ea7a92602e6b16fe069d4635a25", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c049f17d1b1f0512bbdad3f1824b52a9a3123e53ceeacfcfd0c849362857edb7", + evaluated_epoch: Epoch32, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "2e55221a85062b2990ba5e72595dc64b74614c86b1f510461193af34438ef3ce", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "e877eaead9d6890ba4ffdd7fff9f0881ad69b688cb7bb4a5ce7db1c9af4a1c87", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "c903864ee9662d07b203894d75d81813da025448d876bcadf31a3fa4ecb10097", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), + Success(ExpectedBlockOutput( + marf_hash: "ff2c0106a27177e5048bfa48a1a733efd0017d0a74c9ccec5173046753731f0f", + evaluated_epoch: Epoch33, + transactions: [ + ExpectedTransactionOutput( + tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + return_type: Response(ResponseData( + committed: false, + data: Optional(OptionalData( + data: None, + )), + )), + cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + ), + ], + total_block_cost: ExecutionCost( + write_length: 0, + write_count: 0, + read_length: 0, + read_count: 0, + runtime: 28312389, + ), + )), +] From 2924f6e65a3e09c5338c6b225bd41d8b36fd3f56 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 7 Nov 2025 12:36:39 +0100 Subject: [PATCH 23/29] test: add IllegalContractName aac as unreachable, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 07c8ad63eb2..847d5a4b18d 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -44,8 +44,6 @@ fn variant_coverage_report(variant: ParseErrors) { Ignored, // Covered by consensus tests Tested, - - TODO, } use ParseErrors::*; @@ -57,7 +55,7 @@ fn variant_coverage_report(variant: ParseErrors) { CostBalanceExceeded(_, _) => Unreachable_Functionally, // due to epoch runtime epoch limits configuration. MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, CostComputationFailed(_) => Unreachable_ExpectLike, - ExecutionTimeExpired => Unreachable_NotUsed, // To re-check + ExecutionTimeExpired => Unreachable_NotUsed, TooManyExpressions => Unreachable_ExpectLike, ExpressionStackDepthTooDeep => Tested, @@ -78,7 +76,7 @@ fn variant_coverage_report(variant: ParseErrors) { ExpectedTraitIdentifier => Tested, ExpectedWhitespace => Tested, FailedParsingUIntValue(_) => Tested, - IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors + IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant InvalidPrincipalLiteral => Tested, InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_serialize with MAX_TRASACTION_LEN (panic) NameTooLong(_) => Tested, @@ -86,9 +84,9 @@ fn variant_coverage_report(variant: ParseErrors) { TupleColonExpectedv2 => Tested, TupleCommaExpectedv2 => Tested, TupleValueExpected => Tested, - IllegalClarityName(_) => Unreachable_Functionally, // prevented by Lexer checks returning lexer errors + IllegalClarityName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant IllegalASCIIString(_) => Tested, - IllegalContractName(_) => TODO, + IllegalContractName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant or Parser by MAX_CONTRACT_NAME_LEN returning `ContractNameTooLong` variant NoteToMatchThis(_) => Tested, UnexpectedParserFailure => Unreachable_ExpectLike, InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection From 8c0a7fcfb3ec3e19eae7cb444e6047084fadb0e2 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 7 Nov 2025 18:43:33 +0100 Subject: [PATCH 24/29] chore: fix failing unit tests, #6627 --- clarity-types/src/errors/ast.rs | 121 ++++++------------ clarity/src/vm/ast/parser/v2/mod.rs | 25 ++++ ...ts__parse_tests__illegal_ascii_string.snap | 14 +- 3 files changed, 73 insertions(+), 87 deletions(-) diff --git a/clarity-types/src/errors/ast.rs b/clarity-types/src/errors/ast.rs index f460b1a55f9..f2b774bd1b7 100644 --- a/clarity-types/src/errors/ast.rs +++ b/clarity-types/src/errors/ast.rs @@ -24,7 +24,7 @@ use crate::token::Token; pub type ParseResult = Result; -#[derive(PartialEq)] +#[derive(Debug, PartialEq)] pub enum ParseErrors { // Cost errors CostOverflow, @@ -149,9 +149,45 @@ impl fmt::Display for ParseError { } } -impl fmt::Display for ParseErrors { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let message = match &self { +impl error::Error for ParseError { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + None + } +} + +impl From for ParseError { + fn from(err: ParseErrors) -> Self { + ParseError::new(err) + } +} + +impl From for ParseError { + fn from(err: CostErrors) -> Self { + match err { + CostErrors::CostOverflow => ParseError::new(ParseErrors::CostOverflow), + CostErrors::CostBalanceExceeded(a, b) => { + ParseError::new(ParseErrors::CostBalanceExceeded(a, b)) + } + CostErrors::MemoryBalanceExceeded(a, b) => { + ParseError::new(ParseErrors::MemoryBalanceExceeded(a, b)) + } + CostErrors::CostComputationFailed(s) => { + ParseError::new(ParseErrors::CostComputationFailed(s)) + } + CostErrors::CostContractLoadFailure => ParseError::new( + ParseErrors::CostComputationFailed("Failed to load cost contract".into()), + ), + CostErrors::InterpreterFailure | CostErrors::Expect(_) => { + ParseError::new(ParseErrors::InterpreterFailure) + } + CostErrors::ExecutionTimeExpired => ParseError::new(ParseErrors::ExecutionTimeExpired), + } + } +} + +impl DiagnosableError for ParseErrors { + fn message(&self) -> String { + match &self { ParseErrors::CostOverflow => "Used up cost budget during the parse".into(), ParseErrors::CostBalanceExceeded(bal, used) => { format!("Used up cost budget during the parse: {bal} balance, {used} used") @@ -259,89 +295,14 @@ impl fmt::Display for ParseErrors { } ParseErrors::TupleValueExpected => "expected value expression for tuple".into(), ParseErrors::IllegalClarityName(name) => format!("illegal clarity name, '{name}'"), - ParseErrors::IllegalASCIIString(s) => { - // Protect against console flooding and process hanging while running tests, - // using a purely arbitrary max chars limit. - #[cfg(any(test, feature = "testing"))] - let s = shorten_string_for_test(s, 100); - - format!("illegal ascii string \"{s}\"") - } + ParseErrors::IllegalASCIIString(s) => format!("illegal ascii string \"{s}\""), ParseErrors::ExpectedWhitespace => "expected whitespace before expression".into(), ParseErrors::NoteToMatchThis(token) => format!("to match this '{token}'"), ParseErrors::UnexpectedParserFailure => "unexpected failure while parsing".to_string(), ParseErrors::InterpreterFailure => "unexpected failure while parsing".to_string(), ParseErrors::ExecutionTimeExpired => "max execution time expired".to_string(), - }; - write!(f, "{message}") - } -} - -/// Test helper function to shorten big strings while running tests -/// -/// This prevents both: -/// - Console flooding with multi-megabyte output during test runs. -/// - Potential test process blocking or hanging due to stdout buffering limits. -/// -/// In case a the input `string` need to be shortned based on `max_chars`, -/// the resulting string will be ellipsed showing the original character count. -#[cfg(any(test, feature = "testing"))] -fn shorten_string_for_test(string: &str, max_chars: usize) -> String { - let char_count = string.chars().count(); - if char_count <= max_chars { - string.into() - } else { - let shortened: String = string.chars().take(max_chars).collect(); - format!("{shortened}...[{char_count}]") - } -} - -impl fmt::Debug for ParseErrors { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Display::fmt(self, f) - } -} - -impl error::Error for ParseError { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - None - } -} - -impl From for ParseError { - fn from(err: ParseErrors) -> Self { - ParseError::new(err) - } -} - -impl From for ParseError { - fn from(err: CostErrors) -> Self { - match err { - CostErrors::CostOverflow => ParseError::new(ParseErrors::CostOverflow), - CostErrors::CostBalanceExceeded(a, b) => { - ParseError::new(ParseErrors::CostBalanceExceeded(a, b)) - } - CostErrors::MemoryBalanceExceeded(a, b) => { - ParseError::new(ParseErrors::MemoryBalanceExceeded(a, b)) - } - CostErrors::CostComputationFailed(s) => { - ParseError::new(ParseErrors::CostComputationFailed(s)) - } - CostErrors::CostContractLoadFailure => ParseError::new( - ParseErrors::CostComputationFailed("Failed to load cost contract".into()), - ), - CostErrors::InterpreterFailure | CostErrors::Expect(_) => { - ParseError::new(ParseErrors::InterpreterFailure) - } - CostErrors::ExecutionTimeExpired => ParseError::new(ParseErrors::ExecutionTimeExpired), } } -} - -impl DiagnosableError for ParseErrors { - fn message(&self) -> String { - format!("{self}") - } fn suggestion(&self) -> Option { None diff --git a/clarity/src/vm/ast/parser/v2/mod.rs b/clarity/src/vm/ast/parser/v2/mod.rs index 61821d196c3..9f9c9b64e8f 100644 --- a/clarity/src/vm/ast/parser/v2/mod.rs +++ b/clarity/src/vm/ast/parser/v2/mod.rs @@ -875,6 +875,12 @@ impl<'a> Parser<'a> { match Value::string_ascii_from_bytes(val.clone().into_bytes()) { Ok(s) => PreSymbolicExpression::atom_value(s), Err(_) => { + // Protect against console flooding and process hanging while running tests, + // using a purely arbitrary max chars limit. + // NOTE: A better place for this would be the enum itself, but then we need to write a custom Debug implementation + #[cfg(any(test, feature = "testing"))] + let val = ellipse_string_for_test(val, 128); + self.add_diagnostic( ParseErrors::IllegalASCIIString(val.clone()), token.span.clone(), @@ -1110,6 +1116,25 @@ pub fn parse_collect_diagnostics( (stmts, diagnostics, parser.success) } +/// Test helper function to shorten big strings while running tests +/// +/// This prevents both: +/// - Console flooding with multi-megabyte output during test runs. +/// - Potential test process blocking or hanging due to stdout buffering limits. +/// +/// In case a the input `string` need to be shortned based on `max_chars`, +/// the resulting string will be ellipsed showing the original character count. +#[cfg(any(test, feature = "testing"))] +fn ellipse_string_for_test(string: &str, max_chars: usize) -> String { + let char_count = string.chars().count(); + if char_count <= max_chars { + string.into() + } else { + let shortened: String = string.chars().take(max_chars).collect(); + format!("{shortened}...[{char_count}]") + } +} + #[cfg(test)] #[cfg(feature = "developer-mode")] mod tests { diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap index dfafb841b81..383a9185e77 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__illegal_ascii_string.snap @@ -9,7 +9,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_2-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -39,7 +39,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_2-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -69,7 +69,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_2-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -99,7 +99,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -129,7 +129,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -159,7 +159,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( @@ -189,7 +189,7 @@ expression: result transactions: [ ExpectedTransactionOutput( tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", - vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", + vm_error: "Some(illegal ascii string \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...[1048577]\") [NON-CONSENSUS BREAKING]", return_type: Response(ResponseData( committed: false, data: Optional(OptionalData( From 7848a34b3e626942d40cba2ace6fc4140e929a4f Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 7 Nov 2025 20:16:36 +0100 Subject: [PATCH 25/29] test: update insta for test_illegal_ascii_string, #6627 --- ...e_tests__expected_contract_identifier.snap | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap index e936230c036..b20f146282f 100644 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__expected_contract_identifier.snap @@ -4,7 +4,7 @@ expression: result --- [ Success(ExpectedBlockOutput( - marf_hash: "ef74c1a19d770af9ef3cc59d21a428f2bfb638a74c4179a928168138ff9f3b11", + marf_hash: "761d99d7caec93ccc37fa1b130b57fbb3a9bed921e4d3d1ea681e1a9883ccaea", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -21,7 +21,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -30,11 +30,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "4047d3b1d3194eededae9d78ff10d211a62f42e9e157842542a9fa1a56c92c7e", + marf_hash: "2e78fcfd56446b403051192c2642ead711c4ed54240246a0d82b66c2dd42acad", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -51,7 +51,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -60,11 +60,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "b26a4be99619445a5c8bd0dadf70304c453b61ece8b871b15e9addfe9f812108", + marf_hash: "d5e397c16fb5aa02ea62dbf6f9871e3e2571f0acd6e11e04e2159b544672fbfb", evaluated_epoch: Epoch32, transactions: [ ExpectedTransactionOutput( @@ -81,7 +81,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -90,11 +90,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "9150bf8f8302c11eadbb15fed56c17e1034f1cb3bd7e3b18817133bd1d0cb426", + marf_hash: "7f663bb47199d69f0986f05781c9ad83d7e882fdc7e5717fafe4177bd32700c7", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -111,7 +111,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -120,11 +120,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "87a9a00b09f78310eac97b4b397d75bd7ceee30e67ee1016aa3c965a3f48aa22", + marf_hash: "f157d94eae9432477dbfe6f90d6f16609cffeb3f92ce8ea8d8b16cd44e5bccf4", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -141,7 +141,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -150,11 +150,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "8d59a8edb7a7f35508f21b29a02bd3ee37e887bfa4bd443e5362a126eb8bd819", + marf_hash: "9c41eba701504de1eec17a6ed34098e3990278867b5125370d6df28cd389d7bb", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -171,7 +171,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -180,11 +180,11 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), Success(ExpectedBlockOutput( - marf_hash: "e18a29a4794f88b7a2aade2db3fb2541f45e3e269d0f972269491497332dc652", + marf_hash: "5e360d6a14d893f83e7fa8ee9ae2080a1527aede9d832531269ec23ed3a9b8dd", evaluated_epoch: Epoch33, transactions: [ ExpectedTransactionOutput( @@ -201,7 +201,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), ), ], @@ -210,7 +210,7 @@ expression: result write_count: 0, read_length: 0, read_count: 0, - runtime: 2079, + runtime: 2133, ), )), ] From 96b0fe6af82183a9aa8d954adf26840d98aecf19 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Wed, 12 Nov 2025 12:48:42 +0100 Subject: [PATCH 26/29] test: add CostBalanceExceeded aac test, #6627 --- stackslib/src/chainstate/tests/consensus.rs | 39 ++++++- stackslib/src/chainstate/tests/parse_tests.rs | 100 +++++++++++++++++- ...s__parse_tests__cost_balance_exceeded.snap | 13 +++ 3 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__cost_balance_exceeded.snap diff --git a/stackslib/src/chainstate/tests/consensus.rs b/stackslib/src/chainstate/tests/consensus.rs index b9692aae622..1f19adfb3f7 100644 --- a/stackslib/src/chainstate/tests/consensus.rs +++ b/stackslib/src/chainstate/tests/consensus.rs @@ -70,7 +70,7 @@ const FOO_CONTRACT: &str = "(define-public (foo) (ok 1)) (define-public (bar (x uint)) (ok x))"; /// Returns the list of Clarity versions that can be used to deploy contracts in the given epoch. -const fn clarity_versions_for_epoch(epoch: StacksEpochId) -> &'static [ClarityVersion] { +pub const fn clarity_versions_for_epoch(epoch: StacksEpochId) -> &'static [ClarityVersion] { match epoch { StacksEpochId::Epoch10 => &[], StacksEpochId::Epoch20 | StacksEpochId::Epoch2_05 => &[ClarityVersion::Clarity1], @@ -1081,6 +1081,43 @@ impl ConsensusTest<'_> { } } +// Just a namespace for utilities for writing consensus tests +pub struct ConsensusUtils; + +impl ConsensusUtils { + pub fn new_deploy_tx( + nonce: u64, + contract_name: &str, + contract_code: &str, + clarity_version: Option, + ) -> StacksTransaction { + let deploy_tx = make_contract_publish_versioned( + &FAUCET_PRIV_KEY, + nonce, + contract_code.len() as u64 * 100, + CHAIN_ID_TESTNET, + contract_name, + contract_code, + clarity_version, + ); + StacksTransaction::consensus_deserialize(&mut deploy_tx.as_slice()).unwrap() + } + + pub fn new_call_tx(nonce: u64, contract_name: &str, funct_name: &str) -> StacksTransaction { + let call_tx = make_contract_call( + &FAUCET_PRIV_KEY, + nonce, + 200, + CHAIN_ID_TESTNET, + &to_addr(&FAUCET_PRIV_KEY), + contract_name, + funct_name, + &[], + ); + StacksTransaction::consensus_deserialize(&mut call_tx.as_slice()).unwrap() + } +} + #[test] fn test_append_empty_blocks() { let empty_test_blocks = vec![TestBlock { diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 847d5a4b18d..2c7d55acab1 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -15,13 +15,19 @@ //! This module contains consensus tests related to Clarity Parse errors. +use std::collections::HashMap; + use clarity::vm::ast::errors::ParseErrors; use clarity::vm::ast::parser::v2::{MAX_CONTRACT_NAME_LEN, MAX_NESTING_DEPTH, MAX_STRING_LEN}; use clarity::vm::ast::stack_depth_checker::AST_CALL_STACK_DEPTH_BUFFER; use clarity::vm::types::MAX_VALUE_SIZE; use clarity::vm::MAX_CALL_STACK_DEPTH; -use crate::chainstate::tests::consensus::contract_deploy_consensus_test; +use crate::chainstate::tests::consensus::{ + clarity_versions_for_epoch, contract_deploy_consensus_test, ConsensusTest, ConsensusUtils, + TestBlock, EPOCHS_TO_TEST, +}; +use crate::core::BLOCK_LIMIT_MAINNET_21; /// Generates a coverage classification report for a specific [`ParseErrors`] variant. /// @@ -52,7 +58,7 @@ fn variant_coverage_report(variant: ParseErrors) { _ = match variant { // Costs CostOverflow => Unreachable_ExpectLike, - CostBalanceExceeded(_, _) => Unreachable_Functionally, // due to epoch runtime epoch limits configuration. + CostBalanceExceeded(_, _) => Tested, MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, CostComputationFailed(_) => Unreachable_ExpectLike, ExecutionTimeExpired => Unreachable_NotUsed, @@ -457,3 +463,93 @@ fn test_illegal_ascii_string() { }, ); } + +/// ParserError: [`ParseErrors::CostBalanceExceeded`] +/// Caused by: exceeding runtime cost limit [`BLOCK_LIMIT_MAINNET_21`] during contract deploy parsing +/// Outcome: block rejected +/// Note: This cost error is remapped as [`crate::chainstate::stacks::Error::CostOverflowError`] +#[test] +fn test_cost_balance_exceeded() { + const RUNTIME_LIMIT: u64 = BLOCK_LIMIT_MAINNET_21.runtime as u64; + // Arbitrary parameters determined through empirical testing + const CONTRACT_FUNC_INVOCATIONS: u64 = 29_022; + const CALL_RUNTIME_COST: u64 = 249_996_284; + const CALLS_NEEDED: u64 = RUNTIME_LIMIT / CALL_RUNTIME_COST - 1; + + let costly_contract_code = { + let mut code = String::from( + "(define-constant msg 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f)\n\ + (define-constant sig 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40)\n\ + (define-constant key 0xfffefdfcfbfaf9f8f7f6f5f4f3f2f1f0efeeedecebeae9e8e7e6e5e4e3e2e1e0df)\n\ + (define-read-only (costly-func)\n (begin\n", + ); + for _ in 0..CONTRACT_FUNC_INVOCATIONS { + code.push_str(" (secp256k1-verify msg sig key)\n"); + } + code.push_str(" true))"); + code + }; + + let large_contract_code = &{ + let mut code = String::new(); + for i in 0..50_000u64 { + code.push_str(&format!("(define-public (gen-fn-{i}) (ok {i}))\n", i = i)); + } + code + }; + + let mut result = vec![]; + for each_epoch in EPOCHS_TO_TEST { + for &each_clarity_ver in clarity_versions_for_epoch(*each_epoch) { + let mut nonce = 0; + let mut txs = vec![]; + + // Create a contract that will be costly to execute + txs.push(ConsensusUtils::new_deploy_tx( + nonce, + "costly-contract", + &costly_contract_code, + None, + )); + + // Create contract calls that push the runtime cost to a considerably high value + while nonce < CALLS_NEEDED { + nonce += 1; + txs.push(ConsensusUtils::new_call_tx( + nonce, + "costly-contract", + "costly-func", + )); + } + + // Create a large contract that push the runtime cost close to the limit + nonce += 1; + txs.push(ConsensusUtils::new_deploy_tx( + nonce, + "runtime-close", + large_contract_code, + None, + )); + + // Create a large contract that exceeds the runtime cost limit during parsing + // NOTE: this is the only relevant transaction to demonstrate the runtime cost to be exceeded during parsing. + // the previous txs are just for test preparation. + nonce += 1; + txs.push(ConsensusUtils::new_deploy_tx( + nonce, + "runtime-exceeded", + large_contract_code, + Some(each_clarity_ver), + )); + + let block = TestBlock { transactions: txs }; + + let epoch_blocks = HashMap::from([(*each_epoch, vec![block])]); + + let each_result = ConsensusTest::new(function_name!(), vec![]).run(epoch_blocks); + result.extend(each_result); + } + } + + insta::assert_ron_snapshot!(result); +} diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__cost_balance_exceeded.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__cost_balance_exceeded.snap new file mode 100644 index 00000000000..26b074cd5c3 --- /dev/null +++ b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__cost_balance_exceeded.snap @@ -0,0 +1,13 @@ +--- +source: stackslib/src/chainstate/tests/parse_tests.rs +expression: result +--- +[ + Failure("Invalid Stacks block 6eb193bc5f59dea0281da1c509e6ea5ce2f42bf21db4bf1c6c52882a25a8f8f7: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block 1e41c0e9ea50001b1ec7c664a17ee0a2af7577ff05e85592bd055684109e45b9: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block 80d989a9a7d3ee699914b212be7099473541c9953aa049ebaa7bb91b80508165: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block 4336e3cf8a165099cb2e13c7676671a6b045e8ee1ed7973936ec750ae34569d0: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block f9f6a5d51f5c933a24c4e231343541bab01bf3f242538128cdbe0bfd1b391773: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block 19166e89cf28998f4422da5bafd8a9dd4bc474d33e75c9f1b0066bbf35cad9ca: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), + Failure("Invalid Stacks block 78a5502eaececf9deb076908378d3591a86cf4dc5779af1c25b2b8ae5ce803d6: CostOverflowError(ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 4948255138 }, ExecutionCost { write_length: 3589069, write_count: 4, read_length: 19309683, read_count: 59, runtime: 5004355279 }, ExecutionCost { write_length: 15000000, write_count: 15000, read_length: 100000000, read_count: 15000, runtime: 5000000000 })"), +] From ab741efa0ba84512c79bacf522d21c59aafe1d71 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Wed, 12 Nov 2025 16:04:27 +0100 Subject: [PATCH 27/29] crc: improve doc api, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 79 ++++++++++--------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index b9f311f4530..7e4b9663396 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -40,16 +40,16 @@ use crate::core::BLOCK_LIMIT_MAINNET_21; #[allow(dead_code)] fn variant_coverage_report(variant: ParseErrorKind) { enum VariantCoverage { - // Cannot occur through valid execution - Unreachable_Functionally, + // Cannot occur through valid execution. The string is to explain the reason. + Unreachable_Functionally(&'static str), // Unexpected error, that should never happen Unreachable_ExpectLike, // Defined but never used Unreachable_NotUsed, - // Not tested on purpose - Ignored, - // Covered by consensus tests - Tested, + // Not tested on purpose. The string is to explain the reason. + Ignored(&'static str), + // Covered by consensus tests. The func lists is for to link the variant with the related tests + Tested(Vec), } use ParseErrorKind::*; @@ -58,42 +58,45 @@ fn variant_coverage_report(variant: ParseErrorKind) { _ = match variant { // Costs CostOverflow => Unreachable_ExpectLike, - CostBalanceExceeded(_, _) => Tested, + CostBalanceExceeded(_, _) => Tested(vec![test_cost_balance_exceeded]), MemoryBalanceExceeded(_, _) => Unreachable_NotUsed, CostComputationFailed(_) => Unreachable_ExpectLike, ExecutionTimeExpired => Unreachable_NotUsed, TooManyExpressions => Unreachable_ExpectLike, - ExpressionStackDepthTooDeep => Tested, - VaryExpressionStackDepthTooDeep => Tested, - FailedParsingIntValue(_) => Tested, - CircularReference(_) => Tested, - NameAlreadyUsed(_) => Tested, - TraitReferenceNotAllowed => Tested, - ImportTraitBadSignature => Tested, - DefineTraitBadSignature => Tested, - ImplTraitBadSignature => Tested, - TraitReferenceUnknown(_) => Tested, - - Lexer(LexerError) => Tested, - ContractNameTooLong(String) => Tested, - ExpectedClosing(Token) => Tested, - ExpectedContractIdentifier => Tested, - ExpectedTraitIdentifier => Tested, - ExpectedWhitespace => Tested, - FailedParsingUIntValue(_) => Tested, - IllegalTraitName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant - InvalidPrincipalLiteral => Tested, - InvalidBuffer => Unreachable_Functionally, // prevented by both Lexer checks, and StacksTransaction::consensus_serialize with MAX_TRASACTION_LEN (panic) - NameTooLong(_) => Tested, - UnexpectedToken(_) => Tested, - TupleColonExpectedv2 => Tested, - TupleCommaExpectedv2 => Tested, - TupleValueExpected => Tested, - IllegalClarityName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant - IllegalASCIIString(_) => Tested, - IllegalContractName(_) => Unreachable_Functionally, // prevented by Lexer checks returning `Lexer` variant or Parser by MAX_CONTRACT_NAME_LEN returning `ContractNameTooLong` variant - NoteToMatchThis(_) => Tested, + ExpressionStackDepthTooDeep => Tested(vec![ + test_stack_depth_too_deep_case_2_list_only_parsing, + test_stack_depth_too_deep_case_2_list_only_parsing, + test_stack_depth_too_deep_case_3_list_only_checker, + ]), + VaryExpressionStackDepthTooDeep => Tested(vec![test_vary_stack_depth_too_deep_checker]), + FailedParsingIntValue(_) => Tested(vec![test_failed_parsing_int_value]), + CircularReference(_) => Tested(vec![test_circular_reference]), + NameAlreadyUsed(_) => Tested(vec![test_named_already_used]), + TraitReferenceNotAllowed => Tested(vec![test_trait_ref_not_allowed]), + ImportTraitBadSignature => Tested(vec![test_import_trait_bad_signature]), + DefineTraitBadSignature => Tested(vec![test_define_trait_bad_signature]), + ImplTraitBadSignature => Tested(vec![test_impl_trait_bad_signature]), + TraitReferenceUnknown(_) => Tested(vec![test_trait_reference_unknown]), + Lexer(LexerError) => Tested(vec![test_lexer_unknown_symbol]), + ContractNameTooLong(String) => Tested(vec![test_contract_name_too_long]), + ExpectedClosing(Token) => Tested(vec![test_expected_closing]), + ExpectedContractIdentifier => Tested(vec![test_expected_contract_identifier]), + ExpectedTraitIdentifier => Tested(vec![test_expected_trait_identifier]), + ExpectedWhitespace => Tested(vec![test_expected_white_space]), + FailedParsingUIntValue(_) => Tested(vec![test_failed_parsing_uint_value]), + IllegalTraitName(_) => Unreachable_Functionally("prevented by Lexer checks returning `Lexer` variant"), + InvalidPrincipalLiteral => Tested(vec![test_invalid_principal_literal]), + InvalidBuffer => Unreachable_Functionally("prevented by both Lexer checks, and StacksTransaction::consensus_serialize with MAX_TRANSACTION_LEN (panic)"), + NameTooLong(_) => Tested(vec![test_name_too_long]), + UnexpectedToken(_) => Tested(vec![test_unexpected_token]), + TupleColonExpectedv2 => Tested(vec![test_tuple_colon_expected_v2]), + TupleCommaExpectedv2 => Tested(vec![test_tuple_comma_expected_v2]), + TupleValueExpected => Tested(vec![test_tuple_value_expected]), + IllegalClarityName(_) => Unreachable_Functionally("prevented by Lexer checks returning `Lexer` variant"), + IllegalASCIIString(_) => Tested(vec![test_illegal_ascii_string]), + IllegalContractName(_) => Unreachable_Functionally("prevented by Lexer checks returning `Lexer` variant or Parser by MAX_CONTRACT_NAME_LEN returning `ContractNameTooLong` variant"), + NoteToMatchThis(_) => Tested(vec![test_note_to_match_this]), UnexpectedParserFailure => Unreachable_ExpectLike, InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection @@ -118,7 +121,7 @@ fn variant_coverage_report(variant: ParseErrorKind) { | CommaSeparatorUnexpected | ColonSeparatorUnexpected | InvalidCharactersDetected - | InvalidEscaping => Ignored, //parser v1 is deprecated and maybe removed in the next future. + | InvalidEscaping => Ignored("parser v1 is deprecated and maybe removed in the next future."), } } From 3c33ef681b276d3fbe163a96c0171f6bfec86ec4 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 13 Nov 2025 13:08:48 +0100 Subject: [PATCH 28/29] crc: fix NoteToMatchThis as unreachable, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 13 +- ...ests__parse_tests__note_to_match_this.snap | 126 ------------------ 2 files changed, 1 insertion(+), 138 deletions(-) delete mode 100644 stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 53bf042ac8a..9156c3e1837 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -96,7 +96,7 @@ fn variant_coverage_report(variant: ParseErrorKind) { IllegalClarityName(_) => Unreachable_Functionally("prevented by Lexer checks returning `Lexer` variant"), IllegalASCIIString(_) => Tested(vec![test_illegal_ascii_string]), IllegalContractName(_) => Unreachable_Functionally("prevented by Lexer checks returning `Lexer` variant or Parser by MAX_CONTRACT_NAME_LEN returning `ContractNameTooLong` variant"), - NoteToMatchThis(_) => Tested(vec![test_note_to_match_this]), + NoteToMatchThis(_) => Unreachable_Functionally("It is reachable, but only visible in diagnostic mode as it comes as a later diagnostic error"), UnexpectedParserFailure => Unreachable_ExpectLike, InterpreterFailure => Unreachable_ExpectLike, // currently cause block rejection @@ -415,17 +415,6 @@ fn test_expected_closing() { ); } -/// ParserError: [`ParseErrorKind::NoteToMatchThis`] -/// Caused by: missing open parenthesis matching the close one -/// Outcome: block accepted -#[test] -fn test_note_to_match_this() { - contract_deploy_consensus_test!( - contract_name: "my-contract", - contract_code: "())", - ); -} - /// ParserError: [`ParseErrorKind::ExpectedWhitespace`] /// Caused by: missing space before expression /// Outcome: block accepted diff --git a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap b/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap deleted file mode 100644 index da4eec0d119..00000000000 --- a/stackslib/src/chainstate/tests/snapshots/blockstack_lib__chainstate__tests__parse_tests__note_to_match_this.snap +++ /dev/null @@ -1,126 +0,0 @@ ---- -source: stackslib/src/chainstate/tests/parse_tests.rs -expression: result ---- -[ - Success(ExpectedBlockOutput( - marf_hash: "30c1d1cd8e04c4f32d72b79faee516fb261976e29511e2ae9561adef64160cb9", - evaluated_epoch: Epoch33, - transactions: [ - ExpectedTransactionOutput( - tx: "SmartContract(name: my-contract-Epoch3_3-Clarity1, code_body: [..], clarity_version: Some(Clarity1))", - vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", - return_type: Response(ResponseData( - committed: false, - data: Optional(OptionalData( - data: None, - )), - )), - cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - ), - ], - total_block_cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - )), - Success(ExpectedBlockOutput( - marf_hash: "526077ed8bad56d8a919e99c57fc3321f61e711f72dec906893f8c4708351bd4", - evaluated_epoch: Epoch33, - transactions: [ - ExpectedTransactionOutput( - tx: "SmartContract(name: my-contract-Epoch3_3-Clarity2, code_body: [..], clarity_version: Some(Clarity2))", - vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", - return_type: Response(ResponseData( - committed: false, - data: Optional(OptionalData( - data: None, - )), - )), - cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - ), - ], - total_block_cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - )), - Success(ExpectedBlockOutput( - marf_hash: "90e924d4b153b068c91b542e8b1ae4fbab18b340adde9bcdb5679bd0b4529984", - evaluated_epoch: Epoch33, - transactions: [ - ExpectedTransactionOutput( - tx: "SmartContract(name: my-contract-Epoch3_3-Clarity3, code_body: [..], clarity_version: Some(Clarity3))", - vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", - return_type: Response(ResponseData( - committed: false, - data: Optional(OptionalData( - data: None, - )), - )), - cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - ), - ], - total_block_cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - )), - Success(ExpectedBlockOutput( - marf_hash: "ae5c98b3222360854d9d8524f0f5dcaf0692a0c84366b89d4335f9aa7b2e0a78", - evaluated_epoch: Epoch33, - transactions: [ - ExpectedTransactionOutput( - tx: "SmartContract(name: my-contract-Epoch3_3-Clarity4, code_body: [..], clarity_version: Some(Clarity4))", - vm_error: "Some(unexpected \')\') [NON-CONSENSUS BREAKING]", - return_type: Response(ResponseData( - committed: false, - data: Optional(OptionalData( - data: None, - )), - )), - cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - ), - ], - total_block_cost: ExecutionCost( - write_length: 0, - write_count: 0, - read_length: 0, - read_count: 0, - runtime: 162, - ), - )), -] From de77d021f71bc8161d403e0e8ee6211b340da376 Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Thu, 13 Nov 2025 13:11:19 +0100 Subject: [PATCH 29/29] crc: improve doc, #6627 --- stackslib/src/chainstate/tests/parse_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stackslib/src/chainstate/tests/parse_tests.rs b/stackslib/src/chainstate/tests/parse_tests.rs index 9156c3e1837..c5aae11701a 100644 --- a/stackslib/src/chainstate/tests/parse_tests.rs +++ b/stackslib/src/chainstate/tests/parse_tests.rs @@ -240,7 +240,7 @@ fn test_stack_depth_too_deep_case_2_list_only_parsing() { contract_deploy_consensus_test!( contract_name: "my-contract", contract_code: &{ - // In parse v2, open parent '(' have a stack count of 1. + // In parse v2, open parenthesis '(' have a stack count of 1. let count = MAX_NESTING_DEPTH; let body_start = "(list ".repeat(count as usize); let body_end = ")".repeat(count as usize); @@ -257,7 +257,7 @@ fn test_stack_depth_too_deep_case_3_list_only_checker() { contract_deploy_consensus_test!( contract_name: "my-contract", contract_code: &{ - // In parse v2, open parent '(' have a stack count of 1. + // In parse v2, open parenthesis '(' have a stack count of 1. let count = AST_CALL_STACK_DEPTH_BUFFER + MAX_CALL_STACK_DEPTH as u64; let body_start = "(list ".repeat(count as usize); let body_end = ")".repeat(count as usize);